<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">/*global baseUrl, gender, orientation, femaletype, femalebodytype, maletype, malebodytype, penissize, penistype, malerole, orientation, bodyhair, haircolor, breastsize, ethnicity, showtype, tag, tags, totalshowTags, totalPerformers, currentPage, perPage, totalPages */
const allowedGenders = ["female", "male", "couples"];
const allowedOrientations = ["straight", "gay", "bisexual", "bicurious"];
const allowedFemaleBodyTypes = ['PETITE','SKINNY','AVERAGE','ATHLETIC','CURVY','BBW'];
const allowedFemaleTypes = ['TEEN','BABE','MILF','WIFE','EMO','GOTH','MATURE','GRANNY','DOMINA','SUBMISSIVE','PREGNANT'];
const allowedMaleTypes = ['TWINK','CUB','WOLF','BEAR','DILF','MATURE'];
const allowedMaleBodyTypes = ['PETITE','SKINNY','AVERAGE','ATHLETIC','CURVY','BBW'];
const allowedBodyHairs = ['hairy','average','shaved','little'];
const allowedHairColors = ['black','blonde','blond','brown','red','grey','white', 'bald','other'];
const allowedPenisSizes = ['SMALL','AVERAGE','BIG','MONSTER'];
const allowedPenisTypes = ['CUT','UNCUT'];
const allowedMaleRoles = ['BOTTOM','TOP','VERSATILE'];
const allowedBreastSizes = ['TINY','SMALL','MEDIUM','BIG','HUGE'];
const allowedEthnicities = ['arab','asian','black','indian','interracial','caucasian','latino','native_american'];
//const allowedShowTypes = ['regular','privateShow','groupShow','liveTouch','hd','mobile'];
	


/*
 * let text = tt.get('SOME_KEY', {'var': 'value'});
 * console.log(text);
 */
class tt {
	static texts;
	static texts_fallback;
	static levels = 3;
	
	static get(key, data = null) {
		if (!key) {
			return null;
		}

		if (!this.texts) {
			this.texts = i18n;
		}
		
		var return_text = "";
		
		for (let i = this.levels; i &gt;= 0; i--) {
			if (!Object.prototype.hasOwnProperty.call(this.texts, key + this.getFilterParam(i))) {
				//console.log(key + this.getFilterParam(i) + " NOT FOUND");
				if (i === 0) {
					return "TEXT KEY NOT FOUND";
				} else {
					continue;
				}
			}
			
			//console.log(key + this.getFilterParam(i) + " FOUND");
			
			return_text = this.texts[key + this.getFilterParam(i)];
			
			//console.log(return_text);
			
			if (data) {
				for (const [varName, value] of Object.entries(data)) {
					return_text = return_text.replace(`{${varName}}`, value);
				}
			}

			if (!return_text) {
				return this.getFallback(key + this.getFilterParam(i), data);
			}
		}

		return return_text;
	}

	static getFallback(key, data = null) {
		if (!key) {
			return null;
		}

		if (!this.texts_fallback) {
			this.texts_fallback = i18n_fallback;
		}

		var return_text = "";
		
		for (let i = this.levels; i &gt;= 0; i--) {
			if (!Object.prototype.hasOwnProperty.call(this.texts_fallback, key + this.getFilterParam(i))) {
				//console.log(key + this.getFilterParam(i) + " NOT FOUND FALLBACK");
				if (i === 0) {
					return "TEXT KEY NOT FOUND";
				} else {
					continue;
				}
			}

			return_text = this.texts_fallback[key + this.getFilterParam(i)];
			if (data) {
				for (const [varName, value] of Object.entries(data)) {
					return_text = return_text.replace(`{${varName}}`, value);
				}
			}
		}
		
		return return_text;
	}

	static getFilterParam(level = 0) {
		let filter = "";
		if (level &gt; 0) {
			if (gender &amp;&amp; gender == 'male') {
				filter += "_male";
			}
		}

		if (level &gt; 1) {
			if (orientation) {
				filter += "_" + orientation;
			}
		}

		if (level &gt; 2) {
			if (femaletype) {
				filter += "_" + femaletype
			}
		}
		
		return filter;
	}
}


/**
 * validates filter parameter and return them in a object.
 * https://www.cam4.com/directoryCams?directoryJson=true&amp;online=true&amp;url=true&amp;gender=female&amp;broadcastType=female_group&amp;broadcastType=solo&amp;broadcastType=male_female_group&amp;femaleBodyType=PETITE&amp;femaleBodyType=SKINNY&amp;femaleBodyType=AVERAGE&amp;page=1&amp;orderBy=DS&amp;resultsPerPage=60
 * @returns object
 */
