PageSourceSearch

https://www.dreispitz.ch/docroot/dreispitz/js/foundation/foundation.orbit.js

js dreispitz.ch collected 2026-10-06 08:09:09 UTC 14,666 bytes, 367 lines download raw bytes

1;(function ($, window, document, undefined) {
2  'use strict';
3
4  Foundation.libs = Foundation.libs || {};
5
6  Foundation.libs.orbit = {
7    name: 'orbit',
8
9    version: '4.1.0',
10
11    settings: {
12      timer_speed: 10000,
13      animation_speed: 500,
14      bullets: true,
15      stack_on_small: true,
16      container_class: 'orbit-container',
17      stack_on_small_class: 'orbit-stack-on-small',
18      next_class: 'orbit-next',
19      prev_class: 'orbit-prev',
20      timer_container_class: 'orbit-timer',
21      timer_paused_class: 'paused',
22      timer_progress_class: 'orbit-progress',
23      slides_container_class: 'orbit-slides-container',
24      bullets_container_class: 'orbit-bullets',
25      bullets_active_class: 'active',
26      slide_number_class: 'orbit-slide-number',
27      caption_class: 'orbit-caption',
28      active_slide_class: 'active',
29      orbit_transition_class: 'orbit-transitioning'
30    },
31
32    init: function (scope, method, options) {
33      var self = this;
34      Foundation.inherit(self, 'data_options');
35
36      if (typeof method === 'object') {
37        $.extend(true, self.settings, method);
38      }
39
40      $('[data-orbit]', scope).each(function(idx, el) {
41        var scoped_self = $.extend(true, {}, self);
42        scoped_self._init(idx, el);
43      });
44    },
45
46    _container_html: function() {
47      var self = this;
48      return '<div class="' + self.settings.container_class + '"></div>';
49    },
50
51    _bullets_container_html: function($slides) {
52      var self = this,
53          $list = $('<ol class="' + self.settings.bullets_container_class + '"></ol>');
54      $slides.each(function(idx, slide) {
55        var $item = $('<li data-orbit-slide-number="' + (idx+1) + '" class=""></li>');
56        if (idx === 0) {
57          $item.addClass(self.settings.bullets_active_class);
58        }
59        $list.append($item);
60      });
61      return $list;
62    },
63
64    _slide_number_html: function(slide_number, total_slides) {
65      var self = this,
66          $container = $('<div class="' + self.settings.slide_number_class + '"></div>');
67      $container.append('<span>' + slide_number + '</span> of <span>' + total_slides + '</span>');
68      return $container;
69    },
70
71    _timer_html: function() {
72      var self = this;
73      if (typeof self.settings.timer_speed === 'number' && self.settings.timer_speed > 0) {
74        return '<div class="' + self.settings.timer_container_class
75          + '"><span></span><div class="' + self.settings.timer_progress_class
76          + '"></div></div>';
77      } else {
78        return '';
79      }
80    },
81
82    _next_html: function() {
83      var self = this;
84      return '<a href="#" class="' + self.settings.next_class + '">Next <span></span></a>';
85    },
86
87    _prev_html: function() {
88      var self = this;
89      return '<a href="#" class="' + self.settings.prev_class + '">Prev <span></span></a>';
90    },
91
92    _init: function (idx, slider) {
93      var self = this,
94          $slides_container = $(slider),
95          $container = $slides_container.wrap(self._container_html()).parent(),
96          $slides = $slides_container.children();
97      
98      $.extend(true, self.settings, self.data_options($slides_container));
99
100      $container.append(self._prev_html());
101      $container.append(self._next_html());
102      $slides_container.addClass(self.settings.slides_container_class);
103      if (self.settings.stack_on_small) {
104        $container.addClass(self.settings.stack_on_small_class);
105      }
106      $container.append(self._slide_number_html(1, $slides.length));
107      $container.append(self._timer_html());
108      if (self.settings.bullets) {
109        $container.after(self._bullets_container_html($slides));
110      }
111      // To better support the "sliding" effect it's easier
112      // if we just clone the first and last slides
113      $slides_container.append($slides.first().clone().attr('data-orbit-slide',''));
114      $slides_container.prepend($slides.last().clone().attr('data-orbit-slide',''));
115      // Make the first "real" slide active
116      $slides_container.css('marginLeft', '-100%');
117      $slides.first().addClass(self.settings.active_slide_class);
118
119      self._init_events($slides_container);
120      self._init_dimensions($slides_container);
121      self._start_timer($slides_container);
122    },
123
124    _init_events: function ($slides_container) {
125      var self = this,
126          $container = $slides_container.parent();
127
128      $(window)
129        .on('load.fndtn.orbit', function() {
130          $slides_container.height('');
131          $slides_container.height($slides_container.height($container.height()));
132          $slides_container.trigger('orbit:ready');
133        })
134        .on('resize.fndtn.orbit', function() {
135          $slides_container.height('');
136          $slides_container.height($slides_container.height($container.height()));
137        });
138
139      $(document).on('click.fndtn.orbit', '[data-orbit-link]', function(e) {
140        e.preventDefault();
141        var id = $(e.currentTarget).attr('data-orbit-link'),
142            $slide = $slides_container.find('[data-orbit-slide=' + id + ']').first();
143
144        if ($slide.length === 1) {
145          self._reset_timer($slides_container, true);
146          self._goto($slides_container, $slide.index(), function() {});
147        }
148      });
149
150      $container.siblings('.' + self.settings.bullets_container_class)
151        .on('click.fndtn.orbit', '[data-orbit-slide-number]', function(e) {
152          e.preventDefault();
153          self._reset_timer($slides_container, true);
154          self._goto($slides_container, $(e.currentTarget).data('orbit-slide-number'),function() {});
155        });
156
157      $container
158        .on('orbit:after-slide-change.fndtn.orbit', function(e, orbit) {
159          var $slide_number = $container.find('.' + self.settings.slide_number_class);
160
161          if ($slide_number.length === 1) {
162            $slide_number.replaceWith(self._slide_number_html(orbit.slide_number, orbit.total_slides));
163          }
164        })
165        .on('orbit:next-slide.fndtn.orbit click.fndtn.orbit', '.' + self.settings.next_class, function(e) {
166          e.preventDefault();
167          self._reset_timer($slides_container, true);
168          self._goto($slides_container, 'next', function() {});
169        })
170        .on('orbit:prev-slide.fndtn.orbit click.fndtn.orbit', '.' + self.settings.prev_class, function(e) {
171          e.preventDefault();
172          self._reset_timer($slides_container, true);
173          self._goto($slides_container, 'prev', function() {});
174        })
175        .on('orbit:toggle-play-pause.fndtn.orbit click.fndtn.orbit touchstart.fndtn.orbit', '.' + self.settings.timer_container_
175class, function(e) {
176          e.preventDefault();
177          var $timer = $(e.currentTarget).toggleClass(self.settings.timer_paused_class),
178              $slides_container = $timer.closest('.' + self.settings.container_class)
179                .find('.' + self.settings.slides_container_class);
180
181          if ($timer.hasClass(self.settings.timer_paused_class)) {
182            self._stop_timer($slides_container);
183          } else {
184            self._start_timer($slides_container);
185          }
186        })
187        .on('touchstart.fndtn.orbit', function(e) {
188          if (!e.touches) { e = e.originalEvent; }
189          var data = {
190            start_page_x: e.touches[0].pageX,
191            start_page_y: e.touches[0].pageY,
192            start_time: (new Date()).getTime(),
193            delta_x: 0,
194            is_scrolling: undefined
195          };
196          $container.data('swipe-transition', data);
197          e.stopPropagation();
198        })
199        .on('touchmove.fndtn.orbit', function(e) {
200          if (!e.touches) { e = e.originalEvent; }
201          // Ignore pinch/zoom events
202          if(e.touches.length > 1 || e.scale && e.scale !== 1) return;
203
204          var data = $container.data('swipe-transition');
205          if (typeof data === 'undefined') {
206            data = {};
207          }
208
209          data.delta_x = e.touches[0].pageX - data.start_page_x;
210
211          if ( typeof data.is_scrolling === 'undefined') {
212            data.is_scrolling = !!( data.is_scrolling || Math.abs(data.delta_x) < Math.abs(e.touches[0].pageY - data.start_page_y) );
213          }
214
215          if (!data.is_scrolling && !data.active) {
216            e.preventDefault();
217            self._stop_timer($slides_container);
218            var direction = (data.delta_x < 0) ? 'next' : 'prev';
219            data.active = true;
220            self._goto($slides_container, direction, function() {});
221          }
222        })
223        .on('touchend.fndtn.orbit', function(e) {
224          $container.data('swipe-transition', {});
225          e.stopPropagation();
226        });
227    },
228
229    _init_dimensions: function ($slides_container) {
230      var $container = $slides_container.parent(),
231          $slides = $slides_container.children();
232
233      $slides_container.css('width', $slides.length * 100 + '%');
234      $slides.css('width', 100 / $slides.length + '%');
235      $slides_container.height($container.height());
236      $slides_container.css('width', $slides.length * 100 + '%');
237    },
238
239    _start_timer: function ($slides_container) {
240      var self = this,
241          $container = $slides_container.parent();
242
243      var callback = function() {
244        self._reset_timer($slides_container, false);
245        self._goto($slides_container, 'next', function() {
246          self._start_timer($slides_container);
247        });
248      };
249
250      var $timer = $container.find('.' + self.settings.timer_container_class),
251          $progress = $timer.find('.' + self.settings.timer_progress_class),
252          progress_pct = ($progress.width() / $timer.width()),
253          delay = self.settings.timer_speed - (progress_pct * self.settings.timer_speed);
254
255      $progress.animate({'width': '100%'}, delay, 'linear', callback);
256      $slides_container.trigger('orbit:timer-started');
257    },
258
259    _stop_timer: function ($slides_container) {
260      var self = this,
261          $container = $slides_container.parent(),
262          $timer = $container.find('.' + self.settings.timer_container_class),
263          $progress = $timer.find('.' + self.settings.timer_progress_class),
264          progress_pct = $progress.width() / $timer.width()
265      self._rebuild_timer($container, progress_pct * 100 + '%');
266      // $progress.stop();
267      $slides_container.trigger('orbit:timer-stopped');
268      $timer = $container.find('.' + self.settings.timer_container_class);
269      $timer.addClass(self.settings.timer_paused_class);
270    },
271
272    _reset_timer: function($slides_container, is_paused) {
273      var self = this,
274          $container = $slides_container.parent();
275      self._rebuild_timer($container, '0%');
276      if (typeof is_paused === 'boolean' && is_paused) {
277        var $timer = $container.find('.' + self.settings.timer_container_
277class);
278        $timer.addClass(self.settings.timer_paused_class);
279      }
280    },
281
282    _rebuild_timer: function ($container, width_pct) {
283      // Zepto is unable to stop animations since they
284      // are css-based. This is a workaround for that
285      // limitation, which rebuilds the dom element
286      // thus stopping the animation
287      var self = this,
288          $timer = $container.find('.' + self.settings.timer_container_class),
289          $new_timer = $(self._timer_html()),
290          $new_timer_progress = $new_timer.find('.' + self.settings.timer_progress_class);
291
292      if (typeof Zepto === 'function') {
293        $timer.remove();
294        $container.append($new_timer);
295        $new_timer_progress.css('width', width_pct);
296      } else if (typeof jQuery === 'function') {
297        var $progress = $timer.find('.' + self.settings.timer_progress_class);
298        $progress.css('width', width_pct);
299        $progress.stop();
300      }
301    },
302
303    _goto: function($slides_container, index_or_direction, callback) {
304      var self = this,
305          $container = $slides_container.parent(),
306          $slides = $slides_container.children(),
307          $active_slide = $slides_container.find('.' + self.settings.active_slide_class),
308          active_index = $active_slide.index(),
309          margin_position = Foundation.rtl ? 'marginRight' : 'marginLeft';
310
311      if ($container.hasClass(self.settings.orbit_transition_class)) {
312        return false;
313      }
314
315      if (index_or_direction === 'prev') {
316        if (active_index === 0) {
317          active_index = $slides.length - 1;
318        }
319        else {
320          active_index--;
321        }
322      }
323      else if (index_or_direction === 'next') {
324        active_index = (active_index+1) % $slides.length;
325      }
326      else if (typeof index_or_direction === 'number') {
327        active_index = (index_or_direction % $slides.length);
328      }
329      if (active_index === ($slides.length - 1) && index_or_direction === 'next') {
330        $slides_container.css(margin_position, '0%');
331        active_index = 1;
332      }
333      else if (active_index === 0 && index_or_direction === 'prev') {
334        $slides_container.css(margin_position, '-' + ($slides.length - 1) * 100 + '%');
335        active_index = $slides.length - 2;
336      }
337      // Start transition, make next slide active
338      $container.addClass(self.settings.orbit_transition_class);
339      $active_slide.removeClass(self.settings.active_slide_class);
340      $($slides[active_index]).addClass(self.settings.active_slide_class);
341      // Make next bullet active
342      var $bullets = $container.siblings('.' + self.settings.bullets_container_class);
343      if ($bullets.length === 1) {
344        $bullets.children().removeClass(self.settings.bullets_active_class);
345        $($bullets.children()[active_index-1]).addClass(self.settings.bullets_active_class);
346      }
347      var new_margin_left = '-' + (active_index * 100) + '%';
348      // Check to see if animation will occur, otherwise perform
349      // callbacks manually
350      $slides_container.trigger('orbit:before-slide-change');
351      if ($slides_container.css(margin_position) === new_margin_left) {
352        $container.removeClass(self.settings.orbit_transition_class);
353        $slides_container.trigger('orbit:after-slide-change', [{slide_number: active_index, total_slides: $slides_container.children().length - 2}]);
354        callback();
355      } else {
356        var properties = {};
357        properties[margin_position] = new_margin_left;
358
359        $slides_container.animate(properties, self.settings.animation_speed, 'linear', function() {
360          $container.removeClass(self.settings.orbit_transition_class);
361          $slides_container.trigger('orbit:after-slide-change', [{slide_number: active_index, total_slides: $slides_container.children().length - 2}]);
362          callback();
363        });
364      }
365    }
366  };
367}(Foundation.zj, this, this.document));

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.