1(function(){ 2 window.addEventListener('cookieadmin_before_consent_display', function(){ 3 if(cookieadmin_pro_handle_gpc()){ 4 cookieadmin_policy.hide_banner = true; 5 } 6 }); 7 8 // Handle click on blocked content to accept and show 9 document.addEventListener('click', function(e){ 10 var blockedElement = e.target.closest('.cookieadmin-content-blocker'); 11 if(blockedElement){ 12 const category = blockedElement.getAttribute('data-cookieadmin-category'); 13 var preference = {}; 14 15 if(cookieadmin_is_obj(cookieadmin_is_consent) && cookieadmin_is_consent.action){ 16 preference = cookieadmin_is_consent.action; 17 } 18 19 if(category){ 20 21 if(preference.reject && ((preference.reject === true) || (preference.reject === 'true'))){ 22 preference = {}; 23 } 24 25 preference[category] = 'true'; 26 if(preference.functional && preference.marketing && preference.analytics){ 27 preference = {accept : 'true'}; 28 } 29 var gpc_message = cookieadmin_pro_vars.gpc_alert_load_content ? cookieadmin_pro_vars.gpc_alert_load_content : ''; 30 if(cookieadmin_pro_set_consent(preference, 365, gpc_message)){ 31 cookieadmin_pro_enable_blocked_content(preference); 32 } 33 } 34 } 35 }); 36})() 37 38function cookieadmin_pro_set_consent(prefrenc, days, gpc_message = '') { 39 40 // Handling GPC override, preventing GPC signal 41 if(cookieadmin_pro_vars && cookieadmin_pro_vars.respect_gpc){ 42 if(!cookieadmin_pro_handle_set_gpc(gpc_message)){ 43 return false; 44 } 45 } 46 47 const data = 'action=cookieadmin_pro_ajax_handler&cookieadmin_act=save_consent' + 48 '&cookieadmin_preference=' + encodeURIComponent(JSON.stringify(Object.keys(prefrenc))); 49 50 51 let payload = data; 52 if (cookieadmin_is_obj(cookieadmin_is_consent) && !!cookieadmin_is_consent.consent) { 53 payload += '&cookieadmin_consent_id=' + cookieadmin_is_consent.consent; 54 } 55 56 // Make async request â don't block or wait 57 const xhttp = new XMLHttpRequest(); 58 59 xhttp.open('POST', cookieadmin_pro_vars.ajax_url, true); // true = async 60 61 xhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); 62 63 xhttp.onload = function () { 64 if(this.status === 200){ 65 try { 66 const parsed = JSON.parse(this.responseText); 67 if (parsed.success && parsed.data && parsed.data.response) { 68 cookieadmin_save_consent_cookie(prefrenc, days, parsed.data.response); 69 70 // Showing override option if we have GPC enabled. 71 if(cookieadmin_pro_vars && cookieadmin_pro_vars.respect_gpc){ 72 var overrideEle = document.getElementById('cookieadmin_gpc_override'); 73 74 if(overrideEle){ 75 overrideEle.style.display = 'block'; 76 } 77 } 78 79 // Enable blocked content after consent 80 cookieadmin_pro_enable_blocked_content(prefrenc); 81 } 82 } catch (e) { 83 console.error("Invalid JSON response:", e); 84 } 85 } 86 }; 87 88 xhttp.onerror = function () { 89 console.error("AJAX request failed"); 90 }; 91 92 xhttp.send(payload); 93 94 // Immediately return 95 return true; 96} 97 98function cookieadmin_pro_enable_blocked_content(prefrenc){ 99 const blockedElements = document.querySelectorAll('.cookieadmin-content-blocker'); 100 101 blockedElements.forEach(function(element){ 102 const category = element.getAttribute('data-cookieadmin-category'); 103 104 if(!category){ 105 return; 106 } 107 108 // Check if user has consented to this category 109 const hasCategoryConsent = prefrenc.hasOwnProperty(category) && (prefrenc[category] === true || prefrenc[category] === 'true'); 110 111 // Check if user accepted all (accept: true means all categories) 112 const hasAcceptAll = prefrenc.hasOwnProperty('accept') && (prefrenc.accept === true || prefrenc.accept === 'true'); 113 114 if(hasCategoryConsent || hasAcceptAll){ 115 cookieadmin_pro_replace_blocked_element(element); 116 } 117 }); 118} 119 120function cookieadmin_pro_replace_blocked_element(element){ 121 const placeholder = element; 122 123 placeholder.removeAttribute('style'); 124 placeholder.querySelectorAll('.cookieadmin-content-thumbnail').forEach(e => e.remove()); 125 placeholder.querySelectorAll('.cookieadmin-accept-content').forEach(e => e.remove()); 126 127 const iframe = placeholder.getElementsByTagName('iframe')[0]; 128 if(iframe && iframe.dataset.cookieadminSrc){ 129 iframe.src = iframe.dataset.cookieadminSrc; 130 iframe.removeAttribute('data-cookieadmin-src'); 131 } 132} 133 134// Decided if GPC is enabled and if user has enabled the override when saving preference 135function cookieadmin_pro_handle_set_gpc(message){ 136 var consentData = cookieadmin_is_cookie("cookieadmin_consent"); 137 if (consentData && consentData.respect_gpc) { 138 var override = document.getElementById('cookieadmin-override_gpc'); 139 140 if(!override || !override.checked){ 141 alert(message ? message : (cookieadmin_pro_vars.gpc_alert ? cookieadmin_pro_vars.gpc_alert : 'Please accept override GPC before saving preference.')); 142 return false;
143 } 144 } 145 146 return true; 147} 148 149// GPC (Global Privacy Control) Detection and Handling 150function cookieadmin_pro_check_gpc(){ 151 // Check if respect_gpc setting is enabled 152 if(!cookieadmin_pro_vars || !cookieadmin_pro_vars.respect_gpc){ 153 return false; 154 } 155 156 // Check navigator.globalPrivacyControl property (browser-level GPC signal) 157 if(typeof navigator !== 'undefined' && typeof navigator.globalPrivacyControl !== 'undefined'){ 158 if(navigator.globalPrivacyControl === true || navigator.globalPrivacyControl === 'true'){ 159 return true; 160 } 161 } 162 163 // Check if GPC was detected server-side (Sec-GPC header) 164 if(cookieadmin_pro_vars && cookieadmin_pro_vars.gpc_enabled){ 165 return true; 166 } 167 168 return false; 169} 170 171function cookieadmin_pro_handle_gpc(){ 172 // Check if GPC is enabled and should be respected 173 if(!cookieadmin_pro_check_gpc()){ 174 return false; 175 } 176 177 // Handling visibility of Override option in Cookie Customizer modal 178 var overRideEle = document.getElementById('cookieadmin_gpc_override'); 179 var consentData = cookieadmin_is_cookie("cookieadmin_consent"); 180 181 if(overRideEle){ 182 overRideEle.style.display = (consentData && consentData.respect_gpc === true) ? '' : 'none'; 183 } 184 185 // Check if consent was already saved 186 if(consentData){ 187 return false; 188 } 189 190 // Apply auto-reject consent for GPC users 191 // Only allow necessary/functional cookies, reject analytics and marketing 192 const gpc_preferences = { 193 'functional': true, 194 'respect_gpc': true, 195 }; 196 197 // Set consent for 365 days 198 cookieadmin_pro_set_consent(gpc_preferences, 365); 199 200 // Show GPC honored message if banner element exists 201 cookieadmin_pro_show_gpc_message(); 202 203 return true; 204} 205 206function cookieadmin_pro_show_gpc_message() { 207 208 var toast = document.getElementById('cookieadmin-gpc-toast'); 209 210 if(!toast){ 211 return; 212 } 213 214 closeBtn = toast.querySelector('button'); 215 216 if(!closeBtn){ 217 return; 218 } 219 220 // Add hover effects for the close button 221 closeBtn.addEventListener('mouseenter', () => closeBtn.style.opacity = '1'); 222 closeBtn.addEventListener('mouseleave', () => closeBtn.style.opacity = '0.7'); 223 224 // Add click event to remove the toast with a fade-out animation 225 closeBtn.addEventListener('click', () => { 226 toast.style.opacity = '0'; 227 toast.style.transform = 'translateY(20px)'; 228 toast.style.transition = 'opacity 0.3s ease, transform 0.3s ease, visibility 0s 0.3s'; 229 toast.style.visibility = 'hidden'; 230 setTimeout(() => { 231 if (document.body.contains(toast)) { 232 document.body.removeChild(toast); 233 } 234 }, 300); // Wait for transition to finish 235 }); 236 237 // Trigger the fade-in animation 238 requestAnimationFrame(() => { 239 toast.style.visibility = 'visible'; 240 toast.style.opacity = '1'; 241 toast.style.transform = 'translateY(0)'; 242 toast.style.transition = 'opacity 0.3s ease, transform 0.3s ease, visibility 0s'; 243 }); 244 245 // Auto-hide after 10 seconds 246 setTimeout(() => { 247 if(document.body.contains(toast)){ 248 toast.style.opacity = '0'; 249 toast.style.transform = 'translateY(20px)'; 250 toast.style.transition = 'opacity 0.3s ease, transform 0.3s ease, visibility 0s 0.3s'; 251 toast.style.visibility = 'hidden'; 252 setTimeout(() => { 253 if (document.body.contains(toast)) { 254 document.body.removeChild(toast); 255 } 256 }, 300); 257 } 258 }, 10000); 259} 260
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.