function getFilters() {
	let filter = [];
	filter.gender = [];
	filter.broadcastType = [];
	filter.orientation = [];
	filter.bodyHair = [];
	filter.maleType = [];
	filter.femaleType = [];
	filter.maleBodyType = [];
	filter.femaleBodyType = [];
	filter.hairColor = [];
	filter.penisSize = [];
	filter.penisType = [];
	filter.maleRole = [];
	filter.breastSize = [];
	filter.ethnicity = [];
	//filter.showType = [];
		
	
	
	/*
	 * Gender and broadcastType
	 */
	if(allowedGenders.includes(gender)) {
		filter.gender = gender;
		
		if(gender == "female") {
			filter.broadcastType = ["female_group","solo","male_female_group"];	
		} else if(gender == "male") {
			filter.broadcastType = ["male_group","solo","male_female_group"];	
		} else if(gender == "couples") {
			filter.broadcastType = ["female_group","male_group","male_female_group"];	
		} else {
			console.error('Invalid Gender');
		}
	} else {
		filter.gender = "female";
		filter.broadcastType = ["female_group","solo","male_female_group"];	
	}

	/*
	 * Orientation
	 */
	if (orientation.indexOf(',') &gt; -1) {
		let orientations = orientation.split(',');
		filter.orientation = [];
		
		$.each(orientations, function(key,orientationValue) {
			if(allowedOrientations.includes(orientationValue)) {
				filter.orientation.push(orientationValue);
				$('*[data-orientation="'+ orientationValue +'"]').addClass('selected');
			}
		});
		
		if(filter.orientation.length &lt; 1) {
			filter.orientation = "straight";
		}
	} else {
		if(allowedOrientations.includes(orientation)) {
			filter.orientation = orientation;
		} else {
			filter.orientation = "straight";
		}
		
		$('*[data-orientation="'+ filter.orientation +'"]').addClass('selected');
	}
	
	/*
	 * bodyHair
	 */
	if (bodyhair.indexOf(',') &gt; -1) {
		let bodyhairs = bodyhair.split(',');
		filter.bodyHair = [];
		
		$.each(bodyhairs, function(key,bodyhairValue) {
			if(allowedBodyHairs.includes(bodyhairValue)) {
				filter.bodyHair.push(bodyhairValue);
				$('*[data-bodyhair="'+ bodyhairValue +'"]').addClass('selected');
			}
		});
		
		if(filter.bodyHair.length &lt; 1) {
			filter.bodyHair = [];
		}
	} else {
		if(allowedBodyHairs.includes(bodyhair)) {
			filter.bodyHair = bodyhair;
		} else {
			filter.bodyHair = [];
		}
		
		$('*[data-bodyhair="'+ filter.bodyHair +'"]').addClass('selected');
	}
	

	/*
	 * femaleBodyType
	 */
	if (femalebodytype.indexOf(',') &gt; -1) {
		let femalebodytypes = femalebodytype.split(',');
		filter.femaleBodyType = [];
		
		$.each(femalebodytypes, function(key,femalebodytypeValue) {
			if(allowedFemaleBodyTypes.includes(femalebodytypeValue)) {
				filter.femaleBodyType.push(femalebodytypeValue);
				$('*[data-femalebodytype="'+ femalebodytypeValue +'"]').addClass('selected');
			}
		});
		
		if(filter.femaleBodyType.length &lt; 1) {
			filter.femaleBodyType = [];
		}
	} else {
		if(allowedFemaleBodyTypes.includes(femalebodytype)) {
			filter.femaleBodyType = femalebodytype;
		} else {
			filter.femaleBodyType = [];
		}
		
		$('*[data-femalebodytype="'+ filter.femaleBodyType +'"]').addClass('selected');
	}


	
	/*
	 * maleBodyType
	 */
	if (malebodytype.indexOf(',') &gt; -1) {
		let malebodytypes = malebodytype.split(',');
		filter.maleBodyType = [];
		
		$.each(malebodytypes, function(key,malebodytypeValue) {
			if(allowedMaleBodyTypes.includes(malebodytypeValue)) {
				filter.maleBodyType.push(malebodytypeValue);
				$('*[data-malebodytype="'+ malebodytypeValue +'"]').addClass('selected');
			}
		});
		
		if(filter.maleBodyType.length &lt; 1) {
			filter.maleBodyType = [];
		}
	} else {
		if(allowedMaleBodyTypes.includes(malebodytype)) {
			filter.maleBodyType = malebodytype;
		} else {
			filter.maleBodyType = [];
		}
		
		$('*[data-malebodytype="'+ filter.maleBodyType +'"]').addClass('selected');
	}

	/*
	 * maleType
	 */
	if (maletype.indexOf(',') &gt; -1) {
		let maletypes = maletype.split(',');
		filter.maleType = [];
		
		$.each(maletypes, function(key,maletypeValue) {
			if(allowedMaleTypes.includes(maletypeValue)) {
				filter.maleType.push(maletypeValue);
				$('*[data-maletype="'+ maletypeValue +'"]').addClass('selected');
			}
		});
		
		if(filter.maleType.length &lt; 1) {
			filter.maleType = [];
		}
	} else {
		if(allowedMaleTypes.includes(maletype)) {
			filter.maleType = maletype;
		} else {
			filter.maleType = [];
		}
		
		$('*[data-maletype="'+ filter.maleType +'"]').addClass('selected');
	}
	
	/*
	 * femaleType
	 */
	if (femaletype.indexOf(',') &gt; -1) {
		let femaletypes = femaletype.split(',');
		filter.femaleType = [];
		
		$.each(femaletypes, function(key,femaletypeValue) {
			if(allowedFemaleTypes.includes(femaletypeValue)) {
				filter.femaleType.push(femaletypeValue);
				$('*[data-femaletype="'+ femaletypeValue +'"]').addClass('selected');
			}
		});
		
		if(filter.femaleType.length &lt; 1) {
			filter.femaleType = [];
		}
	} else {
		if(allowedFemaleTypes.includes(femaletype)) {
			filter.femaleType = femaletype;
		} else {
			filter.femaleType = [];
		}
		
		$('*[data-femaletype="'+ filter.femaleType +'"]').addClass('selected');
	}
	
	
	/*
	 * hairColor
	 */
	if (haircolor &amp;&amp; haircolor.indexOf(',') &gt; -1) {
		let haircolors = haircolor.split(',');
		filter.hairColor = [];
		
		$.each(haircolors, function(key,haircolorValue) {
			if(allowedHairColors.includes(haircolorValue)) {
				filter.hairColor.push(haircolorValue);
				$('*[data-haircolor="'+ haircolorValue +'"]').addClass('selected');
			}
		});
		
		if(filter.hairColor.length &lt; 1) {
			filter.hairColor = [];
		}
	} else {
		if(allowedHairColors.includes(haircolor)) {
			filter.hairColor = haircolor;
		} else {
			filter.hairColor = [];
		}
		
		$('*[data-haircolor="'+ filter.hairColor +'"]').addClass('selected');
	}
	
	
	
	/*
	 * penisSize
	 */
	if (penissize.indexOf(',') &gt; -1) {
		let penissizes = penissize.split(',');
		filter.penisSize = [];
		
		$.each(penissizes, function(key,penissizeValue) {
			if(allowedPenisSizes.includes(penissizeValue)) {
				filter.penisSize.push(penissizeValue);
				$('*[data-penissize="'+ penissizeValue +'"]').addClass('selected');
			}
		});
		
		if(filter.penisSize.length &lt; 1) {
			filter.penisSize = [];
		}
	} else {
		if(allowedPenisSizes.includes(penissize)) {
			filter.penisSize = penissize;
		} else {
			filter.penisSize = [];
		}
		
		$('*[data-penissize="'+ filter.penisSize +'"]').addClass('selected');
	}
	

	
	/*
	 * penisType
	 */
	if (penistype.indexOf(',') &gt; -1) {
		let penistypes = penistype.split(',');
		filter.penisType = [];
		
		$.each(penistypes, function(key,penistypeValue) {
			if(allowedPenisTypes.includes(penistypeValue)) {
				filter.penisType.push(penistypeValue);
				$('*[data-penistype="'+ penistypeValue +'"]').addClass('selected');
			}
		});
		
		if(filter.penisType.length &lt; 1) {
			filter.penisType = [];
		}
	} else {
		if(allowedPenisTypes.includes(penistype)) {
			filter.penisType = penistype;
		} else {
			filter.penisType = [];
		}
		
		$('*[data-penistype="'+ filter.penisType +'"]').addClass('selected');
	}
	
	
	
	/*
	 * maleRole
	 */
	if (malerole.indexOf(',') &gt; -1) {
		let maleroles = malerole.split(',');
		filter.maleRole = [];
		
		$.each(maleroles, function(key,maleroleValue) {
			if(allowedMaleRoles.includes(maleroleValue)) {
				filter.maleRole.push(maleroleValue);
				$('*[data-malerole="'+ maleroleValue +'"]').addClass('selected');
			}
		});
		
		if(filter.maleRole.length &lt; 1) {
			filter.maleRole = [];
		}
	} else {
		if(allowedMaleRoles.includes(malerole)) {
			filter.maleRole = malerole;
		} else {
			filter.maleRole = [];
		}
		
		$('*[data-malerole="'+ filter.maleRole +'"]').addClass('selected');
	}
	
	
	
	/*
	 * breastSize
	 */
	if (breastsize.indexOf(',') &gt; -1) {
		let breastsizes = breastsize.split(',');
		filter.breastSize = [];
		
		$.each(breastsizes, function(key,breastsizeValue) {
			if(allowedBreastSizes.includes(breastsizeValue)) {
				filter.breastSize.push(breastsizeValue);
				$('*[data-breastsize="'+ breastsizeValue +'"]').addClass('selected');
			}
		});
		
		if(filter.breastSize.length &lt; 1) {
			filter.breastSize = [];
		}
	} else {
		if(allowedBreastSizes.includes(breastsize)) {
			filter.breastSize = breastsize;
		} else {
			filter.breastSize = [];
		}
		
		$('*[data-breastsize="'+ filter.breastSize +'"]').addClass('selected');
	}

	
	/*
	 * ethnicity
	 */
	if (ethnicity.indexOf(',') &gt; -1) {
		let ethnicities = ethnicity.split(',');
		filter.ethnicity = [];
		
		$.each(ethnicities, function(key,ethnicityValue) {
			if(allowedEthnicities.includes(ethnicityValue)) {
				filter.ethnicity.push(ethnicityValue);
				$('*[data-ethnicity="'+ ethnicityValue +'"]').addClass('selected');
			}
		});
		
		if(filter.ethnicity.length &lt; 1) {
			filter.ethnicity = [];
		}
	} else {
		if(allowedEthnicities.includes(ethnicity)) {
			filter.ethnicity = ethnicity;
		} else {
			filter.ethnicity = [];
		}
		
		$('*[data-ethnicity="'+ filter.ethnicity +'"]').addClass('selected');
	}
	
	
	filter.tag = tag.replace(/[^0-9a-z]/gi, '');
	
	return filter;
}




