1document.addEventListener('DOMContentLoaded', () => { 2 const KEY = 'site_cookie_prefs_v1'; 3 4 // helper-safe getter 5 const $ = id => document.getElementById(id); 6 7 const cookieBanner = $('cookieBanner'); 8 const prefsModal = $('prefsModal'); 9 const manageBtn = $('manageBtn'); 10 const acceptAllBtn = $('acceptAllBtn'); 11 const savePrefs = $('savePrefs'); 12 const cancelPrefs = $('cancelPrefs'); 13 const openPrefsFooter = $('openPrefsFooter'); 14 const analyticsToggle = $('analyticsToggle'); 15 const marketingToggle = $('marketingToggle'); 16 const debugReset = $('debugReset'); 17 18 // verify elements exist 19 if (!cookieBanner) { console.log('cookieBanner missing'); return; } 20 21 // safe parse 22 function safeParse(raw) { 23 try { return JSON.parse(raw); } catch (e) { console.warn('corrupt prefs, removing'); localStorage.removeItem(KEY); return null; } 24 } 25 26 function defaultPrefs() { return { essential: true, analytics: true, marketing: true, ts: new Date().toISOString() }; } 27 28 function loadPrefs() { 29 const raw = localStorage.getItem(KEY); 30 if (!raw) return null; 31 return safeParse(raw); 32 } 33 34 function savePrefsToStorage(p) { 35 try { 36 localStorage.setItem(KEY, JSON.stringify(p)); 37 console.log('Preferences saved:', p); 38 hideBanner(); 39 closeModal(); 40 applyPrefs(p); 41 } catch (e) { 42 console.log('Cannot save prefs:', e); 43 alert('ש×××× ×ש××רת ××¢×פ×ת â ××××§ ×××ר×ת ×פ×פ×/פר×××ת.'); 44 } 45 } 46 47 function applyPrefs(p) { 48 if (!p) return; 49 if (p.analytics) enableAnalytics(); else disableAnalytics(); 50 console.log('Marketing enabled?', !!p.marketing); 51 } 52 53 function enableAnalytics() { 54 if (window.__analytics_loaded) return; 55 window.__analytics_loaded = true; 56 loadAnalytics(); 57 console.log('Analytics: loading (...)'); 58 } 59 function disableAnalytics() { console.log('Analytics: disabled'); } 60 61 function showBanner() { cookieBanner.style.display = 'flex'; cookieBanner.setAttribute('aria-hidden', 'false'); } 62 function hideBanner() { 63 cookieBanner.style.display = 'none'; cookieBanner.setAttribute('aria-hidden', 'true'); 64 debugReset.style.display = 'block'; 65 } 66 function openModal() { 67 if (!prefsModal) { console.warn('prefsModal not found'); return; } 68 prefsModal.style.display = 'flex'; 69 const p = loadPrefs() || defaultPrefs(); 70 analyticsToggle.checked = !!p.analytics; 71 marketingToggle.checked = !!p.marketing; 72 analyticsToggle.focus(); 73 } 74 function closeModal() { if (prefsModal) prefsModal.style.display = 'none'; } 75 76 // events (guard each element) 77 if (manageBtn) manageBtn.addEventListener('click', openModal); 78 if (debugReset) debugReset.addEventListener('click', openModal); 79 if (openPrefsFooter) openPrefsFooter.addEventListener('click', openModal); 80 if (acceptAllBtn) acceptAllBtn.addEventListener('click', () => { 81 savePrefsToStorage({ essential: true, analytics: true, marketing: true, ts: new Date().toISOString() }); 82 }); 83 if (savePrefs) savePrefs.addEventListener('click', () => { 84 const p = { essential: true, analytics: !!analyticsToggle.checked, marketing: !!marketingToggle.checked, ts: new Date().toISOString() }; 85 savePrefsToStorage(p); 86 }); 87 if (cancelPrefs) cancelPrefs.addEventListener('click', closeModal); 88 if (prefsModal) prefsModal.addEventListener('click', e => { if (e.target === prefsModal) closeModal(); }); 89 90 // debug reset 91 //if (debugReset) debugReset.addEventListener('click', () => { 92 // localStorage.removeItem(KEY); 93 // console.log('Prefs removed. Reloading...'); 94 // location.reload(); 95 //}); 96 97 // initial flow 98 try { 99 const prefs = loadPrefs(); 100 if (!prefs) { 101 console.log('No prefs found â showing banner'); 102 showBanner(); 103 } else { 104 console.log('Prefs loaded:', prefs); 105 hideBanner(); 106 applyPrefs(prefs); 107 } 108 } catch (err) { 109 console.log('Initialization error:', err); 110 // show banner as fallback 111 showBanner(); 112 } 113 114 // helpful global for debugging 115 window.getCookiePrefs = () => loadPrefs(); 116 117 // global error handler (dev help) 118 window.addEventListener('error', (ev) => { 119 console.log('Window error captured:', ev.error || ev.message); 120 });
121 function loadAnalytics() { 122 if (window.__analytics_loaded) return; // ×× ×××¢×× ×¤×¢×××× 123 window.__analytics_loaded = true; 124 125 // ××¢× ×ת ×סקר××¤× ×©× GA4 126 const s = document.createElement('script'); 127 s.async = true; 128 s.src = 'https://www.googletagmanager.com/gtag/js?id=GTM-KMQ4995'; // <<-- ש×× ××× ×ת ×××× GA4 ש×× 129 document.head.appendChild(s); 130 131 // ×ת×× ×ת gtag 132 window.dataLayer = window.dataLayer || []; 133 function gtag() { dataLayer.push(arguments); } 134 window.gtag = gtag; 135 gtag('js', new Date()); 136 gtag('config', 'GTM-KMQ4995'); // <<-- ×××ª× ×××× ××× ×××¢×× 137 138 console.log('Analytics: GA4 loaded'); 139 140 } 141 142 143}); 144
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.