PageSourceSearch

https://www.lasten-zauber.de/wp-content/plugins/barrierefrei-helper/js/barrierefreiheit.js?ver=1.0.0

js lasten-zauber.de collected 2026-10-05 23:01:53 UTC 13,021 bytes, 323 lines download raw bytes

1document.addEventListener('DOMContentLoaded', function () {
2    const lastCacheClear = parseInt(localStorage.getItem('lastBFCacheClear') || '0');
3    const lastKnownClear = parseInt(BarrierefreiheitSettings.lastCacheClear);
4    var closable = false, closing = false;
5    
6
7    console.log(BarrierefreiheitSettings);
8
9    if (lastKnownClear > lastCacheClear) {
10        const keysToClear = ['barrierefreieSettings'];
11        keysToClear.forEach(key => {
12            localStorage.removeItem(key);
13        });
14
15        localStorage.setItem('lastBFCacheClear', lastKnownClear);
16        console.log('Ausgewählte LocalStorage Einstellungen wurden geleert.');
17    }
18
19    function setLocal(settings) {
20        localStorage.setItem('barrierefreieSettings', JSON.stringify(settings));
21    }
22
23    function getLocal() {
24        const settings = localStorage.getItem('barrierefreieSettings');
25        return settings ? JSON.parse(settings) : {
26            originalElements: {},
27            contrastElements: {},
28            isContrastMode: false
29        };
30    }
31
32    var root = document.documentElement;
33    var settings = getLocal();
34    var currentFontSize = parseFloat(window.getComputedStyle(root).fontSize);
35    let contrastIndex = 0;
36    const contrastDataAttr = "data-contrast-index";
37
38    if (!settings.defaultFontSize) {
39        settings.defaultFontSize = currentFontSize;
40        setLocal(settings);
41    }
42
43    window.resetColor = function (variableName) {
44        document.body.style.removeProperty('--e-global-color-' + variableName);
45        var defaultColor = settings[variableName + 'DefaultColor'];
46        document.getElementById(variableName + '-color').value = defaultColor;
47        settings[variableName + 'Color'] = defaultColor;
48        setLocal(settings);
49    };
50
51    window.resetFontSize = function () {
52        currentFontSize = settings.defaultFontSize;
53        changeFontSize(1);
54    }
55
56    window.toggleContrastMode = function () {
57        let isContrastMode = settings['isContrastMode'];
58        document.querySelectorAll(`[${contrastDataAttr}]`).forEach(el => {
59            let index = el.getAttribute(contrastDataAttr);
60            let colors = isContrastMode ? settings.originalElements[index] : settings.contrastElements[index];
61            if (colors) {
62                el.style.color = colors.text;
63                el.style.backgroundColor = colors.background;
64            }
65        });
66
67        settings['isContrastMode'] = !isContrastMode;
68        setLocal(settings);
69    }
70
71    function changeFontSize(factor) {
72        currentFontSize *= factor;
73        root.style.fontSize = currentFontSize + 'px';
74        settings.currentFontSize = currentFontSize;
75        setLocal(settings);
76    }
77
78    function setColor(toChange) {
79        if (settings[toChange + 'Color']) return;
80        var color = getComputedStyle(document.getElementById('get_colors')).getPropertyValue('--e-global-color-' + toChange).trim();
81        document.getElementById(toChange + '-color').value = color;
82        settings[toChange + 'DefaultColor'] = color;
83        setLocal(settings);
84    }
85
86    function isElementVisible(element) {
87        if (!element) return false;
88
89        while (element) {
90            const style = window.getComputedStyle(element);
91            if (style.display === 'none' || style.visibility === 'hidden') return false;
92            element = element.parentElement;
93        }
94        return true;
95    }
96
97    window.resetAll = function () {
98        Object.keys(settings).forEach(function (key) {
99            if (key.includes('DefaultColor')) {
100                var variableName = key.replace('DefaultColor', '');
101                resetColor(variableName);
102            }
103        });
104        resetFontSize();
105    }
106
107    if (BarrierefreiheitSettings.fontSizeEnabled === "1") {
108        if (settings.currentFontSize) {
109            currentFontSize = parseFloat(settings.currentFontSize);
110            root.style.fontSize = settings.currentFontSize + 'px';
111        }
112
113        document.getElementById('increase-font-size').addEventListener('click', function () {
114            changeFontSize(1.1);
115        });
116        document.getElementById('decrease-font-size').addEventListener('click', function () {
117            changeFontSize(0.9);
118        });
119    }
120
121    if (BarrierefreiheitSettings.colorChoiceEnabled === "1") {
122        ['primary', 'secondary', 'accent', 'text'].forEach(function (colorName) {
123            if (settings[colorName + 'Color']) {
124                var storedColor = settings[colorName + 'Color'];
125                document.body.style.setProperty('--e-global-color-' + colorName, storedColor, 'important');
126                document.getElementById(colorName + '-color').value = storedColor;
127            }
128        });
129
130        setTimeout(() => {
131            setColor('primary');
132            setColor('secondary');
133            setColor('accent');
134            setColor('text');
135        }, 250);
136
137        document.getElementById('primary-color').addEventListener('input', function (e) {
138            settings.primaryColor = this.value;
139            document.body.style.setProperty('--e-global-color-primary', this.value, 'important');
140            setLocal(settings);
141        });
142        document.getElementById('secondary-color').addEventListener('input', function () {
143            settings.secondaryColor = this.value;
144            document.body.style.setProperty('--e-global-color-secondary', this.value, 'important');
145            setLocal(settings);
146        });
147        document.getElementById('accent-color').addEventListener('input', function () {
148            settings.accentColor = this.value;
149            document.body.style.setProperty('--e-global-color-accent', this.value, 'important');
150            setLocal(settings);
151        });
152        document.getElementById('text-color').addEventListener('input', function () {
153            settings.textColor = this.value;
154            document.body.style.setProperty('--e-global-color-text', this.value, 'important');
155            setLocal(settings);
156        });
157    }
158
159    if (BarrierefreiheitSettings.tocEnabled === "1") {
160
161        var headers = document.querySelectorAll(BarrierefreiheitSettings.tocTag);
162        var tocList = document.getElementById('tocList');
163
164        headers.forEach(function (header, index) {
165            if (isElementVisible(header)) {
166                var listItem = document.createElement('li');
167                var link = document.createElement('a');
168                link.textContent = header.textContent;
169                link.href = "#header" + index;
170                header.id = "header" + index;
171                listItem.appendChild(link);
172
173                link.addEventListener('click', function (e) {
174                    e.preventDefault();
175                    document.getElementById(header.id).scrollIntoView({ behavior: 'smooth' });
176                });
177
178                tocList.appendChild(listItem);
179            }
180        });
181    }
182
183    document.addEventListener('click', function (event) {
184        var popup = document.getElementById('barrierefreiheit-popup');
185        var closeButton = document.getElementById('close-popup');
186
187        if (!popup.contains(event.target) && popup.classList.contains('active')) {
188            closeButton.click();
189        }
190    });
191
192    document.getElementById('barrierefreiheit-icon').addEventListener('click', function () {
193        if (closing) return;
194
195        popup = document.getElementById('barrierefreiheit-popup');
196        popup.classList.add('active');
197        setTimeout(() => {
198            popup.style.transform = 'translateY(0)';
199            document.getElementById('barrierefreiheit-icon').style.display = 'none';
200            closable = true;
201        }, 10)
202    });
203    document.getElementById('close-popup').addEventListener('click', function () {
204        if (!closable) return;
205
206        popup = document.getElementById('barrierefreiheit-popup');
207        popup.style.transform = 'translateY(-100%)';
208        closable = false;
209        closing = true;
210        setTimeout(() => {
211            popup.classList.remove('active');
212            closing = false;
213            document.getElementById('barrierefreiheit-icon').style.removeProperty('display');
214        }, 300)
215    });
216
217    if (BarrierefreiheitSettings.contrastEnabled === "1") {
218        function getLuminance(rgb) {
219            let a = rgb.map(function (v) {
220                v /= 255;
221                return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
222            });
223            return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722;
224        }
225
226        function getContrastRatio(rgb1, rgb2) {
227            let lum1 = getLuminance(rgb1);
228            let lum2 = getLuminance(rgb2);
229            let brightest = Math.max(lum1, lum2);
230            let darkest = Math.min(lum1, lum2);
231            return (brightest + 0.05) / (darkest + 0.05);
232        }
233
234        function parseColor(input) {
235            var m;
236            if ((m = input.match(/^#([0-9a-f]{6})$/i)) !== null) {
237                return [
238                    parseInt(m[1].substr(0, 2), 16),
239                    parseInt(m[1].substr(2, 2), 16),
240                    parseInt(m[1].substr(4, 2), 16)
241                ];
242            } else if ((m = input.match(/^rgb\s*\(\s*(\d+),\s*(\d+),\s*(\d+)\s*\)$/)) !== null) {
243                return [parseInt(m[1]), parseInt(m[2]), parseInt(m[3])];
244            } else if ((m = input.match(/^rgba\s*\(\s*(\d+),\s*(\d+),\s*(\d+),\s*([0-9\.]+)\s*\)$/)) !== null) {
245                return [parseInt(m[1]), parseInt(m[2]), parseInt(m[3])];
246            }
247            return null;
248        }
249
250
251        function getEffectiveBackgroundColor(element) {
252            let backgroundColor = window.getComputedStyle(element).backgroundColor;
253            while (element.parentElement && backgroundColor === 'rgba(0, 0, 0, 0)') {
254                element = element.parentElement;
255                backgroundColor = window.getComputedStyle(element).backgroundColor;
256            }
257            return backgroundColor;
258        }
259
260        function adjustColorForContrast(textRgb, backgroundRgb) {
261            let contrastRatio = getContrastRatio(textRgb, backgroundRgb);
262            if (contrastRatio >= 4.5) return null;
263
264            let adjustedTextRgb = [...textRgb];
265            let adjustedBackgroundRgb = [...backgroundRgb];
266            const step = 10;
267
268            while (contrastRatio < 4.5) {
269                if (getLuminance(adjustedTextRgb) > getLuminance(adjustedBackgroundRgb)) {
270                    adjustedTextRgb = adjustedTextRgb.map(c => Math.min(c + step, 255));
271                    adjustedBackgroundRgb = adjustedBackgroundRgb.map(c => Math.max(c - step, 0));
272                } else {
273                    adjustedTextRgb = adjustedTextRgb.map(c => Math.max(c - step, 0));
274                    adjustedBackgroundRgb = adjustedBackgroundRgb.map(c => Math.min(c + step, 255));
275                }
276                contrastRatio = getContrastRatio(adjustedTextRgb, adjustedBackgroundRgb);
277            }
278
279            return {
280                text: `rgb(${adjustedTextRgb.join(", ")})`,
281                background: `rgb(${adjustedBackgroundRgb.join(", ")})`
282            };
283        }
284
285        function applyContrastImprovements(el, textColor, backgroundColor) {
286            let originalColor = { text: '', background: '' };
287            let textRgb = parseColor(textColor);
288            let backgroundRgb = parseColor(backgroundColor);
289            let newColors = adjustColorForContrast(textRgb, backgroundRgb);
290
291            if (newColors) {
292                if (!el.hasAttribute(contrastDataAttr)) {
293                    el.setAttribute(contrastDataAttr, contrastIndex++);
294                }
295                let index = el.getAttribute(contrastDataAttr);
296                settings['originalElements'][index] = originalColor;
297                settings['contrastElements'][index] = newColors;
298
299                setLocal(settings);
300            }
301        }
302
303        function checkPageContrast() {
304            let elements = document.querySelectorAll('body *');
305            elements.forEach(el => {
306                if (!isElementVisible(el)) return;
307
308                let textColor = window.getComputedStyle(el).color;
309                let backgroundColor = getEffectiveBackgroundColor(el);
310                applyContrastImprovements(el, textColor, backgroundColor);
311            });
312        }
313
314        checkPageContrast();
315        if (settings['isContrastMode']) {
316            settings['isContrastMode'] = !settings['isContrastMode'];
317            setTimeout(() => {
318                toggleContrastMode();
319                document.getElementById('contrast-toggle').checked = true;
320            }, 250);
321        }
322    }
323});

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.