/*
 * @returns {Boolean}
 * Create a url slug based on current selection
 */
function getUrlSlug(filter = false, canonical=false) {
	var slug = '';
	
	if(!filter) {
		filter = getFilters();
	}
	
	if(filter.gender == "male") {
		slug += "/men";
	}

	//Add orientation (should always be set)
	slug += '/' + filter.orientation;

	if (typeof filter.femaleType == 'object' &amp;&amp; filter.femaleType.hasOwnProperty(0)) {
		slug += '/' + filter.femaleType[0];	
	} else {
		slug += '/-';
	}
	
	if (typeof filter.femaleBodyType == 'object' &amp;&amp; filter.femaleBodyType.hasOwnProperty(0)) {
		slug += '/' + filter.femaleBodyType[0];	
	} else {
		slug += '/-';
	}
	
	if (typeof filter.hairColor == 'object' &amp;&amp; filter.hairColor.hasOwnProperty(0)) {
		slug += '/' + filter.hairColor[0];	
	} else {
		slug += '/-';
	}

	if (typeof filter.ethnicity == 'object' &amp;&amp; filter.ethnicity.hasOwnProperty(0)) {
		slug += '/' + filter.ethnicity[0];	
	} else {
		slug += '/-';
	}
	
	if (typeof filter.breastSize == 'object' &amp;&amp; filter.breastSize.hasOwnProperty(0)) {
		slug += '/' + filter.breastSize[0];	
	} else {
		slug += '/-';
	}
	
	if (typeof filter.bodyHair == 'object' &amp;&amp; filter.bodyHair.hasOwnProperty(0)) {
		slug += '/' + filter.bodyHair[0];	
	} else {
		slug += '/-';
	}
	
	if(slug == '/straight/-/-/-/-/-/-' || slug == '/-/-/-/-/-/-/-') {
		slug = '/';
	}
	
	if(tt.get('SLUG_' + slug) &amp;&amp; tt.get('SLUG_' + slug) != '' &amp;&amp; tt.get('SLUG_' + slug) != "TEXT KEY NOT FOUND") {
		slug = '/' + tt.get('SLUG_' + slug);
	}
	

	/* some logic to set canonicals */
	if(canonical) {
        // set canonical of orientation
        if(filter.gender == "female") {
            if(filter.orientation) {
				if(filter.orientation == "straight") {
                	setCanonicalUrl("https://sex.com.au/");
				} else {
					setCanonicalUrl("https://sex.com.au/" +  tt.get("SLUG_/" + filter.orientation + "/-/-/-/-/-/-"));
				}
			}
			
            if(filter.orientation &amp;&amp; (typeof filter.femaleType == 'object' &amp;&amp; filter.femaleType.hasOwnProperty(0))) {
                setCanonicalUrl("https://sex.com.au/" +  tt.get("SLUG_/" + filter.orientation + "/" + filter.femaleType[0] + "/-/-/-/-/-"));
			}
		}

        // set canonical to men or couples if set
        if(filter.gender == "male") {
            setCanonicalUrl("https://sex.com.au/men");
		}

        // set self canonical for performer pages.
        if (slug.includes("/live/")) {
            setCanonicalUrl("https://sex.com.au" + slug);
		}
	}

	return slug;
}

