1(function($) { 2 3 cc = new Object(); 4 window.cookieControler = cc; 5 6 cc.initStatus = function() { 7 // {{{ 8 this.options = new Object(); 9 10 // check if we want to force the decision {{{ 11 var forceDecisionElem = $("#dc-cookie-control-form input[name=force_decision_p]"); 12 if(forceDecisionElem.length == 0 || forceDecisionElem.val() == "f") { 13 this.options.forceDecision = false; 14 } else { 15 this.options.forceDecision = true; 16 } 17 // }}} 18 19 let cookieVal = Cookies.get("dc_sys_cookie_consent"); 20 //console.log(cookieVal); 21 22 if (!this.hasDecision()) { 23 this.show(); 24 cookieVal = Cookies.get("dc_sys_cookie_consent"); 25 cc.showDimOverlay(); 26 } 27 28 this.cookieConsent = {}; 29 if ( cookieVal ) { 30 try { 31 this.cookieConsent = JSON.parse(cookieVal); 32 } catch(e) { 33 // delete invalid cookie 34 if (cc.isDebug) console.log("Invalid JSON value for cookie.") 35 // remove cookie 36 Cookies.remove("dc_sys_cookie_consent"); 37 // show controler 38 this.show(); 39 } 40 } 41 //window.cookieConsent = cookieConsent; 42 if (this.cookieConsent["all_p"]) { 43 this.checkAll(); 44 } else { 45 var f = $("#dc-cookie-control-form"); 46 var elem; 47 for (i in this.cookieConsent) { 48 if (i == "all_p") continue; 49 if (this.cookieConsent[i] == "t" || this.cookieConsent[i] == "granted") { 50 elem = f.find("[name=" + i + "]"); 51 elem.prop("checked", true); 52 } 53 } 54 } 55 56 setTimeout( function() { $(".dc-cookie-control").removeClass("is-initial"); }, 0 ) 57 58 this.setForceDecisionClass(); 59 60 var event = new CustomEvent("dc-cookie-control-initialized", { 61 "detail": this.cookieConsent 62 }); 63 window.document.dispatchEvent(event); 64 // }}} 65 } 66 67 cc.setDetailsWrapperScrollHeight = function() { 68 const detailsWrapper = document.querySelector(".dc-cookie-control .details-wrapper"); 69 if (detailsWrapper) { 70 let sh = detailsWrapper.scrollHeight + 100; 71 if (sh > 1000) detailsWrapper.style.setProperty("--js-max-height", sh + "px"); 72 } 73 } 74 75 cc.setForceDecisionClass = function() { 76 // {{{ 77 if (!this.allowHide()) { 78 $("#dc-cookie-control-container, #dc-cookie-control-reveal-container").addClass("force-decision"); 79 } else { 80 $("#dc-cookie-control-container, #dc-cookie-control-reveal-container").removeClass("force-decision"); 81 } 82 // }}} 83 } 84 85 cc.hasDecision = function() { 86 // {{{ 87 const cookieVal = Cookies.get("dc_sys_cookie_consent"); 88 //console.log(cookieVal); 89 if (cookieVal == undefined || cookieVal == "{}") { 90 return false 91 } else { 92 try { 93 JSON.parse(cookieVal); 94 return true 95 } catch(e) { 96 return false 97 } 98 } 99 // }}} 100 } 101 102 cc.forceDecision = function() { 103 return this.options.forceDecision; 104 } 105 106 cc.allowHide = function() { 107 // we return true if {{{ 108 // * we either do not force a decision 109 // * or we already have a descision 110 return (!this.forceDecision() || this.hasDecision()); 111 // }}} 112 } 113 114 cc.initAllSwitch = function() { 115 // {{{ 116 /* as switch */ 117 $(document).on("change", "#dc-cookie-control-form input[type=checkbox]#all", function(ev) { 118 if ($(this).prop("checked")) { 119 // Don't store for checkbox immediately. 120 // Allow the user to uncheck single entries. 121 cc.checkAll(); 122 } 123 }); 124 /* as button */ 125 $(document).on("click", "#dc-cookie-control-form button.-js-dc-cookie-control-all", function(ev) { 126 // check all boxes 127 ev.preventDefault(); 128 ev.stopPropagation(); 129 $("#dc-cookie-control-form input[type=checkbox]").prop("checked", true); 130 cc.store(); 131 }); 132 // }}} 133 } 134 135 cc.initDetails = function() { 136 // {{{ 137 $(document).on("click", "#dc-cookie-control-form .details-toggler", function(ev) { 138 var d = $("#dc-cookie-control-form .details-wrapper") 139 d.toggleClass("show"); 140 }); 141 // }}} 142 } 143 144 cc.showDimOverlay = function() { 145 // {{{ 146 var dim = $("div.dc-cookie-control-dim-overlay"); 147 if(dim) { 148 //dim.show(); 149 dim.addClass("visible"); 150 } 151 // }}} 152 } 153 154 cc.hideDimOverlay = function() { 155 // {{{ 156 var dim = $("div.dc-cookie-control-dim-overlay"); 157 if(dim) { 158 //dim.hide(); 159 dim.removeClass("visible"); 160 } 161 // }}} 162 } 163 164 cc.init = function() { 165 // {{{ 166 cc.initStatus(); 167 cc.initAllSwitch(); 168 cc.initDetails(); 169 170 jQuery(document).on("submit", "#dc-cookie-control-form", function(ev) { 171 // {{{ 172 ev.preventDefault();
173 cc.store(); 174 // }}} 175 }); 176 177 jQuery(document).on("click", "#dc-cookie-control-form .dc-cookie-control-store-details", function(ev) { 178 // the user only consented to the details cookies and not to all cookies {{{ 179 var allElem = $("#dc-cookie-control-form input#all"); 180 if (allElem.hasClass("hidden-input")) { 181 allElem.prop("checked", false); 182 } 183 // }}} 184 }); 185 186 jQuery(document).on("click", "#dc-cookie-control-form .-js-dc-cookie-control-technical", function(ev) { 187 ev.preventDefault(); 188 ev.stopPropagation(); 189 190 cc.uncheckAll(); 191 //cc.storeDefaults(); 192 cc.store(); 193 }); 194 195 jQuery(document).on("click", ".dc-cookie-control-toggler", function(ev) { 196 // {{{ 197 ev.preventDefault(); 198 // keep it open, if we have to force a decision 199 if (cc.hasDecision() || !cc.forceDecision()) { 200 cc.toggle(); 201 } else { 202 cc.show(); 203 } 204 // }}} 205 }); 206 207 jQuery(document).on("click", ".dc-cookie-control-show", function(ev) { 208 // {{{ 209 ev.preventDefault(); 210 cc.show(); 211 // }}} 212 }); 213 214 jQuery(document).on("click", ".dc-cookie-control-option-label", function(ev) { 215 ev.preventDefault(); 216 jQuery(this).parent().next(".dc-cookie-control-option-desc").toggleClass("hidden"); 217 jQuery(this).toggleClass("show"); 218 219 setTimeout( () => { 220 cc.setDetailsWrapperScrollHeight(); 221 }, 1600); 222 }); 223 224 document.querySelectorAll(".dc-cookie-control-option input[type=checkbox]").forEach ( (e) => { 225 // subval handling on change 226 e.addEventListener("change", (ev) => { 227 // {{{ 228 const isSubval = Array.from(ev.target.classList).filter( (e) => { return e.startsWith("-subval"); } ).length>0; 229 230 if (isSubval) { 231 if (ev.target.checked) { 232 // assert, that the parent is checked, if a subval is checked 233 const parentOption = ev.target.closest(".dc-cookie-control-option").querySelector(".dc-cookie-control-option-switch input[type=checkbox]"); 234 if (parentOption!==null) parentOption.checked = true; 235 } 236 } else { 237 const prefix = ev.target.id; 238 const fullPrefix = '-subval-' + prefix + "-"; 239 240 const subElems = document.querySelectorAll(`[type=checkbox][id^=${fullPrefix}]`); 241 242 if (cc.isDebug) console.log("CCC", ev.target.checked, fullPrefix) 243
244 subElems.forEach( (elem) => { 245 elem.checked = ev.target.checked; 246 }); 247 } 248 // }}} 249 }) 250 }); 251 252 cc.tools.hideOnOutsideClick(); 253 cc.tools.hideOnESC(); 254 // }}} 255 } 256 257 cc.checkAll = function() { 258 // {{{ 259 $("#dc-cookie-control-form input[type=checkbox]").prop("checked", true); 260 // }}} 261 } 262 cc.uncheckAll = function() { 263 // {{{ 264 $("#dc-cookie-control-form input[type=checkbox]").prop("checked", false); 265 // }}} 266 } 267 268 cc.store = function() { 269 // {{{ 270 // get form data and create an object out of the array 271 var formData = $("#dc-cookie-control-form").serializeArray(); 272 var cookieConsent = new Object; 273 formData.forEach(function(elem, idx) { 274 cookieConsent[elem.name] = elem.value; 275 }); 276 277 // store in global object 278 window.cookieConsent = cookieConsent; 279 this.cookieConsent = cookieConsent; 280 281 // store in cookie 282 var data = JSON.stringify(window.cookieConsent); 283 Cookies.set("dc_sys_cookie_consent", data, { 284 path: "/", 285 expires: 182, 286 sameSite: "Lax", 287 secure: true 288 }); 289 290 //const url = "/dc_components/site/cookie-control/ajax/store-consent"; 291 const url = "/symlnks/ccc-store"; 292 try { 293 $.post(url, { 294 "consent_json": data 295 }, 296 function() { 297 cc.hide(); 298 cc.hideDimOverlay(); 299 cc.setForceDecisionClass(); 300 } 301 ) 302 } catch (e) { 303 console.log(e); 304 } 305 306 const myEvent = new CustomEvent('dc-cookie-control-changed', { 307 "detail": cookieConsent 308 }); 309 window.document.dispatchEvent(myEvent); 310 // }}} 311 } 312 313 cc.storeDefaults = function() { 314 // {{{ 315 var formData = $("#dc-cookie-control-form").serializeArray(); 316 var cookieConsent = new Object; 317 formData.forEach(function(elem, idx) { 318 cookieConsent[elem.name] = elem.value; 319 }); 320 321 // store in global object 322 window.cookieConsent = cookieConsent; 323 324 // store in cookie 325 var data = JSON.stringify(window.cookieConsent); 326 Cookies.set("dc_sys_cookie_consent", data, { 327 path: "/", 328 expires: 182, 329 sameSite: "Lax", 330 secure: true 331 }); 332 // }}} 333 } 334 335 cc.foundationRevealStatus = function(modal, action) { 336 // {{{ 337 if (parseInt(Foundation.version) >= 6) { 338 if (!cc.fn6Reveal) { 339 cc.fn6Reveal = new Foundation.Reveal(modal); 340 341 $(document).on("closed.zf.reveal", "#dc-cookie-control-reveal-container[data-reveal]", function (ev) { 342 if (typeof(cc) != "undefined" && !cc.allowHide()) { 343 /* 344 ev.preventDefault(); 345 ev.stopPropagation(); 346 */ 347 setTimeout(function() { cc.fn6Reveal.open(); }, 0); 348 } 349 }); 350 } 351 352 if (!action) action = cc.fn6Reveal.isActive?"close":"open"; 353 if (action == "open") { 354 cc.fn6Reveal.open(); 355 } else { 356 if (cc.allowHide()) { 357 cc.fn6Reveal.close(); 358 } else { 359 cc.fn6Reveal.open(); 360 } 361 } 362 } else { 363 if (!action) action = modal.hasClass("open")?"close":"open"; 364 modal.foundation("reveal", action); 365 } 366 // }}} 367 } 368 369 cc.toggle = function() { 370 // {{{ 371 $(".dc-cookie-control").toggleClass("visible"); 372 var modal = $("#dc-cookie-control-reveal-container"); 373 if (modal.length > 0) { 374 this.foundationRevealStatus(modal); 375 } 376 // }}} 377 } 378 379 cc.setConsent = function(type, val) { 380 // {{{ 381 $("#dc-cookie-control-form #" + type).prop("checked", val); 382 // }}} 383 } 384 385 cc.getConsent = function(type) { 386 return $("#dc-cookie-control-form #" + type).prop("checked"); 387 } 388 389 cc.show = function() { 390 // {{{ 391 $(".dc-cookie-control").addClass("visible"); 392 if ($("#dc-cookie-control-reveal-container").length > 0) { 393 var modal = $("#dc-cookie-control-reveal-container"); 394 cc.foundationRevealStatus(modal, "open"); 395 } 396 // }}} 397 } 398 399 cc.hide = function() { 400 // {{{ 401 cc.hideDimOverlay(); 402 $(".dc-cookie-control").removeClass("visible"); 403 if ($("#dc-cookie-control-reveal-container").length > 0) { 404 var modal = $("#dc-cookie-control-reveal-container"); 405 cc.foundationRevealStatus(modal, "close"); 406 //$("#dc-cookie-control-reveal-container").foundation('reveal', 'close'); 407 } 408 // }}} 409 } 410
411 cc.showDetails = function() { 412 // {{{ 413 var d = $("#dc-cookie-control-form .details-wrapper") 414 d.addClass("show"); 415 // }}} 416 } 417 418 cc.hideDetails = function() { 419 // {{{ 420 var d = $("#dc-cookie-control-form .details-wrapper") 421 d.removeClass("show"); 422 // }}} 423 } 424 425 cc.initStatusObj = new Object(); 426 427 // various helper functions {{{ 428 cc.tools = new Object(); 429 430 cc.tools.hideOnOutsideClick = function() { 431 // {{{ 432 var container = $(".dc-cookie-control, .dc-cookie-control-toggler, #dc-cookie-control-reveal-container"); 433 document.addEventListener("click", function(ev) { 434 // if the target of the click isn't the container nor a descendant of the container 435 if (cc.allowHide() && !container.is(ev.target) && container.has(ev.target).length === 0) { 436 cc.hide(); 437 } 438 }); 439 // }}} 440 } 441 442 cc.tools.hideOnESC = function() { 443 // {{{ 444 document.addEventListener("keyup", function(ev) { 445 if (cc.allowHide() && ev.key === "Escape") cc.hide(); 446 }); 447 // }}} 448 } 449 450 cc.tools.showBlockingAuthMsg = function(type, socialSigninContainer) { 451 var parentWindow = window; 452 $.get("/dc_components/site/cookie-control/ajax/blocked-msg-social-signin", null, function(data) { 453 //console.log(data); 454 var container = $(data).filter("div#"+ type + "-container"); 455 if($("div#"+type+"-container").length == 0) { 456 socialSigninContainer.hide(); 457 socialSigninContainer.before(container); 458 459 $(".dc-cookie-control-show").on("click", function(ev) { 460 ev.preventDefault(); 461 ev.stopPropagation(); 462 parentWindow.cookieControler.show(); 463 parentWindow.cookieControler.showDetails(); 464 }); 465 466 $("#dc-cookie-control-allow-"+ type + "-login").on("click", function(ev) { 467 ev.preventDefault(); 468 ev.stopPropagation(); 469 $("div#"+type+"-container").remove(); 470 parentWindow.cookieControler.setConsent(type + "-login", true); 471 parentWindow.cookieControler.store(); 472 }); 473 } 474 }); 475 476 } 477 478 cc.tools.showGeneralBlockingMsg = function(type, prettyName, containerSelector) { 479 // {{{ 480 var containers = document.querySelectorAll(containerSelector); 481 var parentWindow = window; 482 483 if (containers.length > 0) { 484 fetch("/dc_components/site/cookie-control/ajax/blocked-msg-general?" + 485 new URLSearchParams({ 486 cookie_type: type, 487 cookie_pretty_name: prettyName 488 })) 489 .then(response => { 490 if (!response.ok) { 491 return "ERROR" 492 } 493 return response.text(); 494 }) 495 .then(html => { 496 containers.forEach(container => { 497 container.innerHTML = html; 498 499 container.querySelector(".dc-cookie-control-edit-cookies")?.addEventListener("click", function(ev) { 500 ev.preventDefault(); 501 ev.stopPropagation(); 502 parentWindow.cookieControler.show(); 503 parentWindow.cookieControler.showDetails(); 504 }); 505 506 container.querySelector(".dc-cookie-control-allow-" + type)?.addEventListener("click", function(ev) { 507 ev.preventDefault(); 508 ev.stopPropagation(); 509 parentWindow.cookieControler.setConsent(type, true); 510 parentWindow.cookieControler.store(); 511 }); 512 }); 513 }) 514 .catch(error => { 515 console.error("Fetch error:", error); 516 }); 517 } 518 // }}} 519 } 520 521 cc.tools.showVideoBlockingMsg = function(videoSource, videoSourcePrettyName) { 522 // {{{ 523 if(videoSource == "vimeo") { 524 var frames = window.document.querySelectorAll('iframe[data-src^="https://player.vimeo"]'); 525 } else { 526 //console.log("videoSource " + videoSource + " unknown.") 527 return; 528 } 529 530 var parentWindow = window; 531 532 fetch("/dc_components/site/cookie-control/ajax/blocked-msg-video-frame?" + 533 new URLSearchParams({ 534 video_source: videoSource, 535 video_source_pretty_name: videoSourcePrettyName 536 })) 537 .then(response => { 538 if (!response.ok) { 539 return "ERROR" 540 } 541 return response.text(); 542 }) 543 .then(html => { 544 frames.forEach(function(f) { 545 f.classList.add("blocked"); 546 f.contentDocument.body.innerHTML = html; 547 f.contentDocument.body.addEventListener("click", function(ev) { 548 var closest; 549 550 closest = ev.target.closest(".dc-cookie-control-allow-video-once"); 551 if (closest && this.contains(closest)) { 552 ev.preventDefault(); 553 f.src = f.dataset.src; 554 f.classList.remove("blocked"); 555 } 556 557 closest = ev.target.closest(".dc-cookie-control-show"); 558 if (closest && this.contains(closest)) { 559 ev.preventDefault(); 560 f.contentWindow.parent.cookieControler.show(); 561 } 562 563 closest = ev.target.closest(".dc-cookie-control-show-detail
563s"); 564 if (closest && this.contains(closest)) { 565 f.contentWindow.parent.cookieControler.showDetails(); 566 } 567 568 }); 569 f.contentDocument.getElementById('dc-cookie-control-allow-video')?.addEventListener("click", function(ev) { 570 ev.preventDefault(); 571 ev.stopPropagation(); 572 f.classList.remove("blocked"); 573 parentWindow.cookieControler.setConsent(videoSource, true); 574 parentWindow.cookieControler.store(); 575 }); 576 }); 577 }) 578 .catch(error => { 579 console.error("Fetch error:", error); 580 }); 581 // }}} 582 } 583 584 cc.tools.loadedScripts = []; 585 cc.tools.loadScript = function(src, defer, async, crossorigin = "", nonce = "", callback="", id = "") { 586 // {{{ 587 588 // prevent double loading 589 if (cc.tools.loadedScripts.indexOf(src) == -1) { 590 cc.tools.loadedScripts.push(src); 591 592 let scriptTag = document.createElement("script"); // create a script tag 593 let firstScriptTag = document.getElementsByTagName("script")[0]; // find the first script tag in the document 594 595 scriptTag.src = src; // set the source of the script to your script 596 if (defer) { 597 scriptTag.setAttribute("defer", ""); 598 }
599 if (async) { 600 scriptTag.setAttribute("async", ""); 601 } 602 if (crossorigin != "") { 603 scriptTag.setAttribute("crossorigin", crossorigin); 604 } 605 if (nonce != "") { 606 scriptTag.setAttribute("nonce", nonce); 607 } 608 if (id != "") { 609 scriptTag.setAttribute("id", id); 610 } 611 if(callback != "") { 612 scriptTag.onload = function() { 613 callback(); 614 } 615 } 616 if (typeof(abd) !== "undefined") { 617 scriptTag.onerror = () => { abd(src) }; 618 } 619 firstScriptTag.parentNode.insertBefore(scriptTag, firstScriptTag); // append the script to the DOM 620 } 621 // }}} 622 } 623 // }}} 624 625 cc.tools.deleteContainer = function(type) { 626 var container = $("div#"+type+"-container"); 627 if(container.length > 0) { 628 container.remove(); 629 } else { 630 setTimeout( function() { 631 cc.tools.deleteContainer(type); 632 }, 50); 633 } 634 } 635 636 // YOUTUBE {{{ 637 cc.youtube = new Object(); 638 639 cc.youtube.showBlockingMsg = function() { 640 // {{{ 641 var youtubeFrames = window.document.querySelectorAll('iframe[data-src^="https://www.youtube"],iframe[data-yt-src^="https://www.youtube"]'); 642 var parentWindow = window; 643 var msg = $.get("/dc_components/site/cookie-control/ajax/blocked-msg-youtube", null, function(data) { 644 youtubeFrames.forEach(function(ye) { 645 ye.classList.add("blocked"); 646 ye.contentDocument.body.innerHTML = msg.responseText; 647 ye.contentDocument.body.addEventListener("click", function(ev) { 648 var closest; 649 650 closest = ev.target.closest(".dc-cookie-control-allow-youtube-once"); 651 if (closest && this.contains(closest)) { 652 ev.preventDefault(); 653 ye.src = ye.dataset.src; 654 ye.classList.remove("blocked"); 655 } 656 657 closest = ev.target.closest(".dc-cookie-control-show"); 658 if (closest && this.contains(closest)) { 659 ev.preventDefault(); 660 ye.contentWindow.parent.cookieControler.show(); 661 } 662 663 closest = ev.target.closest(".dc-cookie-control-show-details"); 664 if (closest && this.contains(closest)) { 665 ye.contentWindow.parent.cookieControler.showDetails(); 666 } 667 668 }); 669 ye.contentDocument.getElementById('dc-cookie-control-allow-youtube')?.addEventListener("click", function(ev) { 670 ev.preventDefault(); 671 ev.stopPropagation(); 672 ye.classList.remove("blocked"); 673 parentWindow.cookieControler.setConsent("youtube", true); 674 parentWindow.cookieControler.store(); 675 }); 676 }); 677 }); 678 // }}} 679 } 680 681 cc.youtube.init = function() { 682 // {{{ 683 var youtubeFrames = window.document.querySelectorAll('iframe[data-src^="https://www.youtube"],iframe[data-yt-src^="https://www.youtube"]'); 684 youtubeFrames.forEach(function(e) { 685 if(!e.dataset.initialized){ 686 if(e.dataset.autoplay == undefined) { 687 e.src = (e.dataset.src != undefined) ? e.dataset.src : e.dataset.ytSrc; 688 } 689 e.dataset.autoplaySrc = (e.dataset.src != undefined) ? e.dataset.src : e.dataset.ytSrc; 690 691 e.dataset.initialized = true; 692 e.classList.remove("blocked"); 693 //console.log("initialized frame"); 694 } 695 }); 696 697 // }}} 698 } 699 // }}} 700 701 // Vimeo {{{ 702 cc.vimeo = new Object(); 703 704 cc.vimeo.showBlockingMsg = function() { 705 // {{{ 706 cc.tools.showVideoBlockingMsg("vimeo", "Vimeo"); 707 // }}} 708 } 709 710 cc.vimeo.init = function() { 711 // {{{ 712 var frames = window.document.querySelectorAll('iframe[data-src^="https://player.vimeo"]'); 713 frames.forEach(function(e) { 714 if(!e.dataset.initialized){ 715 e.src = e.dataset.src; 716 e.dataset.initialized = true; 717 e.classList.remove("blocked"); 718 } 719 }); 720 // }}} 721 } 722 // }}} 723 724 // GOOGLE ANALYTICS/GTM {{{ 725 cc.google = new Object(); 726 727 // this should really be calles initUA (Universal Analytics) - will be discontinued 2023-07-01 728 cc.google.initGA = function(id) { 729 // Universal Analytics (old) {{{ 730 (function(i, s, o, g, r, a, m) { 731 i['GoogleAnalyticsObject'] = r; 732 i[r] = i[r] || function() { 733 (i[r].q = i[r].q || []).push(arguments) 734 }, i[r].l = 1 * new Date(); 735 a = s.createElement(o), 736 m = s.getElementsByTagName(o)[0]; 737 a.async = 1; 738 a.src = g; 739 m.parentNode.insertBefore(a, m) 740 })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga'); 741 742 ga('create', id, 'auto'); 743 ga('set', 'anonymizeIp', true); 744 ga('send', 'pageview'); 745 746 cc.tools.loadScript("/resources/analytics/track-events-ng.js", true, true); 747 // }}} 748 } 749 750 cc.google.initGA4 = function(GA_MEASUREMENT_ID, UA_ID = null, isConsentMode = true, options) { 751 // GA4 (new, mandatory from 2023-07-01) {{{ 752 // https://developers.google.com/analytics/devguides/collection/gtagjs 753 window.dataLayer = window.dataLayer || []; 754 755 // orig google 756 function gtag() { dataLayer.push(arguments); } 757 if(isConsentMode) { 758 if ( cc.google.consentManagerDefault() ) { 759 cc.google.consentManagerUpdate('ga4-mode'); 760 } 761 762 jQuery(document).on("dc-cookie-control-changed", function(ev) { 763 if (cc.isDebug) console.log("CCC: update ga4-mode datalayer consent"); 764 cc.google.consentManagerUpdate('ga4-mode'); 765 }); 766 767 } 768 769 cc.tools.loadScript("https://www.googletagmanager.com/gtag/js?i
769d=" + (GA_MEASUREMENT_ID?GA_MEASUREMENT_ID:UA_ID)); 770 771 gtag("js", new Date()); 772 773 if ( UA_ID != null ) { 774 // Universal Analytics (old) 775 gtag("config", UA_ID, options); 776 } 777 if ( GA_MEASUREMENT_ID != null ) { 778 // GA4 (new) 779 gtag("config", GA_MEASUREMENT_ID, options); // GA4 780 //console.log(`gtag("config", ${GA_MEASUREMENT_ID}, ${JSON.stringify(options)})`); // GA4 781 } 782 783 // https://developers.google.com/tag-platform/security/guides/consent?hl=de&consentmode=advanced 784 785 window.gtag = gtag; 786 cc.tools.loadScript("/resources/analytics/track-events-ng.js", true, true); 787 // }}} 788 } 789 790 cc.google.consentManager = function(mode, obj) { 791 window.dataLayer = window.dataLayer || []; 792 function gtag() { dataLayer.push(arguments); } 793 if ( cc.isDebug ) console.log("CCC: Google Consent Manger: consentManager", mode, obj); 794 gtag('consent', mode, obj); 795 } 796 797 cc.google.consentManagerDefaultObject = function(defaultStatus) { 798 // {{{ 799 const status = cc.google.mapConsentValue(defaultStatus) 800 return { 801 'ad_storage': status, 802 'ad_user_data': status, 803 'ad_personalization': status, 804 'analytics_storage': status, 805 'functionality_storage': status, 806 'security_storage': status, 807 'personalization_storage': status 808 } 809 // }}} 810 } 811 812 cc.google.consentMangerDefaultSet = false; 813 cc.google.consentManagerDefault = function(defaultStatus=false) { 814 // {{{ 815 // only set default once 816 if (!cc.google.consentMangerDefaultSet) { 817 cc.google.consentMangerDefaultSet = true; 818 cc.google.consentManager('default', cc.google.consentManagerDefaultObject(defaultStatus) ); 819 return true; 820 } 821 return false; 822 // }}} 823 } 824 825 cc.google.mapConsentValue = function(raw) { 826 // allows a bunch of truthy values to be used in the google dataLayer consent manager {{{ 827 const truthy = ["t", "true", "on", "1", "granted", true]; 828 return (truthy.indexOf(raw) !== -1)?"granted":"denied"; 829 // }}} 830 } 831 832 cc.google.consentManagerUpdate = function(prefix, defaultStatus) { 833 // {{{ 834 const fullPrefix = '-subval-' + prefix + "-"; 835 const keys = Object.keys(cc.cookieConsent).filter( (e) => { return e.startsWith(fullPrefix) } ); 836 837 // get the default object with 'granted' values 838 const obj = cc.google.consentManagerDefaultObject(true); 839 keys.forEach ( (k) => { 840 obj[k.substring(fullPrefix.length,k.length)] = cc.google.mapConsentValue(cc.cookieConsent[k]) 841 }); 842 843 cc.google.consentManager('update', obj); 844 // }}} 845 } 846 847 cc.google.initGTM = function(id, hasConsentManager=false) { 848 // Google Tag Manager {{{ 849 window.dataLayer = window.dataLayer || []; 850 function gtag() { dataLayer.push(arguments); } 851 852 if (hasConsentManager) { 853 cc.google.consentManagerDefault(); 854 cc.google.consentManagerUpdate('gtm-consent-mode'); 855 } 856 857 (function(w, d, s, l, i) { 858 w[l] = w[l] || []; 859 w[l].push({ 860 'gtm.start': new Date().getTime(), 861 event: 'gtm.js' 862 }); 863 var f = d.getElementsByTagName(s)[0], 864 j = d.createElement(s), 865 dl = l != 'dataLayer' ? '&l=' + l : ''; 866 j.async = true; 867 j.src = 868 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; 869 f.parentNode.insertBefore(j, f); 870 })(window, document, 'script', 'dataLayer', id); 871 872 cc.google.consentManagerUpdate('gtm-consent-mode'); 873 874 cc.tools.loadScript("/resources/analytics/track-events-ng.js", true, true); 875 // }}} 876 } 877 cc.google.initGTM_new = cc.google.initGTM; 878 cc.google.initGTM_CM = cc.google.initGTM; 879 // }}} 880 881 cc.google.initLogin = function(lng) { 882 cc.tools.loadScript("https://apis.google.com/js/client:platform.js?onload=googleInit&hl="+lng, true, true, "", "", function() { 883 cc.tools.loadScript("https://accounts.google.com/gsi/client", true, true, "", "", function() { 884 window.setTimeout(function(){ 885 $("div#google-container").remove(); 886 $("#btn-google").show(); 887 }, 300); 888 }); 889 }); 890 } 891 892 cc.google.login_showBlockingMsg = function() { 893 // {{{ 894 var container = $("#btn-google"); 895 cc.tools.showBlockingAuthMsg("google", container); 896 // }}} 897 } 898 899 //GOOGLE RECAPTCHA BLOCKING MESSAGE AND INIT 900 //{{{ 901 cc.google.RC = new Object(); 902 cc.google.RC.init = function() { 903 // {{{ 904 cc.tools.loadScript("https://www.google.com/recaptcha/api.js", true, true); 905 906 //to-do unhide frame with customer reviews 907 var blockedFrame = $("#-js-block-message-rc"); 908 var customerReview = $("#-js-review-form"); 909 customerReview.show(); 910 blockedFrame.hide(); 911 // }}} 912 } 913 914 cc.google.RC.showBlockingMsg = function() { 915 // {{{ 916 var div = $("#-js-block-message-rc"); 917 918 // to-do hide divs with customer reviews 919 var customerReview = $("#-js-review-form"); 920 customerReview.hide(); 921 if (div.length == 0) { 922 var newFrame = $("<div/>", { 923 "id": "-js-block-message-rc" 924 }); 925 customerReview.parent().prepend(newFrame); 926 div = $("#-js-block-message-rc"); 927 } 928 929 var parentWindow = window; 930 if (div.length != 0) { 931 var msg = $.get("/dc_components/site/cookie-control/ajax/blocked-msg-recaptcha", null, function(data) { 932 div.html(msg.responseText); 933 934 $("#dc-cookie-control-edit-cookies").on("click", function(ev) { 935 ev.preventDefault(); 936 //if ( cc.isDebug ) console.log(parentWindow.cookieControler); 937 parentWindow.cookieControler.show();
938 parentWindow.cookieControler.showDetails(); 939 }); 940 941 $("#dc-cookie-control-allow-google").on("click", function(ev) { 942 ev.preventDefault(); 943 ev.stopPropagation(); 944 parentWindow.cookieControler.setConsent("google", true); 945 parentWindow.cookieControler.store(); 946 }); 947 }); 948 } 949 // }}} 950 } 951 // }}} 952 953 //GOOGLE MAPS BLOCKING MESSAGE AND INIT 954 //{{{ 955 cc.googleMaps = new Object(); 956 cc.googleMaps.showBlockingMsg = function() { 957 var mapFramesBlocked = $("iframe[data-src^='https://www.google.com/maps'], iframe[data-src^='https://maps.google.at/maps']"); 958 var parentWindow = window; 959 //add blocking message 960 mapFramesBlocked.each(function() { 961 var elem = this; 962 var msg = $.get("/dc_components/site/cookie-control/ajax/blocked-msg-googlemaps", null, function(data) { 963 elem.contentDocument.body.innerHTML = msg.responseText; 964 965 elem.contentDocument.getElementById("dc-cookie-control-edit-cookies")?.addEventListener("click", function(ev) { 966 ev.preventDefault(); 967 elem.contentWindow.parent.cookieControler.show(); 968 elem.contentWindow.parent.cookieControler.showDetails(); 969 }); 970 971 elem.contentDocument.getElementById("dc-cookie-control-allow-googlemaps")?.addEventListener("click", function(ev) { 972 ev.preventDefault(); 973 ev.stopPropagation(); 974 parentWindow.cookieControler.setConsent("google-maps", true); 975 parentWindow.cookieControler.store(); 976 }); 977 }); 978 }); 979 } 980 981 cc.googleMaps.init = function() { 982 if (window.cookieControler.initStatusObj.googleMaps !== true) { 983 var mapFramesBlocked = $("iframe[data-src^='https://www.google.com/maps'], iframe[data-src^='https://maps.google.at/maps']"); 984 mapFramesBlocked.each(function() { 985 $(this).attr("src", $(this).attr("data-src")); 986 }); 987 window.cookieControler.initStatusObj.googleMaps = true; 988 } else { 989 if ( cc.isDebug ) console.log("CCC: Cookie consent for GoogleMaps: already initialized"); 990 } 991 } 992 //}}} 993 994 //MAIL CHIMP PREVENT REDIRECT AND INIT 995 cc.mailchimp = new Object(); 996 cc.mailchimp.form = $("#mc-embedded-subscribe-form"); 997 cc.mailchimp.showBlockingMsg = function() { 998 // {{{ 999 var container = $("#mc-field-container"); 1000 var parentWindow = window; 1001 if (cc.mailchimp.form.length != 0) { 1002 var msg = $.get("/dc_components/site/cookie-control/ajax/blocked-msg-mailchimp", null, function(ev) { 1003 if (container.length >= 1) { 1004 container.attr("data-html", container.get(0).innerHTML); 1005 } 1006 container.html(msg.responseText); 1007 1008 $("#dc-cookie-control-edit-cookies").on("click", function(ev) { 1009 ev.preventDefault(); 1010 parentWindow.cookieControler.show(); 1011 parentWindow.cookieControler.showDetails(); 1012 }); 1013 1014 $("#dc-cookie-control-allow-mailchimp").on("click", function(ev) { 1015 ev.preventDefault(); 1016 ev.stopPropagation(); 1017 parentWindow.cookieControler.setConsent("mailchimp", true); 1018 parentWindow.cookieControler.store(); 1019 }); 1020 }); 1021 } 1022 // }}} 1023 } 1024 1025 cc.mailchimp.init = function() { 1026 // {{{ 1027 if (window.cookieControler.initStatusObj.mailchimp !== true) { 1028 var container = $("#mc-field-container"); 1029 window.setTimeout(function() { 1030 container.html(container.attr("data-html")); 1031 }, 1000); 1032 window.cookieControler.initStatusObj.mailchimp = true; 1033 } else { 1034 if ( cc.isDebug ) console.log("CCC: Cookie consent for Mailchimp: already initialized"); 1035 } 1036 // }}} 1037 } 1038 1039 cc.facebook = new Object(); 1040 cc.facebook.init = function(id) { 1041 // {{{ 1042 if (window.cookieControler.initStatusObj.facebook !== true) { 1043 ! function(f, b, e, v, n, t, s) { 1044 if (f.fbq) return; 1045 n = f.fbq = function() { 1046 n.callMethod ? n.callMethod.apply(n, arguments) : n.queue.push(arguments) 1047 }; 1048 if (!f._fbq) f._fbq = n; 1049 n.push = n; 1050 n.loaded = !0; 1051 n.version = '2.0'; 1052 n.queue = []; 1053 t = b.createElement(e); 1054 t.async = !0; 1055 t.src = v; 1056 s = b.getElementsByTagName(e)[0]; 1057 s.parentNode.insertBefore(t, s) 1058 }(window, document, 'script', 1059 'https://connect.facebook.net/en_US/fbevents.js');
1060 fbq('init', id); 1061 fbq('track', 'PageView'); 1062 window.cookieControler.initStatusObj.facebook = true; 1063 } else { 1064 if ( cc.isDebug ) console.log("CCC: Cookie consent for Facebook Pixel: already initialized"); 1065 } 1066 // }}} 1067 } 1068 1069 cc.facebook.initLogin = function(lng, id, version="v7.0") { 1070 // {{{ 1071 cc.tools.loadScript("https://connect.facebook.net/"+ lng +"/sdk.js#xfbml=1&autoLogAppEvents=1&version="+ version + "&appId="+id, true, true, "anonymous", "4GQWwWIt", function() { 1072 window.setTimeout(function(){ 1073 $("#btn-facebook").show(); 1074 $("div#facebook-container").remove(); 1075 }, 300); 1076 }); 1077 initFacebook(); 1078 // }}} 1079 } 1080 1081 cc.facebook.login_showBlockingMsg = function() { 1082 // {{{ 1083 var container = $("#btn-facebook"); 1084 cc.tools.showBlockingAuthMsg("facebook", container); 1085 // }}} 1086 } 1087 1088 cc.lieferantenDE = new Object(); 1089 1090 cc.lieferantenDE.init = function(id) { 1091 // {{{ 1092 if (window.cookieControler.initStatusObj.lieferantenDE !== true) { 1093 const container = $("a[href^='https://www.lieferanten.de']"); 1094 const url = "https://www.lieferanten.de/images/members/member.php?c=0&li=" + id; 1095 const image = $("#siegelImage").clone(); 1096 $("#siegelImage").remove(); 1097 image.attr("src", url); 1098 container.append(image); 1099 window.cookieControler.initStatusObj.lieferantenDE = true; 1100 } else { 1101 if (cc.isDebug) console.log("Cookie constent for Lieferanten.de: already initialized"); 1102 } 1103 // }}} 1104 } 1105 1106 cc.apple = new Object(); 1107 1108 cc.apple.initLogin = function(lng) { 1109 // {{{ 1110 $.getScript("https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/"+ lng +"/appleid.auth.js", function(data, textStatus, jqxhr) { 1111 appleInit(); 1112 $("#btn-apple").show(); 1113 $("div#apple-container").remove(); 1114 }); 1115 // }}} 1116 } 1117 1118 cc.apple.login_showBlockingMsg = function() { 1119 // {{{ 1120 var container = $("#btn-apple"); 1121 cc.tools.showBlockingAuthMsg("apple", container); 1122 // }}} 1123 } 1124 1125 cc.microsoft = new Object(); 1126 1127 cc.microsoft.initLogin = function() { 1128 // {{{ 1129 $.getScript("https://alcdn.msauth.net/browser/2.30.0/js/msal-browser.min.js", function(data, textStatus, jqxhr) { 1130 initMSAL(); 1131 $("#btn-microsoft").show(); 1132 $("div#microsoft-container").remove(); 1133 }); 1134 // }}} 1135 } 1136 1137 cc.microsoft.login_showBlockingMsg = function() { 1138 // {{{ 1139 var container = $("#btn-microsoft"); 1140 cc.tools.showBlockingAuthMsg("microsoft", container); 1141 // }}} 1142 } 1143 1144 1145 cc.ekomi = new Object(); 1146 1147 cc.ekomi.init = function(id) { 1148 // {{{ 1149 (function (w) { 1150 w['_ekomiWidgetsServerUrl'] = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//widgets.ekomi.com'; 1151 w['_customerId'] = id; 1152 w['_language'] = 'de'; 1153 1154 if(typeof(w['_ekomiWidgetTokens']) !== 'undefined'){ 1155 w['_ekomiWidgetTokens'][w['_ekomiWidgetTokens'].length] = 'sf1367255ef46dc76ad48'; 1156 } else { 1157 w['_ekomiWidgetTokens'] = new Array('sf1367255ef46dc76ad48'); 1158 } 1159 1160 if(typeof(ekomiWidgetJs) == 'undefined') { 1161 ekomiWidgetJs = true; 1162 1163 var scr = document.createElement('script');scr.src = 'https://sw-assets.ekomiapps.de/static_resources/widget.js'; 1164 var head = document.getElementsByTagName('head')[0];head.appendChild(scr); 1165 } 1166 })(window); 1167 var container = $("#ekomi-field-container"); 1168 container.hide(); 1169 jQuery.getScript("//lite.ekomiapps.de/widget.js?type=reputami_rank&v=20200610&locale=de"); 1170 // }}} 1171 } 1172 1173 cc.ekomi.showBlockingMsg = function() { 1174 // {{{ 1175 var container = $("#ekomi-field-container"); 1176 var parentWindow = window; 1177 var msg = $.get("/dc_components/site/cookie-control/ajax/blocked-msg-ekomi", null, function(ev) { 1178 1179 container[0].innerHTML = msg.responseText; 1180 1181 $("#dc-cookie-control-edit-cookies").on("click", function(ev) { 1182 ev.preventDefault(); 1183 ev.stopPropagation(); 1184 parentWindow.cookieControler.show(); 1185 parentWindow.cookieControler.showDetails(); 1186 }); 1187 1188 $("#dc-cookie-control-allow-ekomi").on("click", function(ev) { 1189 ev.preventDefault(); 1190 ev.stopPropagation(); 1191 parentWindow.cookieControler.setConsent("ekomi", true); 1192 parentWindow.cookieControler.store(); 1193 }); 1194 }); 1195 // }}} 1196 } 1197 1198 cc.matomo = new Object(); 1199 1200 cc.matomo.init = function(matomoCloudUrl) { 1201 // {{{ 1202 if (window.cookieControler.initStatusObj.matomo !== true) { 1203 var _paq = window._paq = window._paq || []; 1204 _paq.push(['trackPageView']); 1205 _paq.push(['enableLinkTracking']); 1206 (function() { 1207 _paq.push(['setTrackerUrl', matomoCloudUrl+'matomo.php']); 1208 _paq.push(['setSiteId', '1']); 1209 var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; 1210 g.async=true; g.src=matomoCloudUrl+'matomo.js'; s.parentNode.insertBefore(g,s); 1211 })(); 1212 1213 window.cookieControler.initStatusObj.matomo = true; 1214 } else { 1215 if (cc.isDebug) console.log("CCC: Cookie constent for Matomo: already initialized"); 1216 } 1217 // }}} 1218 } 1219 1220 cc.bing = new Object(); 1221 1222 cc.bing.init = function(bingId) { 1223 // {{{ 1224 if (window.cookieControler.initStatusObj.bing !== true) { 1225 1226 (function(w,d,t,r,u) 1227 { 1228 var f,n,i; 1229 w[u]=w[u]||[],f=function() 1230 { 1231 var o={ti:bingId, enableAutoSpaTracking: true}; 1232 o.q=w[u],w[u]=new UET(o),w[u].push("pageLoad")}, 1233 n=d.createElement(t),n.src=r,n.async=1,n.onload=n.onreadystatechange=function() 1234 { 1235 var s=this.readyState; 1236 s&&s!=="loaded"&&s!=="complete"||(f(),n.onload=n.onreadystatechange=null) 1237 }, 1238 i=d.getElementsByTagName(t)[0],i.parentNode.insertBefore(n,i) 1239 })(window,document,"script","//bat.bing.com/bat.js","uetq"); 1240 1241 window.cookieControler.initStatusObj.bing = true; 1242 /* 1243 (function(w,d,t,r,u) 1244 { 1245 var f,n,i; 1246 w[u]=w[u]||[],f=function() 1247 { 1248 var o={ti:bingId, enableAutoSpaTracking: true}; 1249 o.q=w[u],w[u]=new UET(o),w[u].push("pageLoad") 1250 }, 1251 n=d.createElement(t),n.src=r,n.async=1,n.onload=n.onreadystatechange=function() 1252 { 1253 var s=this.readyState; 1254 s&&s!=="loaded"&&s!=="complete"||(f(),n.onload=n.onreadystatechange=null) 1255 }, 1256 i=d.getElementsByTagName(t)[0],i.parentNode.insertBefore(n,i) 1257 }) 1258 (window,document,"script","//bat.bing.com/bat.js","uetq"); 1259 window.cookieControler.initStatusObj.bing = true; 1260 */ 1261 } else { 1262 if (cc.isDebug) console.log("Cookie constent for Bing: already initialized"); 1263 } 1264 // }}} 1265 } 1266 1267 cc.awin = new Object(); 1268 cc.awin.init = function(id) { 1269 // deferred, not async 1270 cc.tools.loadScript("https://www.dwin1.com/"+id+".js", true, false); 1271 } 1272 1273 cc.belboon = new Object(); 1274 cc.belboon.init = function(pId, page) { 1275 // {{{ 1276 if (page==="") return; 1277 belboonTag = {}; 1278 (function(d) { 1279 var s = d.createElement("script"); 1280 s.async = true; 1281 s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//containertags.belboon.de/belboonTag.js.php?pId="+pId+"&page="+page+"&type=dynamic"; 1282 var a = d.getElementsByTagName("script")[0]; 1283 a.parentNode.insertBefore(s, a); 1284 }(document)); 1285 // }}} 1286 } 1287 1288 cc.adcell = new Object(); 1289 cc.adcell.init = function(loc, pid) { 1290 // {{{ 1291 cc.tools.loadScript("https://t.adcell.com/js/trad.js", true, true, "", "", function() { 1292 Adcell.Tracking.track(); 1293 }); 1294 1295 /* 1296 if (pid > 0) { 1297 if (loc == "index") { 1298 cc.tools.loadScript("https://t.adcell.com/js/inlineretarget.js?method=track&pid=" + pid + "&t
1298ype=startpage", true, true); 1299 } 1300 } 1301 */ 1302 // }}} 1303 } 1304 1305 cc.trustindex = new Object(); 1306 cc.trustindex.init = function() { 1307 // {{{ 1308 cc.tools.loadScript("https://cdn.trustindex.io/loader.js", true, true); 1309 1310 // }}} 1311 } 1312 1313 cc.trustindex.showBlockingMsg = function() { 1314 // {{{ 1315 cc.tools.showGeneralBlockingMsg("trustindex", "Trustindex", "#trustindex-container"); 1316 // }}} 1317 } 1318 1319 cc.hubspot = new Object(); 1320 cc.hubspot.init = function(id) { 1321 // {{{ 1322 //src, defer, async, crossorigin = "", nonce = "", callback="", id = " 1323 cc.tools.loadScript("https://js-eu1.hs-scripts.com/" + id + ".js", true, true, "", "", "", "hs-script-loader"); 1324 1325 // }}} 1326 } 1327 1328 cc.hubspotForms = new Object(); 1329 cc.hubspotForms.init = function(id) { 1330 // {{{ 1331 cc.tools.loadScript("https://js-eu1.hsforms.net/forms/embed/" + id + ".js", true, true); 1332 1333 // }}} 1334 } 1335 1336 cc.hubspotForms.showBlockingMsg = function() { 1337 // {{{ 1338 cc.tools.showGeneralBlockingMsg("hubspotForms", "Hubspot-Forms", ".hubspot-container"); 1339 // }}} 1340 } 1341 1342 // START COOKIE CONTROL 1343 jQuery(document).ready(function($) { 1344 // {{{ 1345 // setTimeout( cc.init, 3000); 1346 cc.init(); 1347 // }}} 1348 }); 1349 1350 jQuery(document).on("dc-cookie-control-changed", function(ev) { 1351 if (cc.isDebug) console.log("CCC: changed consent to:", ev.detail); 1352 }); 1353 /* 1354 jQuery(document).on("dc-cookie-control-initialized", function(ev) { 1355 if (cc.isDebug) console.log("CCC: consent initialized:", ev.detail); 1356 }); 1357 */ 1358})(jQuery);
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.