PageSourceSearch

https://www.arcticspas.co.uk/wp-content/plugins/jucra-custom-cookie-consent-banner/assets/js/cookie-banner.js

js arcticspas.co.uk collected 2026-10-04 06:19:12 UTC 27,926 bytes, 1,077 lines download raw bytes

1(function() {
2	'use strict';
3
4	/**
5	 * JUCRA Cookie Banner Debug
6	 * Set this to false when finished testing.
7	 */
8	var jucra_cookie_debug_enabled = true;
9
10	function jucra_debug_log(label, data) {
11		if (!jucra_cookie_debug_enabled) {
12			return;
13		}
14
15		if (!window.console || typeof window.console.log !== 'function') {
16			return;
17		}
18
19		if (typeof data === 'undefined') {
20			window.console.log('[JUCRA COOKIE DEBUG] ' + label);
21		} else {
22			window.console.log('[JUCRA COOKIE DEBUG] ' + label, data);
23		}
24	}
25
26	function jucra_debug_element_summary(element) {
27		var text = '';
28
29		if (!element) {
30			return {};
31		}
32
33		text = element.innerText || element.textContent || '';
34
35		return {
36			tag: element.tagName || '',
37			id: element.id || '',
38			class_name: element.className ? element.className.toString() : '',
39			text: text.trim().substring(0, 120),
40			href: element.href || '',
41			src: element.getAttribute ? (element.getAttribute('src') || '') : '',
42			data_src: element.getAttribute ? (element.getAttribute('data-jucra-cookie-src') || '') : '',
43			type: element.getAttribute ? (element.getAttribute('type') || '') : '',
44			original_type: element.getAttribute ? (element.getAttribute('data-jucra-cookie-original-type') || '') : '',
45			category: element.getAttribute ? (element.getAttribute('data-jucra-cookie-category') || '') : '',
46			blocked: element.getAttribute ? (element.getAttribute('data-jucra-cookie-blocked') || '') : '',
47			loaded: element.getAttribute ? (element.getAttribute('data-jucra-cookie-loaded') || '') : '',
48			element: element
49		};
50	}
51
52	function jucra_set_cookie(name, value, days) {
53		var date = new Date();
54		var secure = window.location.protocol === 'https:' ? ';Secure' : '';
55
56		date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
57
58		document.cookie =
59			name + '=' + encodeURIComponent(value) +
60			';expires=' + date.toUTCString() +
61			';path=/' +
62			';SameSite=Lax' +
63			secure;
64
65		jucra_debug_log('Cookie set', {
66			name: name,
67			value: value,
68			days: days
69		});
70	}
71
72	function jucra_get_cookie(name) {
73		var name_eq = name + '=';
74		var decoded_cookie = decodeURIComponent(document.cookie);
75		var cookie_parts = decoded_cookie.split(';');
76		var i = 0;
77		var current_part = '';
78
79		for (i = 0; i < cookie_parts.length; i++) {
80			current_part = cookie_parts[i];
81
82			while (current_part.charAt(0) === ' ') {
83				current_part = current_part.substring(1);
84			}
85
86			if (current_part.indexOf(name_eq) === 0) {
87				return current_part.substring(name_eq.length, current_part.length);
88			}
89		}
90
91		return '';
92	}
93
94	function jucra_debug_cookie_snapshot() {
95		return {
96			consent: jucra_get_cookie('jucra_cookie_consent'),
97			functional: jucra_get_cookie('jucra_cookie_functional'),
98			analytics: jucra_get_cookie('jucra_cookie_analytics'),
99			marketing: jucra_get_cookie('jucra_cookie_marketing'),
100			html_classes: document.documentElement ? document.documentElement.className : '',
101			body_classes: document.body ? document.body.className : '',
102			url: window.location.href
103		};
104	}
105
106	function jucra_bind_debug_click_logger() {
107		if (window.jucra_cookie_debug_click_logger_loaded) {
108			return;
109		}
110
111		window.jucra_cookie_debug_click_logger_loaded = true;
112
113		document.addEventListener('click', function(event) {
114			var target = event.target;
115			var clicked_element = null;
116
117			if (!target) {
118				return;
119			}
120
121			if (target.nodeType && target.nodeType !== 1) {
122				target = target.parentNode;
123			}
124
125			if (!target || !target.closest) {
126				return;
127			}
128
129			clicked_element = target.closest(
130				'#jucra-cookie-accept, ' +
131				'#jucra-cookie-reject-optional, ' +
132				'#jucra-cookie-decline, ' +
133				'#jucra-cookie-options-tab, ' +
134				'#jucra-cookie-save-preferences, ' +
135				'#jucra-cookie-banner button, ' +
136				'#jucra-cookie-banner a, ' +
137				'.jucra-cookie-options-tab'
138			);
139
140			if (!clicked_element) {
141				return;
142			}
143
144			jucra_debug_log('CLICK CAPTURED BEFORE BUTTON HANDLER RUNS', {
145				clicked: jucra_debug_element_summary(clicked_element),
146				event_target: jucra_debug_element_summary(target),
147				cookies_before_click: jucra_debug_cookie_snapshot()
148			});
149
150		}, true);
151	}
152
153	function jucra_normalize_category(category) {
154		category = (category || '').toString().toLowerCase();
155
156		if (!category) {
157			category = 'functional';
158		}
159
160		return category;
161	}
162
163	function jucra_category_allowed(category) {
164		var consent_cookie = jucra_get_cookie('jucra_cookie_consent');
165		var category_cookie = '';
166
167		category = jucra_normalize_category(category);
168
169		if (category === 'essential' || category === 'functional') {
170			return true;
171		}
172
173		if (consent_cookie === 'accepted') {
174			return true;
175		}
176
177		category_cookie = jucra_get_cookie('jucra_cookie_' + category);
178
179		return category_cookie === 'accepted';
180	}
181
182	function jucra_inject_options_tab_styles() {
183		var existing_style = document.getElementById('jucra-cookie-options-tab-style');
184		var style = null;
185
186		if (existing_style) {
187			return;
188		}
189
190		style = document.createElement('style');
191		style.id = 'jucra-cookie-options-tab-style';
192
193		style.textContent =
194			'#jucra-cookie-options-tab{' +
195				'position:fixed;' +
196				'left:18px;' +
197				'bottom:0;' +
198				'z-index:999997;' +
199				'display:none;' +
200				'visibility:hidden;' +
201				'opacity:0;' +
202				'pointer-events:none;' +
203				'background:#111;' +
204				'color:#fff;' +
205				'border:0;' +
206				'border-radius:12px 12px 0 0;' +
207				'padding:12px 18px;' +
208				'font-family:inherit;' +
209				'font-size:15px;' +
210				'font-weight:700;' +
211				'line-height:1;' +
212				'cursor:pointer;' +
213				'box-shadow:0 -4px 18px rgba(0,0,0,.22);' +
214			'}' +
215			'#jucra-cookie-options-tab:hover{' +
216				'background:#000;' +
217			'}' +
218			'#jucra-cookie-options-tab:focus{' +
219				'outline:3px solid rgba(46,125,50,.35);' +
220				'outline-offset:2px;' +
221			'}' +
222			'@media (max-width:600px){' +
223				'#jucra-cookie-options-tab{' +
224					'left:12px;' +
225					'font-size:14px;' +
226					'padding:10px 14px;' +
227				'}' +
228			'}';
229
230		document.head.appendChild(style);
231	}
232
233	function jucra_get_options_tab() {
234		var tab = document.getElementById('jucra-cookie-options-tab');
235
236		if (!document.body) {
237			return null;
238		}
239
240		jucra_inject_options_tab_styles();
241
242		if (!tab) {
243			tab = document.createElement('button');
244			tab.type = 'button';
245			tab.id = 'jucra-cookie-options-tab';
246			tab.className = 'jucra-cookie-options-tab';
247			tab.textContent = 'Cookie Options';
248			tab.setAttribute('aria-label', 'Cookie options');
249			tab.setAttribute('aria-hidden', 'true');
250
251			document.body.appendChild(tab);
252
253			jucra_debug_log('Options tab created', jucra_debug_element_summary(tab));
254		}
255
256		if (!tab.getAttribute('data-jucra-cookie-bound')) {
257			tab.addEventListener('click', function(event) {
258				jucra_debug_log('Options tab handler started', {
259					cookies_before: jucra_debug_cookie_snapshot()
260				});
261
262				event.preventDefault();
263				jucra_show_banner();
264
265				jucra_debug_log('Options tab handler finished', {
266					cookies_after: jucra_debug_cookie_snapshot()
267				});
268			});
269
270			tab.setAttribute('data-jucra-cookie-bound', '1');
271
272			jucra_debug_log('Options tab click handler bound');
273		}
274
275		return tab;
276	}
277
278	function jucra_show_options_tab() {
279		var tab = jucra_get_options_tab();
280
281		if (!tab) {
282			return;
283		}
284
285		tab.style.display = 'block';
286		tab.style.visibility = 'visible';
287		tab.style.opacity = '1';
288		tab.style.pointerEvents = 'auto';
289		tab.setAttribute('aria-hidden', 'false');
290
291		jucra_debug_log('Options tab shown');
292	}
293
294	function jucra_hide_options_tab() {
295		var tab = document.getElementById('jucra-cookie-options-tab');
296
297		if (!tab) {
298			return;
299		}
300
301		if (document.activeElement && document.activeElement === tab) {
302			document.activeElement.blur();
303		}
304
305		tab.style.display = 'none';
306		tab.style.visibility = 'hidden';
307		tab.style.opacity = '0';
308		tab.style.pointerEvents = 'none';
309		tab.setAttribute('aria-hidden', 'true');
310
311		jucra_debug_log('Options tab hidden');
312	}
313
314	function jucra_blur_banner_focus() {
315		var banner = document.getElementById('jucra-cookie-banner');
316		var overlay = document.getElementById('jucra-cookie-banner-overlay');
317		var active = document.activeElement;
318
319		if (!active) {
320			return;
321		}
322
323		if (
324			(banner && banner.contains(active)) ||
325			(overlay && overlay.contains(active))
326		) {
327			active.blur();
328
329			jucra_debug_log('Blurred active banner element', jucra_debug_element_summary(active));
330		}
331	}
332
333	function jucra_hide_banner(show_options_tab) {
334		var banner = document.getElementById('jucra-cookie-banner');
335		var overlay = document.getElementById('jucra-cookie-banner-overlay');
336
337		jucra_debug_log('jucra_hide_banner() started', {
338			show_options_tab: show_options_tab,
339			banner_found: !!banner,
340			overlay_found: !!overlay,
341			cookies: jucra_debug_cookie_snapshot()
342		});
343
344		if (show_options_tab === true) {
345			jucra_get_options_tab();
346		}
347
348		jucra_blur_banner_focus();
349
350		if (banner) {
351			if ('inert' in banner) {
352				banner.inert = true;
353			}
354
355			banner.style.display = 'none';
356			banner.style.visibility = 'hidden';
357			banner.style.opacity = '0';
358			banner.style.pointerEvents = 'none';
359			banner.setAttribute('aria-hidden', 'true');
360			banner.classList.remove('jucra-cookie-banner-visible');
361		}
362
363		if (overlay) {
364			if ('inert' in overlay) {
365				overlay.inert = true;
366			}
367
368			overlay.style.display = 'none';
369			overlay.style.visibility = 'hidden';
370			overlay.style.opacity = '0';
371			overlay.style.pointerEvents = 'none';
372			overlay.setAttribute('aria-hidden', 'true');
373			overlay.classList.remove('jucra-cookie-banner-visible');
374		}
375
376		document.documentElement.style.overflow = '';
377		document.body.style.overflow = '';
378		document.body.style.position = '';
379
380		if (show_options_tab === true) {
381			jucra_show_options_tab();
382		}
383
384		jucra_debug_log('jucra_hide_banner() finished', {
385			cookies: jucra_debug_cookie_snapshot()
386		});
387	}
388
389	function jucra_show_banner() {
390		var banner = document.getElementById('jucra-cookie-banner');
391		var overlay = document.getElementById('jucra-cookie-banner-overlay');
392
393		jucra_debug_log('jucra_show_banner() started', {
394			banner_found: !!banner,
395			overlay_found: !!overlay,
396			cookies: jucra_debug_cookie_snapshot()
397		});
398
399		jucra_hide_options_tab();
400
401		if (banner) {
402			if ('inert' in banner) {
403				banner.inert = false;
404			}
405
406			banner.style.display = 'block';
407			banner.style.visibility = 'visible';
408			banner.style.opacity = '1';
409			banner.style.pointerEvents = 'auto';
410			banner.setAttribute('aria-hidden', 'false');
411			banner.classList.add('jucra-cookie-banner-visible');
412		}
413
414		if (overlay) {
415			if ('inert' in overlay) {
416				overlay.inert = true;
417			}
418
419			overlay.style.display = 'none';
420			overlay.style.visibility = 'hidden';
421			overlay.style.opacity = '0';
422			overlay.style.pointerEvents = 'none';
423			overlay.setAttribute('aria-hidden', 'true');
424			overlay.classList.remove('jucra-cookie-banner-visible');
425		}
426
427		jucra_debug_log('jucra_show_banner() finished');
428	}
429
430	function jucra_dispatch_consent_event(detail) {
431		jucra_debug_log('Dispatching consent event', detail);
432
433		if (typeof CustomEvent === 'function') {
434			document.dispatchEvent(
435				new CustomEvent('jucraCookieConsentUpdated', {
436					detail: detail
437				})
438			);
439		}
440	}
441
442	var jucra_document_write_guard_count = 0;
443	var jucra_original_document_write = null;
444	var jucra_original_document_writeln = null;
445
446	function jucra_debug_warning(message, error) {
447		if (
448			typeof window.jucra_cookie_banner_data !== 'undefined' &&
449			window.jucra_cookie_banner_data &&
450			window.jucra_cookie_banner_data.debug === true &&
451			window.console &&
452			typeof window.console.warn === 'function'
453		) {
454			window.console.warn(message, error || '');
455		}
456	}
457
458	function jucra_reactivate_scripts_in_node(parent_node) {
459		var scripts = [];
460		var old_script = null;
461		var new_script = null;
462		var i = 0;
463		var j = 0;
464		var attr = null;
465
466		if (!parent_node || !parent_node.querySelectorAll) {
467			return;
468		}
469
470		scripts = parent_node.querySelectorAll('script');
471
472		jucra_debug_log('Reactivating scripts inside document.write holder', {
473			script_count: scripts.length
474		});
475
476		for (i = 0; i < scripts.length; i++) {
477			old_script = scripts[i];
478			new_script = document.createElement('script');
479
480			for (j = 0; j < old_script.attributes.length; j++) {
481				attr = old_script.attributes[j];
482
483				if (!attr || !attr.name) {
484					continue;
485				}
486
487				new_script.setAttribute(attr.name, attr.value);
488			}
489
490			if (!new_script.hasAttribute('async')) {
491				new_script.async = false;
492			}
493
494			new_script.text = old_script.text || old_script.textContent || '';
495
496			jucra_debug_log('Reactivated script from document.write holder', {
497				old_script: jucra_debug_element_summary(old_script),
498				new_script: jucra_debug_element_summary(new_script)
499			});
500
501			if (old_script.parentNode) {
502				old_script.parentNode.replaceChild(new_script, old_script);
503			}
504		}
505	}
506
507	function jucra_insert_document_write_html(html) {
508		var holder = null;
509		var fragment = null;
510		var current_script = null;
511
512		html = (html || '').toString();
513
514		jucra_debug_log('document.write/document.writeln intercepted', {
515			html_length: html.length,
516			html_preview: html.substring(0, 500)
517		});
518
519		if (!html || !document.body) {
520			return;
521		}
522
523		holder = document.createElement('div');
524		holder.innerHTML = html;
525		jucra_reactivate_scripts_in_node(holder);
526
527		fragment = document.createDocumentFragment();
528
529		while (holder.firstChild) {
530			fragment.appendChild(holder.firstChild);
531		}
532
533		current_script = document.currentScript;
534
535		if (current_script && current_script.parentNode) {
536			current_script.parentNode.insertBefore(fragment, current_script.nextSibling);
537
538			jucra_debug_log('document.write HTML inserted after current script');
539		} else {
540			document.body.appendChild(fragment);
541
542			jucra_debug_log('document.write HTML appended to body');
543		}
544	}
545
546	function jucra_safe_document_write() {
547		var html = Array.prototype.slice.call(arguments).join('');
548
549		jucra_insert_document_write_html(html);
550	}
551
552	function jucra_safe_document_writeln() {
553		var html = Array.prototype.slice.call(arguments).join('') + '\n';
554
555		jucra_insert_document_write_html(html);
556	}
557
558	function jucra_start_document_write_guard() {
559		if (jucra_document_write_guard_count === 0) {
560			jucra_original_document_write = document.write;
561			jucra_original_document_writeln = document.writeln;
562
563			document.write = jucra_safe_document_write;
564			document.writeln = jucra_safe_document_writeln;
565
566			jucra_debug_log('document.write guard started');
567		}
568
569		jucra_document_write_guard_count++;
570
571		jucra_debug_log('document.write guard count increased', {
572			count: jucra_document_write_guard_count
573		});
574	}
575
576	function jucra_stop_document_write_guard() {
577		if (jucra_document_write_guard_count <= 0) {
578			return;
579		}
580
581		jucra_document_write_guard_count--;
582
583		jucra_debug_log('document.write guard count decreased', {
584			count: jucra_document_write_guard_count
585		});
586
587		if (jucra_document_write_guard_count > 0) {
588			return;
589		}
590
591		if (jucra_original_document_write) {
592			document.write = jucra_original_document_write;
593		}
594
595		if (jucra_original_document_writeln) {
596			document.writeln = jucra_original_document_writeln;
597		}
598
599		jucra_original_document_write = null;
600		jucra_original_document_writeln = null;
601
602		jucra_debug_log('document.write guard stopped');
603	}
604
605	function jucra_create_document_write_guard_release() {
606		var released = false;
607
608		return function() {
609			if (released) {
610				return;
611			}
612
613			released = true;
614			jucra_stop_document_write_guard();
615		};
616	}
617
618	function jucra_replace_blocked_script(blocked_script, new_script, has_external_src) {
619		var release_guard = jucra_create_document_write_guard_release();
620
621		if (!blocked_script.parentNode) {
622			jucra_debug_log('Blocked script has no parent node, cannot replace', {
623				blocked_script: jucra_debug_element_summary(blocked_script)
624			});
625
626			return;
627		}
628
629		jucra_debug_log('Replacing blocked script', {
630			has_external_src: has_external_src,
631			blocked_script: jucra_debug_element_summary(blocked_script),
632			new_script: jucra_debug_element_summary(new_script)
633		});
634
635		jucra_start_document_write_guard();
636
637		if (has_external_src) {
638			new_script.addEventListener('load', function() {
639				jucra_debug_log('External blocked script loaded successfully', {
640					script: jucra_debug_element_summary(new_script)
641				});
642
643				release_guard();
644			});
645
646			new_script.addEventListener('error', function(error) {
647				jucra_debug_log('External blocked script failed to load', {
648					script: jucra_debug_element_summary(new_script),
649					error: error
650				});
651
652				release_guard();
653			});
654
655			window.setTimeout(function() {
656				jucra_debug_log('External blocked script guard timeout reached', {
657					script: jucra_debug_element_summary(new_script)
658				});
659
660				release_guard();
661			}, 15000);
662		}
663
664		try {
665			blocked_script.parentNode.replaceChild(new_script, blocked_script);
666
667			jucra_debug_log('Blocked script replaced successfully', {
668				new_script: jucra_debug_element_summary(new_script)
669			});
670		} catch (error) {
671			release_guard();
672			jucra_debug_warning('JUCRA Cookie Banner could not load a blocked script.', error);
673
674			jucra_debug_log('Blocked script replace failed', {
675				error: error,
676				blocked_script: jucra_debug_element_summary(blocked_script),
677				new_script: jucra_debug_element_summary(new_script)
678			});
679
680			return;
681		}
682
683		if (!has_external_src) {
684			window.setTimeout(function() {
685				jucra_debug_log('Inline blocked script guard timeout reached', {
686					script: jucra_debug_element_summary(new_script)
687				});
688
689				release_guard();
690			}, 10000);
691		}
692	}
693
694	function jucra_load_blocked_script(blocked_script) {
695		var new_script = document.createElement('script');
696		var src = blocked_script.getAttribute('data-jucra-cookie-src') || '';
697		var original_type = blocked_script.getAttribute('data-jucra-cookie-original-type') || '';
698		var i = 0;
699		var attr = null;
700
701		if (blocked_script.getAttribute('data-jucra-cookie-loaded') === '1') {
702			jucra_debug_log('Blocked script already loaded, skipping', {
703				script: jucra_debug_element_summary(blocked_script)
704			});
705
706			return;
707		}
708
709		jucra_debug_log('Loading blocked script', {
710			script: jucra_debug_element_summary(blocked_script),
711			src: src,
712			original_type: original_type
713		});
714
715		for (i = 0; i < blocked_script.attributes.length; i++) {
716			attr = blocked_script.attributes[i];
717
718			if (!attr || !attr.name) {
719				continue;
720			}
721
722			if (attr.name === 'type') {
723				continue;
724			}
725
726			if (attr.name.indexOf('data-jucra-cookie-') === 0) {
727				continue;
728			}
729
730			new_script.setAttribute(attr.name, attr.value);
731		}
732
733		if (original_type) {
734			new_script.setAttribute('type', original_type);
735		}
736
737		if (src) {
738			new_script.setAttribute('src', src);
739
740			if (!new_script.hasAttribute('async')) {
741				new_script.async = false;
742			}
743		} else {
744			new_script.text = blocked_script.text || blocked_script.textContent || '';
745		}
746
747		blocked_script.setAttribute('data-jucra-cookie-loaded', '1');
748		jucra_replace_blocked_script(blocked_script, new_script, !!src);
749	}
750
751	function jucra_load_blocked_media(element) {
752		var src = element.getAttribute('data-jucra-cookie-src') || '';
753
754		if (!src) {
755			jucra_debug_log('Blocked media has no data source, skipping', {
756				element: jucra_debug_element_summary(element)
757			});
758
759			return;
760		}
761
762		if (element.getAttribute('data-jucra-cookie-loaded') === '1') {
763			jucra_debug_log('Blocked media already loaded, skipping', {
764				element: jucra_debug_element_summary(element)
765			});
766
767			return;
768		}
769
770		jucra_debug_log('Loading blocked media', {
771			element: jucra_debug_element_summary(element),
772			src: src
773		});
774
775		element.setAttribute('src', src);
776		element.setAttribute('data-jucra-cookie-loaded', '1');
777	}
778
779	function jucra_activate_blocked_items() {
780		var blocked_items = document.querySelectorAll('[data-jucra-cookie-blocked="1"]');
781		var i = 0;
782		var item = null;
783		var category = '';
784		var tag = '';
785
786		jucra_debug_log('jucra_activate_blocked_items() started', {
787			blocked_item_count: blocked_items.length,
788			cookies: jucra_debug_cookie_snapshot()
789		});
790
791		for (i = 0; i < blocked_items.length; i++) {
792			item = blocked_items[i];
793			category = item.getAttribute('data-jucra-cookie-category') || '';
794			tag = (item.getAttribute('data-jucra-cookie-tag') || item.tagName || '').toString().toLowerCase();
795
796			if (!jucra_category_allowed(category)) {
797				continue;
798			}
799
800			jucra_debug_log('Blocked item allowed and will be activated', {
801				number: i + 1,
802				total: blocked_items.length,
803				tag: tag,
804				category: category,
805				item: jucra_debug_element_summary(item)
806			});
807
808			if (tag === 'script') {
809				jucra_load_blocked_script(item);
810			} else if (tag === 'iframe' || tag === 'img') {
811				jucra_load_blocked_media(item);
812			}
813		}
814
815		jucra_debug_log('jucra_activate_blocked_items() finished', {
816			cookies: jucra_debug_cookie_snapshot()
817		});
818	}
819
820	function jucra_accept_all_cookies() {
821		jucra_debug_log('jucra_accept_all_cookies() started', {
822			cookies_before: jucra_debug_cookie_snapshot()
823		});
824
825		jucra_set_cookie('jucra_cookie_consent', 'accepted', 90);
826		jucra_set_cookie('jucra_cookie_functional', 'accepted', 90);
827		jucra_set_cookie('jucra_cookie_analytics', 'accepted', 90);
828		jucra_set_cookie('jucra_cookie_marketing', 'accepted', 90);
829
830		jucra_debug_log('Accept All cookies have been set', {
831			cookies_after_set: jucra_debug_cookie_snapshot()
832		});
833
834		jucra_hide_banner(true);
835
836		jucra_debug_log('Accept All banner hidden. Blocked items will activate in 50ms.');
837
838		window.setTimeout(function() {
839			jucra_debug_log('Accept All timeout started. About to activate blocked items.', {
840				cookies_before_activation: jucra_debug_cookie_snapshot()
841			});
842
843			jucra_activate_blocked_items();
844
845			jucra_debug_log('Accept All timeout finished. Blocked items activation has completed.', {
846				cookies_after_activation: jucra_debug_cookie_snapshot()
847			});
848		}, 50);
849
850		jucra_dispatch_consent_event({
851			consent: 'accepted',
852			functional: true,
853			analytics: true,
854			marketing: true
855		});
856
857		jucra_debug_log('jucra_accept_all_cookies() finished');
858	}
859
860	function jucra_essential_cookies_only() {
861		jucra_debug_log('jucra_essential_cookies_only() started', {
862			cookies_before: jucra_debug_cookie_snapshot()
863		});
864
865		jucra_set_cookie('jucra_cookie_consent', 'required_only', 90);
866		jucra_set_cookie('jucra_cookie_functional', 'accepted', 90);
867		jucra_set_cookie('jucra_cookie_analytics', 'rejected', 90);
868		jucra_set_cookie('jucra_cookie_marketing', 'rejected', 90);
869
870		jucra_debug_log('Essential Only cookies have been set', {
871			cookies_after_set: jucra_debug_cookie_snapshot()
872		});
873
874		jucra_hide_banner(true);
875
876		jucra_dispatch_consent_event({
877			consent: 'required_only',
878			functional: true,
879			analytics: false,
880			marketing: false
881		});
882
883		jucra_debug_log('jucra_essential_cookies_only() finished');
884	}
885
886	function jucra_bind_cookie_banner() {
887		var accept_btn = document.getElementById('jucra-cookie-accept');
888		var essential_only_btn = document.getElementById('jucra-cookie-reject-optional');
889		var consent_cookie = jucra_get_cookie('jucra_cookie_consent');
890
891		jucra_debug_log('jucra_bind_cookie_banner() started', {
892			accept_button_found: !!accept_btn,
893			essential_only_button_found: !!essential_only_btn,
894			consent_cookie: consent_cookie,
895			cookies: jucra_debug_cookie_snapshot()
896		});
897
898		jucra_get_options_tab();
899
900		if (!consent_cookie) {
901			jucra_debug_log('No consent cookie found. Showing banner.');
902			jucra_show_banner();
903		} else {
904			jucra_debug_log('Consent cookie found. Hiding banner and showing options tab.');
905			jucra_hide_banner(true);
906		}
907
908		if (accept_btn && !accept_btn.getAttribute('data-jucra-cookie-bound')) {
909			accept_btn.addEventListener('click', function(event) {
910				jucra_debug_log('Accept All button handler started', {
911					button: jucra_debug_element_summary(accept_btn),
912					cookies_before: jucra_debug_cookie_snapshot()
913				});
914
915				event.preventDefault();
916				jucra_accept_all_cookies();
917
918				jucra_debug_log('Accept All button handler finished', {
919					cookies_after: jucra_debug_cookie_snapshot()
920				});
921			});
922
923			accept_btn.setAttribute('data-jucra-cookie-bound', '1');
924
925			jucra_debug_log('Accept All button click handler bound', {
926				button: jucra_debug_element_summary(accept_btn)
927			});
928		}
929
930		if (essential_only_btn && !essential_only_btn.getAttribute('data-jucra-cookie-bound')) {
931			essential_only_btn.addEventListener('click', function(event) {
932				jucra_debug_log('Essential Cookies Only button handler started', {
933					button: jucra_debug_element_summary(essential_only_btn),
934					cookies_before: jucra_debug_cookie_snapshot()
935				});
936
937				event.preventDefault();
938				jucra_essential_cookies_only();
939
940				jucra_debug_log('Essential Cookies Only button handler finished', {
941					cookies_after: jucra_debug_cookie_snapshot()
942				});
943			});
944
945			essential_only_btn.setAttribute('data-jucra-cookie-bound', '1');
946
947			jucra_debug_log('Essential Cookies Only button click handler bound', {
948				button: jucra_debug_element_summary(essential_only_btn)
949			});
950		}
951
952		jucra_debug_log('jucra_bind_cookie_banner() finished');
953	}
954
955	function jucra_detect_vendor_matches() {
956		var vendor_rules = [];
957		var elements = [];
958		var matched_vendors = {};
959		var detected_services = {
960			essential: [],
961			functional: [],
962			analytics: [],
963			marketing: []
964		};
965		var i = 0;
966		var j = 0;
967		var element = null;
968		var url = '';
969		var rule = null;
970		var match_value = '';
971		var vendor_key = '';
972		var category = '';
973
974		if (
975			typeof jucra_cookie_banner_data !== 'undefined' &&
976			jucra_cookie_banner_data.vendor_rules
977		) {
978			vendor_rules = jucra_cookie_banner_data.vendor_rules;
979		}
980
981		if (!vendor_rules.length) {
982			jucra_debug_log('No vendor rules found. Vendor detection skipped.');
983			return;
984		}
985
986		elements = document.querySelectorAll('script[src], iframe[src], img[src], [data-jucra-cookie-src]');
987
988		jucra_debug_log('Vendor detection started', {
989			vendor_rule_count: vendor_rules.length,
990			element_count: elements.length
991		});
992
993		for (i = 0; i < elements.length; i++) {
994			element = elements[i];
995			url = element.getAttribute('src') || element.getAttribute('data-jucra-cookie-src') || '';
996
997			if (!url) {
998				continue;
999			}
1000
1001			for (j = 0; j < vendor_rules.length; j++) {
1002				rule = vendor_rules[j];
1003				match_value = rule.MatchValue || '';
1004				category = rule.Category || 'functional';
1005				category = category.toString().toLowerCase();
1006
1007				if (!match_value) {
1008					continue;
1009				}
1010
1011				if (!detected_services[category]) {
1012					detected_services[category] = [];
1013				}
1014
1015				if (url.indexOf(match_value) !== -1) {
1016					vendor_key = rule.VendorName + '|' + category;
1017
1018					if (matched_vendors[vendor_key]) {
1019						continue;
1020					}
1021
1022					matched_vendors[vendor_key] = true;
1023
1024					detected_services[category].push({
1025						vendor_name: rule.VendorName,
1026						category: category,
1027						block_before_consent: rule.BlockBeforeConsent,
1028						match_value: rule.MatchValue,
1029						first_detected_url: url,
1030						currently_blocked: element.getAttribute('data-jucra-cookie-blocked') === '1'
1031					});
1032				}
1033			}
1034		}
1035
1036		try {
1037			localStorage.setItem(
1038				'jucra_cookie_detected_services',
1039				JSON.stringify(detected_services)
1040			);
1041		} catch (error) {
1042			/* Ignore localStorage errors. */
1043		}
1044
1045		jucra_debug_log('Vendor detection finished', detected_services);
1046
1047		if (
1048			typeof jucra_cookie_banner_data !== 'undefined' &&
1049			jucra_cookie_banner_data.debug === true
1050		) {
1051			console.log('JUCRA Cookie Banner Detected Services:', detected_services);
1052		}
1053	}
1054
1055	function jucra_init() {
1056		jucra_debug_log('jucra_init() started', {
1057			ready_state: document.readyState,
1058			cookies: jucra_debug_cookie_snapshot()
1059		});
1060
1061		jucra_bind_debug_click_logger();
1062		jucra_bind_cookie_banner();
1063		jucra_activate_blocked_items();
1064		jucra_detect_vendor_matches();
1065
1066		jucra_debug_log('jucra_init() finished', {
1067			cookies: jucra_debug_cookie_snapshot()
1068		});
1069	}
1070
1071	if (document.readyState === 'loading') {
1072		document.addEventListener('DOMContentLoaded', jucra_init);
1073	} else {
1074		jucra_init();
1075	}
1076
1077})();

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.