PageSourceSearch

https://www.hwg-lu.de/_assets/87d6bb40e8845f2516e5a5940c2293da/JavaScript/brainSwiper.js?1789461350

js hwg-lu.de collected 2026-10-02 16:47:19 UTC 12,340 bytes, 353 lines download raw bytes

1var brainSwiper = {
2  lang: {
3    default: {
4      prevSlideMessage: 'Vorheriges Element',
5      nextSlideMessage: 'Nächstes Element',
6      autoplayEnabled: 'Automatischer Elementwechsel aktiv',
7      autoplayDisabled: 'Automatischer Elementwechsel pausiert',
8    },
9  },
10  setUpList: function (carousels) {
11    let self = this;
12    for (let i = 0, n = carousels.length; i < n; i++) {
13      self.setUpCarousel(carousels[i]);
14    }
15  },
16  setUpCarousel: function (carousel) {
17    let self = this;
18    if (carousel.offsetParent !== null) {
19      try {
20        self.create(carousel);
21      } catch (e) {
22        console.log(e);
23      }
24    }
25    carousel.addEventListener(
26      'ba-swiper-reset',
27      function (e) {
28        self.destroy(e.target);
29        if (e.detail.reinitialize) {
30          self.create(e.target);
31        }
32      },
33      false,
34    );
35    if (
36      !carousel.classList.contains('activated') &&
37      carousel.classList.contains('js-layout-listener')
38    ) {
39      carousel.addEventListener('ba-resized', function (e) {
40        let sliderHeight = event.target.innerHeight;
41        let frame = event.target.querySelector('.frame');
42        if (frame) {
43          frame.style.maxHeight = sliderHeight + 'px';
44          let iFrame = frame.querySelector('iframe');
45          iFrame.style.height = 0;
46          iFrame.style.height = sliderHeight + 'px';
47        }
48      });
49    }
50    carousel.addEventListener(
51      'ba-layout-switch',
52      function (e) {
53        let pagination = e.target.querySelector('.swiper-pagination');
54        if (pagination) {
55          pagination.removeAttribute('style');
56        }
57        self.destroy(e.target);
58        self.create(e.target);
59      },
60      false,
61    );
62  },
63  /**
64   * @param {HTMLElement} swiperContainer
65   * @returns {*|boolean}
66   */
67  create: function (swiperContainer) {
68    let self = this;
69    const swiperWrapper = swiperContainer.querySelector('.swiper-wrapper');
70    swiperWrapper
71      .querySelectorAll(':scope > .frame:not(.swiper-slide)')
72      .forEach(function (frameElt) {
73        frameElt.classList.add('swiper-slide');
74      });
75    let slides = swiperContainer.querySelectorAll('.swiper-slide');
76
77    if (slides.length === 1 && slides[0]) {
78      slides[0].classList.add('swiper-slide-active');
79    }
80    if (
81      slides.length < 2 ||
82      swiperContainer.classList.contains('initialized')
83    ) {
84      return null;
85    }
86    let slidesTotalWidth = 0;
87    slides.forEach(function (element) {
88      slidesTotalWidth += element.offsetWidth;
89    });
90    // if all slides are visible, we don't need to initialize the swiper;
91    // all carousels listen to the ba-layout-switch event, so the swiper will be initialized, if the viewport changes
92    if (slidesTotalWidth <= swiperWrapper.offsetWidth) {
93      swiperContainer.classList.add('all-slides-in-view');
94      return null;
95    }
96    let doInitialize = true;
97    let slidesPerView = 1;
98    let vpObj = null;
99    if (swiperContainer.dataset.viewports) {
100      vpObj = JSON.parse(swiperContainer.dataset.viewports);
101      const vpType = typeof vpObj[self.getViewport()];
102      doInitialize = vpType !== 'undefined';
103      if (doInitialize && vpType === 'number') {
104        slidesPerView = parseInt(vpObj[self.getViewport()]);
105      }
106    }
107    if (doInitialize) {
108      swiperContainer.classList.add('initialized');
109      swiperContainer.classList.remove('no-slides', 'carousel-off');
110
111      let spaceBetween = 0;
112      if (
113        swiperContainer.dataset.spaceBetween &&
114        parseInt(swiperContainer.dataset.spaceBetween)
115      ) {
116        spaceBetween = parseInt(swiperContainer.dataset.spaceBetween);
117      }
118      let loop =
119        slides.length > slidesPerView &&
120        (!swiperContainer.hasAttribute('data-loop') ||
121          swiperContainer.dataset.loop === '1');
122      let centeredSlides =
123        swiperContainer.hasAttribute('data-centered-slides') &&
124        swiperContainer.dataset.centeredSlides === '1';
125      if (swiperContainer.hasAttribute('data-slides-per-view')) {
126        slidesPerView = swiperContainer.dataset.slidesPerView;
127      }
128      // https://swiperjs.com/
129      let swiperOptions = {
130        direction: 'horizontal',
131        slidesPerView: slidesPerView,
132        centeredSlides: centeredSlides,
133        spaceBetween: spaceBetween,
134        loop: loop,
135        grabCursor: true,
136        a11y: self.lang.default,
137      };
138      let lazy = swiperContainer.dataset.lazy;
139      if (lazy) {
140        // Disable preloading of all images
141        swiperOptions.preloadImages = false;
142        // Enable lazy loading
143        swiperOptions.lazy = true;
144      }
145      if (swiperContainer.dataset.free === '1') {
146        swiperOptions.freeMode = true;
147      }
148      if (swiperContainer.dataset.centered === '1') {
149        swiperOptions.centeredSlides = true;
150      }
151      if (swiperContainer.dataset.slideclick === '1') {
152        swiperOptions.slideToClickedSlide = true;
153      }
154      let autoplayInterval = 10000;
155      if (swiperContainer.hasAttribute('data-interval')) {
156        autoplayInterval = swiperContainer.dataset.interval;
157      }
158      if (autoplayInterval && autoplayInterval > 0) {
159        if (autoplayInterval < 100) {
160          swiperOptions.freeMode = true;
161          swiperOptions.speed = 2000;
162        }
163        swiperOptions.autoplay = {
164          delay: autoplayInterval,
165          disableOnInteraction: true,
166        };
167      }
168      self.addSwiperNav(swiperContainer, swiperOptions);
169      self.addSwiperPagination(swiperContainer, swiperOptions);
170      /*var respWidth = Math.min(Math.round(swiperContainer.offsetWidth * 0.7), 483) + 20;
171            for (i = 0; i < slides.length; ++i) {
172                slides[i].style.width = respWidth + 'px';
173            }*/
174      try {
175        return this.createSwiperDefault(swiperContainer, swiperOptions);
176      } catch (e) {
177        console.log(e);
178      }
179      return null;
180    } else {
181      swiperContainer.classList.add('no-slides');
182      if (slides[0]) {
183        slides[0].classList.add('swiper-slide-active');
184      }
185    }
186  },
187  addSwiperPagination: function (swiperContainer, swiperOptions) {
188    let hasPagination = !!swiperContainer.querySelector('.swiper-pagination');
189    if (!hasPagination && swiperContainer.dataset.pagination === '1') {
190      const paginationOuterElement = document.createElement('div');
191      paginationOuterElement.classList.add(
192        'swiper-pagination',
193        'js-swiper-added',
194      );
195      swiperContainer.appendChild(paginationOuterElement);
196      hasPagination = true;
197    }
198    if (hasPagination) {
199      swiperOptions.pagination = {
200        el: '.swiper-pagination',
201        clickable: true,
202      };
203      swiperContainer.classList.add('with-pagination');
204    }
205  },
206  addSwiperNav: function (swiperContainer, swiperOptions) {
207    let hasNav = !!swiperContainer.parentNode.querySelector(
208      '.swiper-button-next',
209    );
210    if (!hasNav && swiperContainer.dataset.nav === '1') {
211      const swiperControlsElement = document.createElement('div');
212      swiperControlsElement.classList.add('swiper-nav', 'js-swiper-added');
213      swiperControlsElement.innerHTML =
214        '<button class="swiper-button-prev"><i class="fa fa-angle-left" aria-hidden="true"></i></button>' +
215        //+ '<button class="swiper-button-play"><span class="icon icon-play"><span class="play" aria-label="Start"></span>'
216        //+ '<span class="pause" aria-label="Pause" aria-hidden="true"></span></span></button>'
217        '<button class="swiper-button-next"><i class="fa fa-angle-right" aria-hidden="true"></i></button>';
218      swiperContainer.appendChild(swiperControlsElement);
219      hasNav = true;
220    }
221    if (hasNav) {
222      const btnNext = swiperContainer.parentNode.querySelector(
223        '.swiper-button-next',
224      );
225      const btnPrev = swiperContainer.parentNode.querySelector(
226        '.swiper-button-prev',
227      );
228      swiperOptions.navigation = {
229        nextEl: btnNext,
230        prevEl: btnPrev,
231        disabledClass: 'swiper-button-disabled',
232      };
233      swiperContainer.classList.add('with-nav');
234    }
235  },
236  createSwiperDefault: function (swiperContainer, swiperOptions) {
237    let self = this;
238    const swiper = new Swiper(swiperContainer, swiperOptions);
239    if (!swiperContainer.dataset.eventsAdded) {
240      swiperContainer.dataset.eventsAdded = 1;
241      const playButton = swiperContainer.querySelector('.swiper-button-play');
242      if (playButton) {
243        playButton.addEventListener('click', function (evt) {
244          evt.preventDefault();
245          self.toggleAutoplay(swiper, playButton, 2);
246        });
247      }
248      swiperContainer
249        .querySelectorAll(
250          '.swiper-wrapper,.swiper-button-prev,.swiper-button-next,.swiper-pagination',
251        )
252        .forEach(function (elt) {
253          elt.addEventListener('click', function (evt) {
254            swiperContainer.classList.add('user-interaction');
255          });
256        });
257      if (swiperOptions.autoplay) {
258        swiperContainer.addEventListener('mouseenter', (e) => {
259          swiperContainer.classList.add('hover');
260          if (
261            swiperContainer.swiper &&
262            !swiperContainer.classList.contains('user-interaction')
263          ) {
264            self.toggleAutoplay(swiperContainer.swiper, playButton, -1);
265          }
266        });
267        swiperContainer.addEventListener('mouseleave', (e) => {
268          swiperContainer.classList.remove('hover');
269          if (
270            swiperContainer.swiper &&
271            !swiperContainer.classList.contains('user-interaction')
272          ) {
273            self.toggleAutoplay(swiperContainer.swiper, playButton, 1);
274          }
275        });
276      }
277    }
278    return swiper;
279  },
280  toggleAutoplay: function (swiper, playButton, toggleType) {
281    let self = this;
282    if (playButton) {
283      const isPaused = playButton.classList.contains('paused');
284      const isPausedByUser =
285        isPaused && playButton.classList.contains('paused-by-user');
286      if (toggleType === 2) {
287        if (isPausedByUser) {
288          self.restartAutoplay(swiper, playButton);
289          playButton.classList.remove('paused-by-user');
290        } else {
291          if (!isPaused) {
292            self.pauseAutoplay(swiper, playButton);
293          }
294          playButton.classList.add('paused-by-user');
295        }
296      } else if (isPaused) {
297        // Only unpause, if user clicked on button or no previous user interaction occurred
298        if (toggleType !== -1 && !isPausedByUser) {
299          self.restartAutoplay(swiper, playButton);
300        }
301      } else if (!isPaused && toggleType !== 1) {
302        self.pauseAutoplay(swiper, playButton);
303      }
304    } else {
305      if (toggleType === 1) {
306        swiper.autoplay.start();
307      } else {
308        swiper.autoplay.stop();
309      }
310    }
311  },
312  restartAutoplay: function (swiper, playButton) {
313    let self = this;
314    playButton.classList.remove('paused');
315    playButton.setAttribute('aria-label', self.lang.default.autoplayEnabled);
316    playButton.querySelector('.pause').removeAttribute('aria-hidden');
317    playButton.querySelector('.play').setAttribute('aria-hidden', 'true');
318    swiper.autoplay.start();
319  },
320  pauseAutoplay: function (swiper, playButton) {
321    let self = this;
322    playButton.classList.add('paused');
323    playButton.setAttribute('aria-label', self.lang.default.autoplayDisabled);
324    playButton.querySelector('.play').removeAttribute('aria-hidden');
325    playButton.querySelector('.pause').setAttribute('aria-hidden', 'true');
326    swiper.autoplay.stop();
327  },
328  destroy: function (swiperContainer) {
329    if (swiperContainer.swiper) {
330      swiperContainer.swiper.destroy(true, true);
331      //swiperContainer.removeEventListener('mouseenter');
332      //swiperContainer.removeEventListener('mouseleave');
333    }
334    swiperContainer.classList.remove(
335      'initialized',
336      'swiper-backface-hidden',
337      'all-slides-in-view',
338    );
339    swiperContainer.classList.add('carousel-off');
340    swiperContainer
341      .querySelectorAll('.swiper-slide-duplicate,.js-swiper-added')
342      .forEach((el) => el.remove());
343  },
344  getViewport: function () {
345    let viewport = getComputedStyle(document.documentElement).getPropertyValue(
346      '--vp',
347    );
348    if (viewport) {
349      viewport = viewport.replaceAll('"', '').trim();
350    }
351    return viewport;
352  },
353};

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.