// Function to set canonical URL
function setCanonicalUrl(canonicalUrl) {
    // Remove existing canonical link if it exists
    var existingCanonical = document.querySelector("link[rel='canonical']");
    if (existingCanonical) {
        existingCanonical.remove();
    }

    // Create a new canonical link element
    var canonicalLink = document.createElement('link');
    canonicalLink.rel = 'canonical';
    canonicalLink.href = canonicalUrl;

    // Append the canonical link to the &lt;head&gt; section of the document
    document.head.appendChild(canonicalLink);
	console.log("Canonical set to: " + canonicalUrl);
}

/*
 * @returns {Boolean}
 * Set url slug based on links
 */
function setUrlSlugs() {	
	$('#filterWrapper').find('ul').each(function() {
		var filter = getFilters();
		var currentFilter = getFilters();
		var filterType = $(this).attr('data-filter');
		
		$(this).find('a').each(function() {
			var filterValue = $(this).attr('data-' + filterType);
			if(filterType == 'orientation') {
				if(currentFilter[filterType] != filterValue) {
					filter[filterType] = filterValue;
				} else {
					$(this).removeAttr('href');
					return;
					//filter[filterType] = '-';
				}
			} else {
				if(currentFilter[filterType][0] != filterValue) {
					filter[filterType][0] = filterValue;
				} else {
					filter[filterType][0] = '-';
				}
			}
			
			var slug = getUrlSlug(filter);
			$(this).attr('href', slug);
		});
	});
}


/*
 * @returns {Boolean}
 * Create a querystring for cam4 api filtering
 */
