PageSourceSearch

https://www.schnaps.at/dc_components/site/cookie-control/js/ccc.js?v=1.0.33

js schnaps.at collected 2026-10-08 17:12:01 UTC 40,269 bytes, 1,358 lines download raw bytes

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.