PageSourceSearch

https://www.frenell.de/resources/js/main.1740497581.js

js frenell.de collected 2026-10-07 01:58:03 UTC 12,963 bytes, 413 lines download raw bytes

1const clamp = (num, min, max) => Math.min(Math.max(num, min), max);
2//Header Observer
3const header = document.querySelector('header');
4let obsTargets;
5if (document.getElementsByTagName("section").length == 0) {
6    obsTargets = 'main';
7} else {
8    obsTargets = 'section';
9}
10if (window.innerHeight < document.querySelector("footer").offsetHeight) obsTargets += ', footer';
11
12const sections = [...document.querySelectorAll(obsTargets)];
13let prevYPosition = 0;
14let direction = '';
15const options = {
16    root: null,
17    rootMargin: `${header.offsetHeight * -1}px`,
18    threshold: 0
19}
20const getTargetSection = (entry) => {
21    const index = sections.findIndex((section) => section == entry.target);
22    if (index >= sections.length - 1) {
23        return entry.target;
24    } else {
25        return sections[index + 1];
26    }
27}
28const shouldUpdate = (entry) => {
29    if (direction === 'down' && !entry.isIntersecting) {
30        return true;
31    }
32    if (direction === 'up' && entry.isIntersecting) {
33        return true;
34    }
35    return false;
36};
37const onIntersect = (entries) => {
38    if (direction == '') entries.reverse();
39    entries.forEach((entry) => {
40        if ($(window).scrollTop() > prevYPosition) {
41            direction = 'down';
42        } else {
43            direction = 'up';
44        }
45    prevYPosition = $(window).scrollTop();
46    const target = direction === 'down' ? getTargetSection(entry) : entry.target;
47    if (shouldUpdate(entry)) {
48        if (target.classList.contains("blue")) {
49            header.classList.add("white-header");
50        } else {
51            header.classList.remove("white-header");
52        }
53    }
54  });
55};
56const headerObserver = new IntersectionObserver(onIntersect, options);
57sections.forEach((section) => {
58    headerObserver.observe(section)
59});
60//Header Observer END
61//Reveal Observer
62// const revObsOptions = {
63//     root: null,
64//     rootMargin: '-20% 0px -20% 0px',
65//     threshold: 0
66// };
67// const revObs = new IntersectionObserver(reveal, revObsOptions);
68// function reveal(entries) {
69//     entries.forEach((entry) => {
70//         if (entry.isIntersecting) {
71//             entry.target.classList.add("show");
72//             entry.target.classList.remove("hidden");
73//         } else {
74//             entry.target.classList.add("hidden");
75//             entry.target.classList.remove("show");
76//         }
77//     });
78// }
79// const revObsTargets = document.querySelectorAll(".reveal");
80// for (const target of revObsTargets) {
81//     revObs.observe(target);
82// }
83//Reveal Observer END
84//Smooth Scroll
85new SmoothScroll(document, 100, 15);
86function SmoothScroll(target, speed, smooth) {
87	if (target === document)
88		target = (document.scrollingElement 
89              || document.documentElement 
90              || document.body.parentNode 
91              || document.body); // cross browser support for document scrolling
92      
93	var moving = false;
94	var pos = target.scrollTop;
95    var prevPos = pos;
96    var frame = target === document.body && document.documentElement ? document.documentElement : target; // safari is the new IE
97
98	target.addEventListener('mousewheel', scrolled, { passive: false });
99	target.addEventListener('DOMMouseScroll', scrolled, { passive: false });
100
101	function scrolled(e) {
102        if (prevPos != target.scrollTop) pos = target.scrollTop; //check for scrollbar/middle-mouse-button scroll, update position
103		e.preventDefault(); // disable default scrolling
104		var delta = normalizeWheelDelta(e);
105		pos += -delta * speed;
106		pos = Math.max(0, Math.min(pos, target.scrollHeight - frame.clientHeight)); // limit scrolling
107		if (!moving) update();
108        
109	}
110	function normalizeWheelDelta(e){
111		if(e.detail){
112			if (e.wheelDelta) {
113				return e.wheelDelta/e.detail/40 * (e.detail > 0 ? 1 : -1); // Opera
114            } else {
115				return -e.detail/3; // Firefox
116            }
117		} else {
118			return e.wheelDelta/120; // IE,Safari,Chrome
119        }
120    }
121	function update() {
122		moving = true;
123		var delta = (pos - target.scrollTop) / smooth;
124		target.scrollTop += delta;
125		if (Math.abs(delta) >= 1) {
126			requestFrame(update);
127        } else {
128			moving = false;
129        }
130        prevPos = target.scrollTop;
131	}
132	var requestFrame = function() { // requestAnimationFrame cross browser
133		return (
134			window.requestAnimationFrame ||
135			window.webkitRequestAnimationFrame ||
136			window.mozRequestAnimationFrame ||
137			window.oRequestAnimationFrame ||
138			window.msRequestAnimationFrame ||
139			function(func) {
140				window.setTimeout(func, 1000 / 50);
141			}
142		);
143	}()
144}
145//Smooth Scroll END
146//Parallax
147var imgsUp = document.querySelectorAll(".parallax-up");
148new simpleParallax(imgsUp, {
149	orientation: 'up',
150    scale: 1.2
151});
152var imgsRight = document.querySelectorAll(".parallax-right");
153new simpleParallax(imgsRight, {
154	orientation: 'right',
155    scale: 1.2
156});
157//Parallax END
158// Text Filter
159function filterText(elem) {
160    if (elem.classList.contains("visible")) {
161        return;
162    }
163
164    var filterParent = elem.parentElement;
165    var filterElem = filterParent.children;
166    var txtElem = filterParent.parentElement.children[1].children;
167    var focusElem;
168
169    for (var i = 0; i < filterElem.length; i++) {
170        filterElem[i].classList.remove("visible");
171    }
172    for (var i = 0; i < txtElem.length; i++) {
173        $(txtElem[i]).hide(1000);
174        if (txtElem[i].dataset.filter == elem.dataset.filter) {
175            focusElem = txtElem[i];
176        }
177    }
178    $(focusElem).show(1000);
179    elem.classList.add("visible");
180}
181// Text Filter ENDE
182
183// Text Fade
184var canChange = true;
185function fadeText(buttonElem, direction) {
186    if (canChange == false) return;
187    canChange = false;
188    var parentElem = buttonElem.parentElement.nextElementSibling;
189    var currentElem = parentElem.getElementsByClassName("fade-txt-elem visible")[0];
190    var nextElem = (direction == "next") ? getNextSibling(currentElem) : getPreviousSibling(currentElem);
191
192    currentElem.classList.remove("visible");
193    nextElem.classList.add("visible");
194    $(nextElem).show();
195    $(currentElem.getElementsByClassName("link-arrow")[0]).fadeOut(800, function() {
196        $(nextElem.getElementsByClassName("link-arrow")[0]).fadeIn(800);
197    });  
198    $(currentElem.getElementsByClassName("txt-container")[0]).hide(800, function() {
199        $(nextElem.getElementsByClassName("txt-container")[0]).show(800);
200        $(currentElem).hide();
201        canChange = true;
202    });  
203}
204function getNextSibling(elem) {
205	var sibling = elem.nextElementSibling;
206    if (sibling == null) sibling = elem.parentElement.firstElementChild;
207    return sibling;
208}
209function getPreviousSibling(elem) {
210	var sibling = elem.previousElementSibling;
211    if (sibling == null) sibling = elem.parentElement.lastElementChild;
212	return sibling;
213}
214// Text Fade ENDE
215
216//Accordion
217function openAccordion(elem) {
218    var siblings = elem.parentElement.children;
219    for (var i = 0; i < siblings.length; i++) {
220        if (!siblings[i].isEqualNode(elem)) {
221            var hideText = siblings[i].getElementsByClassName("accordion-txt")[0];
222            $(hideText).hide(1000);
223            siblings[i].classList.remove("active");
224        }
225    }
226    var showText = elem.getElementsByClassName("accordion-txt")[0];
227    $(showText).stop();
228    $(showText).toggle(1000);
229    elem.classList.toggle("active");
230}
231//Accordion ENDE
232
233//Masonry
234var $grid = $('.masonry').masonry({
235    // options
236    itemSelector: '.masonry-item.visible',
237    columnWidth: '.masonry-item.visible',
238    percentPosition: true,
239    horizontalOrder: true,
240    originTop: true
241  });
242//Masonry ENDE
243// Filter
244//toggle filter buttons (show/hide) small screens
245var canToggleFilter = true;
246function toggleFilters(elem) {
247    if (!canToggleFilter) return;
248    canToggleFilter = false;
249    elem.classList.toggle("clicked");
250    var filterButtons = elem.nextElementSibling;
251    $(filterButtons).toggle(500, function(){
252        filterButtons.classList.toggle("visible");
253        $(filterButtons).css({
254            display: ''
255        });
256        canToggleFilter = true;
257    });
258}
259function filter(elem) {
260    //button handling
261    if (elem.classList.contains("active")) return;
262    var buttons = elem.parentElement.children;
263    for (var i = 0; i < buttons.length; i++) {
264        buttons[i].classList.remove("active");
265    }
266    elem.classList.add("active");
267    //filter
268    var filterValue = elem.dataset.filter;
269    var masonryContainer = elem.parentElement.nextElementSibling;
270    masonryContainer.dataset.currfilter = filterValue;
271    filterMasonry(masonryContainer);
272}
273function filterMasonry(masonryContainer) {
274    var filterElements = masonryContainer.children;
275    var filterValue = masonryContainer.dataset.currfilter;
276    for (var i = 0; i < filterElements.length; i++) {
277        filterElements[i].classList.remove("visible");
278        $(filterElements[i]).css({
279            display: 'none',
280            top: '0',
281            left: '0'
282        });
283    }
284    setTimeout(function() {
285        var count = 0;
286        for (var i = 0; i < filterElements.length; i++) {
287            if (filterValue == "all" || filterValue == filterElements[i].dataset.filter) {
288                count++;
289                $(filterElements[i]).css({
290                    display: 'block',
291                    transform: 'none'
292                });
293                filterElements[i].classList.add("visible");
294            }
295            if (count >= masonryContainer.dataset.elemcount) {
296                break;
297            }
298
299        }
300        $grid.masonry();
301    }, 200);
302    var loadMoreButton = masonryContainer.nextElementSibling;
303    $(loadMoreButton).fadeOut(250, ()=>{
304        loadMoreButton.classList.add("not-loaded");
305        var numberFilterElem = 0;
306        for (var i = 0; i < filterElements.length; i++) {
307            if (filterValue == "all" || filterElements[i].dataset.filter == filterValue) {
308                numberFilterElem++;
309            }
310        }
311        if (numberFilterElem > masonryContainer.dataset.elemcount) {
312            loadMoreButton.classList.remove("not-loaded");
313            $(loadMoreButton).slideDown(250);
314        }
315    });
316}
317function loadMoreNews(elem) {
318    var container = elem.previousElementSibling;
319    container.dataset.elemcount = parseInt(container.dataset.elemcount) + parseInt(container.dataset.origelemcount);
320    filterMasonry(container);
321}
322// Filter ENDE
323
324//Audio Wave
325function convertToMinutes(seconds) {
326    var minutes = ~~(seconds / 60);
327    seconds = Math.round(seconds % 60);
328    secondsString = seconds.toString();
329    if (secondsString.length < 2) {
330        seconds = "0" + secondsString
331    }
332    return minutes+":"+seconds;
333}
334function setTime(time, container) {
335    container.innerHTML = convertToMinutes(time);
336}
337function togglePlayButton(button) {
338    button.classList.toggle("playing");
339}
340function stopPlayButton(button) {
341    button.classList.remove("playing");
342}
343//Audio Wave ENDE
344
345//Scroll News
346function scrollToElem(elem) {
347    var container = elem.parentElement;
348    var scrollPos = (elem.offsetLeft - container.offsetLeft) - container.offsetWidth/2 + elem.offsetWidth/2;
349    /* $(container).scrollLeft(scrollPos); not this because safari ios is a thing */
350    $(container).animate({scrollLeft: scrollPos});
351}
352//Scroll News ENDE
353
354
355//Swiper
356$('.swiper').each(function (index) {
357    var activeIndexName = "activeIndex"+index;
358    new Swiper($(this)[0],{
359        direction: 'horizontal',
360        preloadImages: false,
361        lazy: true,
362        allowTouchMove: false,
363        lazy: {
364            loadPrevNext: true,
365        },
366        pagination: {
367            el: '.swiper-pagination',
368            type: 'bullets',
369            dynamicBullets: true,
370            clickable: true,
371            renderBullet: function(index, className) {
372                var year = document.querySelectorAll('.swiper-slide')[index].getAttribute('data-year');
373                return '<span class="' + className + '">' + year + '</span>';
374            }
375        },
376        breakpoints: {
377            768: {
378                direction: 'vertical'
379            }
380        },
381        navigation: {
382            nextEl: '.swiper-button-next',
383            prevEl: '.swiper-button-prev'
384        },
385        on: {
386            init: function() {
387                if (sessionStorage.getItem(activeIndexName) != null) {
388                    this.slideTo(sessionStorage.getItem(activeIndexName), 0, false);
389                    sessionStorage.removeItem(activeIndexName);
390                }
391                this.on('breakpoint', function() {
392                    sessionStorage.setItem(activeIndexName, this.activeIndex);
393                    location.reload();
394                });
395            }
396        }
397    });
398});
399//Swiper ENDE
400
401//Scroll Swiper
402var scrollSwiper = new Swiper(".scroll-swiper", {
403    allowTouchMove: false,
404    scrollbar: {
405      el: ".swiper-scrollbar",
406      hide: false,
407      draggable: true,
408      snapOnRelease: false
409    },
410    slidesPerView: 3,
411    spaceBetween: 30
412});
413//Scroll Swiper ENDE

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.