Group Show Ticket 14:45
CataleyaGlow
0
GOAL: loading...
0 / 0
00:00
`; } else { media_html += ''; } if (media.text) { media_html += '
'; media_html += ''+ capitalizeFirstLetter(media.username) +' '+ capitalizeFirstLetter(media.text) +'
'; media_html += '
'; } media_html += ''; return media_html; } $(document).ready(function() { if(cam4.sfw){ $("#profile-bio").addClass('blur blur-small'); $("#profile-photos").addClass('blur blur-small'); $("#profile-videos").addClass('blur blur-small'); } //fetch all the profile data window.I18n = {"api":{"gender":{"male":"Male","female":"Female","shemale":"Transexual","unknown":"Unknown"},"sex_preference":{"straight":"Straight","gay":"Gay","bisexual":"Bisexual","bicurious":"Bi-curious","unknown":"Unknown"},"body_type":{"slimPetite":"Petite","athletic":"Athletic","average":"Average","morethanAverage":"Chubby","large":"BBW"},"hair_color":{"black":"Black","blonde":"Blonde","brown":"Brown","red":"Red","grey":"Grey","white":"White","bald":"Bald"},"ethnicity":{"arab":"Arab","asian":"Asian","black":"Ebony","indian":"Indian","interracial":"Interracial","caucasian":"Caucasian","latino":"Latino","native_american":"Native American"},"body_hair":{"hairy":"Hairy","average":"Average","shaved":"Shaved","little":"Little"},"penis_size":{"SMALL":"Small","AVERAGE":"Average","BIG":"Big","MONSTER":"Monster"},"male_type":{"TWINK":"Twink","CUB":"Cub","WOLF":"Wolf","BEAR":"Bear","DILF":"DILF","MATURE":"Mature"},"male_role":{"BOTTOM":"Bottom","TOP":"Top","VERSATILE":"Versatile"},"female_type":{"TEEN":"Teen","BABE":"Babe","MILF":"MILF","WIFE":"Wife","EMO":"Emo","GOTH":"Goth","MATURE":"Mature","GRANNY":"Granny","DOMINA":"Domina","SUBMISSIVE":"Submissive","PREGNANT":"Pregnant"},"breast_size":{"TINY":"Tiny","SMALL":"Small","MEDIUM":"Medium","BIG":"Big","HUGE":"Huge"},"marital_status":{"single":"Single","married":"Married","committed":"Committed","openMarriage":"Open Marriage","openRelationship":"Open Relationship"},"drinks":{"no":"No","socially":"Socially","occasionally":"Occasionally","regularly":"Regularly","heavily":"Heavily"},"hair_length":{"longx":"Long","medium":"Medium","shortx":"Short","shaved":"Shaved","bald":"Bald"},"eye_color":{"black":"Black","brown":"Brown","blue":"Blue","hazel":"Hazel","green":"Green","gray":"Grey","other":"Other"},"facial_hair":{"beard":"Beard","mustache":"Mustache","goatee":"Goatee","sideburns":"Sideburns"},"trans_penis_size":{"SMALL":"Small","AVERAGE":"Average","BIG":"Big","MONSTER":"Monster","POST_OP":"Post-Op"},"trans_type":{"CROSS_DRESSER":"Cross Dresser","LADY_BOY":"Lady Boy","PRE_OP":"Pre-Op","POST_OP":"Post-Op","T_GIRL":"T-Girl"},"errors":{"INVALID_CREDENTIALS":"Invalid credentials.","UNVERIFIED_USER":"First you need to activate your account, please check your email.","CONSECUTIVE_LOGIN_FAILED":"Too many failed attempts to login.","CLIENT_BANNED":"Sorry you have been banned.","CLIENT_TEMP_BANNED":"You have been temporarily banned.","ACCOUNT_EXPIRED":"Your account has expired, please reset your password.","VALIDATION_ERROR":"Username or password cannot be blank.","ACCOUNT_DELETED":"This account has been deleted."}},"sexcouk_female_profile_basic_text":"This is the profile page of {link} {username}. She broadcasts her live Webcam Show on Sex.co.uk.","sexcouk_female_profile_age_text":"She is {age} year old, and is famous for her great {link}.","sexcouk_female_profile_height_text":"Her height is {height}, which makes her {heighttext}.","sexcouk_female_profile_tattoo_text_link":"Naked Girls Tattoo Cams","sexcouk_male_profile_tattoo_text_link":"Naked Gay Tattoo Cams","sexcouk_female_profile_tattoo_text":"{username} has some sexy tattoos. Check out other {link} here.","sexcouk_female_profile_language_text":"You can talk to her in {languages}.","sexcouk_female_profile_country_text_link":"{country} Sex Cams","sexcouk_female_profile_country_text":"She comes from {country}. Watch the best {link} here.","sexcouk_female_profile_boobs_text":"If you like {username}'s big boobs, you´ll love these {link}.","sexcouk_female_profile_enjoy_text":"What are you waiting for? Enjoy her {link} now!","sexcouk_male_profile_basic_text":"This is the profile page of {link} {username}. He broadcasts his live Webcam Show on Sex.co.uk.","sexcouk_male_profile_age_text":"He is {age} old, and is famous for his great {link}","sexcouk_male_profile_height_text":"His height is {height}, which makes him {link}","sexcouk_male_profile_tattoo_text":"{username} has some sexy tattoos. Check out other {link} here.","sexcouk_male_profile_country_text":"He comes from {country}. Watch the best {link} here.","sexcouk_male_profile_penis_text":"If you like {username}'s big penis, you'll love these {link}.","sexcouk_male_profile_enjoy_text":"What are you waiting for? Enjoy his {link} now!","sexcouk_male_profile_language_text":"You can talk to him in {languages}.","sexcouk_male_profile_country_text_link":"{country} Sex Cams","sexcouk_female_profile_boobs_text_link":"free big tits cams","sexcouk_female_profile_enjoy_text_link":"Live Sex Chat","sexcouk_male_profile_enjoy_text_link":"Twink Cam","sexcouk_male_profile_basic_text_link":"Cam Boy","sexcouk_male_profile_height_text_small":"small","sexcouk_male_profile_height_text_normal":"normal sized","sexcouk_male_profile_height_text_tall":"tall","sexcouk_female_profile_basic_text_link":"Cam Girl","sexcouk_female_profile_age_text_link_18-19":"Teen Live Cam","sexcouk_female_profile_age_text_link_20-29":"Young Cam Chat","sexcouk_female_profile_age_text_link_30-49":"Milf Live Cam","sexcouk_female_profile_age_text_link_50-59":"Mature Live Cam","sexcouk_female_profile_age_text_link_60-80":"Granny Live Cam","sexcouk_male_profile_age_text_link_18-19":"Teen Gay Cam","sexcouk_male_profile_age_text_link_20-29":"Young Gay Cam Chat","sexcouk_male_profile_age_text_link_30-49":"Gay Daddy Cam","sexcouk_male_profile_age_text_link_50-59":"Old Gay Cam","sexcouk_male_profile_age_text_link_60-80":"Grandaddy Gay Cam","sexcouk_male_profile_penis_text_link":"Big Dick Cams"} cam4.getProfile('CataleyaGlow', function(data){ if(data){ //populate the chatroom if(!blank(data['profile_pic'])){ $("#mobile-chat-header-performer-profile-pic").css('background-image', 'url("'+data['profile_pic']+'")'); } else{ $("#mobile-chat-header-performer-profile-pic").remove(); $("#mobile-chat-header-performer").css('left', '5px'); } if(is_mobile && data['rank'] > 0){ $("#mobile-chat-header-rank-text").html(data['rank']); $("#mobile-chat-header-rank").show(); } //populate the page $("#profile-pic-container").html(hiddenWatermarkImg(data['profile_pic'], 'img-thumbnail '+(cam4.sfw ? 'blur blur-small' : '')+'')); $("#profile-age").html(data['age']); $("#profile-gender").html(capitalizeFirstLetter(t('api.gender.'+data['gender']))); $("#profile-sex-preference").html(capitalizeFirstLetter(t('api.sex_preference.'+data['sex_preference']))); try{ var regionNames = new Intl.DisplayNames(['en'], {type: 'region'}); $("#profile-country").html(capitalizeFirstLetter(regionNames.of(data['country'].toUpperCase()))); }catch{ $("#profile-country").html(capitalizeFirstLetter(data['country'])); } $("#profile-city").html(capitalizeFirstLetter(data['city'])); $("#profile-occupation").html(capitalizeFirstLetter(data['occupation'])); $("#profile-marital-status").html(capitalizeFirstLetter(t('api.marital_status.'+data['marital_status']))); $("#profile-smokes").html(capitalizeFirstLetter(data['smoke'])); $("#profile-drinks").html(capitalizeFirstLetter(data['drink'])); try{ var langNames = new Intl.DisplayNames(['en'], {type: 'language'}); $("#profile-languages").html(data['languages'].map(l => capitalizeFirstLetter(langNames.of(l))).join('
')); }catch{ $("#profile-languages").html(data['languages'].join('
')); } $("#profile-height").html(data['height']); $("#profile-hair-color").html(capitalizeFirstLetter(t('api.hair_color.'+data['hair_color']))); $("#profile-hair-length").html(capitalizeFirstLetter(t('api.hair_length.'+data['hair_length']))); $("#profile-eye-color").html(capitalizeFirstLetter(t('api.eye_color.'+data['eyes']))); $("#profile-ethnicity").html(capitalizeFirstLetter(t('api.ethnicity.'+data['ethnicity']))); $("#profile-body-type").html(capitalizeFirstLetter(t('api.body_type.'+data['body_type']))); $("#profile-breast-size").html(capitalizeFirstLetter(t('api.breast_size.'+data['breast_size']))); $("#profile-female-type").html(capitalizeFirstLetter(t('api.female_type.'+data['female_type']))); $("#profile-body-hair").html(capitalizeFirstLetter(t('api.body_hair.'+data['body_hair']))); $("#profile-facial-hair").html(capitalizeFirstLetter(t('api.facial_hair.'+data['facial_hair']))); $("#profile-male-type").html(capitalizeFirstLetter(t('api.male_type.'+data['male_type']))); $("#profile-penis-size").html(capitalizeFirstLetter(t('api.penis_size.'+data['penis_size']))); $("#profile-tattoos").html(data['tattoos'] ? t('common.yes') : t('common.no')); $("#profile-piercings").html(data['piercings'] ? t('common.yes') : t('common.no')); var parser = new BBCodeParser({settings : {'FontSizeUnit' : '', ColorAllowAdvFormats: true}, allOrNothing: false}); var bio = parser.format(data['bio']); if(blank(bio)) $("#profile-bio-section").hide(); else $("#profile-bio").html(bio).find('img').css('max-width', '100%'); if(data['gender'] == 'male'){ $(".female-specific").hide(); } else{ $(".male-specific").hide(); } var html = ''; //videos if(data['videos'] && data['videos'].length > 0){ for(var i = 0; i < data['videos'].length; i++){ if ( data['videos'][i]['visibility'] != 'SUBSCRIPTION') { let dataVideoThumb = cam4.sfw? data['videos'][i]['medias'][0]['thumbnailBlurredUrl'] : data['videos'][i]['medias'][0]['thumbnailUrl'] let dataVideoId = data['videos'][i]['medias'][0]['id']; html += '
'; html += '
'; html += ''; html += '
'; html += '
'; } } $("#profile-videos").html(html); $("#profile-videos-section").show(); } //Images slider let photos_html = ''; let lastLoadedId = false; let loading = false; let noMorePosts = false; function loadMedia(media) { let cover = media.medias[0].thumbnailUrl ? (cam4.sfw ? media.medias[0].thumbnailBlurredUrl : media.medias[0].thumbnailUrl) : media.coverThumbnailUrl; let imageURL = media.medias[0].mediaUrl; let galleryTitle = media['text'] ? media['text'] : 'Photo from ' + media['username']; media_html = '
'; media_html += '
'; media_html += '
'; if (media['visible']) { if (cam4.sfw) { media_html += ''; } else { media_html += ''; } if (media.medias.length > 1) { media_html += '1/' + media.medias.length +''; } } else { media_html += ''; media_html += ''; } media_html += '
'; media_html += media.medias.length > 1 ? '' : ''; media_html += '
'; media_html += '
'; if (media.medias.length > 1) { for (let m = 1; m < media.medias.length; m++) { let extraURL = media.medias[m].mediaUrl; media_html += ''; } } media_html += loadMediaBody(media); media_html += ''; media_html += '
'; // thumb-box media_html += '
'; // thumb-box media_html += '
'; // col return media_html; } function loadPhotos(initial = false) { if (loading || noMorePosts) return; loading = true; cam4.getUserActivityFeed('CataleyaGlow', 'IMAGE', 10, lastLoadedId, false, function(data){ if (data && data.length > 0) { for (let j = 0; j < data.length; j++) { if (data[j]['visibility'] != 'SUBSCRIPTION') { photos_html += loadMedia(data[j]); } } $("#profile-photos").html(photos_html); $("#profile-photos-section").show(); $(".fancybox").fancybox(); // Update lastLoadedId lastLoadedId = data[data.length - 1].id; // If fewer than 10 posts, stop pagination if (data.length < 10) { noMorePosts = true; } loading = false; } else { noMorePosts = true; loading = false; } }); } // Initial load loadPhotos(true); // Infinite scroll for section $(window).on('scroll', function() { let section = $("#profile-photos-section"); if (section.length && !noMorePosts) { let sectionBottom = section.offset().top + section.outerHeight(); let scrollBottom = $(window).scrollTop() + $(window).height(); if (scrollBottom >= sectionBottom - 100) { loadPhotos(); } } }); //hide loader and show profile $("#profile-loader-wrapper").remove(); $("#profile-container").show(); $(document).on('click', '.market-gallery-btn', function () { const $btn = $(this); const $parent = $btn.closest('.gallery-purchase-buttons'); // If already waiting for confirmation → Confirm clicked if ($btn.data('confirm') === true) { // Show loading state $btn.html(''); cam4.buyActivityFeedPost($btn.data('username'), $btn.data('media'), function(status){ if(status){ cam4.getActivityFeedPost($btn.data('username'), $btn.data('media'), function(data){ if (data) { let post = loadMedia(data); $('#post-' + $btn.data('media')).replaceWith(post); cam4.getBalance(); } }); } else { showTokensModal(); } }); return; } // First click → set confirm mode setConfirmState($parent, $btn); }); // Cancel button logic $(document).on('click', '.market-gallery-cancel', function () { const $parent = $(this).closest('.gallery-purchase-buttons'); resetButton($parent); }); // ----- Helpers ----- function setConfirmState($parent, $btn) { // Reset all other containers $('.gallery-purchase-buttons').each(function () { resetButton($(this)); }); if (!$btn.data('original-html')) { $btn.data('original-html', $btn.html()); } $btn.data('confirm', true).html(' Buy'); // Inject cancel button inside parent if not there if ($parent.find('.market-gallery-cancel').length === 0) { $parent.append(''); } } function resetButton($parent) { const $btn = $parent.find('.market-gallery-btn'); if ($btn.data('original-html')) { $btn.html($btn.data('original-html')); } $btn.data('confirm', false); $parent.find('.market-gallery-cancel').remove(); } } else{ //profile not found $("#profile-loader-wrapper").hide(); $("#profile-container").hide(); $("#profile-not-found").show(); } $(".fancybox").fancybox(); //attach the buttons that trigger this modal to all blurred elements $("#profile-container .blur.blur-small").each(function(){ $(this).parent().css('position', 'relative').append(forced_trigger_small); }); }); cam4.onRoomOffline = function(){ cam4._showInfo(cam4.msgs['room_offline']); setTimeout(function(){ $("#chatroom-container").slideUp('fast'); $("#online-cams").show(); }, 3000); $('#main-navbar').show(); // Add cams if room goes offline var cam_page = 1; var cam_n = 12; cam4.getCams("&orderBy=MOST_VIEWERS", cam_page, cam_n, function(cams){ if(cams.length > 0){ var html = '

Cataleyaglow is offline right now, here are some other cams that might interest you.

'; for(var i = 0; i < cams.length; i++){ html += '
'; html += '
'; html += '
'; html += '
'; if(cam4.sfw || false) html += '
'; else html += '
'; html += '
'; html += '
'; html += ''; if(true) html += ''+cams[i]['country']+' flag '; html += cams[i]['nickname']; html += ''; html += '
'; html += performerGender(cams[i]['gender'], true); html += '
'; html += '
'; html += '
'; html += ''+cams[i]['viewers']; html += '
'; html += '
'; html += '
'; html += '
'; } html += '
'; $("#online-cams").html(html); if(!is_mobile){ $('.pink-preview').pinkPreview(); } //attach the buttons that trigger this modal to all blurred elements $("#online-cams div.blur.blur-small").each(function(){ $(this).parent().css('position', 'relative').append(forced_trigger_small); }); $('.thumb-box').on('click', function(e){ //prevent this from happening if we have a click from the button added by the SFW mode if(e.target.nodeName == "A") return; if ($(this).attr('data-room')) { window.location.href = $(this).attr('data-room'); } }) } }); } cam4.getBroadcastHistory('CataleyaGlow', function(data){ if (data.status && data.status == 2) { $('.online-chart-container').remove(); return; } const date = new Date(); const days = data.days; const broadcastKeys = Object.keys(data.totalBroadcastsPerHours); const chartElement = document.getElementById('online-chart'); let chosenDayNum = date.getDay(); loadOnlineChart(chartElement, chosenDayNum, days, broadcastKeys, ['#0357ab', '#242424']); $('#days-switcher i').on('click', function(){ if ($(this).hasClass('prev-day')) { chosenDayNum--; if (chosenDayNum < 0) { chosenDayNum = 6; } } else { chosenDayNum++; if (chosenDayNum > 6) { chosenDayNum = 0; } } loadOnlineChart(chartElement, chosenDayNum, days, broadcastKeys, ['#0357ab', '#242424']); }); }); }); if (cam4.sfw){ $('.registration-modal-bg').addClass('blur blur-small'); } }, onBadAccessHash: function () { //instead lets do this in the global js //only redirect to logout if not on embed page //if(document.location.pathname.indexOf('/embed/') == -1) //window.location = '/en/logout'; }, }, camsBlacklist: ["kate0000","cyborgc18","chilliteen","june_hotsexy","ladysexylily","mashapink","clarafrenchx","carolyneburell","sahorix","gtantn01","lartssy","tianabrown00","madame_louise","tommyaussie","camboy193","teenmilkfun","teenloads","teenloadz","teen_loads","geexxgreen","white_boy_tj88","showparejaarg","maixxx73","zeus608","dickthump69","nahuebjrs","nanahings","sexy18hunboy","brunanurse","pornbobby_","jon_b_good","tonyxxx333","simon8t","patatraki","bienvoyonsvoir","selenevixxa","fuegodulcesexy","lagobianco","lexilustsex","curtis7899","ottercummer","doltro","_fun_lover_","cocksox25","elina94","GoddessTransSex","hotlatina33","batman9103","nia_blonde2","babydarkk77","konovii","einfachgeilfuni","kinkysubslutuk","xvitany","arianacoco","giangibus2s","euripide2","pasdepeseudo","hungstraightbwc","lagobianco","scambicaldi","ibanez_1","morenogym222","azzurro197","costantin_elena","pika158","darkybreeze","teresinainsina","aishaox","actexhib","buttslut4you","lareini1","abbedul","selenevixxa","stifler2026","tuttizie","deadpole20","nakedfunhome","greenylp","boygirl32","naked69xx","activojeropa","saradelicia26","nakedmagicx","kingkonglabomba","kimy69000","klariz09","greatgatsby_xxx","aster_deusa_","channel_charnel","yngkrissz","effy_pamela","crissbga","skinnybwc","antonellamareal","hungwhitedude","hungwhitedick","twix_69_","mr_ra","foguinho85","reibaj55","thegreek06","annaok01","cherrypuure","ambersomner9555","gabr1elev","bbykira","timotea97"], }; function readBadAccessHashGuardTimestamp(){var e=0;try{e=parseInt(sessionStorage.getItem(BAD_ACCESS_HASH_GUARD_KEY)||"0",10)}catch(t){e=0}return e>0||"undefined"!=typeof Cookies&&(e=parseInt(Cookies.get(BAD_ACCESS_HASH_GUARD_KEY)||"0",10))>0||(e=parseInt(window[BAD_ACCESS_HASH_GUARD_WINDOW_KEY]||"0",10))>0?e:0}function writeBadAccessHashGuardTimestamp(e){try{sessionStorage.setItem(BAD_ACCESS_HASH_GUARD_KEY,String(e))}catch(e){}"undefined"!=typeof Cookies&&Cookies.set(BAD_ACCESS_HASH_GUARD_KEY,String(e),{expires:1/1440,path:"/"}),window[BAD_ACCESS_HASH_GUARD_WINDOW_KEY]=e}function clearBadAccessHashGuardTimestamp(){try{sessionStorage.removeItem(BAD_ACCESS_HASH_GUARD_KEY)}catch(e){}"undefined"!=typeof Cookies&&Cookies.remove(BAD_ACCESS_HASH_GUARD_KEY,{path:"/"}),window[BAD_ACCESS_HASH_GUARD_WINDOW_KEY]=null}function showRegisterModal(){$("#login-modal").modal("hide"),$("#register-modal").modal()}function showLoginModal(e){$(".modal").modal("hide"),e&&$("#login-verified").show(),$("#login-modal").modal()}function showTokensModal(){$("#buy-tokens-modal").modal()}function showLangModal(){$("#lang-modal").modal(),$("#sidebar-modal").removeClass("opened")}function showProfileDetailsModal(){$("#profile-details-modal").modal()}function showGoldModal(){$(".modal").modal("hide"),$("#buy-gold-modal").modal()}function performerGender(e,t){switch(e){case 0:case"male":return t?'':"male";case 1:case"female":return t?'':"female";case 2:case"shemale":return t?'':"shemale"}}function setupCamsPager(e,t,a){e>1?$("#pager-prev").attr("href","?page="+(e-1)).show():($("#pager-prev").attr("href","#").hide(),$("#link-prev").remove()),a?$("#pager-next").attr("href","?page="+(e+1)).show():($("#pager-next").attr("href","#").hide(),$("#link-next").remove()),$("#cams-pager").show()}function capitalizeFirstLetter(e){return blank(e)?"---":e.charAt(0).toUpperCase()+e.slice(1)}function currentAge(e){if(blank(e))return"--";var t=new Date,a=new Date(e),s=t.getFullYear()-a.getFullYear(),n=t.getMonth()-a.getMonth();return(n<0||0===n&&t.getDate()";return n+="
",n+="",n+="
"}function showPassword(e){var t=document.getElementById(e);"password"===t.type?t.type="text":t.type="password"}function updateAgeToMinMaxInQueryString(e){const t=new URLSearchParams(e);if(t.has("age")){const e=t.get("age"),[a,s]=e.split("-").map(Number);t.delete("age"),t.set("minAge",a),t.set("maxAge",s)}return t.toString()}function updateQueryFilters(e){if(e){let t=e.replace(/(^|\?|&)(orientation=)/,"$1sexPreference=").replace(/(^|\?|&)(hair=)/,"$1hairColor=").replace(/(^|\?|&)(body=)/,"$1bodyType=").replace(/(^|\?|&)(bodyType=)(bbw|petite)/g,(e,t,a,s)=>t+a+("bbw"===s?"large":"slimPetite")).replace(/(^|\?|&)(bodyType=)morethanAverage/,"$1$2moreThanAverage").replace(/(^|\?|&)(ethnicity=)ebony/,"$1$2black");return t=updateAgeToMinMaxInQueryString(t),"&"+t}return""}function defineSiteGender(e){let t=!1;if(Array.isArray(e))for(const a of e){if(t=new URLSearchParams(a).get("gender"),t)break}else t=new URLSearchParams(e).get("gender");"male"===t&&($('[data-subcat="30-49"]').html(RAILS.translations.sidebarDilfs),$('[data-subcat="60-100"]').html(RAILS.translations.sidebarGrandpas)),"female"===t&&$('[data-subcat="gay"]').html(RAILS.translations.sidebarLesbian)}function onCaptchaSubmit(){window.currentCaptchingForm&&(currentCaptchingForm.submit(),window.currentCaptchingForm=!1)}function resetTokensValue(){$(".member-balance").each(function(){$(this).find(".balance-value").hide(),$(this).find(".lds-ring").show()})}function requireAllFields(e){const t=e.find("button"),a=e.find(".form-control");let s=!0;a.each(function(){$(this).is("input, textarea, select")&&!$(this).val().trim()&&(s=!1)}),t.toggleClass("disabled",!s)}function trackAndRedirect(e){const t=e.includes("performer")?e.split("performer=")[1]:"";$.get(e+"&aff_sub=traffic_mode&format=json",{},function(e){if(1===e?.response?.status){let a="https://www.cam4.com/"+t+"?act=hasOffers_"+e.response.data.transaction_id;RAILS.site.tfTriggerSignup&&(a+="&showSignupPopup"),document.location=a}},"json")}function setupFieldValidator(e){let t=null,a=0;const s=$("#register-form").find("button[type='submit']"),n=$("#username-alert"),o=$("#username-icon"),r=$("#usernames-suggested");e.on("input",function(){const i=e.val().trim();if(clearTimeout(t),""===i)return s.prop("disabled",!0),o.attr("class","bi bi-x text-danger"),n.hide(),void r.hide().empty();t=setTimeout(()=>{const t=++a;"username"===e.data("field-type")&&cam4.validateUsername(i,function(i){if(t===a)if("ok"===i.code)s.prop("disabled",!1),o.attr("class","bi bi-check text-success"),n.hide(),r.hide().empty();else{let t="";switch(i.code){case"username_exists":t=RAILS.translations.usernameExists;break;case"invalid_numbers":t=RAILS.translations.usernameNumbers;break;case"invalid_username":t=RAILS.translations.usernameInvalid}n.empty().append(`${t}`).show(),s.prop("disabled",!0),o.attr("class","bi bi-x text-danger"),Array.isArray(i.suggestedUsernames)&&i.suggestedUsernames.length>0?(r.empty(),i.suggestedUsernames.forEach(e=>{const t=$(`${e}`);r.append(t)}),r.show()):r.hide().empty(),r.off("click",".suggested-username-pill").on("click",".suggested-username-pill",function(){const t=$(this).text();e.val(t).trigger("input")})}})},300)})}function redirectLink(e){trackAndRedirect(RAILS.site.bizTrackingLink.replace(/&/g,"&").replace("{{REPLACE-ME}}",e))}function formatDuration(e){let t=Math.floor(e/1e3),a=Math.floor(t/3600),s=Math.floor(t%3600/60),n=t%60;return a>0?`${a}:${s.toString().padStart(2,"0")}:${n.toString().padStart(2,"0")}`:`${s}:${n.toString().padStart(2,"0")}`}function showRecaptchaBadge(e){const t=document.querySelector(".grecaptcha-badge"),a=document.querySelector("form[data-recaptcha-badge]");t&&(t.style.display=a||e?"block":"none",t.style.visibility=a||e?"visible":"hidden")}function hideRecaptchaBadge(){const e=document.querySelector(".grecaptcha-badge"),t=document.querySelector("form[data-recaptcha-badge]");e&&!t&&(e.style.display="none",e.style.visibility="hidden")}function handleReactionCounter(e){const t=$(e),a=t.hasClass("active"),s=t.data("username"),n=t.data("id"),o=t.find("i"),r=t.find(".counter"),i=parseInt(r.text(),10)+(a?-1:1);o.attr("class",a?"bi bi-heart":"bi bi-heart-fill"),r.text(i),t.toggleClass("active",!a),cam4.reactToActivityFeedPost(s,n,!a)}function initBlurredFeed(e,t){const a=RAILS.site.showBlurAfterSeconds,s=RAILS.site.blurAfterSeconds;a&&e&&!t&&setTimeout(function(){$("body").addClass("blur-feed");const e=$("#chatroom");e.length&&($("body").hasClass("modal-open")||showLoginModal(!1),e.addClass("blur-big").on("click",()=>showLoginModal(!1)))},1e3*s)}function containerToCamsFlag(){try{var e=localStorage.getItem("to_cams");if("true"===e||"false"===e)return"true"===e}catch(e){}var t=container.data("to-cams");return!0===t||"true"===t}const is_guest=RAILS.isGuest,is_mobile=document.documentElement.clientWidth<768;let balance=RAILS.balance;var urlParams=new URLSearchParams(window.location.search),verified=urlParams.get("verified"),showTokens=urlParams.get("showtokens"),showLogin=urlParams.get("showlogin");const hide_membership=urlParams.get("hidemembership"),no_avs=urlParams.get("noavs"),tokens_modal_timeout=urlParams.get("tokensmodaltimeout"),tokens_modal_interval=urlParams.get("tokensmodalinterval");var tokens_modal_limit=urlParams.get("tokensmodallimit");tokens_modal_limit||(tokens_modal_limit=5);const BAD_ACCESS_HASH_GUARD_KEY="pl_bad_access_hash_logout_at",BAD_ACCESS_HASH_GUARD_WINDOW_KEY="__plBadAccessHashLogoutAt";RAILS.isGuest&&clearBadAccessHashGuardTimestamp(),Cam4Api.verbose=RAILS.envVerbose;var cam4=new Cam4Api;cam4.setup({rest_domain:RAILS.site.domain,domain:RAILS.site.domainFull,full_domain:RAILS.site.fullDomain,tokens_return_path:RAILS.paths.tokensReturn,membership_return_path:RAILS.paths.membershipReturn,verification_return_path:RAILS.paths.verificationReturn,username:RAILS.user.username,access_hash:RAILS.user.accessHash,disable_upsells:!!hide_membership,disable_avs:!!no_avs,cams_blacklist:RAILS.camsBlacklist,onGetProducts:displayProducts,onGetCryptoProducts:displayCryptoProducts,onGetMembershipProducts:displayMembershipProducts,onBalance:function(e){$(".member-balance").each(function(){$(this).find(".lds-ring").hide(),$(this).find(".balance-value").html(e).show()})},onUserInfo:function(){RAILS.functions.onUserInfo()},onBadAccessHash:function(){RAILS.functions.onBadAccessHash();var e=Date.now(),t=readBadAccessHashGuardTimestamp();if(t>0&&e-t<15e3)return cam4.username="",void(cam4.access_hash="");document.location.pathname.includes("/embed/")||(writeBadAccessHashGuardTimestamp(e),window.location=RAILS.paths.logout)},onPaymentPopupOpen:function(){$("#buy-gold-modal .lds-ring, #buy-tokens-modal .lds-ring").remove(),$(".modal").modal("hide")}}),"traffic_site"!==RAILS.site.bizModel&&(is_guest||(urlParams.get("hidemembership")||cam4.getMembershipProducts(),cam4.getTokenProducts(),resetTokensValue(),cam4.getBalance())),$(function(){window.t=function(e){if(!e)return"---";var t=e.split("."),a=window.I18n;return $(t).each(function(e,t){a&&(a=a[t])}),!a&&console?(console.debug("No translation found for key: "+e),"N/A"):a}}),document.addEventListener("DOMContentLoaded",showRecaptchaBadge),setTimeout(showRecaptchaBadge,1e3); var trigger = $('.hamburger'), isClosed = false; trigger.click(function () { hamburger_cross(); }); function hamburger_cross() { if (isClosed == true) { trigger.removeClass('is-open'); trigger.addClass('is-closed'); isClosed = false; // $('body').css('overflow-y', 'auto'); } else { // $('body').css('overflow-y', 'hidden'); trigger.removeClass('is-closed'); trigger.addClass('is-open'); isClosed = true; } } $('[data-toggle="offcanvas"]').click(function () { $('#page-wrapper').toggleClass('toggled'); }); $('#page-content-wrapper .container-fluid').on('click', function(event){ if ($('#page-wrapper').hasClass('toggled')) { var clickedElement = $(event.target); if (clickedElement.attr('id') !== 'mobile-chat-header-burger' && clickedElement.attr('class') !== 'bi bi-list') { $('#page-wrapper').toggleClass('toggled'); hamburger_cross(); } } }); $(document).ready(function() { const urlParams = new URLSearchParams(window.location.search); const isEmbeded = false; const disablefc = isEmbeded || urlParams.get('disablefc') == 1; //show registration modal every 2.5min for a maximum of three times for guests if (is_guest){ var reg_count = 0; var reg_int = setInterval(function(){ if(reg_count < 3){ if (!($("#login-modal").is(':visible'))) { reg_count++; showRegisterModal(); } } else clearInterval(reg_int); }, 150000); } //age verification overlay if( !(Cookies.get("age_check_agree") == 1) ){ $('#age-verification-modal').modal(); $('#age-verification-modal button').on('click', function(e){ if ($(this).attr('data-action') == 'continue') { Cookies.set("age_check_agree", 1, { expires: 365, path: '/' }); } }); $('#age-verification-modal').on('hidden.bs.modal', function () { $(".swf-cover").remove(); }); }else{ $(".swf-cover").remove(); } //do we need to show the login modal with the success message? if(parseInt(verified) == 1){ showLoginModal(true); } //do we need to show the buy tokens/register form if(parseInt(showTokens) == 1){ if(is_guest) showRegisterModal(); else showTokensModal(); } //do we need to show the login form if(parseInt(showLogin) == 1 && is_guest){ showLoginModal(false); } //do we need to set a timeout for the tokens modal if(tokens_modal_timeout){ var seconds = parseInt(tokens_modal_timeout); if(!isNaN(seconds) && !is_guest && balance <= tokens_modal_limit){ setTimeout(function(){ showTokensModal(); }, seconds * 1000); } } //do we need to set an interval for the tokens modal if(tokens_modal_interval){ var seconds_int = parseInt(tokens_modal_interval); if(!isNaN(seconds_int) && !is_guest && balance <= tokens_modal_limit){ setInterval(function(){ showTokensModal(); }, seconds_int * 1000); } } //do we need to remove the membership option? if(hide_membership){ $("#buy-gold-btn").remove(); $("#buy-gold-modal").remove(); } //Handle username field validator $(".js-field-validate").each(function () { setupFieldValidator($(this)); }); $('.modal.show-captcha').on('shown.bs.modal', function (e) { showRecaptchaBadge(true); }); $('.modal.show-captcha').on('hidden.bs.modal', function (e) { hideRecaptchaBadge(); }); // Report modal handlers (used by sexcouk chatroom report button) if ($('#report-content-modal').length > 0) { var getReportReasons = function(targetType) { if (targetType === 'post') { return [ { value: 'creatorUnderage', label: 'Creator Underage<\/span>' }, { value: 'creatorAdvertising', label: 'Creator Advertising<\/span>' }, { value: 'inappropriateContent', label: 'Inappropriate content' } ]; } return [ { value: 'broadcasterUnderage', label: 'Broadcaster underage' }, { value: 'broadcasterPlayingVideo', label: 'Broadcaster playing video' }, { value: 'broadcasterAdvertising', label: 'Broadcaster advertising' }, { value: 'inappropriateContent', label: 'Inappropriate content' } ]; }; var applyReportReasonOptions = function(targetType) { var $reason = $('#report-reason'); var reasons = getReportReasons(targetType); var optionsHtml = ''; if (targetType !== 'post') { optionsHtml = ''; } reasons.forEach(function(reason) { optionsHtml += ''; }); $reason.html(optionsHtml); // Post flow must always submit one of the 3 allowed reasons. if (targetType === 'post' && reasons.length > 0) { $reason.val(reasons[0].value); } }; var getReportTitle = function(targetType, username) { if (targetType === 'post') { return 'Report Post'; } return 'Report ' + username; }; var isPostTarget = function() { return $('#report-target-type').val() === 'post'; }; var syncReportCommentErrorState = function() { if (isPostTarget()) { $('#report-information').removeClass('report-field-error'); return; } var isOtherSubReason = $('#report-reason').val() === 'inappropriateContent' && $('#report-sub-reason').val() === 'other'; var hasComment = $('#report-information').val().trim().length > 0; $('#report-information').toggleClass('report-field-error', isOtherSubReason && !hasComment); }; var toggleReportSubReason = function() { var isPostReport = isPostTarget(); var isInappropriateContent = $('#report-reason').val() === 'inappropriateContent'; var $subReasonWrap = $('#report-sub-reason-wrap'); var $subReason = $('#report-sub-reason'); var $comment = $('#report-information'); var isOtherSubReason = isInappropriateContent && $subReason.val() === 'other'; if (isPostReport) { $subReasonWrap.hide(); $subReason.prop('disabled', true); $subReason.prop('required', false); $subReason.val(''); $comment.closest('.report-comments-wrap').hide(); $comment.prop('required', false); $comment.removeClass('report-field-error'); $comment.val(''); return; } $comment.closest('.report-comments-wrap').show(); $subReasonWrap.toggle(isInappropriateContent); $subReason.prop('disabled', !isInappropriateContent); $subReason.prop('required', isInappropriateContent); $comment.prop('required', isOtherSubReason); if (!isInappropriateContent) { $subReason.val(''); } syncReportCommentErrorState(); }; $(document).off('click.reportModal').on('click.reportModal', '.js-open-report-modal', function(e) { e.preventDefault(); var $button = $(this); var targetType = ($button.data('report-target-type') || 'stream').toString(); var targetId = ($button.data('report-target-id') || '').toString(); var username = ($button.data('report-target-user') || '').toString(); var targetUrl = ($button.data('report-target-url') || '').toString(); applyReportReasonOptions(targetType); $('#report-target-type').val(targetType); $('#report-target-id').val(targetId); $('#report-target-user').val(username); $('#report-target-url').val(targetUrl); $('#report-content-modal-title').text(getReportTitle(targetType, username)); $('#report-content-modal').modal('show'); toggleReportSubReason(); }); $('#report-reason').off('change.reportModal').on('change.reportModal', function() { toggleReportSubReason(); }); $('#report-sub-reason').off('change.reportModal').on('change.reportModal', function() { toggleReportSubReason(); }); $('#report-information').off('input.reportModal').on('input.reportModal', function() { syncReportCommentErrorState(); }); $('#report-content-submit-btn').off('click.reportModal').on('click.reportModal', function(e) { e.preventDefault(); var targetType = $('#report-target-type').val(); var targetId = $('#report-target-id').val(); var broadcasterUsername = $('#report-target-user').val(); var abuseType = $('#report-reason').val(); var abuseSubtype = $('#report-sub-reason').val(); var comment = $('#report-information').val().trim(); if (targetType === 'post') { if (!abuseType) { $('#report-content-success').hide(); $('#report-content-error').show(); $('#report-reason').trigger('focus'); return; } cam4.reportPost(targetId, abuseType, function(status, data) { if (status >= 200 && status < 300) { $('#report-content-error').hide(); $('#report-content-success').show(); setTimeout(function() { $('#report-content-modal').modal('hide'); }, 2000); } else { $('#report-content-success').hide(); $('#report-content-error').show(); } }); return; } if (abuseSubtype === 'other' && comment.length === 0) { $('#report-content-success').hide(); $('#report-content-error').show(); syncReportCommentErrorState(); $('#report-information').trigger('focus'); return; } cam4.reportBroadcaster(broadcasterUsername, abuseType, abuseSubtype || 'other', comment, function(status, data) { if (status >= 200 && status < 300) { $('#report-content-error').hide(); $('#report-content-success').show(); setTimeout(function() { $('#report-content-modal').modal('hide'); }, 2000); } else { $('#report-content-success').hide(); $('#report-content-error').show(); } }); }); $('#report-content-modal').off('hidden.bs.modal.reportModal').on('hidden.bs.modal.reportModal', function() { var $form = $('#report-content-form'); if ($form.length > 0) { $form[0].reset(); } $('#report-content-success').hide(); $('#report-content-error').hide(); syncReportCommentErrorState(); applyReportReasonOptions('stream'); toggleReportSubReason(); $('#report-content-modal-title').text('Report'); }); applyReportReasonOptions('stream'); toggleReportSubReason(); } const forms = document.querySelectorAll('form:has([id^="g-recaptcha-response-data-"])'); forms.forEach(form => { const buttons = form.querySelectorAll('button[type="submit"], input[type="submit"]'); buttons.forEach(btn => { btn.addEventListener('click', function (e) { if (form._recaptchaSubmitting) { form._recaptchaSubmitting = false; return; } e.preventDefault(); e.stopImmediatePropagation(); const input = form.querySelector('[id^="g-recaptcha-response-data-"]'); if (!input) { form.submit(); return; } // clean old token input.value = ''; let action = input.id .replace('g-recaptcha-response-data-', '') .replace(/[^a-zA-Z0-9_]/g, '_'); grecaptcha.ready(() => { grecaptcha.execute( '6LfJV_QrAAAAAI3GxuP55ob9KFrCJfKbC8YyKqEc', { action } ).then(token => { input.value = token; // allow one submit form._recaptchaSubmitting = true; $(form).trigger('submit.rails'); }).catch(err => { console.error('reCAPTCHA failed:', err); }); }); }); }); // Server error handler form.addEventListener('ajax:error', () => { form._recaptchaSubmitting = false; const input = form.querySelector('[id^="g-recaptcha-response-data-"]'); if (input) input.value = ''; }); }); // Theme-scoped default: set "to_cams" flag to true unless already configured. // Ensure this runs on normal load and when pages are restored from bfcache (back/forward). (function(){ function setDefaultToCams(){ try { localStorage.setItem('to_cams', 'true'); } catch(e) {} } setDefaultToCams(); window.addEventListener('pageshow', setDefaultToCams); window.addEventListener('popstate', setDefaultToCams); })(); is_mobile&&($("#chatroom-container").addClass("mobile"),$("#chatroom").addClass("mobile"),$(".header").hide(),$("#chatroom-tour-tip-performer span").html(''),$("#start-private").html(''),$("#stop-private").html(''),$("#cancel-private-request").html(''),$(".js-open-report-modal").html(''),$("#toggle-mobile-chat").show(),$("#video").click(function(){toggleVideoZoom()}));const hide_ui=urlParams.get("hideui");hide_ui&&($(".header").hide(),$(".overlay-chat").hide(),$(".overlay-bottom").hide(),$("#mobile-chat-header-member").hide(),$("#mobile-chat-header-rank").hide(),$("#mobile-chat-header-logo").hide(),$("#mobile-chat-header-performer").hide(),$("#video").css("padding-top","0")),emojione.imagePathSVGSprites="/assets/emojione.sprites.svg",emojione.imageType="png",emojione.sprites=!0,emojione.unicodeAlt=!1,emojione.ascii=!0,$(window).bind("load resize",function(){is_mobile&&$("#chatroom-container").css("height",window.innerHeight),$("body").css("padding",0)});var BLUR_RADIUS=80,canvas=document.getElementById("video-background"),canvasContext=canvas.getContext("2d");drawBlur=function(){var e=canvas.width,i=canvas.height,t=document.getElementById("video");canvasContext.drawImage(t,0,0,e,i),stackBlurCanvasRGBA("video-background",0,0,e,i,BLUR_RADIUS)},$("#chat-message").on("keydown",function(e){13==e.keyCode&&(e.preventDefault(),send())}),$(document).on("click",function(e){$('[data-toggle="popover"]').each(function(){$(this).is(e.target)||0!==$(this).has(e.target).length||0!==$(".popover").has(e.target).length||$(this).popover("hide")})}),$("#video").on("loadeddata",function(){""===$("#video")[0].canPlayType("application/vnd.apple.mpegurl")?drawBlur():canvas.style.backgroundColor="black"}),$("video").bind("contextmenu",function(){return!1}),$("#custom-tip-submit").click(function(e){var i=parseInt($("#custom-tip-value").val());!isNaN(i)&&i>=1&&(tip(i),$("#custom-tip-modal").modal("hide")),e.preventDefault()}),initBlurredFeed(is_guest,disablefc); $("#market-video-btn").click(function(){ //show register modal if the user is not logged in if(!is_guest){ var btn_text = $(this).html(); $(this).html($(this).data('disable-with')); var videoID = $(this).data('videoid'); var username = $(this).data('name'); cam4.buyActivityFeedPost(username, videoID, function(status){ if(status){ cam4.getActivityFeedPost(username, videoID, function(data){ if (data) { //show the video $("#market-video-footer").hide(); $("#market-video-thumb").hide(); $("#market-video-video").attr('src', data['medias'][0]['mediaUrl']).show(); $("#market-video-video-wrapper").show(); cam4.getBalance(); } }); } else{ $('#market-video-modal').modal('hide'); showTokensModal(); } }, 'json'); } else{ $('#market-video-modal').modal('hide'); showRegisterModal(); } }); $('#market-video-modal').on('hidden.bs.modal', function () { $("#market-video-video").get(0).pause(); }); $("#quick-reg").submit(function(e){ e.preventDefault(); }); $("#navbar-logo").show(); //Picture in picture $(document).scroll(function() { if (!is_mobile) { let video = document.getElementById("video"); if ($(document).scrollTop() >= 600) { if (!$('#video').hasClass('pic-closed')) { $('#video').addClass('pic-in-pic'); var picInPicBtns = document.getElementById('pic-in-pic-btns'); if (!picInPicBtns) { $('').insertBefore('.pic-in-pic'); $('#scroll-top').on('click', function(e){ window.scrollTo(0, 0); }); $('#close-pic-in-pic').on('click', function(e){ $('#video').removeClass('pic-in-pic').addClass('pic-closed'); $('#pic-in-pic-btns').remove(); }); } else { var videoHeight = $('.pic-in-pic').height() + 20; $('#pic-in-pic-btns').css('bottom', videoHeight); } } } else { $('#video').removeClass('pic-in-pic').removeClass('pic-closed'); $('#pic-in-pic-btns').remove(); } } }); var camsBase = "/en/cams"; $('.sidebar-query').each(function(){ var container = $(this); function containerToCamsFlag() { try { var ls = localStorage.getItem('to_cams'); if (ls === 'true' || ls === 'false') return ls === 'true'; } catch (e) {} var attr = container.data('to-cams'); return attr === true || attr === 'true'; } var urlObj = new URL(window.location.href); container.find('.add-to-query-link, .add-to-query-link-static').each(function(){ let cat = $(this).attr('data-cat'); let subcat = $(this).attr('data-subcat'); if (!cat) return; let param = urlObj.searchParams.get(cat); if (param == subcat) { $(this).closest('ul, .cat-container, li.nav-item, div.cat-container').addClass('active-link-enabled'); $(this).addClass("active"); } }); // Toggle/set/remove query parameter (either on current page or redirect to cams) container.find('.add-to-query-link, .add-to-query-link-static').on('click', function(e){ e.preventDefault(); let cat = $(this).attr('data-cat'); let subcat = $(this).attr('data-subcat'); let toCams = containerToCamsFlag(); if (toCams) { // Build URL based on the link's href (redirect to cams or specific cams_* path) let base = $(this).attr('href'); if (!base || base.trim() === '' || $(this).hasClass('add-to-query-link-static')) base = camsBase; let url = new URL(base, window.location.origin); if (cat) { if (subcat === '' || url.searchParams.get(cat) === subcat) url.searchParams.delete(cat); else url.searchParams.set(cat, subcat); } url.searchParams.delete('page'); window.location.href = url.toString(); return; } if (!cat) return; let url = new URL(window.location.href); if (subcat === '' || url.searchParams.get(cat) === subcat) { url.searchParams.delete(cat); } else { url.searchParams.set(cat, subcat); } url.searchParams.delete('page'); window.location.href = url.toString(); }); }); forced_trigger_small = '
\n \n Free registration<\/a>\n Login<\/a>\n<\/div>'; forced_trigger_big = '
\n \n

\n To watch this content you need to verify your age. This is required by law.
\n Click the button below to get started.\n <\/p>
\n
Free registration<\/a>\n Login<\/a>\n<\/div>'; var camsBase = "/en/cams"; $('.links-query').each(function(){ var container = $(this); var urlObj = new URL(window.location.href); container.find('.add-to-query-link, .add-to-query-link-static').each(function(){ let cat = $(this).attr('data-cat'); let subcat = $(this).attr('data-subcat'); if (!cat) return; let param = urlObj.searchParams.get(cat); if (param == subcat) { $(this).closest('ul, .cat-container, li.nav-item, div.cat-container').addClass('active-link-enabled'); $(this).addClass("active"); } }); // Toggle/set/remove query parameter (either on current page or redirect to cams) container.find('.add-to-query-link, .add-to-query-link-static').on('click', function(e){ e.preventDefault(); let cat = $(this).attr('data-cat'); let subcat = $(this).attr('data-subcat'); let toCams = containerToCamsFlag(); if (toCams) { // Build URL based on the link's href (redirect to cams or specific cams_* path) let base = $(this).attr('href'); if (!base || base.trim() === '' || $(this).hasClass('add-to-query-link-static')) base = camsBase; let url = new URL(base, window.location.origin); if (cat) { if (subcat === '' || url.searchParams.get(cat) === subcat) url.searchParams.delete(cat); else url.searchParams.set(cat, subcat); } url.searchParams.delete('page'); window.location.href = url.toString(); return; } if (!cat) return; let url = new URL(window.location.href); if (subcat === '' || url.searchParams.get(cat) === subcat) { url.searchParams.delete(cat); } else { url.searchParams.set(cat, subcat); } url.searchParams.delete('page'); window.location.href = url.toString(); }); }); //Update pager query $('#cams-pager .btn').on('click', function(e){ e.preventDefault(); let page = this.getAttribute("href").substring(1).split('=')[1]; let url = new URL(window.location.href); url.searchParams.set('page', page); window.location.href = url.toString(); }); $('[data-toggle="tooltip"]').tooltip(); filter_top = 0; $(window).on('load resize scroll', function(){ //handle the positioning of the sidebar if it's open if($(this).scrollTop() < filter_top){ document.getElementById("sidebar").style.top = $(this).scrollTop()+'px'; filter_top = $(this).scrollTop(); } }); // $("#sidebar-backdrop").click(() => { toggleFilters(); }); }); function toggleMobileMenu(){ toggleFilters(); } function displayMembershipProducts(products){ //generate the methods tabs var payments = []; for(var i = 0; i < products.length; i++){ for(var j = 0; j < products[i].categories.length; j++){ for(var k = 0; k < products[i].categories[j].methods.length; k++){ var t = products[i].categories[j].methods[k].type; if(typeof t == "undefined") t = 13; if(!payments.includes(t)){ let cryptoSelector = ''; if (t == 'CR') { cam4.getCryptoProducts(products[i].id); cryptoSelector = '

'; } payments.push(t); $("#gold-payment-tabs").append('
  • '); $("#gold-payment-tabs-content").append('
    '+cryptoSelector+'
    '); } let href = 'javascript:cam4.purchaseMembershipProduct(\''+t+'\',\''+products[i].id+'\',\''+products[i].categories[j].methods[k].processorId+'\',);'; var details = '

    '+getPeriod(products[i].details.recurringPeriod)+''; details += products[i].currency.symbol+(products[i].amount / Math.round(products[i].details.recurringPeriod / 30)).toFixed(3).replace(/\.(\d\d)\d?$/, '.$1')+' / month

    (billed at '+products[i].currency.symbol+products[i].amount+')
    '; $("#gold-tab-"+t).append(details); } } } //adds loader animation to the payment-box link $('#buy-gold .payment-box').on('click', function(e){ $(this).find('.lds-ring').remove(); $(this).append('

    '); }); } function getPeriod(p){ switch(p){ case 30: return "1 Month"; case 90: return "3 Months"; case 365: return "12 Months"; } } function getMonthlyCost(p, a){ Math.round(a / p); } function displayProducts(products){ //generate the methods tabs var payments = []; for(var i = 0; i < products.length; i++){ for(var j = 0; j < products[i].categories.length; j++){ for(var k = 0; k < products[i].categories[j].methods.length; k++){ var t = products[i].categories[j].methods[k].type; if(!payments.includes(t)){ payments.push(t); let cryptoSelector = ''; if (t == 'CR') { cam4.getCryptoProducts(products[i].id); cryptoSelector = '
    '; } $("#payment-tabs").append(''); $("#payment-tabs-content").append('
    '+cryptoSelector+'
    '); } if(products[i].type == "TOKENS"){ var href = 'javascript:cam4.purchaseTokensProduct(\''+t+'\',\''+products[i].id+'\',\''+products[i].categories[j].methods[k].processorId+'\',);'; if(false && products[i].quantity >= 0){ var details = '

    '+products[i].quantity+' '; details += (products[i].quantity + 0)+' Tokens '; details += '0 Bonus Tokens ($9.95)

    '; details += '' + products[i].currency.symbol+products[i].amount+''; details += '
    '; } else{ if (t == 'GC') { var gcMessage = "You can now pay for CAM4 Tokens by trading any gift card. Instant access, 100% anonymous, no credit card required."; var details = '

    '+gcMessage+'

    '; } else { var details = '

    '+products[i].quantity+' Tokens'; details += '

    '+ products[i].currency.symbol+products[i].amount+'
    '; } } $("#tab-"+t).append(details); } } } } //adds loader animation to the payment-box link $('.payment-box').on('click', function(e){ $(this).find('.lds-ring').remove(); $(this).append('
    '); }); } function displayCryptoProducts(products) { let cryptoSelectors = $(".crypto-selector"); cryptoSelectors.each(function(){ let parentTab = $(this).attr("data-tab"); var html = ''; if (products){ html = ''; } $(this).html(html); }); } function updateRates(rate = false, crypto = false, fiat = false, parentTab) { //SVG for the convert icon let convertIcon = ''; //get values on page load and cryptoselect if (!rate) rate = $('#' + parentTab).find(".cryptos").find(":selected").attr('data-rate'); if (!crypto) crypto = $('#' + parentTab).find(":selected").val(); if (!fiat) fiat = $('#' + parentTab).find(":selected").attr('data-fiat'); //Get crypto tab var priceTabs = $("#" + parentTab); //Convert prices to the selected crypto priceTabs.find('.payment-box small.price-value').each(function(){ $(this).html($(this).attr('init-currency') + $(this).attr('ammount') + '
    ' + ($(this).attr('ammount') * (1/rate)).toFixed(8) + ' ' + convertIcon ); }); //Update link to the selected crypto priceTabs.find('a').each(function(){ const initHref = $(this).attr('init-href'); let updatedHref = initHref.replace(");","'" + crypto + "','" + fiat + "');"); $(this).attr('href', updatedHref); }); } /** * All config. options available here: * https://cookieconsent.orestbida.com/reference/configuration-reference.html */ CookieConsent.run({ guiOptions: { consentModal: { layout: 'bar inline', position: 'bottom left' } }, categories: { necessary: { enabled: true, // this category is enabled by default readOnly: true // this category cannot be disabled }, analytics: { enabled: true, } }, language: { default: 'en', translations: { en: { consentModal: { title: 'We use cookies', description: 'This website uses cookies to enhance user navigation and to collect statistical data. For more information please click on the link to learn more. By continuing to browse on this website, you accept the use of cookies for the above purposes.', acceptAllBtn: 'Accept all', acceptNecessaryBtn: 'Reject all', showPreferencesBtn: 'Manage Individual preferences' }, preferencesModal: { title: 'Manage cookie preferences', acceptAllBtn: 'Accept all', acceptNecessaryBtn: 'Reject all', savePreferencesBtn: 'Accept current selection', closeIconLabel: 'Close modal', sections: [ { title: 'Cookie usage', description: 'We use cookies to ensure the basic functionalities of the website and to enhance your online experience. You can choose for each category to opt-in/out whenever you want. For more details relative to cookies and other sensitive data, please read the full privacy policy. Here' }, { title: 'Strictly Necessary cookies', description: 'These cookies are essential for the proper functioning of the website and cannot be disabled.', //this field will generate a toggle linked to the 'necessary' category linkedCategory: 'necessary' }, { title: 'Performance and Analytics', description: 'These cookies collect information about how you use our website. All of the data is anonymized and cannot be used to identify you.', linkedCategory: 'analytics' }, { title: 'More information', description: 'For any queries in relation to our policy on cookies and your choices, please Contact Us' } ] } } } } }); function initializeChatroom(){cam4.setupChatroom({room:"cataleyaglow",balance:parseInt("0"),el_video:"video",el_timer:"private-timer",exit_url:'/en/cams',username:"",access_hash:"",msgs:{room_offline:'This room is offline.',room_private:'This room is currently in private.',connecting:'Connecting...',private_finished:'Private finished.',room_group_show:'This room is currently in a Group Show.',room_paused:'This room will come back shortly.',requesting_private:'Requesting Private Show...',cancelling_private:'Cancelling the Private Show...',stopping_private:'Stopping the Private Show...',stopped_private:'Private Show stopped.',no_funds:'You don't have enough tokens.',spam:'You are spamming the chat by sending the same message multiple times.',too_many:'You are sending too many messages.',not_allowed_without_tokens:'The performer only allows chatting when you have tokens.',not_allowed:'The performer disabled chatting.',not_in_group:'You are not in the group of users allowed to chat in this room.'},onChatStarted:function(){$("#start-private").show(),$("#stop-private").hide(),$("#cancel-private-request").hide(),is_mobile&&positionMobileProgressBar()},onPrivateStarted:function(){$("#start-private").hide(),$("#stop-private").show(),$("#cancel-private-request").hide()},onViewersCount:function(e){$("#viwers-counter").text(e)},onRoster:function(){},onInsuficientFunds:onInsuficientFunds,onTip:onTip,onGift:onGift,onChatMessage:updateChat,onClearChat:function(){$("#chat-body").html("")},onBalance:function(e){$(".member-balance").each(function(){$(this).find(".lds-ring").hide(),$(this).find(".balance-value").html(e),$(this).find(".balance-value").show()})},onPrivateSettings:function(e,t,a,o,i){if(e)if($("#private-btns").show(),a){for(var s="",n="",r="",l=0;l

    '+c[0]+' mins ',s+=(c[1]/c[0]).toFixed(1)+" tokens/min

    "+c[2]+"
    ",n=""}s+='',$("#private-unlimited").hide(),$("#private-blocks-content").html(s),$("#private-blocks-content").show()}else $("#private-price").html(t),$("#private-min-time").html("tokens/minute (until you end show or your balance runs out) (%{minutes} minutes minimum charge).".replace("%{minutes}",i)),$("#private-unlimited").html("tokens/minute (until you end show or your balance runs out) (%{minutes} minutes minimum charge).".replace("%{minutes}",i)),$("#private-unlimited").show();else $("#private-btns").hide()},onTicketSale:function(e,t,a,o,i){if(i?($("#ticket-price").html('').removeClass("btn-primary").addClass("btn-success"),$("#ticket-sale").attr("onclick","").off()):(""==$("#ticket-sale").attr("onclick")&&$("#ticket-sale").attr("onclick","buyGroupShowTicket();"),$("#ticket-price").html(' '+e+' Tokens').removeClass("btn-danger").removeClass("btn-success").addClass("btn-primary")),!is_mobile){var s=$("#ticket-sale").width();$("#ticket-sale").css("left",document.documentElement.clientWidth/2-s/2+"px")}$("#ticket-sale").fadeIn("fast")},onFailedTicketSale:function(){resetTokensValue(),cam4.getBalance(),$("#ticket-sale").fadeOut("fast")},onRoomOffline:function(){cam4._showInfo(cam4.msgs.room_offline),setTimeout(function(){$("#chatroom-container").slideUp("fast")},3e3)},onRoomPrivate:function(){cam4._showInfo(cam4.msgs.room_private),setTimeout(function(){$("#chatroom-container").slideUp("fast")},3e3)},onRoomPaused:function(){$("#stop-private").hide(),$("#start-private").show()},onTicketPurchased:function(e){resetTokensValue(),cam4.getBalance(),e.ok?($("#ticket-price").html('').removeClass("btn-primary").addClass("btn-success"),$("#ticket-sale").attr("onclick","").off()):$("#ticket-price").html(' Error').removeClass("btn-primary").addClass("btn-danger")},onGoal:function(e){if(e&&!blank(e.goal)){var t=100*parseInt(e.goalbalance)/parseInt(e.goal);$("#tip-progressbar").attr("aria-valuenow",t),$("#tip-progressbar").attr("aria-valuemax",blank(e.goal)?0:e.goal),$("#tip-progressbar").css("width",t+"%"),$("#tip-progress-current").html(blank(e.goalbalance)?0:e.goalbalance),$("#tip-progress-goal").html(blank(e.goal)?0:e.goal),$("#goal-message").html("GOAL: "+decodeURIComponent(e.message)).show(),$("#goal-link").show()}else $("#goal-message").hide(),$("#goal-link").hide()}})}function send(){is_guest?(link='It\'s FREE, register now',$("#chat-body").append('
    Only members can chat with our models, so why don\'t you register '+link+"
    "),$("#chat-body").scrollTop($("#chat-body")[0].scrollHeight)):cam4.sendToChat($("#chat-message").val()),$("#chat-message").val("")}function startPrivate(){cam4.requestPrivateShow(cam4.private_blocks?$("#selected-block").val():null)&&($("#cancel-private-request").show(),$("#start-private").hide()),$("#private-details-modal").modal("hide")}function cancelPrivateRequest(){cam4.cancelPrivateShowRequest(),$("#cancel-private-request").hide(),$("#start-private").show()}function stopPrivate(){cam4.stopPrivateShow()}function selectTimeBlock(e,t){$(".payment-box.selected").removeClass("selected"),$("#block-"+e).addClass("selected"),$("#selected-block").val(t)}function updateChat(e,t,a,o){a=a.replace(//g,">").replace(/\"/g,"""),a='

    '+t+'

    '+(a=o?emojione.shortnameToImage(replaceAddons(a)):a)+"

    ",$("#chat-body").append(a),$("#chat-body").scrollTop($("#chat-body")[0].scrollHeight)}function onTip(e,t,a){a&&updateTips(t),updateChatWithTip(e,t)}function onGift(e,t,a){msg='

    '+e+" sent a gift!

    ",$("#chat-body").append(msg),$("#chat-body").scrollTop($("#chat-body")[0].scrollHeight),a&&($("#gift-pic").attr("src",t),$("#gift-showcase").fadeIn("fast",function(){setTimeout(function(){$("#gift-showcase").fadeOut("fast")},3e3)}))}function onInsuficientFunds(){""==cam4.username||null==cam4.username?(screenfull.exit(),$("#register-modal").modal()):(screenfull.exit(),$("#buy-tokens-modal").modal())}function updateChatWithTip(e,t){msg='

    '+e+" sent "+t+" tokens!

    ",$("#chat-body").append(msg),$("#chat-body").scrollTop($("#chat-body")[0].scrollHeight)}function updateTips(e){var t=parseInt($("#tip-progress-goal").html()),a=parseInt($("#tip-progress-current").html()),o=100*a/t;$("#tip-progressbar").attr("aria-valuemax",t),$("#tip-progressbar").attr("aria-valuenow",a+e),$("#tip-progressbar").css("width",o+"%"),$("#tip-progress-current").html(a+e)}function customTip(){$("#custom-tip-modal").modal()}function tip(e){cam4.balance i").hasClass("bi-volume-up")?($("#video").prop("muted",!0),$("#mute-btn > i").removeClass("bi-volume-up").addClass("bi-volume-off")):($("#video").prop("muted",!1),$("#mute-btn > i").removeClass("bi-volume-off").addClass("bi-volume-up"))}function displayGuestNotice(){$("#guest-notice-modal").modal()}function replaceAddons(e){var t={'[hi]':Array("[hi]"),'[yes]':Array("[yes]"),'[no]':Array("[no]"),'[makelove]':Array("[makelove]"),'[play]':Array("[play]"),'[horny]':Array("[horny]"),'[webcam]':Array("[webcam]"),'[busy]':Array("[busy]"),'[brb]':Array("[brb]"),'[bfn]':Array("[bfn]"),'[cool]':Array("[cool]"),'[ok]':Array("[ok]"),'[omg]':Array("[omg]"),'[smiley]':Array("[smiley]"),'[talk]':Array("[talk]"),'[kiss]':Array("[kiss]"),'[hot]':Array("[hot]"),'[rocket]':Array("[rocket]"),'[censored]':Array("[censored]"),'[approved]':Array("[approved]"),'[whatsup]':Array("[whatsup]"),'[mail]':Array("[mail]"),'[fuck]':Array("[fuck]"),'[thankyou]':Array("[thankyou]")};for(var a in t)for(var o=0;o i").hasClass("fa-comments")?($(".overlay-chat").hide(),$("#chat-message").hide(),$("#toggle-mobile-chat > i").removeClass("fa-comments").addClass("fa-comment")):($(".overlay-chat").show(),$("#chat-message").show(),$("#toggle-mobile-chat > i").removeClass("fa-comment").addClass("fa-comments"))}function positionMobileProgressBar(){var e=$("#chatroom-container").width()-$("#mute-btn").outerWidth(!0)-$("#private-btns").outerWidth(!0)-$("#tip-group").outerWidth(!0)-10;$("a.progress").width(e),$("a.progress").prependTo(".performer-actions"),$(".overlay-chat").width(.5*$("#chatroom-container").width()),$(".chatbox-input-wrapper").prependTo(".overlay-bottom"),$(".viewers-counter").appendTo(".overlay-chat")}function toggleVideoZoom(){"cover"==$("#video").css("object-fit")?$("#video").css("object-fit","contain"):$("#video").css("object-fit","cover")}function buyGroupShowTicket(){var e=$("#ticket-price").html();if($("#ticket-price").html(''),!is_mobile){var t=$("#ticket-sale").width();$("#ticket-sale").css("left",document.documentElement.clientWidth/2-t/2+"px")}cam4.buyGroupShowTicket()||$("#ticket-price").html(e)}RegExp.escape=function(e){return e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")}; function columnSize(id) { $('.layout-adjuster a').removeClass('active'); $('#'+id).addClass('active'); switch (id) { case 'three-cols' : $('.dynamic-col').removeClass('col-md-3 col-md-7-columns').addClass('col-md-4'); localStorage.setItem("columns", "three-cols"); break; case 'four-cols' : $('.dynamic-col').removeClass('col-md-7-columns col-md-4').addClass('col-md-3'); localStorage.setItem("columns", "four-cols"); break; case 'six-cols' : $('.dynamic-col').removeClass('col-md-4 col-md-3').addClass('col-md-7-columns'); localStorage.setItem("columns", "six-cols"); break; } } function showVideo(id, username){ //populate modal and show it $("#market-video-title").text($("#video-"+id).data('name')); $("#market-video-description").text($("#video-"+id).data('description')); $("#market-video-duration").text($("#video-"+id).data('duration')); $("#market-video-tags").text($("#video-"+id).data('tags')); $("#market-video-price").text($("#video-"+id).data('price')); if($("#video-"+id).data('purchased')){ $("#market-video-footer").hide(); $("#market-video-thumb").hide(); $("#market-video-video").attr('poster', $("#video-"+id).data('thumb')); $("#market-video-video-wrapper").show(); //load the video url let videoUrl = $("#video-"+id).data('video'); //load the video url if(videoUrl){ $("#market-video-loading").hide(); $("#market-video-video").attr('src', videoUrl).show().get(0).play(); } } else{ $("#market-video-video").hide(); $("#market-video-video-wrapper").hide(); $("#market-video-footer").show(); $("#market-video-btn").attr('data-videoid', id); $("#market-video-btn").attr('data-name', username); $("#market-video-thumb").css('background-image', 'url('+$("#video-"+id).data('thumb')+')').show(); } $('#market-video-modal').modal(); } function drawOnlineChart(element, labels, data, colors) { if (Object.keys(Chart.instances).length > 0) { Object.values(Chart.instances).forEach(chart => chart.destroy()); } const currentHour = new Date().getHours(); new Chart(element, { type: 'bar', data: { labels: labels, datasets: [{ label: 'Online Chart', minBarLength: 5, data: data, backgroundColor: Array.from(data, (_, i) => i === currentHour ? colors[0] : colors[1] // 1 for the current hour, 0 for others ), borderWidth: 1 }] }, options: { plugins: { legend: { display: false // Disable the title }, tooltip: { enabled: false // Disable tooltips } }, animations: { tension: { duration: 1000, easing: 'linear', from: 1, to: 0, loop: true } }, scales: { x: { grid: { display: false // Hides grid lines on x-axis }, ticks: { callback: function(value, index, ticks) { // Show the label only for every third index return index % 3 === 0 ? this.getLabelForValue(value) : ''; }, autoSkip: false, color: colors[2] || Chart.defaults.color } }, y: { beginAtZero: true, grid: { display: false // Hides grid lines on x-axis }, border: { display: false // Explicitly hides the border line }, ticks: { display: false // Hides the labels on the y-axis }, } } } }); } function loadOnlineChart(chartElement,chosenDayNum, days, broadcastKeys, colors) { const week = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']; const locals = [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ]; const dataPoints = 24; let chosenDay = week[chosenDayNum]; $('#day-title').text(locals[chosenDayNum]); let result = days.filter((d) => d.day == chosenDay.toUpperCase()); let broadcasts = result[0]? result[0].broadcastsPerHours : Array(dataPoints).fill(0); drawOnlineChart(chartElement, broadcastKeys, broadcasts, colors); } function quickRegistration(e){ //populare the real registration form and show it $("#member_username").val($("#quick-username").val()); $("#member_email").val($("#quick-email").val()); $("#member_password").val($("#quick-pwd").val()); $("#member_password_confirmation").val($("#quick-pwd-conf").val()); showRegisterModal(); e.preventDefault(); return false; } function showForcedAgeVerificationModal(){ cam4.openAgeVerificationPopup(); } function toggleFilters(){ $('#page-wrapper').toggleClass('toggled'); }