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.