PageSourceSearch

https://vhelp.co.uk/static/js/wcag.js?v=2

js vhelp.co.uk collected 2026-10-02 15:33:04 UTC 25,630 bytes, 747 lines download raw bytes

1/* Cookie expiry date */
2
3// Years * Weeks * Days * Hours * Minutes * Seconds * Milliseconds
4var expiry_time = Number(13*7*24*60*60*1000)
5
6
7var wcagcontrast;
8/* var wcagfont; */
9
10if (loadcookie('wcagcontrast') !== '') {
11    wcagcontrast = loadcookie('wcagcontrast');
12} else {
13    wcagcontrast = 0;
14}
15
16/* if (loadcookie('wcagfont') !== '') {
17    wcagfont = loadcookie('wcagfont');
18} else {
19    wcagfont = 0;
20} */
21
22var tempwcagcontrast = wcagcontrast;
23/* var tempwcagfont = wcagfont; */
24
25var wcagdialog;
26var wcagdialog_contrast_options;
27
28function loadcookie(cookiename) {
29    var name = cookiename + "=";
30    var decodedCookie = decodeURIComponent(document.cookie);
31    var ca = decodedCookie.split(';');
32
33    for (var i = 0; i < ca.length; i++) {
34        var c = ca[i];
35
36        while (c.charAt(0) == ' ')
37            c = c.substring(1);
38
39        if (c.indexOf(name) == 0)
40            return c.substring(name.length, c.length);
41    }
42
43    return "";
44}
45
46function wcaginput() {
47    var wcagdialogclasses = wcagdialog.className.split(' ');
48
49    var wcagcontrastradio = document.getElementsByName('wcag-contrast');
50    /* var wcagfontradio = document.getElementsByName('wcag-font'); */
51
52    for (var i = 0; i < wcagcontrastradio.length; i++) {
53        console.log(wcagcontrastradio[i])
54        if (wcagcontrastradio[i].checked) {
55            tempwcagcontrast = i;
56            console.log('checked')
57        }
58    }
59
60    /* for (var i = 0; i < wcagfontradio.length; i++) {
61        if (wcagfontradio[i].checked) {
62            tempwcagfont = i;
63        }
64    } */
65
66    for (var i = 0; i < wcagdialogclasses.length; i++) {
67        if (/^wcag\-contrast\-l[0-9]{1}$/.test(wcagdialogclasses[i])) {
68            wcagdialogclasses[i] = 'wcag-contrast-l' + tempwcagcontrast;
69        }
70
71        /* if (/^wcag\-font\-l[0-9]{1}$/.test(wcagdialogclasses[i])) {
72            wcagdialogclasses[i] = 'wcag-font-l' + tempwcagfont;
73        } */
74    }
75
76    wcagdialog.className = wcagdialogclasses.join(' ');
77}
78
79function wcagreset(event) {
80    e_key = event.which || event.keyCode
81    e_valid_keys = [1, 13, 32]
82
83    if(e_valid_keys.indexOf(e_key) != -1){
84        var wcagdialogclasses = wcagdialog.className.split(' ');
85
86        tempwcagcontrast = wcagcontrast;
87        /* tempwcagfont = wcagfont; */
88
89        for (var i = 0; i < wcagdialogclasses.length; i++) {
90            if (/^wcag\-contrast\-l[0-9]{1}$/.test(wcagdialogclasses[i])) {
91                wcagdialogclasses[i] = 'wcag-contrast-l' + tempwcagcontrast;
92            }
93
94            /* if (/^wcag\-font\-l[0-9]{1}$/.test(wcagdialogclasses[i])) {
95                wcagdialogclasses[i] = 'wcag-font-l' + tempwcagfont;
96            } */
97        }
98
99        for (var i = 0; i < wcagdialog_contrast_options.length; i++) {
100            wcagdialog_contrast_options[i].checked = false
101        }
102
103        wcagdialog.className = wcagdialogclasses.join(' ');
104    }
105}
106
107function wcagsubmit(event, firstrun = false) {
108    e_key = event.which || event.keyCode
109    e_valid_keys = [1, 13, 32]
110    //console.log('submitted')
111    //console.log(e_key)
112
113    if(e_valid_keys.indexOf(e_key) != -1 || firstrun){
114        //console.log('submitted p2')
115        if (event.preventDefault) {
116            event.preventDefault();
117        } else {
118            event.returnValue = false;
119        }
120        //console.log('submitted p3')
121
122        var htmlclasses = document.documentElement.className.split(' ');
123        var bodyclasses = document.body.className.split(' ');
124
125        wcagcontrast = tempwcagcontrast;
126        /* wcagfont = tempwcagfont; */
127
128        for (var i = 0; i < bodyclasses.length; i++) {
129            if (/^wcag\-contrast\-l[0-9]{1}$/.test(bodyclasses[i])) {
130                bodyclasses[i] = 'wcag-contrast-l' + wcagcontrast;
131            }
132
133            /* if (/^wcag\-font\-l[0-9]{1}$/.test(bodyclasses[i])) {
134                bodyclasses[i] = 'wcag-font-l' + wcagfont;
135            } */
136        }
137
138        for (var i = 0; i < htmlclasses.length; i++) {
139            if (/^wcag\-contrast\-l[0-9]{1}$/.test(htmlclasses[i])) {
140                htmlclasses[i] = 'wcag-contrast-l' + wcagcontrast;
141            }
142
143            /* if (/^wcag\-font\-l[0-9]{1}$/.test(htmlclasses[i])) {
144                htmlclasses[i] = 'wcag-font-l' + wcagfont;
145            } */
146        }
147
148        let expiry = new Date()
149        expiry.setTime(expiry.getTime()+expiry_time)
150
151        document.cookie = 'wcagcontrast=' + wcagcontrast + '; expires='+expiry.toGMTString()+'; path=/; samesite=strict';
152        /* document.cookie = 'wcagfont=' + wcagfont + '; expires='+expiry.toGMTString()+'; path=/; samesite=strict'; */
153
154        document.documentElement.className = htmlclasses.join(' ');
155        document.body.className = bodyclasses.join(' ');
156    }
157}
158
159
160
161/* Modals */
162
163var modalopenbtns;
164var modalclosebtns;
165var modal;
166
167var nonmodals = [];
168var nonmodal_tabs = [];
169
170function modalopen(mdname) {
171    var key = event.keyCode || event.charCode || event.which;
172    if (key !== undefined && key !== 1 && key !== 13 && key !== 32) {
173        return;
174    } else {
175        event.preventDefault();
176    }
177
178    modal = document.getElementById(mdname);
179
180    modal.classList.add('active');
181    modal.setAttribute('aria-hidden', 'false');
182    modal.removeAttribute('aria-hidden');
183    modal.setAttribute('hidden', 'false');
184    modal.removeAttribute('hidden');
185
186    modal.focus();
187
188    define_nonmodals()
189
190    for (let i = 0; i < nonmodals.length; i++){
191        if (nonmodals[i])
192            nonmodals[i].setAttribute('aria-hidden', true)
193    }
194    for (let i = 0; i < nonmodal_tabs.length; i++){
195        if (nonmodal_tabs[i]) {
196            if (nonmodal_tabs[i].tabIndex) {
197                nonmodal_tabs[i].dataset.prevTabindex = nonmodal_tabs[i].tabIndex
198            } else {
199                nonmodal_tabs[i].dataset.prevTabindex = "unset"
200            }
201            nonmodal_tabs[i].tabIndex = -1
202        }
203    }
204}
205
206function modalclose(mdname) {
207    var key = event.keyCode || event.charCode || event.which;
208    if (key !== undefined && key !== 1 && key !== 13 && key !== 32) {
209        return;
210    } else {
211        event.preventDefault();
212    }
213
214    modal = document.getElementById(mdname);
215
216    modal.classList.remove('active');
217    modal.setAttribute('aria-hidden', 'true');
218    modal.setAttribute('hidden', 'true');
219
220    define_nonmodals()
221
222    for (let i = 0; i < nonmodals.length; i++){
223        if (nonmodals[i]) {
224            nonmodals[i].setAttribute('aria-hidden', false)
225            nonmodals[i].removeAttribute('aria-hidden')
226        }
227    }
228    for (let i = 0; i < nonmodal_tabs.length; i++){
229        if (nonmodal_tabs[i])
230            if (nonmodal_tabs[i].dataset.prevTabindex != "unset") {
231                nonmodal_tabs[i].tabIndex = nonmodal_tabs[i].dataset.prevTabindex
232            } else {
233                nonmodal_tabs[i].removeAttribute('tabindex')
234            }
235    }
236
237    document.documentElement.focus();
238}
239
240function modalcloseviaoverlay(event) {
241    var key = event.keyCode || event.charCode || event.which;
242    if (key !== undefined && key !== 1 && key !== 13 && key !== 32) {
243        return;
244    } else {
245        event.preventDefault();
246    }
247
248    if (
249        (modal !== undefined && modal !== null) &&
250        (modal.getAttribute('id') !== undefined && modal.getAttribute('id') !== null)
251    ) {
252        if (event.target == modal) {
253            modalclose(modal.getAttribute('id'));
254        }
255    }
256}
257
258function openModalOnPageload() {
259    var isModalClosed = /#close/i.test(window.location.href);
260    if (isModalClosed) {
261        window.history.replaceState(document.documentElement.innerHTML, document.title, window.location.pathname + window.location.search);
262    }
263}
264
265
266
267/* Close WCAG Toolbar */
268
269function hidewcagtoolbar() {
270    var key = event.keyCode || event.charCode || event.which;
271    if (key !== undefined && key !== 1 && key !== 13 && key !== 32) {
272        return;
273    } else {
274        event.preventDefault();
275    }
276
277    wcagtoolbar = document.getElementById('wcag-toolbar');
278    wcagtoolbar.classList.add('hidden');
279    wcagtoolbar.setAttribute('aria-hidden', 'true');
280    wcagtoolbar.setAttribute('hidden', 'true');
281
282    wcagtoolbartoggle = document.getElementById('toggle-wcag-toolbar');
283    wcagtoolbartoggle.classList.remove('hidden');
284    wcagtoolbartoggle.setAttribute('aria-hidden', 'false');
285    wcagtoolbartoggle.removeAttribute('aria-hidden');
286    wcagtoolbartoggle.setAttribute('hidden', 'false');
287    wcagtoolbartoggle.removeAttribute('hidden');
288
289    let expiry = new Date()
290    expiry.setTime(expiry.getTime()+expiry_time)
291
292    document.cookie = 'wcagtoolbar=hidden; expires='+expiry.toGMTString()+'; path=/; samesite=strict';
293
294    modalclose('wcag-confirm');
295}
296
297function showwcagtoolbar() {
298    var key = event.keyCode || event.charCode || event.which;
299    if (key !== undefined && key !== 1 && key !== 13 && key !== 32) {
300        return;
301    } else {
302        event.preventDefault();
303    }
304
305    wcagtoolbar = document.getElementById('wcag-toolbar');
306    wcagtoolbar.classList.remove('hidden');
307    wcagtoolbar.setAttribute('aria-hidden', 'false');
308    wcagtoolbar.removeAttribute('aria-hidden');
309    wcagtoolbar.setAttribute('hidden', 'false');
310    wcagtoolbar.removeAttribute('hidden');
311
312    wcagtoolbartoggle = document.getElementById('toggle-wcag-toolbar');
313    wcagtoolbartoggle.classList.add('hidden');
314    wcagtoolbartoggle.setAttribute('aria-hidden', 'true');
315    wcagtoolbartoggle.setAttribute('hidden', 'true');
316
317    let expiry = new Date()
318    expiry.setTime(expiry.getTime()+expiry_time)
319
320    document.cookie = 'wcagtoolbar=shown; expires='+expiry.toGMTString()+'; path=/; samesite=strict';
321
322    wcagtoolbar.focus();
323}
324
325
326
327/* Privacy Policy */
328
329var cookie_banner;
330var cookie_button;
331
332function getCookie(cookiename) {
333    var name = cookiename + "=";
334    var decodedCookie = decodeURIComponent(document.cookie);
335    var ca = decodedCookie.split(';');
336
337    for (var i = 0; i < ca.length; i++) {
338        var c = ca[i];
339
340        while (c.charAt(0) == ' ')
341            c = c.substring(1);
342
343        if (c.indexOf(name) == 0)
344            return c.substring(name.length, c.length);
345    }
346
347    return "";
348}
349
350
351
352/* Non-Modals */
353
354function define_nonmodals(firstrun = false) {
355    if (firstrun) {
356        nonmodals = []
357        nonmodal_tabs = []
358
359        let nm_wcag = document.querySelectorAll('#wcag-toolbar, #cookie-banner, body > header, body > nav, body > main, body > footer, body > #tab_content')
360
361        let nm_wcag_tabs = document.querySelectorAll(
362            '#wcag-toolbar [tabindex], #wcag-toolbar a, #wcag-toolbar button, #wcag-toolbar input, #wcag-toolbar select, #wcag-toolbar textarea, #wcag-toolbar iframe, ' +
363            '#cookie-banner [tabindex], #cookie-banner a, #cookie-banner button, #cookie-banner input, #cookie-banner select, #cookie-banner textarea, #cookie-banner iframe, ' +
364            'body > header [tabindex], body > header a, body > header button, body > header input, body > header select, body > header textarea, body > header iframe, ' +
365            'body > nav [tabindex], body > nav a, body > nav button, body > nav input, body > nav select, body > nav textarea, body > nav iframe, ' +
366            'body > main [tabindex], body > main a, body > main button, body > main input, body > main select, body > main textarea, body > main iframe, ' +
367            'body > footer [tabindex], body > footer a, body > footer button, body > footer input, body > footer select, body > footer textarea, body > footer iframe, ' +
368            'body > #tab_content [tabindex], body > #tab_content a, body > #tab_content button, body > #tab_content input, body > #tab_content select, body > #tab_content textarea, body > #tab_content iframe'
369        )
370
371        for (let i = 0; i < nm_wcag.length; i++)
372            nonmodals.push(nm_wcag[i])
373
374        for (let i = 0; i < nm_wcag_tabs.length; i++)
375            nonmodal_tabs.push(nm_wcag_tabs[i])
376    }else{
377        // For Google reCaptcha and other script loaded iframes we must recheck
378        let nm_iframe_tabs = document.querySelectorAll('#wcag-toolbar iframe, #cookie-banner iframe, body > header iframe, body > nav iframe, body > main iframe, body > footer iframe, body > #tab_content iframe')
379
380        for (let i = 0; i < nm_iframe_tabs.length; i++)
381            if (nonmodal_tabs.indexOf(nm_iframe_tabs[i]) == -1)
382                nonmodal_tabs.push(nm_iframe_tabs[i])
383    }
384}
385
386
387
388/* Password Requirements script */
389
390document.addEventListener('DOMContentLoaded', () => {
391    const pw_req_str = '#passwordRequirements'
392    const pw_req_field_str = '[aria-details="passwordRequirements"]'
393	const pw_req_field_toggle_str = '.pw-toggle'
394
395    const pw_req = document.querySelector(pw_req_str)
396    const pw_req_field = document.querySelector(pw_req_field_str)
397
398    let pw_req_runs = 0
399    let pw_req_shown = false
400
401    if (pw_req && pw_req_field) {
402        pw_req.hidden = true
403        pw_req.setAttribute('aria-hidden', true)
404        pw_req.setAttribute('role', 'alert')
405        pw_req.setAttribute('aria-live', 'polite')
406
407        const pw_req_toggle = () => {
408            if (
409                (event.target.closest(pw_req_field_str) || event.target.closest(pw_req_str) || event.target.closest(pw_req_field_toggle_str)) &&
410                (pw_req_shown == false)
411            ) {
412                // if (pw_req_runs >= 1)
413                //     pw_req.setAttribute('aria-live', 'off')
414
415                pw_req.hidden = false
416                pw_req.setAttribute('aria-hidden', false)
417                pw_req.removeAttribute('aria-hidden')
418
419                pw_req_shown = true
420                pw_req_runs++
421            }else if (
422                (!event.target.closest(pw_req_field_str) && !event.target.closest(pw_req_str) && !event.target.closest(pw_req_field_toggle_str)) &&
423                (pw_req_shown == true)
424            ) {
425                pw_req.hidden = true
426                pw_req.setAttribute('aria-hidden', true)
427
428                pw_req_shown = false
429            }
430        }
431
432        var pw_req_spec = {}
433            pw_req_spec['pwl'] = document.querySelector('#passwordRequirements .pw-l')
434            pw_req_spec['pwc'] = document.querySelector('#passwordRequirements .pw-c')
435            pw_req_spec['pwa'] = document.querySelector('#passwordRequirements .pw-a')
436            pw_req_spec['pwn'] = document.querySelector('#passwordRequirements .pw-n')
437            pw_req_spec['pws'] = document.querySelector('#passwordRequirements .pw-s')
438
439        const pw_req_update = () => {
440            // &#10004; ✔
441            // &cross; ✗
442            // l-cans (length-capital-alphabetic-numeric-special)
443            // ^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{8,}$
444            // if (pw_req_runs >= 1)
445            //     pw_req.setAttribute('aria-live', 'off')
446
447            if (/^(.*).{12,}$/.test(pw_req_field.value) && pw_req_spec['pwl'].classList.contains('warning')) {
448                pw_req_spec['pwl'].classList.remove('warning')
449                pw_req_spec['pwl'].children[0].innerHTML = '&#10004;'
450                pw_req_spec['pwl'].children[1].innerHTML = '(Completed)'
451            }else if (!/^(.*).{12,}$/.test(pw_req_field.value)) {
452                pw_req_spec['pwl'].classList.add('warning')
453                pw_req_spec['pwl'].children[0].innerHTML = '&cross;'
454                pw_req_spec['pwl'].children[1].innerHTML = ''
455            }
456
457            if (/^(?=.*?[A-Z]).{1,}$/.test(pw_req_field.value) && pw_req_spec['pwc'].classList.contains('warning')) {
458                pw_req_spec['pwc'].classList.remove('warning')
459                pw_req_spec['pwc'].children[0].innerHTML = '&#10004;'
460                pw_req_spec['pwc'].children[1].innerHTML = '(Completed)'
461            }else if(!/^(?=.*?[A-Z]).{1,}$/.test(pw_req_field.value)) {
462                pw_req_spec['pwc'].classList.add('warning')
463                pw_req_spec['pwc'].children[0].innerHTML = '&cross;'
464                pw_req_spec['pwc'].children[1].innerHTML = ''
465            }
466
467            if (/^(?=.*?[a-z]).{1,}/.test(pw_req_field.value) && pw_req_spec['pwa'].classList.contains('warning')) {
468                pw_req_spec['pwa'].classList.remove('warning')
469                pw_req_spec['pwa'].children[0].innerHTML = '&#10004;'
470                pw_req_spec['pwa'].children[1].innerHTML = '(Completed)'
471            }else if(!/^(?=.*?[a-z]).{1,}/.test(pw_req_field.value)) {
472                pw_req_spec['pwa'].classList.add('warning')
473                pw_req_spec['pwa'].children[0].innerHTML = '&cross;'
474                pw_req_spec['pwa'].children[1].innerHTML = ''
475            }
476
477            if (/^(?=.*?[0-9]).{1,}/.test(pw_req_field.value) && pw_req_spec['pwn'].classList.contains('warning')) {
478                pw_req_spec['pwn'].classList.remove('warning')
479                pw_req_spec['pwn'].children[0].innerHTML = '&#10004;'
480                pw_req_spec['pwn'].children[1].innerHTML = '(Completed)'
481            }else if(!/^(?=.*?[0-9]).{1,}/.test(pw_req_field.value)) {
482                pw_req_spec['pwn'].classList.add('warning')
483                pw_req_spec['pwn'].children[0].innerHTML = '&cross;'
484                pw_req_spec['pwn'].children[1].innerHTML = ''
485            }
486
487            if (/^(?=.*?[!@#\$&*~]).{1,}/.test(pw_req_field.value) && pw_req_spec['pws'].classList.contains('warning')) {
488                pw_req_spec['pws'].classList.remove('warning')
489                pw_req_spec['pws'].children[0].innerHTML = '&#10004;'
490                pw_req_spec['pws'].children[1].innerHTML = '(Completed)'
491            }else if(!/^(?=.*?[!@#\$&*~]).{1,}/.test(pw_req_field.value)) {
492                pw_req_spec['pws'].classList.add('warning')
493                pw_req_spec['pws'].children[0].innerHTML = '&cross;'
494                pw_req_spec['pws'].children[1].innerHTML = ''
495            }
496
497            pw_req_runs++
498        }
499
500        // We check every click and input event, and their target,
501        // TODO: Check if we can replace it with focus and blur eventListener on target element
502        document.addEventListener('click', pw_req_toggle)
503        document.addEventListener('keydown', pw_req_toggle)
504        document.addEventListener('keyup', pw_req_toggle)
505
506        // We update the password requirements as the user types
507        //console.log(pw_req_spec)
508        for (let i in pw_req_spec) {
509            //console.log(pw_req_spec[i])
510            pw_req_spec[i].children[0].innerHTML = '&cross;'
511        }
512        pw_req_field.addEventListener('input', pw_req_update)
513    }
514})
515
516
517
518/* Miles to Currency conversion */
519document.addEventListener('DOMContentLoaded', () => {
520    let ml_in = document.querySelector('input#miles[name="miles"]')
521
522    let ml_price = document.querySelector('.js-calc-mileage-price')
523    let ml_cont = document.querySelector('.js-calc-mileage-container')
524
525    let ml_out_label = document.querySelector('.js-calc-amount-output')
526    let ml_out = document.querySelector('.js-calc-amount-output .amount')
527
528    const showMileagePrice = (auto = false) => {
529        if (auto) ml_out_label.setAttribute('aria-live', 'polite')
530
531        let miles_amount = Number(ml_in.value) * Number(ml_price.innerHTML)
532        ml_out.innerHTML = miles_amount.toLocaleString('en-GB', { style: 'currency', currency: 'GBP' })
533    }
534
535    if (ml_in && ml_price && ml_cont && ml_out) {
536        ml_in.addEventListener('input', showMileagePrice)
537        showMileagePrice()
538    }
539})
540
541
542
543/* Password Visibility */
544document.addEventListener('DOMContentLoaded', () => {
545	let pw_toggles = document.querySelectorAll('input.pw-toggle')
546
547	const ShowHidePW = (e) => {
548		if (e.getAttribute('aria-controls')) {
549			let pw_field_selectors = e.getAttribute('aria-controls')
550			if (pw_field_selectors) {
551				pw_field_selectors = pw_field_selectors.split(' ')
552
553				let pw_toggle_icon_selector = 'label.pw-toggle[for="'+e.id+'"]'
554				let pw_toggle_icon = document.querySelectorAll(pw_toggle_icon_selector)
555
556				let pw_toggle_text_selector = 'label.pw-toggle[for="'+e.id+'"] span'
557				let pw_toggle_text = document.querySelectorAll(pw_toggle_text_selector)
558
559				pw_field_selectors.forEach((pw_field_selector) => {
560					if (pw_field_selector) {
561						let pw_field = document.getElementById(pw_field_selector)
562
563						if (pw_field) {
564							if (pw_field.type == 'password') {
565								pw_field.type = 'text'
566								pw_toggle_icon.forEach((icon) => {
567									icon.title = 'Hide Password'
568									icon.classList.add('active')
569								})
570								pw_toggle_text.forEach((text) => {
571									text.innerHTML = 'Hide Password'
572								})
573							} else {
574								pw_field.type = 'password'
575								pw_toggle_icon.forEach((icon) => {
576									icon.title = 'Show Password'
577									icon.classList.remove('active')
578								})
579								pw_toggle_text.forEach((text) => {
580									text.innerHTML = 'Show Password'
581								})
582							}
583						}
584					}
585				})
586			}
587		}
588	}
589
590	pw_toggles.forEach((pw_toggle) => {
591		pw_toggle.addEventListener('change', (e) => {
592			ShowHidePW(e.target)
593		})
594	})
595})
596
597
598
599/* Date Fields and error messages */
600
601document.addEventListener('DOMContentLoaded', () => {
602    /* Custom Invalid messages */
603
604    const setInvalid = () => {
605        const c_invalids = document.querySelectorAll('[data-c-invalid]')
606
607        c_invalids.forEach((c_invalid) => {
608            let inv_str = c_invalid.dataset.cInvalid ? c_invalid.dataset.cInvalid : 'Please fill in this field'
609
610            // console.log(c_invalid.name)
611            // console.log(inv_str)
612
613            c_invalid.addEventListener('invalid', () => {c_invalid.setCustomValidity(inv_str)})
614            c_invalid.addEventListener('input', () => {c_invalid.setCustomValidity('')})
615
616            c_invalid.title = inv_str
617        })
618    }
619
620
621    /* Custom Date selection for Safari */
622
623    let _test
624
625    try {
626        _test = document.createElement("input")
627        _test.type = "date"
628
629        if (_test.type === "date") {
630            let _dateIns = document.querySelectorAll('[data-date-format]')
631            let _dateCIns = document.querySelectorAll('[data-c-date-format]')
632
633            // console.log(_dateIns)
634            // console.log(_dateCIns)
635
636            _dateIns.forEach((_dateIn) => {
637                _dateIn.innerHTML = 'dd/mm/yyyy'
638            })
639            _dateCIns.forEach((_dateCIn) => {
640                _dateCIn.dataset.cInvalid = 'Please select a past date or enter it in dd/mm/yyyy format'
641            })
642
643            setInvalid()
644        } else {
645            return
646        }
647    } catch(e) {
648        return
649    }
650})
651
652
653
654/* Initialisation */
655
656document.addEventListener('DOMContentLoaded', function(event) {
657    wcagdialog = document.getElementById('wcag-options-dialog-content')
658    wcagdialog_contrast_options = document.querySelectorAll('[name="wcag-contrast"]')
659    wcagsubmit(event, true)
660
661    var wcagS = document.getElementById('wcag-switch')
662    if (wcagS !== undefined && wcagS !== null) {
663        wcagS.addEventListener('click', function() {
664            modalopen('wcag-options-dialog')
665        })
666        wcagS.addEventListener('keydown', function() {
667            modalopen('wcag-options-dialog')
668        })
669    }
670
671    // id="wcag-options-dialog-close" onclick="javascript:wcagreset();modalclose('wcag-options-dialog');"
672    var wcagODC = document.getElementById('wcag-options-dialog-close')
673    wcagODC.addEventListener('click', function(event) {
674        wcagreset(event)
675        modalclose('wcag-options-dialog')
676    })
677    wcagODC.addEventListener('keydown', function(event) {
678        wcagreset(event)
679        modalclose('wcag-options-dialog')
680    })
681
682    // id="wcag-form" oninput="javascript:wcaginput();" onsubmit="javascript:wcagsubmit(event);modalclose('wcag-options-dialog');"
683    var wcagF = document.getElementById('wcag-form')
684    wcagF.addEventListener('input', function() {
685        wcaginput()
686    })
687    /* wcagF.addEventListener('submit', function(event) {
688        wcagsubmit(event);
689        modalclose('wcag-options-dialog');
690    }); /* */
691
692    // id="wcag-options-dialog-discard" onclick="javascript:wcagreset();modalclose('wcag-options-dialog');"
693    var wcagODD = document.getElementById('wcag-options-dialog-discard')
694    wcagODD.addEventListener('click', function(event) {
695        wcagreset(event)
696        modalclose('wcag-options-dialog')
697    })
698    wcagODD.addEventListener('keydown', function(event) {
699        wcagreset(event)
700        modalclose('wcag-options-dialog')
701    })
702
703    // id="wcag-options-dialog-apply" onclick="javascript:wcagsubmit(event);modalclose('wcag-options-dialog');"
704    var wcagODA = document.getElementById('wcag-options-dialog-apply');
705    wcagODA.addEventListener('click', function(event) {
706        wcagsubmit(event)
707        modalclose('wcag-options-dialog')
708    })
709    wcagODA.addEventListener('keydown', function(event) {
710        wcagsubmit(event)
711        modalclose('wcag-options-dialog')
712    })
713
714
715
716    /* Modals */
717
718    window.addEventListener('hashchange', openModalOnPageload)
719    openModalOnPageload()
720
721    define_nonmodals(true)
722
723
724
725    /* Privacy Policy */
726
727    cookie_banner = document.getElementById("cookie-banner")
728    cookie_button = document.getElementById("cookie-button")
729
730    if(cookie_banner && cookie_button){
731        cookie_button.addEventListener('click', function() {
732            let expiry = new Date()
733            expiry.setTime(expiry.getTime()+expiry_time)
734
735            document.cookie = "accept_cookie=True; expires="+expiry.toGMTString()+"; path=/; samesite=strict"
736            cookie_banner.remove()
737        });
738
739        if (getCookie("accept_cookie") == "True") {
740            cookie_banner.remove()
741        }
742    }
743
744    if (getCookie("wcagtoolbar") == "hidden") {
745        hidewcagtoolbar()
746    }
747});

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.