function createQueryString(filter = false) {
	if(!filter) {
		filter = getFilters();
	}
	var qs = '';
	
	/*
	 * Gender is always set, so its save to use &amp; in following filters.
	 */
	if(filter.gender &amp;&amp; filter.gender != "") {
		qs += "gender="+ filter.gender;
	}
	
	//
	if(typeof filter.orientation == 'object' &amp;&amp; filter.orientation.length &gt; 0) {
		$.each(filter.orientation, function(key,broadcastType) {
			qs += "&amp;sexPreference="+ broadcastType;
		});
	} else {
		if(filter.orientation &amp;&amp; filter.orientation != "") {
			qs += "&amp;sexPreference="+ filter.orientation;
		}
	}
	
	// Body Hair
	if(typeof filter.bodyHair == 'object' &amp;&amp; filter.bodyHair.length &gt; 0) {
		$.each(filter.bodyHair, function(key,bodyHairType) {
			qs += "&amp;bodyHair="+ bodyHairType;
		});
	} else {
		if(filter.bodyHair &amp;&amp; filter.bodyHair != "") {
			qs += "&amp;bodyHair="+ filter.bodyHair;
		}
	}
	
	//Female Body Type
	if(typeof filter.femaleBodyType == 'object' &amp;&amp; filter.femaleBodyType.length &gt; 0) {
		$.each(filter.femaleBodyType, function(key,femaleBodyType) {
			qs += "&amp;femaleBodyType="+ femaleBodyType;
		});
	} else {
		if(filter.femaleBodyType &amp;&amp; filter.femaleBodyType != "") {
			qs += "&amp;femaleBodyType="+ filter.femaleBodyType;
		}
	}
	
	//Male Body Type
	if(typeof filter.maleBodyType == 'object' &amp;&amp; filter.maleBodyType.length &gt; 0) {
		$.each(filter.maleBodyType, function(key,maleBodyType) {
			qs += "&amp;maleBodyType="+ maleBodyType;
		});
	} else {
		if(filter.maleBodyType &amp;&amp; filter.maleBodyType != "") {
			qs += "&amp;maleBodyType="+ filter.maleBodyType;
		}
	}

	
	//Female Type
	if(typeof filter.femaleType == 'object' &amp;&amp; filter.femaleType.length &gt; 0) {
		$.each(filter.femaleType, function(key,femaleType) {
			qs += "&amp;femaleType="+ femaleType;
		});
	} else {
		if(filter.femaleType &amp;&amp; filter.femaleType != "") {
			qs += "&amp;femaleType="+ filter.femaleType;
		}
	}
	
	//Male Type
	if(typeof filter.maleType == 'object' &amp;&amp; filter.maleType.length &gt; 0) {
		$.each(filter.maleType, function(key,maleType) {
			qs += "&amp;maleType="+ maleType;
		});
	} else {
		if(filter.maleType &amp;&amp; filter.maleType != "") {
			qs += "&amp;maleType="+ filter.maleType;
		}
	}
	
	//Penis Type
	if(typeof filter.penisType == 'object' &amp;&amp; filter.penisType.length &gt; 0) {
		$.each(filter.penisType, function(key,penisType) {
			qs += "&amp;penisType="+ penisType;
		});
	} else {
		if(filter.penisType &amp;&amp; filter.penisType != "") {
			qs += "&amp;penisType="+ filter.penisType;
		}
	}
	
	//Hair color
	if(typeof filter.hairColor == 'object' &amp;&amp; filter.hairColor.length &gt; 0) {
		$.each(filter.hairColor, function(key,hairColor) {
			qs += "&amp;hairColor="+ hairColor;
		});
	} else {
		if(filter.hairColor &amp;&amp; filter.hairColor != "") {
			qs += "&amp;hairColor="+ filter.hairColor;
		}
	}
	
	//Male Role
	if(typeof filter.maleRole == 'object' &amp;&amp; filter.maleRole.length &gt; 0) {
		$.each(filter.maleRole, function(key,maleRole) {
			qs += "&amp;maleRole="+ maleRole;
		});
	} else {
		if(filter.maleRole &amp;&amp; filter.maleRole != "") {
			qs += "&amp;maleRole="+ filter.maleRole;
		}
	}
	
	//Penis Size
	if(typeof filter.penisSize == 'object' &amp;&amp; filter.penisSize.length &gt; 0) {
		$.each(filter.penisSize, function(key,penisSize) {
			qs += "&amp;penisSize="+ penisSize;
		});
	} else {
		if(filter.penisSize &amp;&amp; filter.penisSize != "") {
			qs += "&amp;penisSize="+ filter.penisSize;
		}
	}
	
	//Penis Size
	if(typeof filter.breastSize == 'object' &amp;&amp; filter.breastSize.length &gt; 0) {
		$.each(filter.breastSize, function(key,breastSize) {
			qs += "&amp;breastSize="+ breastSize;
		});
	} else {
		if(filter.breastSize &amp;&amp; filter.breastSize != "") {
			qs += "&amp;breastSize="+ filter.breastSize;
		}
	}
	
	//Penis Size
	if(typeof filter.ethnicity == 'object' &amp;&amp; filter.ethnicity.length &gt; 0) {
		$.each(filter.ethnicity, function(key,ethnicity) {
			qs += "&amp;ethnicity="+ ethnicity;
		});
	} else {
		if(filter.ethnicity &amp;&amp; filter.ethnicity != "") {
			qs += "&amp;ethnicity="+ filter.ethnicity;
		}
	}
	
	
	//broadcastType female / male / couples
	if(typeof filter.broadcastType == 'object' &amp;&amp; filter.broadcastType.length &gt; 0) {
		$.each(filter.broadcastType, function(key,broadcastType) {
			qs += "&amp;broadcastType="+ broadcastType;
		});
	}
	
	console.log('QS', qs);
	
	return qs;
}


