1(function (window, document) { 2 3 window.addEventListener('load', function () { 4 5 // Die Id des Containers, in dem gescrollt wird, falls das Element nicht ermittelt werden konnte 6 var scrollableContainerId = 'hwcookiebanner-content'; 7 8 // Globaler Speicher für den Link, der den Banner geöffnet hat 9 var cookieBannerOpeningElement = null; 10 11 // Cookie-Banner Small gefunden? 12 if ( document.getElementById('hwcookiebanner-small') ) { 13 14 var cookieBannerSmallWrap = document.getElementById('hwcookiebanner-small'); 15 16 // Klick auf Verweigern-Button 17 document.getElementById('hwcookiebanner-keine').addEventListener('click', function (e) { 18 19 e.preventDefault(); 20 21 // Alle veränderbaren Checkboxen im Cookie-Banner unchecken 22 _uncheckAllEnabledCheckboxesinCookieBanner(); 23 24 // Formular Absenden (mit kurzer Verzögerung) 25 window.setTimeout( 26 function() { 27 _submitCookieBannerForm(); 28 }, 29 100 30 ); 31 }); 32 33 // Klick auf Akzeptieren-Button 34 document.getElementById('hwcookiebanner-alle').addEventListener('click', function (e) { 35 36 e.preventDefault(); 37 38 // Alle veränderbaren Checkboxen im Cookie-Banner unchecken 39 _checkAllEnabledCheckboxesinCookieBanner(); 40 41 // Formular Absenden (mit kurzer Verzögerung) 42 window.setTimeout( 43 function() { 44 _submitCookieBannerForm(); 45 }, 46 100 47 ); 48 }); 49 50 // Klick auf den Mehr-Button 51 document.getElementById('hwcookiebanner-mehr').addEventListener('click', function (e) { 52 53 // Prüfen ob das Pop-Up bereits offen ist und öffnen bzw. schlieÃen 54 if(document.getElementById('hwcookiebanner-full').classList.contains('hwcookiebanner-open')) { 55 _closeCookieBannerFull(); 56 } else { 57 _openCookieBannerFull(); 58 59 // Element speichern, das den Banner geöffnet hat 60 _storeLastFocusedElement(document.getElementById('hwcookiebanner-mehr')); 61 } 62 63 }); 64 65 } 66 67 68 // Cookie-Banner gefunden? 69 if ( document.getElementById('hwcookiebanner-full') ) { 70 71 var cookieBannerWrap = document.getElementById('hwcookiebanner-full'); 72 73 // Alle Elemente mit data-target finden und dort auf den click die Funktion binden, 74 // die zu dem entsprechenden Element scrollt 75 var elementsWithDataTarget = cookieBannerWrap.querySelectorAll('[data-target]'); 76 77 if ( elementsWithDataTarget.length > 0 ) { 78 79 // Alle Elemente durchgehen und die Funktion binden 80 for ( var i = 0; i < elementsWithDataTarget.length; i++ ) { 81 elementsWithDataTarget[i].addEventListener('click', function(e) { 82 83 e.preventDefault(); 84 85 if (cookieBannerWrap.classList.contains("sidebar-open")) { 86 cookieBannerWrap.classList.remove("sidebar-open"); 87 } 88 _scrollToTarget(this.dataset.target); 89 }); 90 } 91 } 92 93 // Buttons Klick: uncheck all 94 if ( document.getElementById('hwcookiebanner-uncheck-all') ) { 95 96 var uncheckAllButton = document.querySelector('#hwcookiebanner-uncheck-all button'); 97 98 if ( uncheckAllButton ) { 99 100 // Auf Klick hören 101 uncheckAllButton.addEventListener('click', function () { 102 103 // Alle veränderbaren Checkboxen im Cookie-Banner unchecken 104 _uncheckAllEnabledCheckboxesinCookieBanner(); 105 }); 106 } 107 } 108 109 // Buttons Klick: check all 110 if ( document.getElementById('hwcookiebanner-check-all') ) { 111 112 var checkAllButton = document.querySelector('#hwcookiebanner-check-all button'); 113 114 if ( checkAllButton ) { 115 116 // Auf Klick hören 117 checkAllButton.addEventListener('click', function () { 118 119 // Alle veränderbaren Checkboxen im Cookie-Banner checken 120 _checkAllEnabledCheckboxesinCookieBanner(); 121 }); 122 } 123 } 124 125 // click-Event auf den Button zum öffnen der Sidebar in Mobile 126 if (document.getElementById("hwcookiebanner-sidebar-toggle-button")) { 127 128 var hwcookiebannerSidebarToggle = document.getElementById("hwcookiebanner-sidebar-toggle-button"); 129 130 hwcookiebannerSidebarToggle.addEventListener('click', function (e) { 131 if (cookieBannerWrap.classList.contains("sidebar-open")) { 132 cookieBannerWrap.classList.remove("sidebar-open"); 133 } else { 134 cookieBannerWrap.classList.add("sidebar-open"); 135 } 136 }); 137 } 138 document.getElementById("hwcookiebanner-content").addEventListener('click', function (e) { 139 if (cookieBannerWrap.classList.contains("sidebar-open")) { 140 cookieBannerWrap.classList.remove("sidebar-open"); 141 } 142 }); 143 144 145 // Wechsel von Mobile zu Desltop beachten 146 var hw_cookiebanner_mobile; 147 148 // was getan werden soll wenn sich die GröÃe um einen bestimmten Punkt ändert 149 var widthChangeCookiebannerMobile = function() { 150 if (!hw_cookiebanner_mobile.matches) { 151 if (cookieBannerWrap.classList.contains("sidebar-open")) { 152 cookieBannerWrap.classList.remove("sidebar-open"); 153 } 154 } 155 }; 156 157 // beobachten ob sich die GröÃe um einen besimmten Punkt ändert 158 if (typeof matchMedia !== 'undefined' && typeof matchMedia === 'function') { 159 hw_cookiebanner_mobile = window.matchMedia("(max-width: 639px)"); 160 hw_cookiebanner_mobile.addListener(widthChangeCookiebannerMobile); 161 widthChangeCookiebannerMobile(); 162 } 163 164 if(document.querySelectorAll('#hwcookiebanner-full #hwcookiebanner-sidebar-groups .services .service input[type="checkbox"]:not([disabled="disabled"])').length > 0 && document.querySelectorAll('#hwcookiebanner-full #hwcookiebanner-content .services .service input[type="checkbox"]:not([disabled="disabled"])').length >0) { 165 _setOtherCheckbox(); 166 } 167 168 } 169 170 171 // Links gefunden die das PopUp öffnen? 172 if ( document.getElementsByClassName('hwcookiebanner-open-full') ) { 173 174 var cookieBannerOpenPopupLinks = document.getElementsByClassName('hwcookiebanner-open-full'); 175 176 // Alle gefunden Links ein ClickEvent geben 177 for (var i = 0; i < cookieBannerOpenPopupLinks.length; i++) { 178 179 // Prüfen ob Link auch wirklich da ist (wegen Fehler von IE wo Elemente während dem rendern kurz verschwinden) 180 if (cookieBannerOpenPopupLinks[i]) { 181 182 // Klick auf den Link 183 cookieBannerOpenPopupLinks[i].addEventListener('click', function (e) { 184 e.preventDefault(); 185 186 // Prüfen ob das Pop-Up existiert 187 if( document.getElementById('hwcookiebanner-full') ) { 188 // Prüfen ob das Pop-Up bereits offen ist und öffnen bzw. schlieÃen 189 if( document.getElementById('hwcookiebanner-full').classList.contains('hwcookiebanner-open') ) { 190 _closeCookieBannerFull(); 191 } else { 192 _openCookieBannerFull(); 193 194 // Falls ein target exisitert, scrolle an diese Stelle 195 if(this.hasAttribute("data-target")) { 196 var scrollTarget = this.dataset.target; 197 if (scrollTarget === 'essentiell' || scrollTarget === 'funktionell' ) { 198 _scrollToTarget('hwcookiebanner-content-group-' + scrollTarget); 199 } else { 200 _scrollToTarget(scrollTarget); 201 } 202 } 203 204 // Element speichern, das den Banner geöffnet hat 205 _storeLastFocusedElement(cookieBannerOpenPopupLinks[i]); 206 } 207 } 208 }); 209 } 210 } 211 } 212 213 214 // _ _ ___ _ _____ ____ _____ _ _ _ _ _ _______ ___ ___ _ _ _____ _ _ 215 // | | | |_ _| | | ___/ ___|| ___| | | | \ | | |/ /_ _|_ _/ _ \| \ | | ____| \ | | 216 // | |_| || || | | |_ \___ \| |_ | | | | \| | ' / | | | | | | | \| | _| | \| | 217 // | _ || || |___| _| ___) | _| | |_| | |\ | . \ | | | | |_| | |\ | |___| |\ | 218 // |_| |_|___|_____|_| |____/|_| \___/|_| \_|_|\_\ |_| |___\___/|_| \_|_____|_| \_| 219 // 220 221 /** 222 * _openCookieBannerFull 223 * 224 * Ãffnet den groÃen Cookie-Banner 225 * 226 * @private 227 */ 228 function _openCookieBannerFull() { 229 230 var cookieBannerFull = document.getElementById('hwcookiebanner-full'); 231 232 // Klasse hwcookiebanner-open hinzufügen 233 cookieBannerFull.classList.add('hwcookiebanner-open'); 234 235 // html Klasse hwcookiebanner-open hinzufügen 236 document.documentElement.classList.add('hwcookiebanner-open'); 237 238 // Attribut open hinzufügen 239 cookieBannerFull.setAttribute('open', ''); 240 241 // Hiermit sollte der erste Link fokussiert werden 242 cookieBannerFull.querySelector('a').focus(); 243 244 // Auf Klicks auÃerhalb des Banners achten und ggf. Banner schlieÃen 245 // Muss mit einem kurzen Timeout aufgerufen werden, da sonst der Banner nie offen sein kann 246 // Die Funktion muss ausgelagert sein, so dass der EventListener wieder korrekt entfernt werden kann 247 window.setTimeout( 248 function() { 249 document.addEventListener('click', _closeCookieBannerIfClickedOutsite); 250 }, 251 100 252 ); 253 254 // Auf tabs reagieren und prüfen, ob der Banner den focus verloren hat und ggf. schlieÃen 255 cookieBannerFull.addEventListener('focusout', _closeCookieBannerOnFocusOut); 256 257 } 258 259 /** 260 * _closeCookieBannerFull 261 * 262 * SchlieÃt den groÃen Cookie-Banner 263 * 264 * @private 265 */ 266 function _closeCookieBannerFull() { 267 268 var cookieBannerFull = document.getElementById('hwcookiebanner-full'); 269 270 // Klasse hwcookiebanner-open entfernen 271 cookieBannerFull.classList.remove('hwcookiebanner-open'); 272 273 // html Klasse hwcookiebanner-open entfernen 274 document.documentElement.classList.remove('hwcookiebanner-open'); 275 276 // Attribut open entfernen 277 cookieBannerFull.removeAttribute('open'); 278 279 // EventListener für click wieder entfernen 280 document.removeEventListener('click', _closeCookieBannerIfClickedOutsite); 281 282 // EventListener für tab entfernen 283 cookieBannerFull.removeEventListener('focusout', _closeCookieBannerOnFocusOut); 284 285 // Element fokussieren, dass den Banner geöffnet hat 286 _recoverLastFocusedElement(); 287 } 288 289 /** 290 * _isCookieBannerFullOpened 291 * 292 * Prüft, ob der groÃe Cookie-Banenr offen ist 293 * 294 * @returns {boolean|*} 295 * @private 296 */ 297 function _isCookieBannerFullOpened() { 298 return !!document.getElementById('hwcookiebanner-full').classList.contains('hwcookiebanner-open') && document.getElementById('hwcookiebanner-full').hasAttribute('open'); 299 } 300 301 /** 302 * _submitCookieBannerForm 303 * 304 * Schickt das CookieBanner-Formular ab 305 * 306 * @private 307 */ 308 function _submitCookieBannerForm() { 309 310 // Formular im CookieBanner suchen 311 var cookieBannerForm = document.querySelector('#hwcookiebanner-full form'); 312 313 // Wenn das Formular existiert -> Absenden 314 if ( cookieBannerForm ) { 315 cookieBannerForm.submit(); 316 } 317 } 318 319 /** 320 * _closeCookieBannerIfClickedOutsite 321 * 322 * SchlieÃt den Cookie-Banner, wenn auÃerhalb des Elements geklickt wird 323 * 324 * @param e 325 * @private 326 */ 327 function _closeCookieBannerIfClickedOutsite(e) { 328 if ( !document.getElementById('hwcookiebanner-full').contains(e.target) ) { 329 _closeCookieBannerFull(); 330 } 331 } 332 333 /** 334 * _closeCookieBannerOnFocusOut 335 * 336 * SchlieÃt den Cookie-Banner, wenn herausgetabt wird 337 * 338 * @param e 339 * @private 340 */ 341 function _closeCookieBannerOnFocusOut(e) { 342 343 // Nur auf Events hören, die ein related Target haben (z.B. ein Tab aus dem Fenster heraus) 344 if ( e.relatedTarget ) { 345 346 // Nur prüfen, wenn der Cookie-Banner geöffnet ist 347 if ( _isCookieBannerFullOpened()) { 348 349 // Kurz warten, da wir uns sonst zwischen den Focus-Events befinden 350 window.setTimeout( 351 function() { 352 353 // Prüfen, ob das neu fokussierte Element innerhalb des Cookie-Banners ist 354 if ( !document.getElementById('hwcookiebanner-full').contains(document.activeElement) ) { 355 356 // Wenn nicht -> Cookie-Banner schlieÃen 357 _closeCookieBannerFull(); 358 } 359 }, 360 50 361 ); 362 } 363 } 364 } 365 366 /** 367 * _storeLastFocusedElement 368 * 369 * Speichert das Element, von aus der Banner geöffnet wurde 370 * 371 * @param element 372 * @private 373 */ 374 function _storeLastFocusedElement(element) { 375 376 if ( element ) { 377 cookieBannerOpeningElement = element; 378 } 379 } 380 381 /** 382 * _recoverLastFocusedElement 383 * 384 * Fokussiert das Element, von dem aus der Banner geöffnet wurde 385 * 386 * @private 387 */ 388 function _recoverLastFocusedElement() { 389 390 // Prüfen, ob es ein zuvor fokussiertes Element gibt 391 if ( cookieBannerOpeningElement ) { 392 393 // Element fokussieren 394 cookieBannerOpeningElement.focus(); 395 396 // Element zurücksetzen 397 cookieBannerOpeningElement = null; 398 } 399 } 400 401 /** 402 * _findAllEnabledCheckboxesInCookieBanner 403 * 404 * Findet alle veränderbaren Checkboxen im Cookiebanner 405 * 406 * @returns {*} 407 * @private 408 */ 409 function _findAllEnabledCheckboxesInCookieBanner() { 410 return document.querySelectorAll('#hwcookiebanner-full .services .service input[type="checkbox"]:not([disabled="disabled"])'); 411 } 412 413 /** 414 * _uncheckAllEnabledCheckboxesinCookieBanner 415 * 416 * Setzt checked aller veränderbaren Checkboxen im Cookiebanner auf FALSE 417 * 418 * @private 419 */ 420 function _uncheckAllEnabledCheckboxesinCookieBanner() { 421 422 // Alle veränderbaren Checkboxen im Cookie-Banner suchen 423 var enabledCheckboxes = _findAllEnabledCheckboxesInCookieBanner(); 424 425 // Alle gefunden Checkboxen durchgehen un
425d checked auf FALSE setzen 426 if ( enabledCheckboxes && enabledCheckboxes.length > 0 ) { 427 for ( var i = 0; i < enabledCheckboxes.length; i++ ) { 428 enabledCheckboxes[i].checked = false; 429 } 430 } 431 } 432 433 /** 434 * _checkAllEnabledCheckboxesinCookieBanner 435 * 436 * Setzt checked aller veränderbaren Checkboxen im Cookiebanner auf TRUE 437 * 438 * @private 439 */ 440 function _checkAllEnabledCheckboxesinCookieBanner() { 441 442 // Alle veränderbaren Checkboxen im Cookie-Banner suchen 443 var enabledCheckboxes = _findAllEnabledCheckboxesInCookieBanner(); 444 445 // Alle gefunden Checkboxen durchgehen und checked auf TRUE setzen 446 if ( enabledCheckboxes && enabledCheckboxes.length > 0 ) { 447 for ( var i = 0; i < enabledCheckboxes.length; i++ ) { 448 enabledCheckboxes[i].checked = true; 449 } 450 } 451 } 452 453 454 /** 455 * _setOtherCheckbox 456 * 457 * Verknüpft die Listen Checkbox mit der Checkbox im Textblock, sodass beide Elemente bei klick getoggelt werden 458 * 459 * @private 460 */ 461 function _setOtherCheckbox() { 462 463 // Checkboxen imSidebarblock 464 var listCheckBoxes = document.querySelectorAll('#hwcookiebanner-full #hwcookiebanner-sidebar-groups .services .service input[type="checkbox"]:not([disabled="disabled"])'); 465 // Checkboxen im Textblock 466 var textCheckBoxes = document.querySelectorAll('#hwcookiebanner-full #hwcookiebanner-content .services .service input[type="checkbox"]:not([disabled="disabled"])'); 467 // Die enstprechende ID des Targets im anderen Block 468 var otherTarget = ''; 469 // Die enstprechende Checkbox im anderen Block 470 var otherElement; 471 // TempElement für this 472 var innerElement; 473 474 // Nadel für Substring der IDs 475 var needle; 476 // Part nach der Nadel 477 var endPart; 478 479 // Nur wenn ich auf beiden Seiten genauso viele Checkboxen habe, ansonsten Fehlermeldung 480 if(listCheckBoxes.length === textCheckBoxes.length) { 481 482 for ( var i = 0; i < listCheckBoxes.length; i++ ) { 483 484 listCheckBoxes[i].addEventListener("click", function(e){ 485 486 innerElement = this; 487 // ID im Textblock ohne -quicklist 488 needle = innerElement.id.lastIndexOf('-quicklist'); 489 endPart = innerElement.id.substring(needle + 10); 490 otherTarget = innerElement.id.substring(0,needle) + endPart; 491 492 // Suchen der ID 493 for ( var j = 0; j < textCheckBoxes.length; j++ ) { 494 if(textCheckBoxes[j].id === otherTarget) { 495 otherElement = textCheckBoxes[j]; 496 } 497 } 498 499 if (innerElement.checked) { 500 otherElement.checked = true; 501 } else { 502 otherElement.checked = false; 503 } 504 }); 505 } 506 507 for ( var k = 0; k < textCheckBoxes.length; k++ ) { 508 509 textCheckBoxes[k].addEventListener("click", function(e){ 510 511 innerElement = this; 512 513 // ID im Listenblock ohne -quicklist 514 needle = innerElement.id.lastIndexOf('-'); 515 endPart = innerElement.id.substring(needle); 516 otherTarget = innerElement.id.substring(0,needle) + '-quicklist' + endPart; 517 518 // Suchen der ID 519 for ( var l = 0; l < listCheckBoxes.length; l++ ) { 520 if(listCheckBoxes[l].id === otherTarget) { 521 otherElement = listCheckBoxes[l]; 522 } 523 } 524 525 if (innerElement.checked) { 526 otherElement.checked = true; 527 } else { 528 otherElement.checked = false;
529 } 530 }); 531 } 532 } else { 533 console.error('Checkboxen im Template nicht die gleiche Anzahl'); 534 } 535 536 } 537 538 539 /** 540 * _scrollToTarget 541 * 542 * Stellt sicher, dass das gewünschte Element sichtbar wird 543 * Als Focus kann hier ein Selektor angegeben werden, der fokussiert werden soll 544 * 545 * @param targetId 546 * @param focus 547 * @private 548 */ 549 function _scrollToTarget(targetId, focus) { 550 551 // Focus parameter gesetzt? 552 if ( typeof focus === 'undefined' ) { 553 focus = ''; 554 } 555 556 // Prüfen, ob es das targetElement gibt (+cachen) 557 var targetElement = document.getElementById(targetId); 558 559 if ( targetElement ) { 560 561 // Scrollbares Eltern-Element finden 562 var scrollableElement = _getScrollableParent(targetElement); 563 564 // Wenn keines gefunden wurde, das Backup Setup verwenden 565 if ( typeof scrollableElement === 'undefined' || !scrollableElement ) { 566 scrollableElement = document.getElementById(scrollableContainerId); 567 } 568 569 // Fallback für IE11 falls nötig 570 if (typeof scrollableElement.scrollTo !== "undefined") { // IE11 Fallback 571 // Zum gewünschten Element scrollen (Element offsetTop - Container offsetTop - 20 [20px weiter oben, dass es besser aussieht]) 572 scrollableElement.scrollTo(0, targetElement.offsetTop - scrollableElement.offsetTop - 20); 573 } else { 574 targetElement.scrollIntoView({alignToTop: "true"}); 575 } 576 577 // Fokussieren? 578 if ( focus !== '' ) { 579 targetElement.querySelector(focus).focus(); 580 } 581 } 582 583 } 584 585 586 /** 587 * _getScrollableParent 588 * 589 * Ermittelt das nächte scrollbare Elternelement 590 * Von: https://github.com/olahol/scrollparent.js/blob/master/scrollparent.js#L13 591 * 592 * @param node 593 * @returns {undefined|*} 594 * @private 595 */ 596 function _getScrollableParent(node) { 597 598 var regex = /(auto|scroll)/; 599 600 var parents = function (node, ps) { 601 if (node.parentNode === null) { return ps; } 602 603 return parents(node.parentNode, ps.concat([node])); 604 }; 605 606 var style = function (node, prop) { 607 return getComputedStyle(node, null).getPropertyValue(prop); 608 }; 609 610 var overflow = function (node) { 611 return style(node, "overflow") + style(node, "overflow-y") + style(node, "overflow-x"); 612 }; 613 614 var scroll = function (node) { 615 return regex.test(overflow(node)); 616 }; 617 618 var scrollParent = function (node) { 619 if (!(node instanceof HTMLElement || node instanceof SVGElement)) { 620 return ; 621 } 622 623 var ps = parents(node.parentNode, []); 624 625 for (var i = 0; i < ps.length; i += 1) { 626 if (scroll(ps[i])) { 627 return ps[i]; 628 } 629 } 630 631 return document.scrollingElement || document.documentElement; 632 }; 633 634 return scrollParent(node); 635 } 636 }); 637 638})(window, document);
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.