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.