PageSourceSearch

https://visitsandoy.fo/views/main/js/cookies.js?v=1790322694

js visitsandoy.fo collected 2026-09-25 07:51:45 UTC 14,658 bytes, 460 lines download raw bytes

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.