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.