/*
 * show modal after ** seconds;
 */
try {
	var cam4registrationmodalTimeout = window.setTimeout(function () {
		$('#cam4registrationmodal').fadeIn(800);
	}, duration);
} catch (e) {
	//
}


/*
 * Load more performers
 */
$("body").on('click', "#loadmore", function (e) {
	e.preventDefault();
	
	loadPerformers( getFilters() );
	return true;
});

/*
 * open modal on click
 */
$("body").on('click', ".cta, .nav-cta", function (e) {
	e.preventDefault();
	
	if(typeof cam4registrationmodalTimeout != "undefined") {
		clearTimeout(cam4registrationmodalTimeout);
	}
	
	$('#cam4registrationmodal').fadeIn(800);
});

/*
 * Close modal.
 */
$("body").on('click', ".modalClose", function () {
	modalCloseTimes++;

	if(modalCloseTimes &gt; 4) {
		$('.modalClose').html('').remove();
		$('.modal-footer').html('').remove();
	}

	cam4registrationmodalTimeout = window.setTimeout(function () {
		$('#cam4registrationmodal').fadeIn(800);
	}, duration);

	$('#cam4registrationmodal').fadeOut(800);
	return false;
});




//Cams Count:
//https://sfw.cam4.com/directoryCounts?directoryJson=true&amp;online=true&amp;sfw=true&amp;gender=female&amp;broadcastType=female_group&amp;broadcastType=solo&amp;broadcastType=male_female_group&amp;url=true&amp;page=1&amp;orderBy=VIDEO_QUALITY&amp;resultsPerPage=60
//
//Cams
//https://sfw.cam4.com/directoryCams?directoryJson=true&amp;online=true&amp;sfw=true&amp;gender=female&amp;broadcastType=female_group&amp;broadcastType=solo&amp;broadcastType=male_female_group&amp;url=true&amp;page=1&amp;resultsPerPage=60&amp;orderBy=VIDEO_QUALITY
//
//Tags:
//https://sfw.cam4.com/rest/v1.0/directoryTags?&amp;gender=female
function getTags(filter = false) {
	if(!filter) {
		var filter = getFilters();
	}

	var qs = createQueryString(filter);
	
	$.ajax({
		url: "https://www.cam4.com/rest/v2.0/directory/tags?" + qs + "&amp;resultsPerPage=" + perPage,
		type: 'GET',
		data: "",
		crossDomain:true,
	}).done(function (data,textStatus,xhr) {
		totalshowTags = data.showTags.length;
		tags = data.showTags;
	})
	.fail(function (jqXHR, textStatus, errorThrown) {

	})
	.always(function () {
		let filterGenderUrl = ""
		
		if(tags.length &gt; 0) {
			
			/*
			 * force gender on performer pages.
			 */
			if(filter.gender != gender) {
				filter.gender = gender;
			}
			
			if(filter.gender == "female") {
				filterGenderUrl = "";
			} else if(filter.gender == "male") {
				filterGenderUrl = "men/";
			} else if(filter.gender == "couples") {
				filterGenderUrl = "couples/";
			} else {
				filterGenderUrl = "";
			}

			$.each(tags, function( index, tag ) {
				$(".tags").append('&lt;a href="' + baseUrl + '' + filterGenderUrl + '' + filter.orientation + '/' + tag.name + '"&gt;#' + tag.name + '&lt;/a&gt;');
			});
		} else {
			// hide tags.
			$("#filters").hide().remove();
		}
	});
}


function getTotalPerformers(filter,reset=false) {
	var qs = createQueryString(filter);
	$.ajax({
		//url: "https://api.cam4.com/directoryCounts?directoryJson=true&amp;online=true&amp;gender="+ filter.gender + "&amp;sexPreference=" + filter.orientation + "&amp;showTag=" + filter.tag + "&amp;femaleType=" + filter.femaleType + "&amp;maleType=" + filter.maleType + "",
		url: "https://api.cam4.com/directoryCounts?directoryJson=true&amp;online=true&amp;showTag=" + filter.tag + "&amp;"+ qs,
		type: 'GET',
		data: "",
		crossDomain:true,
	}).done(function (data,textStatus,xhr) {
		totalPerformers = data.totalCount;
		totalPages = Math.ceil(totalPerformers / perPage);
	})
	.fail(function (jqXHR, textStatus, errorThrown) {

	})
	.always(function () {
		if(totalPerformers &gt; 0) {
			loadPerformers(filter,reset);
		} else {
			loadRandomPerformers(filter);
			getTags([]);
		}
	});
}


