PageSourceSearch

https://vg-uttenreuth.de/org.dreamox.cmsmox.divlayout/static/1572259799492/js/datenschutzV3_20251015.js

js vg-uttenreuth.de collected 2026-10-02 19:40:22 UTC 38,547 bytes, 1,029 lines download raw bytes

1class CmsDatenschutzDialog {
2
3  constructor() {
4    // Details sichtbar?
5    this.detailsVisible = false;
6
7    // Texte und Konfiguration
8    this.data = null;
9
10    // Aktive Sprache
11    this.active = null;
12    
13    // Referenz auf Klasse
14    var c = this;
15    
16    // Dialog per Link mit Klasse aufrufen
17    $(".datenschutzdialog").on("click", function(event) {
18   	 event.preventDefault();
19   	 c.init();
20    });
21  }
22
23  /**
24  * HTML fuer Kategorieauswahl generieren
25  * @param {*} l ausgewaehlte Sprache
26  */
27  getCategories(l, data) {
28  	var s='<div id="dsV3Kategorien">';
29  	var servicesNotwendig = [];
30  	var servicesMarketing = [];
31  	var servicesStatistik = [];
32  	var servicesEingebundeneDienste = [];
33  	var c = this;
34  	
35  	// Aktive Services durchgehen und der Kategorie zuordnen
36  	l.services.forEach(function(service) {
37  		if(typeof service !=='undefined' && Object.entries(service).length !== 0){
38  			switch(service.alias){
39	  			case 'V3_ALLGEMEIN':
40	  				servicesNotwendig.push(service);
41	  				break;
42				case 'V3_GOOGLEANALYTICS': // Statistik
43				case 'V3_MATOMO': // Statistik
44				case 'V3_GTM': // Marketing -> Statistik
45					servicesStatistik.push(service);
46					break;
47				
48				case 'V3_FACEBOOK_PIXEL': // Marketing
49					servicesMarketing.push(service);
50					break;
51
52				case 'V3_YOUTUBE': // Eingebundene Dienste
53				case 'V3_GMAPS': // Eingebundene Dienste
54				case 'V3_IFRAMES': // Eingebundene Dienste
55					servicesEingebundeneDienste.push(service);
56					break;
57	  			default:
58	  				// Checken wo es ansonsten rein muss (nur für Custom-Werte welche von Stammdatenwert kommen)
59	  				if(typeof service.alias === 'undefined')
60	  					break;
61	  				if(service.alias.startsWith('V3_FUNKTIONAL') || service.alias.startsWith('V3_STATISTIK'))
62	  					servicesStatistik.push(service);
63	  				else if(service.alias.startsWith('V3_MARKETING'))
64	  					servicesMarketing.push(service);
65	  				else if(service.alias.startsWith('V3_EINGEBUNDENE_DIENSTE'))
66	  					servicesEingebundeneDienste.push(service);
67  					break;
68	  		}
69  		}
70  	});
71  	
72  	// Kategorien auslesen und entsprechende Services je Kategorie hinzufügen
73  	l.categories.forEach((cat) => {
74  		if (cat.alias === "V3_NOTWENDIG" && servicesNotwendig.length > 0) {
75		  	s += '<div class="kategorieWrapper">';
76		  	s += '<div disabled><button class="icon-chevron"></button><span class="dsChecked" disabled></span><strong>'+cat.name+'</strong></div>';
77		  	s += '<p class="text" style="display: none">' + cat.desc + '</p>';
78		  	servicesNotwendig.forEach(service => { 
79			  	s += this.generateCategoryButtons(service, true);
80		  	});
81		  	s += '</div>';
82        } else if (cat.alias === "V3_STATISTIK" && servicesStatistik.length > 0) {
83        	var alleUnterkatCheckedString = 'dsChecked';
84            s += '<div class="kategorieWrapper">';
85            s += '[PLATZHALTER_ALLE_UNTERKAT_STATISTIK]';
86            s += '<p class="text" style="display: none">' + cat.desc + '</p>';
87            servicesStatistik.forEach(service => { 
88              var addString1 = this.generateCategoryButtons(service, false);
89			  var addString2 = '';
90			  // Sonderfall - Consent-Types generieren
91	  		  if (service.alias === 'V3_GTM')
92		  		var addString2 = this.generateCategoryAnalyticsButtons(data, service, false);
93			  if (service.alias === 'V3_GOOGLEANALYTICS')
94				var addString2 = this.generateCategoryAnalyticsButtons(data, service, false);
95
96              if (addString1.includes('dsUnchecked') || addString2.includes('dsUnchecked'))
97				alleUnterkatCheckedString = 'dsUnchecked';
98          
99              s += addString1 + addString2;
100          	});
101            
102          s = s.replace('[PLATZHALTER_ALLE_UNTERKAT_STATISTIK]','<div><button class="icon-chevron"></button><button class="btn_all_cat statistik"><span class="'+alleUnterkatCheckedString+'"></span><strong>'+cat.name+'</strong></button></div>');
103
104		  s+='</div>';
105        }
106  		else if (cat.alias === "V3_MARKETING" && servicesMarketing.length > 0){
107  			s += '<div class="kategorieWrapper">';
108  			s += '[PLATZHALTER_ALLE_UNTERKAT_MARKETING]';
109		  	s += '<p class="text" style="display: none">' + cat.desc + '</p>';
110		  	var alleUnterkatCheckedString = 'dsChecked';
111		  	servicesMarketing.forEach(service => {
112			  	var addString1 = this.generateCategoryButtons(service, false);
113			  	var addString2 = '';
114			  	// Sonderfall - Consent-Types generieren
115			  	if (service.alias === 'V3_GTM')
116			  		var addString2 = this.generateCategoryAnalyticsButtons(data, service, false);
117			  	if (service.alias === 'V3_GOOGLEANALYTICS')
118			  		var addString2 = this.generateCategoryAnalyticsButtons(data, service, false);
119			  	if(addString1.includes('dsUnchecked') || addString2.includes('dsUnchecked'))
120			  		alleUnterkatCheckedString = 'dsUnchecked';
121			  		
122			  	s+=addString1+addString2;
123		  	});
124		  	s = s.replace('[PLATZHALTER_ALLE_UNTERKAT_MARKETING]','<div><button class="icon-chevron"></button><button class="btn_all_cat marketing"><span class="'+alleUnterkatCheckedString+'"></span><strong>
124'+cat.name+'</strong></button></div>');
125		  	s+='</div>';
126        } else if (cat.alias === "V3_EINGEBUNDENE_DIENSTE" && servicesEingebundeneDienste.length > 0) {
127        	var alleUnterkatCheckedString = 'dsChecked';
128            s += '<div class="kategorieWrapper">';
129            s += '[PLATZHALTER_ALLE_UNTERKAT_EINGEBUNDENE_DIENSTE]';
130            s += '<p class="text" style="display: none">' + cat.desc + '</p>';
131            servicesEingebundeneDienste.forEach(service => { 
132                var addString1 = this.generateCategoryButtons(service, false);
133              var addString2 = '';
134                                  
135              if (addString1.includes('dsUnchecked') || addString2.includes('dsUnchecked'))
136                  alleUnterkatCheckedString = 'dsUnchecked';
137          
138              s += addString1 + addString2;
139          });
140            
141          s = s.replace('[PLATZHALTER_ALLE_UNTERKAT_EINGEBUNDENE_DIENSTE]','<div><button class="icon-chevron"></button><button class="btn_all_cat eingebundeneDienste"><span class="'+alleUnterkatCheckedString+'"></span><strong>'+cat.name+'</strong></button></div>');
142          s+='</div>';
143        }
144	});
145		  
146	  s+='</div>'
147	  return s;
148  }
149  
150  /**
151  *  Nur für getCategories...
152  */ 
153  generateCategoryButtons(service, buttonDisabled) {
154	 	var checkedClass =  'dsUnchecked';
155	 	if (service.alias === 'V3_ALLGEMEIN') {
156			checkedClass='dsChecked';
157		}
158		else if (service.selected) {
159			checkedClass='dsChecked';
160		}
161
162		const s = `<div class="haupt" style="display: none">
163			<button data-alias="${service.alias}" ${buttonDisabled ? 'disabled' : ''}>
164				<span class="${checkedClass}"></span>${service.name}
165			</button>
166			<button class="glyphicon glyphicon-info-sign"></button>
167			</div>`;
168
169	 	return s;
170  }
171  
172  /**
173  *  Nur für getCategories... 
174  * und wenn Sonderfall Google Analytics
175  */ 
176  generateCategoryAnalyticsButtons(data, service, buttonDisabled) {
177		var s='';
178		if (typeof data.consentMode !== 'undefined' && data.consentMode.active) {
179			data.consentMode.types.forEach(function(consentType) {
180				// granted wenn akzeptiert, Wert ist 'denied' wenn false
181				var checkedClass = consentType.value === 'granted' ? "dsChecked" : "dsUnchecked";
182				var disabledVal = consentType.disabled ? 'disabled' : '';
183				
184				// Namen des aktuellen Consent-Modus laden
185				var sName = "";
186				if(consentType.alias==="ad_storage")
187					sName = service.consent_types.name_ad_storage;
188				else if(consentType.alias==="analytics_storage")
189					sName = service.consent_types.name_analytics_storage;
190				else if(consentType.alias==="functionality_storage")
191					sName = service.consent_types.name_functionality_storage;
192				else if(consentType.alias==="personalization_storage")
193					sName = service.consent_types.name_personalization_storage;
194				else if(consentType.alias==="security_storage")
195					sName = service.consent_types.name_security_storage;
196				else if(consentType.alias==="ad_user_data")
197					sName = service.consent_types.name_ad_user_data;
198				else if(consentType.alias==="ad_personalization")
199					sName = service.consent_types.name_ad_personalization;
200				else
201					sName = "Kein Name vorhanden...";
202					
203				// Beschreibungen + Checked-Status für ConsentTypes laden
204				s+='<div class="consent-types" style="display: none;">'; // ConsentTypes Akkordeon
205				s+='<button class="consentType" data-alias="'+consentType.alias+'" '+disabledVal+'>';
206				s+='<span class="'+checkedClass+'"></span>'+service.name + " | " + sName+'</button>';
207				s+='<button class="glyphicon glyphicon-info-sign"></button>';
208				s+='</div>';
209			});
210		}
211		return s;
212  }
213  
214  /**
215   * HTML fuer Serviceauswahl generieren
216   * @param {*} l ausgewaehlte Sprache
217   */
218  getServices(l, data) {
219  	var s = '<div id="dsV3Services" style="display: none;">';
220  	l.services.forEach(function(service) {
221  		if(typeof service ==='undefined' || Object.entries(service).length === 0)
222  			return;
223  		
224  		// Matomo/Allgemein sind immer dabei
225    	var disabled = service.alias==='V3_ALLGEMEIN' ? 'disabled':'';
226    	var checkedClass =  'dsUnchecked';
227    	
228    	if (service.alias==='V3_ALLGEMEIN') {
229    		checkedClass='dsChecked';
230    	} else if (service.selected) {
231    		checkedClass='dsChecked';
232    	}
233    	
234    	if (typeof service.name !=='undefined' && Object.entries(service.name).length !== 0) {
235	    	s+='<div>';
236				s+='<button data-alias="'+service.alias+'" '+disabled+'><span class="'+checkedClass+'"></span><strong>'+service.name+'</strong></button>';
237				s+='<button class="icon-chevron"></button>';
238				s+='<div style="display: none;">'+service.desc+'</div>';
239	    	s+='</div>';
240    	}
241    	
242    	// Consent-Types - Analytics | Generiert im Bereich "Services" die Consent-Auswahl
243    	if((service.alias==='V3_GOOGLEANALYTICS' || service.alias==='V3_GTM') && typeof data.consentMode !== 'undefined' && data.consentMode.active){
244
245			data.consentMode.types.forEach(function(consentType) {
246    			var checkedConsentType = consentType.value === 'granted' ? "dsChecked" : "dsUnchecked"; // Wert ist 'denied' wenn false
247    			var consentBeschreibung = "";
248    			var consentName = "";
249    			var disabledVal = consentType.disabled ? 'disabled' : '';
250    			
251		    	// Beschreibungen + Checked-Status für ConsentTypes laden
252		    	switch(consentType.alias){
253		    		case "ad_storage":
254		    			consentBeschreibung=service.consent_types.desc_ad_storage;
255		    			consentName=service.consent_types.name_ad_storage;
256		    			break;
257		    		case "analytics_storage":
258		    			consentBeschreibung=service.consent_types.desc_analytics_storage;
259		    			consentName=service.consent_types.name_analytics_storage;
260		    			break;
261		    		case "functionality_storage":
262		    			consentBeschreibung=service.consent_types.desc_functionality_storage;
263		    			consentName=service.consent_types.name_functionality_storage;
264		    			break;
265		    		case "personalization_storage":
266		    			consentBeschreibung=service.consent_types.desc_personalization_storage;
267		    			consentName=service.consent_types.name_personalization_storage;
268		    			break;
269		    		case "security_storage":
270		    			consentBeschreibung=service.consent_types.desc_security_storage;
271		    			consentName=service.consent_types.name_security_storage;
272		    			break;
273		    		case "ad_user_data":
274		    			consentBeschreibung = service.consent_types.desc_ad_user_data;
275		    			consentName = service.consent_types.name_ad_user_data;
276		    			break;
277		    		case "ad_personalization":
278		    			consentBeschreibung = service.consent_types.desc_ad_personalization;
279		    			consentName = service.consent_types.name_ad_personalization;
280		    			break;
281		    		default:
282		    			consentBeschreibung="Keine Beschreibung vorhanden";
283		    			break;
284		    	}
285	    		s+='<div>';
286			    	s+='<button class="consentType" data-alias="'+consentType.alias+'" '+disabledVal+' ><span class="'+checkedConsentType+'"></span><strong>'+service.name+' | '+consentName+'</strong></button>';
287			    	s+='<button class="icon-chevron"></button>';
288			    	s+='<div style="display: none;">';
289			    	s+=consentBeschreibung;
290			    	s+='</div>';
291	    		s+='</div>';
292    		});
293    	}
294  	});
295  	s += '</div>';
296    return s;
297  }
298  
299  /**
300   * HTML mit Flaggen-Icon als Background-Image
301   * @param {*} lang Sprache fuer welche das Icon geladen werden soll
302   */
303  getIcon(lang) {
304    var code = `<span class="dsFlagIcon" style="background-image: url(` + lang.icon + `);"></span>`;
305    return code;
306  }
307
308  /**
309   * HTML fuer Sprachauswahl generieren
310   * @param {*} l ausgewaehlte Sprachen
311   * @param {*} languages verfuegbare Sprachen
312   */
313  getLangSelect(l, languages) {
314    var c = this;
315    var code = `
316    <button type="button">` + this.getIcon(l) + ` ` + l.name + ` <span class="dsArrowDown"></span></button>
317    <ul>`;
318
319    languages.forEach(function(lang) {
320      if(lang.active) {
321        code += `<li><button data-locale="` + lang.locale + `" type="button">` + c.getIcon(lang) + ` ` + lang.name + `</button></li>`;
322      }
323    });
324    
325    code += `</ul>`;
326
327    return code;
328  }
329
330  /**
331   * Datenschutz-Dialog in der gewaehlten Sprache generieren
332   * @param {*} l ausgewaehlte Sprache
333   * @param {*} data Dialogdaten
334   */
335  parseDialog(l, data) {
336    var codeLangSelect = data.multilanguage ? `<div class="datenschutzLangs">` + this.getLangSelect(l, data.lang) + `</div>` : ``;
337    var code = codeLangSelect + `
338      <div class="datenschutzTitle">` + l.titel + `</div>
339      <p class="einleitungstext">` + l.txt + `</p>
340      <p class="datenschutzLinks">` + l.more + `
341        <a href="` + l.datenschutzUrl + `"><span class="dsArrowRight"></span>` + l.datenschutzTxt + `</a>
342        <a href="` + l.impressumUrl + `"><span class="dsArrowRight"></span>` + l.impressumTxt + `</a>
343      </p>
344
345	  <div id="dsV3SelectButtons">
346	  	<div>
347		  <button id="dsV3KategorienButton" class="dsV3SelectButton selected">Kategorien</button>
348	  	</div>
349	  	<div>
350		  <button id="dsV3ServicesButton" class="dsV3SelectButton">Services</button>
351	  	</div>
352	  </div>
353	  	`+this.getCategories(l, data)+`
354	  	`+this.getServices(l, data)+`
355	  
356      <div class="datenschutzFooter">
357        <button class="datenschutzFooterConfirm" type="button">` + l.confirm + `</button>`;
358         code += `<button class="datenschutzFooterDenyAll" type="button">` + l.deny_all + `</button>`;
359         code += `<button class="datenschutzFooterSelectAll" type="button">` + l.select_all + `</button>`;
360      code += `</div>
361    `;
362    return code;
363  }
364
365  /**
366   * Dialog aktualisieren
367   */
368  refreshDialog() {
369    $("#dsV3Dialog").empty().append(this.parseDialog(this.active, this.data));
370    this.bindEvents();
371  }
372  
373  /**
374  * Kategorien öffnen
375  */
376  openKategorien() {
377    $('#dsV3Services').hide();
378		$('#dsV3Kategorien').show();
379		$(this).addClass("selected");
380		$("#dsV3ServicesButton").removeClass("selected");
381	}
382  
383   /**
384   * Services öffnen
385   */
386  openServices() {
387    $('#dsV3Kategorien').hide();
388		$('#dsV3Services').show();
389		$(this).addClass("selected");
390		$("#dsV3KategorienButton").removeClass("selected");
391  }
392  
393  /**
394   * Events an Buttons usw. binden
395   */
396  bindEvents() {
397    const c = this;
398    
399    // Aufklappen/Einklappen
400    $('#dsV3ServicesButton').on("click", this.openServices);
401    $('#dsV3KategorienButton').on("click", this.openKategorien);
402    
403    // Aufklappen/Einklappen
404    $('#dsV3Dialog .icon-chevron').on("click", function() {
405    	$(this).toggleClass('open').find('+ div').slideToggle('fast');
406    	$(this).parent().parent().find('.text').css('display', $(this).hasClass('open') ? '' : 'none');
407    	$(this).parent().parent().find('.haupt').css('display', $(this).hasClass('open') ? '' : 'none');
408    	$(this).parent().parent().find('.consent-types').css('display', $(this).hasClass('open') ? '' : 'none');
409    });
410    
411    // Zur Info springen
412    $('#dsV3Kategorien .glyphicon-info-sign').on("click", function(){
413		// Alle ausgeklappten Elemente zu
414		$('#dsV3Services button.icon-chevron.open').removeClass('open').find('+ div').css('display','none');
415		
416		//DataAlias um an richtige Stelle zu sprignen
417    	var dataAlias = $(this).parent().find('button').attr('data-alias');
418    	
419		// Kategorie-Button ausklappen
420		//this.openServices(); // Ersetzt untere Zeilen
421		$('#dsV3Kategorien').hide();
422		$('#dsV3Services').show();
423		$('#dsV3ServicesButton').addClass("selected");
424		$("#dsV3KategorienButton").removeClass("selected");
425		// Ende "this.openServices()"
426		
427		// Ausklappen
428		$('#dsV3Services button[data-alias='+dataAlias+'] + button').addClass('open').find('+ div').slideToggle('fast',function(){
429			//Nach unten scrollen
430			var scrollBlock = document.getElementById('dsV3Services');
431			var element = document.querySelector('#dsV3Services button[data-alias='+dataAlias+']');
432			var scrollPX = element.getBoundingClientRect().top - scrollBlock.getBoundingClientRect().top;
433			scrollBlock.scrollBy({ top: scrollPX, left: 0, behavior: "smooth" });
434		});
435    });
436    
437    // Ausgewaehlte aktivieren
438    $("#dsV3Dialog .datenschutzFooterConfirm").on("click", function() {
439      c.activate();
440    });
441    
442    // Alles ablehnen
443    $("#dsV3Dialog .datenschutzFooterDenyAll").on("click", function() {
444     	// Alle selected im JSON auf false (Außer Allgemein)
445			c.data.lang.forEach(function(lang) {
446				lang.services.forEach(function(service) {
447					if(service.alias!=='V3_ALLGEMEIN')
448						service.selected = false;
449				});
450			});
451			// Consent-Types extra behandeln
452			if(typeof c.data.consentMode !== 'undefined') {
453				c.data.consentMode.types.forEach(function(consentType) {
454					consentType.value = "denied";
455				});
456				c.activate();
457			}
458      	
459			$("#dsV3Kategorien button, #dsV3Services button").each(function() {
460				if($(this).attr('data-alias') !== 'V3_ALLGEMEIN'){
461					$(this).find('span').removeClass("dsChecked").addClass("dsUnchecked");
462				}
463			});
464			c.activate();
465    });
466
467    // Alle aktivieren V3
468    $("#dsV3Dialog .datenschutzFooterSelectAll").on("click", function() {
469		// Alle selected im JSON auf true
470		c.data.lang.forEach(function(lang) {
471	        lang.services.forEach(function(service) {
472	        	service.selected = true;
473	        });
474      	});
475      	// Consent-Types extra behandeln
476      	if(typeof c.data.consentMode !== 'undefined'){
477			c.data.consentMode.types.forEach(function(consentType) {
478				consentType.value = "granted";
479			});
480		}
481      	
482      	$("#dsV3Kategorien button > span, #dsV3Services button > span").removeClass("dsUnchecked").addClass("dsChecked");
483      	c.activate();
484    });
485
486    // Klick auf einzelne Services | Egal ob in Reiter "Kategorien" oder "Services"
487    $("#dsV3Kategorien button, #dsV3Services button").on("click", function() {
488    	var alias = $(this).attr("data-alias");
489    	var isSelected = false;
490    	// Checked Klassen setzen
491    	$('#dsV3Dialog button[data-alias='+alias+']').each(function(){
492    		var span = $(this).find('> span');
493    		if(span.hasClass('dsChecked')){
494    			span.removeClass('dsChecked').addClass('dsUnchecked');
495			}else{
496    			isSelected = true;
497    			span.removeClass('dsUnchecked').addClass('dsChecked');
498    		}
499    	});
500    	
501    	// Selected Status auf Services setzen
502    	c.data.lang.forEach(function(lang) {
503			lang.services.forEach(function(service) {
504				if(service.alias===alias) {
505					service.selected = isSelected;
506				}
507			});
508      	});
509
510		// ConsentMode
511		if (typeof c.data.consentMode !== 'undefined' && c.data.consentMode.active && $(this).hasClass("consentType")) {
512			c.data.consentMode.types.forEach(function(type) {
513				if (type.name === alias) {
514					type.value = isSelected ? "granted" : "denied";
515				}
516			});
517		}
518    	
519      	// Wenn Oberkategorie ausgewählt, alle Unterkategorien selektieren
520      	if($(this).hasClass('btn_all_cat')){
521      		if ($(this).hasClass('marketing') || $(this).hasClass('statistik') || $(this).hasClass('eingebundeneDienste')){
522		      // Aktive Services durchgehen und der Kategorie zuordnen
523      		  var servicesMarketing = [];
524	      	  var servicesStatistik = [];
525	      	  var servicesEingebundeneDienste= [];
526			  c.active.services.forEach(function(service) {
527			  	if(typeof service !=='undefined' && Object.entries(service).length !== 0){
528			  		switch(service.alias) {
529			  		   case 'V3_GOOGLEANALYTICS': // Statistik
530			  		   case 'V3_MATOMO': // Statistik
531			  			   servicesStatistik.push(service);
532			  			   break;
533              
534		               case 'V3_FACEBOOK_PIXEL': // Marketing
535		               case 'V3_GTM': // Marketing
536		            	   servicesMarketing.push(service);
537		            	   break;
538		
539		               case 'V3_YOUTUBE': // Eingebundene Dienste
540		               case 'V3_GMAPS': // Eingebundene Dienste
541		               case 'V3_IFRAMES': // Eingebundene Dienste
542		            	   servicesEingebundeneDienste.push(service);
543		            	   break;
544              
545		               default:
546			               // Checken wo es ansonsten rein muss (nur für Custom-Werte welche von Stammdatenwert kommen)
547			               if(typeof service.alias === 'undefined')
548			                 break;
549			               if(service.alias.startsWith('V3_FUNKTIONAL') || service.alias.startsWith('V3_STATISTIK'))
550			                 servicesStatistik.push(service);
551			               else if(service.alias.startsWith('V3_MARKETING'))
552			                 servicesMarketing.push(service);
553			               else if(service.alias.startsWith('V3_EINGEBUNDENE_DIENSTE'))
554			                 servicesEingebundeneDienste.push(service);
555			               break;
556			  		}
557		  		}
558		  		});
559			  	
560			  	if($(this).find('> span').hasClass('dsUnchecked')){ // Alle Unterfelder Aktivieren
561				  	// Services zuweisen
562				  	if($(this).hasClass('marketing')){
563					  	servicesMarketing.forEach(function(service) {
564					  		service.selected = true;
565					  	});
566				  	}else if($(this).hasClass('statistik')){
567				  		servicesStatistik.forEach(function(service) {
568					  		service.selected = true;
569					  	});
570				  	}else if($(this).hasClass('eingebundeneDienste')){
571				  		servicesEingebundeneDienste.forEach(function(service) {
572					  		service.selected = true;
573					  	});
574				  	}
575				  	
576			    	// Alle Buttons in den Kategorien/Services umschalten auf true
577				  	var dataAli = [];
578				  	$(this).find('> span').addClass('dsChecked').removeClass('dsUnchecked');
579				  	$(this).parent().parent().find('button').each(function(){
580			    		dataAli.push($(this).attr('data-alias'));
581			    	});
582			    	for(var i = 0; i<dataAli.length;i++){
583			    		if(typeof dataAli[i]==='undefined')
584			    			continue;
585			    		var span = $('button[data-alias="'+dataAli[i]+'"] span');
586			    		if(!span.hasClass('dsChecked')){
587			    			span.removeClass('dsUnchecked').addClass('dsChecked');
588			    		}
589			    	}
590			  	} else { // Alle Unterfelder Deaktivieren
591				  	// Services zuweisen
592				  	if($(this).hasClass('marketing')){
593					  	servicesMarketing.forEach(function(service) {
594					  		service.selected = false;
595					  	});
596				  	}else if($(this).hasClass('statistik')){
597				  		servicesStatistik.forEach(function(service) {
598					  		service.selected = false;
599					  	});
600				  	}else if($(this).hasClass('eingebundeneDienste')){
601				  		servicesEingebundeneDienste.forEach(function(service) {
602					  		service.selected = false;
603					  	});
604				  	}
605				  	
606			    	// Alle Buttons in den Kategorien/Services umschalten auf false
607				  	var dataAli = [];
608				  	$(this).find('span').addClass('dsUnchecked').removeClass('dsChecked');
609				  	$(this).parent().parent().find('button').each(function(){
610			    		dataAli.push($(this).attr('data-alias'));
611			    	});
612			    	for(var i = 0; i<dataAli.length;i++){
613			    		if(typeof dataAli[i]==='undefined')
614			    			continue;
615			    		var span = $('button[data-alias="'+dataAli[i]+'"] span');
616			    		if(!span.hasClass('dsUnchecked')){
617			    			span.removeClass('dsChecked').addClass('dsUnchecked');
618			    		}
619			    	}
620			  	}
621		  	}
622      		if($(this).hasClass('statistik') | $(this).hasClass('marketing')) {
623				c.data.consentMode.types.forEach(function(consentType) {
624					var spanStatistik = $('.statistik span');
625					if (spanStatistik.length > 0) {
626						if (spanStatistik.hasClass('dsChecked')) {
627							consentType.value = "granted";
628						} else {
629							consentType.value = "denied";
630						}
631					}
632					var spanMarketing = $('.marketing span');
633					if (spanMarketing.length > 0) {
634						if (spanMarketing.hasClass('dsChecked')) {
635							consentType.value = "granted";
636						} else {
637							consentType.value = "denied";
638						}
639					}
640      			});
641      		}
642
643          // Selected Status auf Services setzen
644          c.data.lang.forEach(function(lang) {
645            lang.services.forEach(function(service) {
646              const itemStatistik = servicesStatistik.find((s) => s.alias === service.alias);
647              if (itemStatistik) {
648            	  service.selected = itemStatistik.selected;
649              }
650              const itemMarketing = servicesMarketing.find((s) => s.alias === service.alias);
651              if (itemMarketing) {
652            	  service.selected = itemMarketing.selected;
653              }
654              const itemEingebundeneDienste = servicesEingebundeneDienste.find((s) => s.alias === service.alias);
655              if (itemEingebundeneDienste) {
656            	  service.selected = itemEingebundeneDienste.selected;
657              }
658            });
659          });
660      	}
661    	
662        if(($(this).attr('data-alias') === 'V3_GOOGLEANALYTICS' || $(this).attr('data-alias') === 'V3_GTM') && typeof c.data.consentMode !== 'undefined' && typeof c.data.consentMode.types !== 'undefined') {
663            if(isSelected){
664                c.data.consentMode.types.forEach(function(consentType) {
665                  consentType.disabled = "false";
666              });
667              $('#dsV3Dialog .consentType').each(function(){
668                  $(this).prop("disabled", false);
669              });
670            }else{
671                c.data.consentMode.types.forEach(function(consentType) {
672                  consentType.disabled = "true";
673              });
674              $('#dsV3Dialog .consentType').each(function(){
675                  $(this).prop("disabled", true);
676              });
677            }
678        }
679    });
680
681    // Sprachauswahl ein- oder ausblenden
682    $("#dsV3Dialog .datenschutzDetailsToggleBtn").on("click", function() {
683      c.detailsVisible = !c.detailsVisible;
684      $("#dsV3Dialog .datenschutzDetails").slideToggle("fast");
685      $(this).find("span").toggleClass("dsArrowUp").toggleClass("dsArrowDown");
686    });
687
688    // Sprachauswahl ein- oder ausblenden
689    $("#dsV3Dialog .datenschutzLangs > button").on("click", function() {
690      $(this).parent().toggleClass("dsActive");
691    });
692
693    // Sprache auswaehlen
694    $("#dsV3Dialog .datenschutzLangs ul button").on("click", function() {
695      var locale = $(this).attr("data-locale");
696
697      c.data.lang.forEach(function(lang) {
698        if(lang.locale===locale) {
699          c.active = lang;
700        }
701      });
702
703      c.refreshDialog();
704    });
705  }
706
707  /**
708   * Auswahl aktivieren
709   */
710  activate() {
711    var c = this;
712    var activeServicesArr = [];
713
714
715	// Aktive Services sammeln
716	c.active.services.forEach(function(serviceActive) {
717		if (typeof serviceActive.alias !== 'undefined') {
718			c.data.lang.forEach(function(lang) {
719				lang.services.forEach(function(service) {
720					if (serviceActive.alias === service.alias && service.selected && activeServicesArr.indexOf(service.alias) === -1 && typeof service.alias !== 'undefined'){
721						activeServicesArr.push(service.alias);
722					}
723				});
724			});
725		}
726	});
727	
728    // Aktive Analytics-Typen sammeln
729    var activeAnalyticsConsentTypes=""; // Alle Checked Typen
730    var allConsentTypes = ""; // Alle aktivierten Typen
731    
732    if(typeof this.data.consentMode !== 'undefined' && this.data.consentMode.active){
733	    this.data.consentMode.types.forEach(function(type) {
734      		if(type.value==='granted')
735	      		activeAnalyticsConsentTypes+=type.alias+":";
736	 		allConsentTypes+=type.alias;
737	    });
738	    // Letztes ":" wieder raus
739	    activeAnalyticsConsentTypes = activeAnalyticsConsentTypes.substring(0,activeAnalyticsConsentTypes.length-1);
740	    if(activeAnalyticsConsentTypes.length>0)
741	    	activeAnalyticsConsentTypes="["+activeAnalyticsConsentTypes.substring()+"]";
742    }
743    
744    var sActiveServices = "";
745    activeServicesArr.forEach(function(serviceAlias) {
746      sActiveServices += (sActiveServices ? ("," + serviceAlias) : serviceAlias);
747    });
748    if(activeAnalyticsConsentTypes.length>0)
749    	sActiveServices += ","+activeAnalyticsConsentTypes;
750    
751    var url = "/moxanos/json?svc=org.dreamox.cmsmox.divlayout&msg=setDatenschutzAdvancedCookieV3&services=" + encodeURIComponent(sActiveServices);
752    $.get(url, function() {
753      	// Tracker aktivieren wenn gewünscht
754        c.activateTracker(sActiveServices, allConsentTypes, c);
755  
756      $("#dsV3Overlay").fadeOut("fast", function() {
757        $("#dsV3Overlay").remove();
758        $("body").removeClass("datenschutzDialogOpen");
759        $(document).trigger("V3closed");
760		window.location.reload();
761      });
762    });	
763  }
764  
765  /**
766   * Vorhandene Statistik-Tracker aktivieren
767   */
768  
769  activateTracker(sActiveServices, allConsentTypes, c) {
770  
771  	if (sActiveServices.indexOf("V3_MATOMO") !== -1) {
772  		// Wenn noch kein Matomo, dann jetzt einbinden
773  		if(!$('script[src*="matomo"]').length && !$('script[src*="piwik"]').length){
774  			try{
775  				doAppendMatomo()(); // Methode liegt in MMatomo.java
776  			}catch(e){
777  				// Methode existiert nicht
778  				console.log("doAppendMatomo() existiert nicht -> Matomo wird nicht eingebunden");
779  			}
780  		}
781  	}
782  	if (sActiveServices.indexOf("V3_GTM") !== -1) {
783  		// Wenn noch kein Google Tag Manager, dann jetzt einbinden
784  		if (!$('script[src^="https://www.googletagmanager.com"]').length) {
785  			try {
786
787  				if(typeof this.data.consentMode !== 'undefined' && this.data.consentMode.active) {
788	  				doAppendGoogleTagManagerCodeHead(); // Methode liegt in GoogleData-Klasse
789  				} else {
790	  				// Einbindung Google-Tag-Manager-Code
791  					doAppendGoogleTagManagerCodeHead(); // Methode liegt in GoogleData-Klasse
792  				}
793  				// noscript Methode
794  				 doAppendGoogleTagManagerCodeBody(); // Methode liegt in GoogleData-Klasse
795  				 this.updateConsentVariables(sActiveServices, allConsentTypes);
796
797  			} catch(e) {
798  				// Methode existiert nicht
799  				console.log(e);
800  				console.log("Kann Google Tag Manager nicht per Zustimmung des Cookie-Banners einbinden");
801  			}
802  		} else {
803			try {
804				// Methoden/Variablen liegen in GoogleData-Klasse
805	  			if(this.data.consentMode.active)
806	  				this.updateConsentVariables(sActiveServices, allConsentTypes);
807
808  				updateGTMConsent(); // Methode liegt in GoogleData-Klasse
809  			} catch(e) {
810  				console.error("GTM Consent Update nicht möglich");
811  			}
812		}
813  	}
814  	if(sActiveServices.indexOf("V3_GOOGLEANALYTICS") !== -1) {
815  		
816  		// Wenn noch kein Analytics, dann jetzt einbinden
817  		if (!$('script[src^="https://www.google-analytics.com"]').length) {
818  			try {
819  				doAppendGoogleAnalytics(); // Methode liegt in GoogleData-Klasse
820  			} catch(e) {
821  				// Methode existiert nicht
822  				console.log("doAppendGoogleAnalytics existiert nicht -> Google Tag Manager wird nicht eingebunden");
823  			}
824  		}
825  		
826  		// Wenn noch nicht vorhanden, dann einfügen
827  		if (!$('script[src^="https://www.googletagmanager.com"]').length) {
828  			try {
829	  			if (typeof this.data.consentMode !== 'undefined' && this.data.consentMode.active)
830	  				this.updateConsentVariables(sActiveServices, allConsentTypes);
831	  			
832  				doAppendGoogleAnalyticsWithConsent(); // Methode liegt in GoogleData-Klasse
833  			} catch(e) {
834  				console.log("doAppendGoogleAnalyticsWithConsent existiert nicht -> Normaler Analytics Code wird eingebunden");
835  			}
836  		} else { // Wenn vorhanden dann die Consent-Variablen Updaten - hierfür gibt es eine Funktion (in GoogleData.java)
837  			try {
838				// Methoden/Variablen liegen in GoogleData-Klasse
839	  			if(this.data.consentMode.active)
840	  				this.updateConsentVariables(sActiveServices, allConsentTypes);
841
842  				updateGoogleAnalyticsConsent(); // Methode liegt in GoogleData-Klasse
843  			} catch(e) {
844  				console.error("Analytics Consent Update nicht möglich");
845  			}
846  		}
847  	}
848  	
849  	// Facebook-Pixel Tracker einbinden, wenn noch nicht vorhanden
850  	if(sActiveServices.indexOf("V3_FACEBOOK_PIXEL")!==-1 && !document.getElementById('facebookpixelscript')) {
851	  	try{doAppendFacebookPixel();}
852	  	catch(e){console.error("Facebook Pixel Code ist nicht eingebunden...");}
853  	}
854  	
855	// Wenn Googlemap vorhanden, dann die Skripte laden (Klick simulieren)
856  	if(sActiveServices.indexOf("V3_GMAPS")!==-1) {
857  		$(".mapLoaderActivate").each(function(){
858  			$(this).trigger("click");
859  		});
860  	}
861  	
862	// Wenn IFRAMES vorhanden, dann die Skripte laden (Klick simulieren)
863  	if(sActiveServices.indexOf("V3_IFRAMES")!==-1) {
864      	$(".cmiFrameActivate").each(function(){
865  			$(this).trigger("click");
866		});
867  	}
868  	
869  	// Wenn V3_STATISTIK vorhanden, dann die Skripte laden (Klick simulieren)
870  	if(sActiveServices.indexOf("V3_STATISTIK")!==-1 || sActiveServices.includes('V3_STATISTIK')) {
871  		$(".cmvLoaderActivate").each(function(){
872  			$(this).trigger("click");
873  		});
874  	}
875  	
876  	// Wenn Custom-Werte eingebunden sind
877  	if(sActiveServices.includes('V3_MARKETING') || sActiveServices.includes('V3_STATISTIK')){
878  		sActiveServices.split(',').forEach(elementAlias => {
879  			elementAlias = elementAlias.replace(/\s/g, '');
880  			if(elementAlias.startsWith('V3_MARKETING') || elementAlias.startsWith('V3_STATISTIK')){
881  				var scriptSRC = '';
882	  			c.data.lang[0].services.forEach(function(service) {
883					if(service.alias===elementAlias) {
884						scriptSRC = service.src;
885
886						// Wenn noch nicht eingebunden, dann Script jetzt einbinden
887						var elAlias = elementAlias.replace(/\+/g, "");
888						if(scriptSRC && !$('script#'+elAlias).length){
889							customDSV3ScriptFunctions['customScriptFunction_' + elAlias]();
890						}
891					}
892				});
893
894  			}
895  		});
896  	}
897  	
898  	
899  	// Wenn YouTube-Videos vorhanden, dann die Skripte laden (Klick simulieren)
900  	if(sActiveServices.indexOf("V3_YOUTUBE")!==-1) {
901      	$('.cmvVideoWrapper > div[data-provider="Youtube"] + div .cmvLoaderActivate').each(function(){
902  			// Autoplay auch hier rüber raus! Es soll nicht jedes Video loslaufen, bloß weil wir Videos über Cookiebanner aktivieren
903  			$(this).attr('data-autoplay','false').trigger("click");
904		});
905		
906  		// TODO VIMEO - Falls benötigt...
907  	}
908  }
909    
910  updateConsentVariables(sActiveServices, allConsentTypes) {
911  	// Methoden/Variablen liegen in GoogleData-Klasse
912	  if(allConsentTypes.includes("ad_storage"))
913			if(sActiveServices.includes("ad_storage"))
914				var_ad_storage = "granted";
915			else
916				var_ad_storage = "denied";
917
918		if(allConsentTypes.includes("analytics_storage"))	
919			if(sActiveServices.includes("analytics_storage"))
920				var_analytics_storage = "granted";
921			else
922				var_analytics_storage = "denied";
923
924		if(allConsentTypes.includes("functionality_storage"))
925			if(sActiveServices.includes("functionality_storage"))
926				var_functionality_storage = "granted";
927			else
928				var_functionality_storage = "denied";
929
930		if(allConsentTypes.includes("personalization_storage"))	
931			if(sActiveServices.includes("personalization_storage"))
932				var_personalization_storage = "granted";
933			else
934				var_personalization_storage = "denied";
935
936		if(allConsentTypes.includes("security_storage"))	
937			if(sActiveServices.includes("security_storage"))
938				var_security_storage = "granted";
939			else
940				var_security_storage = "denied";
941
942		if(allConsentTypes.includes("ad_user_data"))	
943			if(sActiveServices.includes("ad_user_data"))
944				var_ad_user_data = "granted";
945			else
946				var_ad_user_data = "denied";
947
948		if(allConsentTypes.includes("ad_personalization"))	
949			if(sActiveServices.includes("ad_personalization"))
950				var_ad_personalization = "granted";
951			else
952				var_ad_personalization = "denied";
953
954/* Debugging
955	console.log("update in datenschutz.js methode <----");
956	console.log("consent Types: "+sActiveServices);
957	console.log('update ad_storage:'+var_ad_storage);
958	console.log('update analytics_storage:'+var_analytics_storage);
959	console.log('update functionality_storage:'+var_functionality_storage);
960	console.log('updaet personalization_storage:'+var_personalization_storage);
961	console.log('update security_storage:'+var_security_storage);
962	console.log("------> update in datenschutz.js methode");
963	*/
964  }
965
966  /**
967   * Matomo / Piwik aktivieren
968   * @param {*} server URL des Servers
969   * @param {*} siteId Seitenkennung
970  activateMatomo(server, siteId) {
971    var _paq = window._paq || [];
972    _paq.push(['trackPageView']);
973    _paq.push(['enableLinkTracking']);
974
975    (function() {
976      var u = "//" + server + "";
977      _paq.push(['setTrackerUrl', u + 'matomo.php']);
978      _paq.push(['setSiteId', {siteId}]);
979
980      var d = document;
981      var s = d.getElementsByTagName('script')[0];
982      
983      var g = d.createElement('script');
984      g.type = 'text/javascript';
985      g.async = true;
986      g.defer = true;
987      g.src = u + 'piwik.js';
988      s.parentNode.insertBefore(g, s);
989    })();
990  }
991  */
992
993  /**
994   * Datenschutz-Dialog initialisieren und anzeigen
995   */
996  init() {
997    const c = this;
998
999    $.get("/moxanos/json?svc=org.dreamox.cmsmox.divlayout&msg=getDatenschutzAdvanced", function(data) {
1000      c.data = data;
1001
1002      c.data.lang.forEach(function(lang) {
1003        if(lang.default===true) {
1004          c.active = lang;
1005        }
1006      });
1007      
1008      // Allgemeines Cookie auf true stellen, dieses bestimmt, ob der Cookiebanner bei Seitenaufruf angezeigt wird
1009      // Einmal zugestimmt und der Cookiebanner ploppt nicht mehr auf
1010      if (typeof c.active.services !== 'undefined') {
1011	      var serviceAllgemein = c.active.services.filter(item => item.alias === 'V3_ALLGEMEIN');
1012	      if (!serviceAllgemein[0].selected)
1013			serviceAllgemein[0].selected = true;
1014      }
1015
1016      var dialogCode = `
1017        <div id="dsV3Overlay">
1018          <div id="dsV3Dialog">` + c.parseDialog(c.active, c.data) + `</div>
1019        </div>
1020      `;
1021
1022      $("body").prepend(dialogCode).addClass("datenschutzDialogOpen");
1023      c.bindEvents();
1024      
1025      // Wenn Cookie für Allgemein noch nicht gesetzt -> Cookiebanner öffnen für neue Besucher:
1026      var serviceAllgemein = c.active.services.filter(item => item.alias === 'V3_ALLGEMEIN');
1027    });
1028  }
1029}

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.