1(function() { 2 'use strict'; 3 4 var COOKIE_NAME = 'dgis_cookie_prefs'; 5 var analyticsPatterns = []; 6 var marketingPatterns = []; 7 8 if (typeof DGIS_COOKIE_DATA === 'object' && DGIS_COOKIE_DATA) { 9 COOKIE_NAME = DGIS_COOKIE_DATA.cookieName || COOKIE_NAME; 10 if (Array.isArray(DGIS_COOKIE_DATA.analytics_patterns)) analyticsPatterns = DGIS_COOKIE_DATA.analytics_patterns; 11 if (Array.isArray(DGIS_COOKIE_DATA.marketing_patterns)) marketingPatterns = DGIS_COOKIE_DATA.marketing_patterns; 12 } 13 14 if (!analyticsPatterns.length) analyticsPatterns = ['G-', 'UA-', '_ga', 'gtag/js', 'analytics.js', 'gtm.js', 'hotjar', 'clarity', 'mixpanel', 'plausible.io']; 15 if (!marketingPatterns.length) marketingPatterns = ['fbq', '_fbp', 'fbevents.js', 'tr?id=', 'tiktok', 'ttq', 'adsbygoogle', 'googleadservices', 'pagead2.googlesyndication.com']; 16 17 function getCookie(name) { 18 var parts = ('; ' + document.cookie).split('; ' + name + '='); 19 if (parts.length === 2) return decodeURIComponent(parts.pop().split(';').shift()); 20 return null; 21 } 22 23 function setCookie(name, value, days) { 24 var expires = ''; 25 if (days) { 26 var d = new Date(); 27 d.setTime(d.getTime() + days * 24 * 60 * 60 * 1000); 28 expires = '; expires=' + d.toUTCString(); 29 } 30 document.cookie = name + '=' + encodeURIComponent(value) + expires + '; path=/; SameSite=Lax'; 31 } 32 33 function readPrefs() { 34 var raw = getCookie(COOKIE_NAME); 35 if (!raw) return null; 36 try { return JSON.parse(raw); } catch (e) { return null; } 37 } 38 39 function savePrefs(prefs) { 40 setCookie(COOKIE_NAME, JSON.stringify(prefs), 180); 41 } 42 43 function elementMatchesPatterns(el, patterns) { 44 if (!patterns || !patterns.length) return false; 45 var src = el.getAttribute && el.getAttribute('src') || ''; 46 var html = el.tagName === 'SCRIPT' ? (el.innerHTML || '') : ''; 47 for (var i = 0; i < patterns.length; i++) { 48 var p = patterns[i]; 49 if (!p) continue; 50 if ((src && src.indexOf(p) !== -1) || (html && html.indexOf(p) !== -1)) return true; 51 } 52 return false; 53 } 54 55 function blockByPatterns(patterns) { 56 if (!patterns || !patterns.length) return; 57 var nodes = document.querySelectorAll('script,iframe'); 58 nodes.forEach(function(el) { 59 if (el.dataset && el.dataset.dgisBlocked === '1') return; 60 if (!elementMatchesPatterns(el, patterns)) return; 61 62 if (el.tagName === 'SCRIPT') { 63 var originalSrc = el.getAttribute('src'); 64 if (originalSrc) el.setAttribute('data-dgis-original-src', originalSrc); 65 el.type = 'text/plain'; 66 el.removeAttribute('src'); 67 } else if (el.tagName === 'IFRAME') { 68 if (el.parentNode) el.parentNode.removeChild(el); 69 } 70 if (el.dataset) el.dataset.dgisBlocked = '1'; 71 }); 72 } 73 74 function applyBlocking(prefs) { 75 if (!prefs) { 76 blockByPatterns(analyticsPatterns); 77 blockByPatterns(marketingPatterns); 78 return; 79 } 80 if (!prefs.analytics) blockByPatterns(analyticsPatterns); 81 if (!prefs.marketing) blockByPatterns(marketingPatterns); 82 } 83 84 function restoreBlockedScriptsByPatterns(patterns) { 85 if (!patterns || !patterns.length) return; 86 var blocked = document.querySelectorAll('script[data-dgis-blocked="1"]'); 87 blocked.forEach(function(oldScript) { 88 var src = oldScript.getAttribute('data-dgis-original-src'); 89 if (!src) return; 90 var matched = false; 91 for (var i = 0; i < patterns.length; i++) { 92 if (src.indexOf(patterns[i]) !== -1) { matched = true; break; } 93 } 94 if (!matched) return; 95 96 var s = document.createElement('script'); 97 s.src = src; 98 s.async = oldScript.async; 99 s.defer = oldScript.defer; 100 oldScript.parentNode && oldScript.parentNode.replaceChild(s, oldScript); 101 }); 102 } 103 104 var observerStarted = false; 105 function startObserver() { 106 if (observerStarted || !window.MutationObserver) return; 107 observerStarted = true; 108 var obs = new MutationObserver(function() { 109 applyBlocking(readPrefs()); 110 }); 111 obs.observe(document.documentElement, { childList: true, subtree: true }); 112 } 113
114 function init() { 115 var banner = document.getElementById('dgis-cookie-banner'); 116 if (!banner) return; 117 118 var acceptBtn = document.getElementById('dgis-accept-all'); 119 var rejectBtn = document.getElementById('dgis-reject-all'); 120 var settingsBtn = document.getElementById('dgis-open-settings'); 121 var reopenBtn = document.getElementById('dgis-cookie-reopen'); 122 123 var modal = document.getElementById('dgis-cookie-settings'); 124 var overlay = modal && modal.querySelector('.dgis-overlay'); 125 var analyticsCb = document.getElementById('dgis-analytics'); 126 var marketingCb = document.getElementById('dgis-marketing'); 127 128 function updateReopenVisibility(prefs) { 129 if (!reopenBtn) return; 130 reopenBtn.style.display = prefs ? 'flex' : 'none'; 131 } 132 133 function openModal() { 134 if (!modal) return; 135 var p = readPrefs() || { analytics: false, marketing: false }; 136 if (analyticsCb) analyticsCb.checked = !!p.analytics; 137 if (marketingCb) marketingCb.checked = !!p.marketing; 138 modal.classList.remove('dgis-hidden'); 139 modal.setAttribute('aria-hidden', 'false'); 140 } 141 142 function closeModal() { 143 if (!modal) return; 144 modal.classList.add('dgis-hidden'); 145 modal.setAttribute('aria-hidden', 'true'); 146 } 147 148 var prefs = readPrefs(); 149 applyBlocking(prefs); 150 startObserver(); 151 updateReopenVisibility(prefs); 152 if (prefs) banner.style.display = 'none'; 153 154 if (acceptBtn) { 155 acceptBtn.addEventListener('click', function() { 156 var p = { necessary: true, analytics: true, marketing: true }; 157 savePrefs(p); 158 restoreBlockedScriptsByPatterns(analyticsPatterns); 159 restoreBlockedScriptsByPatterns(marketingPatterns); 160 banner.style.display = 'none'; 161 updateReopenVisibility(p); 162 }); 163 } 164 165 if (rejectBtn) { 166 rejectBtn.addEventListener('click', function() { 167 var p = { necessary: true, analytics: false, marketing: false }; 168 savePrefs(p); 169 applyBlocking(p); 170 banner.style.display = 'none'; 171 updateReopenVisibility(p); 172 }); 173 } 174 175 if (settingsBtn) settingsBtn.addEventListener('click', openModal); 176 if (reopenBtn) reopenBtn.addEventListener('click', openModal); 177 178 var cancelBtn = document.getElementById('dgis-cancel-settings'); 179 if (cancelBtn) cancelBtn.addEventListener('click', closeModal); 180 if (overlay) overlay.addEventListener('click', closeModal); 181 182 var saveBtn = document.getElementById('dgis-save-settings'); 183 if (saveBtn) { 184 saveBtn.addEventListener('click', function() { 185 var p = { 186 necessary: true, 187 analytics: analyticsCb ? analyticsCb.checked : false, 188 marketing: marketingCb ? marketingCb.checked : false 189 }; 190 savePrefs(p); 191 applyBlocking(p); 192 if (p.analytics) restoreBlockedScriptsByPatterns(analyticsPatterns); 193 if (p.marketing) restoreBlockedScriptsByPatterns(marketingPatterns); 194 banner.style.display = 'none'; 195 closeModal(); 196 updateReopenVisibility(p); 197 }); 198 } 199 } 200 201 if (document.readyState === 'loading') { 202 document.addEventListener('DOMContentLoaded', init); 203 } else { 204 init(); 205 } 206})();
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.