function loadRandomPerformers(filter) {
	$('.thumbnail-section h2').html("Some great XXX shows you might like!");
	$('.thumbnail-section ._smalltext').html("Sorry, we couldn't find any performers that fit what you're looking for right now. Give it another shot with different preferences! Meanwhile, here are some other cool performers you might dig. Have fun checking them out!");
	var newFilter = [];
	newFilter.tag = '';
	newFilter.gender = filter.gender;
	newFilter.orderBy = "RECENT";
	getTotalPerformers(newFilter, true);
	loadPerformers(newFilter, true);
}


function loadPerformers(filter,reset=false) {
	var qs = createQueryString(filter);
	$("#loadmore").hide();
	
	if(reset) {
		console.log('reset requested, set currentPage to 1');
		currentPage = 1;
	}
	
	console.log('page ' + currentPage + ' of ' + totalPages);
	
	$.ajax({
		//url: "https://api.cam4.com/directoryCams?directoryJson=true&amp;online=true&amp;gender=" + filter.gender + "&amp;sexPreference=" + filter.orientation + "&amp;showTag=" + filter.tag + "&amp;url=true&amp;femaleType=" + filter.femaleType + "&amp;maleType=" + filter.maleType + "&amp;page=" + currentPage + "&amp;resultsPerPage=" + perPage + "",
		url: "https://api.cam4.com/directoryCams?directoryJson=true&amp;online=true&amp;showTag=" + filter.tag + "&amp;url=true&amp;page=" + currentPage + "&amp;resultsPerPage=" + perPage + "&amp;" + qs,
		type: 'GET',
		data: "",
		dataType: 'json',
		crossDomain:true,
		withCredentials:true,
	}).done(function (data,textStatus,xhr) {
		parsePerformerData(data);
	})
	.fail(function (jqXHR, textStatus, errorThrown) {

	})
	.always(function () {
		currentPage++;

		if(currentPage &lt; totalPages ) {
			$("#loadmore").show();
		} else if(currentPage == totalPages) {
			$("#loadmore").hide();
		} else {
			// Remove page nav or trigger.
			$("#loadmore").hide();
			return false;
		}


	});
}

/*
 * Show related performers when performer is offline.
 * based on filter"
 *	gender: "female"
 *	hairColor: "brown"
 *	sexPreference : "straight"
 */
function loadRelated(filter) {	
	console.log('filter',filter);
	var qs = createQueryString(filter);
	$.ajax({
		//url: "https://api.cam4.com/directoryCams?directoryJson=true&amp;online=true&amp;gender=" + filter.gender + "&amp;sexPreference=" + filter.orientation + "&amp;hairColor=" + filter.hairColor + "&amp;url=true&amp;page=1&amp;resultsPerPage=12",
		url: "https://api.cam4.com/directoryCams?directoryJson=true&amp;online=true&amp;showTag=" + filter.tag + "&amp;url=true&amp;page=" + currentPage + "&amp;resultsPerPage=" + perPage + "&amp;" + qs,
		type: 'GET',
		data: "",
		dataType: 'json',
		crossDomain:true,
		withCredentials:true,
	}).done(function (data,textStatus,xhr) {
		parsePerformerData(data);
	})
	.fail(function (jqXHR, textStatus, errorThrown) {

	})
	.always(function () {
		
	});
}

function parsePerformerData(data) {
	var template = $("#thumbnailTemplate").clone().prop('id', "");
	//console.log('template',template);
	template.removeClass('_template');
	//console.log(data.users);
	//console.log(data.users.length);
	if(data.users.length &gt; 0) {
		var i = 0;
		$.each(data.users, function( index, performer ) {
			let performerUsername = performer.username.trim();
			let bioUsername = $(".bio-username").text().trim();

			console.log(performerUsername + ' :: ' + bioUsername);

			if (performerUsername === bioUsername) {
				return;
			}
		
			//console.log(performer);
			if(i == 0) {
				if(typeof performer.profileImageLink != "undefined" &amp;&amp; performer.profileImageLink != "") {
					$('#formImage').attr('src', "https://liivecammodels.com/test/img.php?width=640&amp;height=320&amp;source="+encodeURIComponent(performer.profileImageLink.replace("-400x300", "")));
					i++;
				}
			}
			
			template.find('.video_name').text(performer.username);
			template.find('.sexPreference').text(performer.sexPreference); 
			template.find('.views').text(performer.viewers); 
			template.find('.flags &gt; img').attr('src', 'https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/0.8.2/flags/4x3/' + performer.countryCode + '.svg');
			template.find('.showTags').text(performer['showTags'].join()); 
			
			// template.find('.image').css('background-image', 'url(' + performer['profileImageLinkSFW'].replace("-400x300","") + ')').attr('href','?p='+ performer.username);
			// template.find('.image').css('background-image', 'url(https://liivecammodels.com/test/img.php?width=320&amp;height=220&amp;source=' + performer['profileImageLinkSFW'].replace("-400x300","") + ')').attr('href','?p='+ performer.username);
			template.find('.image').css('background-image', 'url(' + performer['snapshotImageLink'].replace("-400x300","") + ')').attr('href',baseUrl + 'live/'+ performer.username);
			
			$(".thumbnail-container").append(template[0].outerHTML);
		});
		
		
	} else {
		// no data available
		//alert('No data available');
	}
	
	return true;
}


