PageSourceSearch

https://www.freudenberg-main.de/typo3conf/ext/hwdatenschutz/Resour…/HwDatenschutzCookieBanner.js?1712842503

js freudenberg-main.de collected 2026-10-02 19:30:22 UTC 24,246 bytes, 638 lines download raw bytes

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.