1 2// The cookies should bewrapped in an object if more tracking gets added, currently we only enable or disable. 3 4let hostname = window.location.hostname 5let gaTarget = 'G-V0XWB24QL8'; 6 7switch (hostname) { 8 case 'visittorshavn.fo': 9 gaTarget = 'G-H8L8GK3CNH'; 10 break; 11 case 'visitnordoy.fo': 12 gaTarget = 'G-S6T7PWMRCC'; 13 break; 14 case 'visiteysturoy.fo': 15 gaTarget = 'G-JWDWL85J71'; 16 break; 17 case 'visitstreymoy.fo': 18 gaTarget = 'G-DHHVD7Q9CV'; 19 break; 20 case 'visitvagar.fo': 21 gaTarget = 'G-1NVG9QZDKZ'; 22 break; 23 case 'visitsandoy.fo': 24 gaTarget = 'G-1Z0GY0W6CR'; 25 break; 26 case 'visitsuduroy.fo': 27 gaTarget = 'G-FCMXYGJ3SB'; 28 break; 29 case 'visitfaroeislands.fo': 30 gaTarget = 'G-LCRZYVJR0C'; 31 break; 32 default: 33} 34 35window.dataLayer = window.dataLayer || []; 36function gtag() { dataLayer.push(arguments); } 37gtag('js', new Date()); 38 39gtag('config', gaTarget, { 40 'ad_storage': 'denied' 41}); 42 43function setCookies(val /* boolean */) { 44 if (val) { 45 gtag('config', gaTarget, { 46 'analytics_storage': 'permitted', 47 'anonymize_ip': false 48 }); 49 } else { 50 gtag('config', gaTarget, { 51 'ad_storage': 'denied', 52 'analytics_storage': 'denied', 53 'anonymize_ip': true 54 }); 55 } 56} 57 58// Policy panel links 59const links = [ 60 { 61 href: '/privacy-policy', 62 text: 'Go to Privacy & Policy' 63 }, 64 { 65 href: '/cookies-and-analytics', 66 text: 'Go to Cookies & Analytics' 67 } 68]; 69 70document.addEventListener('DOMContentLoaded', (event) => { 71 // Initial cookie card 72 var initCookieCard = document.querySelector('.init-cookie-card'); 73 var acceptCookiesBtn = document.querySelector('.accept-cookies'); 74 var neccesaryBtn = document.querySelector('.accept-necessary-cookies'); 75 76 // Settings button
77 var settingsBtn = document.querySelectorAll('.cookie-settings-btn'); 78 79 // Settings overlay, card and elements 80 var cookieSettings = document.querySelector('.cookie-settings-overlay'); 81 var exitBtn = document.querySelector('.cookie-settings-exit-btn'); 82 83 // Navigation buttons 84 var aboutPanelBtn = document.querySelector('.about-panel-btn'); 85 var settingsPanelBtn = document.querySelector('.settings-panel-btn'); 86 var policyPanelBtn = document.querySelector('.privacy-panel-btn'); 87 88 // Panels 89 var aboutPanelDesktop = document.querySelector('.cookie-about-panel-desktop'); 90 // var aboutPanelMobile = document.querySelector('.cookie-about-panel-mobile'); 91 var settingsPanel = document.getElementsByClassName('cookie-settings-panel'); 92 var policyPanel = document.getElementsByClassName('cookie-policy-panel'); 93 94 [].forEach.call(settingsPanel, panel => { 95 96 // Container for wrapping Title and seettings buttons 97 let topContainer = document.createElement('div'); 98 topContainer.classList.add('settings-content-container') 99 100 let title = document.createElement('h1'); 101 title.classList.add('title'); 102 title.innerHTML = 'Settings'; 103 title.appendChild(document.createElement('hr')); 104 topContainer.appendChild(title); 105 106 // Create a container for each toggle switch 107 let checkBoxContainer = document.createElement('div'); 108 checkBoxContainer.classList.add('accept-cookie-container'); 109 110 // Toggle button 111 let checkBox = document.createElement('button'); 112 checkBox.classList.add('accept-cookie-toggle'); 113 114 // Toggle slider 115 let slider = document.createElement('div'); 116 slider.classList.add('slider'); 117 checkBox.appendChild(slider); 118 let text = document.createElement('div'); 119 text.innerHTML = 'Allow third party cookies'; 120 121 checkBoxContainer.appendChild(text); 122 checkBoxContainer.appendChild(checkBox); 123 topContainer.appendChild(checkBoxContainer); 124 125 panel.appendChild(topContainer); 126 127 // Contianer for buttons in settings panel 128 let btnContainer = document.createElement('div'); 129 btnContainer.classList.add('btn-container'); 130 131 // Accept all button 132 let acceptAll = document.createElement('button'); 133 acceptAll.classList.add('accept-all-cookies'); 134 acceptAll.classList.add('btn'); 135 acceptAll.innerHTML = 'Accept all'; 136 137 btnContainer.appendChild(acceptAll); 138 139 // Settings settings button 140 let save = document.createElement('button'); 141 save.classList.add('save-cookie-settings'); 142 save.classList.add('btn'); 143 save.innerHTML = 'Save changes'; 144 145 btnContainer.appendChild(save); 146 147 panel.appendChild(btnContainer); 148 }); 149 150 // Add links to policy panel 151 [].forEach.call(policyPanel, panel => { 152 153 let linkContainer = document.createElement('div'); 154 linkContainer.classList.add('link-container'); 155 156 links.forEach(link => { 157 let a = document.createElement('a'); 158 a.href = link.href; 159 a.target = '_blank'; 160 a.innerHTML = link.text; 161 162 linkContainer.appendChild(a); 163 }); 164 165 panel.appendChild(linkContainer); 166 }); 167 168 169 // Could've stored the checkboxes/toggle-buttons in an array when initalizing them, but this works too. 170 var accpetCheckbox = document.getElementsByClassName('accept-cookie-toggle'); 171 172 // 173 var saveChanges = document.getElementsByClassName('save-cookie-settings'); 174 var acceptAllSettings = document.getElementsByClassName('accept-all-cookies'); 175 176 // Settings change flag
177 let changes = false; 178 179 // Add state for each cookie (currently only Google Analytics) 180 // Could wrap it in a cookie state object 181 let checkState = false; 182 183 // Helper functions for the floating button 184 const btnDisplay = () => { 185 // Displays the floating button 186 settingsBtn.forEach((elm) => { 187 elm.classList.contains('active') ? 188 elm.classList.remove('active') : 189 elm.classList.add('active'); 190 }) 191 } 192 193 const settingsDisplay = () => { 194 // Displays the settings popup 195 cookieSettings.classList.contains('active') ? 196 cookieSettings.classList.remove('active') : 197 cookieSettings.classList.add('active'); 198 } 199 200 // Resetting settings popup when closing 201 const settingsInitReset = () => { 202 [].forEach.call(saveChanges, btn => { 203 btn.classList.remove('changes'); 204 }); 205 206 policyPanelBtn.classList.remove('selected'); 207 208 settingsPanelBtn.classList.remove('selected'); 209 210 aboutPanelBtn.classList.add('selected'); 211 212 // Mobile 213 policyPanelBtn.classList.remove('mobile-selected'); 214 settingsPanelBtn.classList.remove('mobile-selected'); 215 } 216 217 // Checks the state of the users cookies, if not set it will open an initial popup that only gets shown once 218 if (!(localStorage.getItem("cookies") === null)) { 219 btnDisplay(); 220 initCookieCard.classList.remove('active'); 221 222 checkState = (localStorage.getItem("cookies") == 'true'); 223 setCookies(checkState); 224 225 [].forEach.call(accpetCheckbox, btn => { 226 checkState ? btn.classList.add('toggled') : btn.classList.remove('toggled'); 227 }); 228 } else { 229 initCookieCard.classList.add('active'); 230 setCookies(checkState); 231 } 232 233 // Accepts all cookies (Init popup) 234 acceptCookiesBtn.addEventListener("click", (e) => { 235 localStorage.setItem('cookies', true); 236 237 [].forEach.call(accpetCheckbox, btn => { 238 btn.classList.add('toggled'); 239 }); 240 241 checkState = true; 242 243 setCookies(checkState); 244 245 initCookieCard.remove(); 246 btnDisplay(); 247 }); 248 249 // Only accept necessary (Init popup) 250 neccesaryBtn.addEventListener("click", (e) => { 251 localStorage.setItem('cookies', false); 252 253 [].forEach.call(accpetCheckbox, btn => { 254 btn.classList.remove('toggled'); 255 }); 256 257 checkState = false; 258 259 setCookies(checkState); 260 261 initCookieCard.remove(); 262 btnDisplay(); 263 }); 264 265 // Exit cookie settings 266 exitBtn.addEventListener("click", (e) => { 267 changes = false; 268 [].forEach.call(accpetCheckbox, btn => { 269 checkState = (localStorage.getItem("cookies") == 'true'); 270 (localStorage.getItem("cookies") == 'true') ? btn.classList.add('toggled') : btn.classList.remove('toggled'); 271 }); 272 273 // Mobile 274 policyPanel[0].classList.remove('active'); 275 settingsPanel[0].classList.remove('active'); 276 277 // Desktop 278 aboutPanelDesktop.classList.add('active'); 279 policyPanel[1].classList.remove('active'); 280 settingsPanel[1].classList.remove('active'); 281 282 settingsInitReset(); 283 284 settingsDisplay(); 285 btnDisplay(); 286 }); 287 288 // Settings panel / button 289 settingsBtn.forEach((elm) => { 290 elm.addEventListener("click", (e) => { 291 // Opens cookie settings 292 if (elm.classList.contains('link-to-settings')) { 293 initCookieCard.classList.remove('active') 294 } 295 settingsDisplay(); 296 btnDisplay(); 297 }); 298 }) 299 300 // Panels 301 302 aboutPanelBtn.addEventListener("click", (e) => { 303 304 // Desktop 305 aboutPanelDesktop.classList.add('active'); 306 policyPanel[1].classList.remove('active'); 307 settingsPanel[1].classList.remove('active'); 308 309 // Mobile 310 settingsPanel[0].classList.contains('active') ? 311 settingsPanel[0].classList.remove('active') : 312 settingsPanel[0].classList.add('active'); 313 314 settingsPanelBtn.classList.contains('mobile-selected') ? 315 settingsPanelBtn.classList.remove('mobile-selected') : 316 settingsPanelBtn.classList.add('mobile-selected'); 317 318 // Common 319 aboutPanelBtn.classList.add('selected'); 320 settingsPanelBtn.classList.remove('selected'); 321 policyPanelBtn.classList.remove('selected'); 322 323 }); 324 325 settingsPanelBtn.addEventListener("click", (e) => { 326 // Desktop 327 aboutPanelDesktop.classList.remove('active'); 328 policyPanel[1].classList.remove('active'); 329 settingsPanel[1].classList.add('active'); 330 331 // Mobile 332 settingsPanel[0].classList.contains('active') ? 333 settingsPanel[0].classList.remove('active') : 334 settingsPanel[0].classList.add('active'); 335 336 settingsPanelBtn.classList.contains('mobile-selected') ? 337 settingsPanelBtn.classList.remove('mobile-selected') : 338 settingsPanelBtn.classList.add('mobile-selected'); 339 340 // Common 341 aboutPanelBtn.classList.remove('selected'); 342 settingsPanelBtn.classList.add('selected'); 343 policyPanelBtn.classList.remove('selected'); 344 345 }); 346 347 // Policy panel/button 348 policyPanelBtn.addEventListener("click", (e) => { 349 350 // Desktop 351 aboutPanelDesktop.classList.remove('active'); 352 policyPanel[1].classList.add('active'); 353 settingsPanel[1].classList.remove('active'); 354 355 // Mobile 356 policyPanel[0].classList.contains('active') ? 357 policyPanel[0].classList.remove('active') : 358 policyPanel[0].classList.add('active'); 359 360 policyPanelBtn.classList.contains('mobile-selected') ? 361 policyPanelBtn.classList.remove('mobile-selected') : 362 policyPanelBtn.classList.add('mobile-selected'); 363 364 // Common 365 aboutPanelBtn.classList.remove('selected'); 366 settingsPanelBtn.classList.remove('selected'); 367 policyPanelBtn.classList.add('selected'); 368 }); 369 370 // Accept cookie checkbox 371 [].forEach.call(accpetCheckbox, container => { 372 373 container.addEventListener("click", (e) => { 374 checkState = !checkState; 375 376 changes = true; 377 [].forEach.call(accpetCheckbox, btn => { 378 checkState ? btn.classList.add('toggled') : btn.classList.remove('toggled'); 379 }); 380 [].forEach.call(saveChanges, btn => { 381 btn.classList.add('changes'); 382 }); 383 }); 384 }); 385 386 // Accept all cookies button 387 [].forEach.call(acceptAllSettings, btn => { 388 btn.addEventListener("click", (e) => { 389 // Accept all cookies 390 checkState = true;
391 setCookies(checkState); 392 changes = false; 393 localStorage.setItem('cookies', true); 394 [].forEach.call(accpetCheckbox, btn => { 395 btn.classList.add('toggled'); 396 }); 397 398 // Mobile 399 policyPanel[0].classList.remove('active'); 400 settingsPanel[0].classList.remove('active'); 401 402 // Desktop 403 aboutPanelDesktop.classList.add('active'); 404 policyPanel[1].classList.remove('active'); 405 settingsPanel[1].classList.remove('active'); 406 407 settingsInitReset(); 408 409 settingsDisplay(); 410 btnDisplay(); 411 }); 412 }); 413 414 // Save changes button 415 [].forEach.call(saveChanges, btn => { 416 btn.addEventListener("click", (e) => { 417 if (changes) { 418 changes = false; 419 localStorage.setItem('cookies', checkState); 420 421 setCookies(checkState); 422 423 // Mobile 424 policyPanel[0].classList.remove('active'); 425 settingsPanel[0].classList.remove('active'); 426 427 // Desktop 428 aboutPanelDesktop.classList.add('active'); 429 policyPanel[1].classList.remove('active'); 430 settingsPanel[1].classList.remove('active'); 431 432 settingsInitReset(); 433 434 settingsDisplay(); 435 btnDisplay(); 436 } 437 }); 438 }); 439 440 document.querySelector('.nav-tab').addEventListener('click', () => { 441 // Desktop 442 aboutPanelDesktop.classList.remove('active'); 443 policyPanel[1].classList.add('active'); 444 settingsPanel[1].classList.remove('active'); 445 446 // Mobile 447 policyPanel[0].classList.contains('active') ? 448 policyPanel[0].classList.remove('active') : 449 policyPanel[0].classList.add('active'); 450 451 policyPanelBtn.classList.contains('mobile-selected') ? 452 policyPanelBtn.classList.remove('mobile-selected') : 453 policyPanelBtn.classList.add('mobile-selected'); 454 455 // Common 456 aboutPanelBtn.classList.remove('selected'); 457 settingsPanelBtn.classList.remove('selected'); 458 policyPanelBtn.classList.add('selected'); 459 }); 460});
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.