if($(".tags").length) {
	getTags( getFilters() );
}

if($(".thumbnail-container").length) {
	getTotalPerformers( getFilters() );
}


setUrlSlugs();


/*
 * Filter bar events
 */
$("body").on('click', "#filterWrapper ul li a", function (e) {
	// just follow links on performer pages
	if($("#performer-menu-wrapper").length) {
		return true;
	}
	

	
	e.preventDefault();
	
	if($(this).hasClass('selected')) {
		$(this).closest('ul').find('.selected').removeClass('selected');
	} else {
		$(this).closest('ul').find('.selected').removeClass('selected');
		$(this).addClass('selected');
	}
	

	let currentFilter = $(this).closest('ul').data('filter');
	console.log('Changed filter: ' + currentFilter);
	window[currentFilter.toLowerCase()] = '';
	$('*[data-' + currentFilter.toLowerCase() +'].selected').each(function() {
		window[currentFilter.toLowerCase()] += $(this).data(currentFilter.toLowerCase())+',';
	});
	
	var filters = getFilters();
	console.log(filters);
	/*
	 * empty current content
	 */
	$('.thumbnail-container').html('');

	/*
	 * update browser url and meta texts.
	 */	
	var slug = getUrlSlug(filters,true);
	

	/*
	 * Retrieve the texts
	 */
	if(tt.get('METATITLE_' + slug) &amp;&amp; tt.get('METATITLE_' + slug) != '' &amp;&amp; tt.get('METATITLE_' + slug) != "TEXT KEY NOT FOUND") {
		var metatitle = tt.get('METATITLE_' + slug);
	} else {
		var metatitle = tt.get('LANDER-' + filters.gender.toUpperCase() + '_METATITLE');
	}
	
	if(tt.get('_' + slug) &amp;&amp; tt.get('METADESCRIPTION_' + slug) != '' &amp;&amp; tt.get('METADESCRIPTION_' + slug) != "TEXT KEY NOT FOUND") {
		var metadescription = tt.get('METADESCRIPTION_' + slug);
	} else {
		var metadescription = tt.get('LANDER-' + filters.gender.toUpperCase + '_METADESCRIPTION');
	}
	
	if(tt.get('H1_' + slug) &amp;&amp; tt.get('H1_' + slug) != '' &amp;&amp; tt.get('H1_' + slug) != "TEXT KEY NOT FOUND") {
		var h1 = tt.get('H1_' + slug);
	} else {
		var h1 = '';
	}
	
	if(tt.get('H2_' + slug) &amp;&amp; tt.get('H2_' + slug) != '' &amp;&amp; tt.get('H2_' + slug) != "TEXT KEY NOT FOUND") {
		var h2 = tt.get('H2_' + slug);
	} else {
		var h2 = '';
	}
	
	if(tt.get('SMALLTEXT_' + slug) &amp;&amp; tt.get('SMALLTEXT_' + slug) != '' &amp;&amp; tt.get('SMALLTEXT_' + slug) != "TEXT KEY NOT FOUND") {
		var smalltext = tt.get('SMALLTEXT_' + slug);
	} else {
		var smalltext = '';
	}
	
	if(tt.get('LARGETEXT_' + slug) &amp;&amp; tt.get('LARGETEXT_' + slug) != '' &amp;&amp; tt.get('LARGETEXT_' + slug) != "TEXT KEY NOT FOUND") {
		var largetext = tt.get('LARGETEXT_' + slug);
	} else {
		var largetext = '';
	}
	

	/*
	 * Set all texts
	 */
	document.title = metatitle;
	document.querySelector('meta[name="description"]').setAttribute("content", metadescription);
	
	$('h1').html(h1);
	$('.thumbnail-section h2').html(h2);
	$('._smalltext').html(smalltext);
	$('._largetext').html(largetext);

	window.history.pushState({"filter":$("#filterWrapper").html(),"filters":filters,"metatitle":metatitle, "h1":h1, "h2":h2, "smalltext":smalltext, "largetext":largetext}, "", slug);
	
	/*
	 * Set the filter links
	 */
	setUrlSlugs();
	
	/*
	 * Load new data
	 */
	getTotalPerformers(filters,true);
	
	return true;
});

/*
 * on back buttons
 */
window.onpopstate = function(e){
    if(e.state) {
		console.log(e.state);
		$('.thumbnail-container').html('');
		
		$("#filterWrapper").html(e.state.filter);
		var filter = e.state.filters;
	
		getTotalPerformers(filter,true);

		document.title = e.state.metatitle;
		document.querySelector('meta[name="description"]').setAttribute("content", e.state.metadescription);
		$('h1').html(e.state.h1);
		$('.thumbnail-section h2').html(e.state.h2);

		$('._smalltext').html(e.state.smalltext);
		$('._largetext').html(e.state.largetext);
		
		return true;
    } else {
		window.location.reload();
	}
}</pre></body></html>