PageSourceSearch

https://www.steiner-verlag.de/bundles/ropifrontendediting/content-editor/js/scripts/carousel.js?v=1637255330

js steiner-verlag.de collected 2026-10-01 10:42:43 UTC 6,664 bytes, 200 lines download raw bytes

1(function() {
2    let initAll = function() {
3        let carousels = document.querySelectorAll('[data-ropi-carousel]');
4        for (let i = 0; i < carousels.length; i++) {
5            init(carousels[i]);
6        }
7    };
8
9    let init = function(carousel) {
10        if (carousel.ropiCarousel) {
11            return;
12        }
13
14        carousel.ropiCarousel = new function() {
15            const self = this;
16            const rotationInterval = carousel.getAttribute('data-ropi-carousel-rotation-interval') || 0;
17            const slides = carousel.querySelector('[data-ropi-carousel-slides]') || carousel.querySelector('ul');
18            const numSlides = carousel.getAttribute('data-ropi-carousel-num-slides') || slides.childElementCount;
19            const left = carousel.querySelector('[data-ropi-carousel-left]');
20            const right = carousel.querySelector('[data-ropi-carousel-right]');
21            const dots = carousel.querySelector('[data-ropi-carousel-dots]');
22            const dotsActiveClass = (dots ? dots.getAttribute('data-ropi-carousel-dots-class-active') : null) || 'ropi-dot-active';
23
24            let interval, intervalPaused, clientX, clientY, swipe, rect;
25            let current = 0;
26            let swipeable = true;
27
28            // Listeners
29
30            carousel.addEventListener('touchstart', function(event) {
31                if (!swipeable) return;
32
33                clientX = event.changedTouches[0].clientX;
34                clientY = event.changedTouches[0].clientY;
35                slides.style.transition = 'none';
36                swipe = false;
37            }, {passive: true});
38
39            carousel.addEventListener('touchmove', function(event) {
40                if (!swipeable) return;
41
42                let deltaX = clientX - event.changedTouches[0].clientX;
43                let deltaY = event.changedTouches[0].clientY - clientY;
44
45                if (swipe) {
46                    let transform = 'translateX(calc(' + (-current * 100) + '% - ' + deltaX + 'px))';
47                    slides.style.msTransform = transform;
48                    slides.style.transform = transform;
49                } else {
50                    if (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > 16) {
51                        swipe = true;
52                        rect = carousel.getBoundingClientRect();
53                    }
54                }
55            }, {passive: true});
56
57            carousel.addEventListener('touchend', function(event) {
58                if (!swipeable) return;
59
60                slides.style.transition = '';
61
62                if (swipe) {
63                    let deltaX = clientX - event.changedTouches[0].clientX;
64                    let percentageX = 100 / rect.width * deltaX;
65
66                    let next = current + Math.round(percentageX / 100);
67
68                    if (next === current) {
69                        next = current + Math.round(percentageX * 4 / 100);
70                    }
71
72                    if (next < 0) {
73                        next = 0;
74                    } else if (next >= numSlides) {
75                        next = numSlides - 1;
76                    }
77
78                    self.slideTo(next);
79                    self.resetInterval();
80                    swipe = false;
81                }
82            }, {passive: true});
83
84            if (left && right) {
85                left.addEventListener('click', function() {
86                    self.resetInterval();
87                    self.slideTo(current - 1);
88                });
89
90                right.addEventListener('click', function() {
91                    self.resetInterval();
92                    self.slideTo(current + 1);
93                });
94            }
95
96            if (dots) {
97                dots.addEventListener('click', function(event) {
98                    self.resetInterval();
99                    let index = Array.prototype.indexOf.call(dots.children, event.target);
100                    if (index > -1) {
101                        self.slideTo(index);
102                    }
103                });
104            }
105
106            // Public
107
108            self.resetInterval = function() {
109                if (interval) {
110                    clearInterval(interval);
111                }
112
113                if (!rotationInterval) {
114                    return;
115                }
116
117                interval = setInterval(function() {
118                    if (intervalPaused || swipe) {
119                        return;
120                    }
121
122                    self.slideTo(current + 1);
123                }, rotationInterval);
124            };
125
126            self.setIntervalPaused = function(value) {
127                intervalPaused = value;
128            };
129
130            self.getIntervalPaused = function() {
131                return intervalPaused;
132            };
133
134            self.setSwipeable = function(value) {
135                swipeable = !!value;
136            };
137
138            self.getSwipeable = function() {
139                return swipeable;
140            };
141
142            self.slideTo = function(next) {
143                next = (next >= numSlides) ? 0 : ((next < 0) ? numSlides - 1 : next);
144                let transform = 'translateX(-' + (next * 100) + '%)';
145                slides.style.transform = transform;
146                slides.style.msTransform = transform;
147                if (dots && dots.children[next]) {
148                    for (let i = 0; i < dots.children.length; i++) {
149                        dots.children[i].setAttribute('class', '');
150                    }
151
152                    dots.children[next].setAttribute('class', dotsActiveClass);
153                }
154
155                current = next;
156            };
157
158            self.getCurrent = function() {
159                return current;
160            };
161
162            self.getDotsElement = function() {
163                return dots;
164            };
165
166            self.getLeftElement = function() {
167                return left;
168            };
169
170            self.getRightElement = function() {
171                return right;
172            };
173
174            self.getSlidesElement = function() {
175                return slides;
176            };
177
178            // constructor
179
180            self.resetInterval();
181            self.slideTo(0);
182        };
183
184        let event;
185
186        try {
187            event = new CustomEvent('ropicarouselinitialized');
188        } catch(e) {
189            event = document.createEvent('CustomEvent');
190            event.initCustomEvent('ropicarouselinitialized', false, false, {});
191        }
192
193        carousel.dispatchEvent(event);
194    };
195
196    document.addEventListener('load', initAll);
197    document.addEventListener('contentelementrender', initAll);
198
199    initAll();
200})();

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.