carousel.js 25.3 KB
Newer Older
XhmikosR's avatar
Dist    
XhmikosR committed
1
/*!
2
  * Bootstrap carousel.js v5.0.0-alpha1 (https://getbootstrap.com/)
XhmikosR's avatar
XhmikosR committed
3
  * Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
XhmikosR's avatar
XhmikosR committed
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
XhmikosR's avatar
Dist    
XhmikosR committed
5
  */
Mark Otto's avatar
dist    
Mark Otto committed
6
(function (global, factory) {
XhmikosR's avatar
XhmikosR committed
7
8
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/data.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./dom/selector-engine.js')) :
  typeof define === 'function' && define.amd ? define(['./dom/data.js', './dom/event-handler.js', './dom/manipulator.js', './dom/selector-engine.js'], factory) :
XhmikosR's avatar
XhmikosR committed
9
  (global = global || self, global.Carousel = factory(global.Data, global.EventHandler, global.Manipulator, global.SelectorEngine));
XhmikosR's avatar
XhmikosR committed
10
}(this, (function (Data, EventHandler, Manipulator, SelectorEngine) { 'use strict';
Mark Otto's avatar
dist    
Mark Otto committed
11

XhmikosR's avatar
XhmikosR committed
12
13
14
15
  Data = Data && Object.prototype.hasOwnProperty.call(Data, 'default') ? Data['default'] : Data;
  EventHandler = EventHandler && Object.prototype.hasOwnProperty.call(EventHandler, 'default') ? EventHandler['default'] : EventHandler;
  Manipulator = Manipulator && Object.prototype.hasOwnProperty.call(Manipulator, 'default') ? Manipulator['default'] : Manipulator;
  SelectorEngine = SelectorEngine && Object.prototype.hasOwnProperty.call(SelectorEngine, 'default') ? SelectorEngine['default'] : SelectorEngine;
Mark Otto's avatar
dist    
Mark Otto committed
16

XhmikosR's avatar
XhmikosR committed
17
18
  /**
   * --------------------------------------------------------------------------
19
   * Bootstrap (v5.0.0-alpha1): util/index.js
XhmikosR's avatar
XhmikosR committed
20
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
XhmikosR's avatar
XhmikosR committed
21
22
23
   * --------------------------------------------------------------------------
   */
  var MILLISECONDS_MULTIPLIER = 1000;
XhmikosR's avatar
XhmikosR committed
24
  var TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
XhmikosR's avatar
XhmikosR committed
25
26

  var toType = function toType(obj) {
XhmikosR's avatar
XhmikosR committed
27
28
29
30
    if (obj === null || obj === undefined) {
      return "" + obj;
    }

XhmikosR's avatar
XhmikosR committed
31
32
33
    return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
  };

XhmikosR's avatar
XhmikosR committed
34
  var getSelector = function getSelector(element) {
XhmikosR's avatar
XhmikosR committed
35
36
37
38
    var selector = element.getAttribute('data-target');

    if (!selector || selector === '#') {
      var hrefAttr = element.getAttribute('href');
XhmikosR's avatar
XhmikosR committed
39
      selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
XhmikosR's avatar
XhmikosR committed
40
41
    }

XhmikosR's avatar
XhmikosR committed
42
43
44
45
46
47
    return selector;
  };

  var getElementFromSelector = function getElementFromSelector(element) {
    var selector = getSelector(element);
    return selector ? document.querySelector(selector) : null;
XhmikosR's avatar
XhmikosR committed
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
  };

  var getTransitionDurationFromElement = function getTransitionDurationFromElement(element) {
    if (!element) {
      return 0;
    } // Get transition-duration of the element


    var _window$getComputedSt = window.getComputedStyle(element),
        transitionDuration = _window$getComputedSt.transitionDuration,
        transitionDelay = _window$getComputedSt.transitionDelay;

    var floatTransitionDuration = parseFloat(transitionDuration);
    var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found

    if (!floatTransitionDuration && !floatTransitionDelay) {
      return 0;
    } // If multiple durations are defined, take the first


    transitionDuration = transitionDuration.split(',')[0];
    transitionDelay = transitionDelay.split(',')[0];
    return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
  };

  var triggerTransitionEnd = function triggerTransitionEnd(element) {
XhmikosR's avatar
XhmikosR committed
74
    element.dispatchEvent(new Event(TRANSITION_END));
XhmikosR's avatar
XhmikosR committed
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
  };

  var isElement = function isElement(obj) {
    return (obj[0] || obj).nodeType;
  };

  var emulateTransitionEnd = function emulateTransitionEnd(element, duration) {
    var called = false;
    var durationPadding = 5;
    var emulatedDuration = duration + durationPadding;

    function listener() {
      called = true;
      element.removeEventListener(TRANSITION_END, listener);
    }

    element.addEventListener(TRANSITION_END, listener);
    setTimeout(function () {
      if (!called) {
        triggerTransitionEnd(element);
      }
    }, emulatedDuration);
  };

  var typeCheckConfig = function typeCheckConfig(componentName, config, configTypes) {
    Object.keys(configTypes).forEach(function (property) {
      var expectedTypes = configTypes[property];
      var value = config[property];
      var valueType = value && isElement(value) ? 'element' : toType(value);

      if (!new RegExp(expectedTypes).test(valueType)) {
        throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\"."));
      }
    });
  };

  var isVisible = function isVisible(element) {
    if (!element) {
      return false;
    }

    if (element.style && element.parentNode && element.parentNode.style) {
XhmikosR's avatar
XhmikosR committed
117
118
119
      var elementStyle = getComputedStyle(element);
      var parentNodeStyle = getComputedStyle(element.parentNode);
      return elementStyle.display !== 'none' && parentNodeStyle.display !== 'none' && elementStyle.visibility !== 'hidden';
XhmikosR's avatar
XhmikosR committed
120
121
122
123
124
125
126
127
128
    }

    return false;
  };

  var reflow = function reflow(element) {
    return element.offsetHeight;
  };

XhmikosR's avatar
XhmikosR committed
129
130
131
132
133
134
135
136
137
138
139
  var getjQuery = function getjQuery() {
    var _window = window,
        jQuery = _window.jQuery;

    if (jQuery && !document.body.hasAttribute('data-no-jquery')) {
      return jQuery;
    }

    return null;
  };

Mark Otto's avatar
Mark Otto committed
140
141
142
143
144
145
146
147
148
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }

  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }

  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

  function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

  function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
fat's avatar
fat committed
149
  /**
XhmikosR's avatar
Dist    
XhmikosR committed
150
151
152
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
fat's avatar
fat committed
153
   */
Mark Otto's avatar
dist    
Mark Otto committed
154

XhmikosR's avatar
Dist    
XhmikosR committed
155
  var NAME = 'carousel';
156
  var VERSION = '5.0.0-alpha1';
XhmikosR's avatar
Dist    
XhmikosR committed
157
158
159
  var DATA_KEY = 'bs.carousel';
  var EVENT_KEY = "." + DATA_KEY;
  var DATA_API_KEY = '.data-api';
XhmikosR's avatar
XhmikosR committed
160
161
  var ARROW_LEFT_KEY = 'ArrowLeft';
  var ARROW_RIGHT_KEY = 'ArrowRight';
XhmikosR's avatar
Dist    
XhmikosR committed
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
  var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch

  var SWIPE_THRESHOLD = 40;
  var Default = {
    interval: 5000,
    keyboard: true,
    slide: false,
    pause: 'hover',
    wrap: true,
    touch: true
  };
  var DefaultType = {
    interval: '(number|boolean)',
    keyboard: 'boolean',
    slide: '(boolean|string)',
    pause: '(string|boolean)',
    wrap: 'boolean',
    touch: 'boolean'
  };
XhmikosR's avatar
XhmikosR committed
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
  var DIRECTION_NEXT = 'next';
  var DIRECTION_PREV = 'prev';
  var DIRECTION_LEFT = 'left';
  var DIRECTION_RIGHT = 'right';
  var EVENT_SLIDE = "slide" + EVENT_KEY;
  var EVENT_SLID = "slid" + EVENT_KEY;
  var EVENT_KEYDOWN = "keydown" + EVENT_KEY;
  var EVENT_MOUSEENTER = "mouseenter" + EVENT_KEY;
  var EVENT_MOUSELEAVE = "mouseleave" + EVENT_KEY;
  var EVENT_TOUCHSTART = "touchstart" + EVENT_KEY;
  var EVENT_TOUCHMOVE = "touchmove" + EVENT_KEY;
  var EVENT_TOUCHEND = "touchend" + EVENT_KEY;
  var EVENT_POINTERDOWN = "pointerdown" + EVENT_KEY;
  var EVENT_POINTERUP = "pointerup" + EVENT_KEY;
  var EVENT_DRAG_START = "dragstart" + EVENT_KEY;
  var EVENT_LOAD_DATA_API = "load" + EVENT_KEY + DATA_API_KEY;
  var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY;
  var CLASS_NAME_CAROUSEL = 'carousel';
  var CLASS_NAME_ACTIVE = 'active';
  var CLASS_NAME_SLIDE = 'slide';
  var CLASS_NAME_RIGHT = 'carousel-item-right';
  var CLASS_NAME_LEFT = 'carousel-item-left';
  var CLASS_NAME_NEXT = 'carousel-item-next';
  var CLASS_NAME_PREV = 'carousel-item-prev';
  var CLASS_NAME_POINTER_EVENT = 'pointer-event';
  var SELECTOR_ACTIVE = '.active';
  var SELECTOR_ACTIVE_ITEM = '.active.carousel-item';
  var SELECTOR_ITEM = '.carousel-item';
  var SELECTOR_ITEM_IMG = '.carousel-item img';
  var SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev';
  var SELECTOR_INDICATORS = '.carousel-indicators';
  var SELECTOR_DATA_SLIDE = '[data-slide], [data-slide-to]';
  var SELECTOR_DATA_RIDE = '[data-ride="carousel"]';
XhmikosR's avatar
Dist    
XhmikosR committed
214
215
216
217
  var PointerType = {
    TOUCH: 'touch',
    PEN: 'pen'
  };
XhmikosR's avatar
XhmikosR committed
218
219
220
221
222
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */
XhmikosR's avatar
Dist    
XhmikosR committed
223

XhmikosR's avatar
XhmikosR committed
224
  var Carousel = /*#__PURE__*/function () {
XhmikosR's avatar
Dist    
XhmikosR committed
225
226
227
228
229
230
231
232
233
234
235
    function Carousel(element, config) {
      this._items = null;
      this._interval = null;
      this._activeElement = null;
      this._isPaused = false;
      this._isSliding = false;
      this.touchTimeout = null;
      this.touchStartX = 0;
      this.touchDeltaX = 0;
      this._config = this._getConfig(config);
      this._element = element;
XhmikosR's avatar
XhmikosR committed
236
      this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);
XhmikosR's avatar
Dist    
XhmikosR committed
237
      this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;
XhmikosR's avatar
XhmikosR committed
238
      this._pointerEvent = Boolean(window.PointerEvent);
XhmikosR's avatar
Dist    
XhmikosR committed
239
240

      this._addEventListeners();
XhmikosR's avatar
XhmikosR committed
241
242

      Data.setData(element, DATA_KEY, this);
XhmikosR's avatar
Dist    
XhmikosR committed
243
244
245
246
247
248
249
250
    } // Getters


    var _proto = Carousel.prototype;

    // Public
    _proto.next = function next() {
      if (!this._isSliding) {
XhmikosR's avatar
XhmikosR committed
251
        this._slide(DIRECTION_NEXT);
XhmikosR's avatar
Dist    
XhmikosR committed
252
      }
Mark Otto's avatar
dist    
Mark Otto committed
253
    };
XhmikosR's avatar
Dist    
XhmikosR committed
254
255
256
257

    _proto.nextWhenVisible = function nextWhenVisible() {
      // Don't call next when the page isn't visible
      // or the carousel or its parent isn't visible
XhmikosR's avatar
XhmikosR committed
258
      if (!document.hidden && isVisible(this._element)) {
XhmikosR's avatar
Dist    
XhmikosR committed
259
260
        this.next();
      }
Mark Otto's avatar
dist    
Mark Otto committed
261
    };
XhmikosR's avatar
Dist    
XhmikosR committed
262
263
264

    _proto.prev = function prev() {
      if (!this._isSliding) {
XhmikosR's avatar
XhmikosR committed
265
        this._slide(DIRECTION_PREV);
XhmikosR's avatar
Dist    
XhmikosR committed
266
      }
Mark Otto's avatar
dist    
Mark Otto committed
267
    };
fat's avatar
fat committed
268

XhmikosR's avatar
Dist    
XhmikosR committed
269
270
271
272
273
    _proto.pause = function pause(event) {
      if (!event) {
        this._isPaused = true;
      }

XhmikosR's avatar
XhmikosR committed
274
      if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) {
XhmikosR's avatar
XhmikosR committed
275
        triggerTransitionEnd(this._element);
XhmikosR's avatar
Dist    
XhmikosR committed
276
277
278
279
280
        this.cycle(true);
      }

      clearInterval(this._interval);
      this._interval = null;
Mark Otto's avatar
dist    
Mark Otto committed
281
    };
fat's avatar
fat committed
282

XhmikosR's avatar
Dist    
XhmikosR committed
283
284
    _proto.cycle = function cycle(event) {
      if (!event) {
Mark Otto's avatar
dist    
Mark Otto committed
285
        this._isPaused = false;
XhmikosR's avatar
Dist    
XhmikosR committed
286
      }
fat's avatar
fat committed
287

XhmikosR's avatar
Dist    
XhmikosR committed
288
289
290
291
      if (this._interval) {
        clearInterval(this._interval);
        this._interval = null;
      }
fat's avatar
fat committed
292

XhmikosR's avatar
XhmikosR committed
293
      if (this._config && this._config.interval && !this._isPaused) {
XhmikosR's avatar
Dist    
XhmikosR committed
294
295
296
        this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);
      }
    };
Mark Otto's avatar
grunt    
Mark Otto committed
297

XhmikosR's avatar
Dist    
XhmikosR committed
298
299
    _proto.to = function to(index) {
      var _this = this;
Mark Otto's avatar
dist    
Mark Otto committed
300

XhmikosR's avatar
XhmikosR committed
301
      this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
Mark Otto's avatar
dist    
Mark Otto committed
302

XhmikosR's avatar
Dist    
XhmikosR committed
303
      var activeIndex = this._getItemIndex(this._activeElement);
fat's avatar
fat committed
304

XhmikosR's avatar
Dist    
XhmikosR committed
305
306
307
      if (index > this._items.length - 1 || index < 0) {
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
308

XhmikosR's avatar
Dist    
XhmikosR committed
309
      if (this._isSliding) {
XhmikosR's avatar
XhmikosR committed
310
        EventHandler.one(this._element, EVENT_SLID, function () {
XhmikosR's avatar
Dist    
XhmikosR committed
311
312
313
314
          return _this.to(index);
        });
        return;
      }
Mark Otto's avatar
grunt    
Mark Otto committed
315

XhmikosR's avatar
Dist    
XhmikosR committed
316
317
318
319
320
      if (activeIndex === index) {
        this.pause();
        this.cycle();
        return;
      }
fat's avatar
fat committed
321

XhmikosR's avatar
XhmikosR committed
322
      var direction = index > activeIndex ? DIRECTION_NEXT : DIRECTION_PREV;
fat's avatar
fat committed
323

XhmikosR's avatar
Dist    
XhmikosR committed
324
325
      this._slide(direction, this._items[index]);
    };
Mark Otto's avatar
dist    
Mark Otto committed
326

XhmikosR's avatar
Dist    
XhmikosR committed
327
    _proto.dispose = function dispose() {
XhmikosR's avatar
XhmikosR committed
328
329
      EventHandler.off(this._element, EVENT_KEY);
      Data.removeData(this._element, DATA_KEY);
XhmikosR's avatar
Dist    
XhmikosR committed
330
331
332
333
334
335
336
337
      this._items = null;
      this._config = null;
      this._element = null;
      this._interval = null;
      this._isPaused = null;
      this._isSliding = null;
      this._activeElement = null;
      this._indicatorsElement = null;
Mark Otto's avatar
Mark Otto committed
338
339
    } // Private
    ;
XhmikosR's avatar
Dist    
XhmikosR committed
340
341

    _proto._getConfig = function _getConfig(config) {
Mark Otto's avatar
Mark Otto committed
342
      config = _objectSpread(_objectSpread({}, Default), config);
XhmikosR's avatar
XhmikosR committed
343
      typeCheckConfig(NAME, config, DefaultType);
XhmikosR's avatar
Dist    
XhmikosR committed
344
345
      return config;
    };
Mark Otto's avatar
dist    
Mark Otto committed
346

XhmikosR's avatar
Dist    
XhmikosR committed
347
348
    _proto._handleSwipe = function _handleSwipe() {
      var absDeltax = Math.abs(this.touchDeltaX);
Mark Otto's avatar
dist    
Mark Otto committed
349

XhmikosR's avatar
Dist    
XhmikosR committed
350
351
352
      if (absDeltax <= SWIPE_THRESHOLD) {
        return;
      }
fat's avatar
fat committed
353

XhmikosR's avatar
XhmikosR committed
354
355
      var direction = absDeltax / this.touchDeltaX;
      this.touchDeltaX = 0; // swipe left
fat's avatar
fat committed
356

XhmikosR's avatar
Dist    
XhmikosR committed
357
358
359
      if (direction > 0) {
        this.prev();
      } // swipe right
fat's avatar
fat committed
360
361


XhmikosR's avatar
Dist    
XhmikosR committed
362
363
364
365
      if (direction < 0) {
        this.next();
      }
    };
fat's avatar
fat committed
366

XhmikosR's avatar
Dist    
XhmikosR committed
367
368
    _proto._addEventListeners = function _addEventListeners() {
      var _this2 = this;
fat's avatar
fat committed
369

XhmikosR's avatar
Dist    
XhmikosR committed
370
      if (this._config.keyboard) {
XhmikosR's avatar
XhmikosR committed
371
        EventHandler.on(this._element, EVENT_KEYDOWN, function (event) {
XhmikosR's avatar
Dist    
XhmikosR committed
372
373
374
          return _this2._keydown(event);
        });
      }
Mark Otto's avatar
grunt    
Mark Otto committed
375

XhmikosR's avatar
Dist    
XhmikosR committed
376
      if (this._config.pause === 'hover') {
XhmikosR's avatar
XhmikosR committed
377
        EventHandler.on(this._element, EVENT_MOUSEENTER, function (event) {
XhmikosR's avatar
Dist    
XhmikosR committed
378
          return _this2.pause(event);
XhmikosR's avatar
XhmikosR committed
379
        });
XhmikosR's avatar
XhmikosR committed
380
        EventHandler.on(this._element, EVENT_MOUSELEAVE, function (event) {
XhmikosR's avatar
Dist    
XhmikosR committed
381
382
383
          return _this2.cycle(event);
        });
      }
fat's avatar
fat committed
384

385
      if (this._config.touch && this._touchSupported) {
Mark Otto's avatar
Mark Otto committed
386
387
        this._addTouchEventListeners();
      }
XhmikosR's avatar
Dist    
XhmikosR committed
388
    };
Mark Otto's avatar
dist    
Mark Otto committed
389

XhmikosR's avatar
Dist    
XhmikosR committed
390
391
    _proto._addTouchEventListeners = function _addTouchEventListeners() {
      var _this3 = this;
Mark Otto's avatar
dist    
Mark Otto committed
392

XhmikosR's avatar
Dist    
XhmikosR committed
393
      var start = function start(event) {
XhmikosR's avatar
XhmikosR committed
394
395
        if (_this3._pointerEvent && PointerType[event.pointerType.toUpperCase()]) {
          _this3.touchStartX = event.clientX;
XhmikosR's avatar
Dist    
XhmikosR committed
396
        } else if (!_this3._pointerEvent) {
XhmikosR's avatar
XhmikosR committed
397
          _this3.touchStartX = event.touches[0].clientX;
Mark Otto's avatar
dist    
Mark Otto committed
398
        }
XhmikosR's avatar
Dist    
XhmikosR committed
399
      };
Mark Otto's avatar
dist    
Mark Otto committed
400

XhmikosR's avatar
Dist    
XhmikosR committed
401
402
      var move = function move(event) {
        // ensure swiping with one touch and not pinching
XhmikosR's avatar
XhmikosR committed
403
        if (event.touches && event.touches.length > 1) {
XhmikosR's avatar
Dist    
XhmikosR committed
404
405
          _this3.touchDeltaX = 0;
        } else {
XhmikosR's avatar
XhmikosR committed
406
          _this3.touchDeltaX = event.touches[0].clientX - _this3.touchStartX;
Mark Otto's avatar
dist    
Mark Otto committed
407
408
        }
      };
fat's avatar
fat committed
409

XhmikosR's avatar
Dist    
XhmikosR committed
410
      var end = function end(event) {
XhmikosR's avatar
XhmikosR committed
411
412
        if (_this3._pointerEvent && PointerType[event.pointerType.toUpperCase()]) {
          _this3.touchDeltaX = event.clientX - _this3.touchStartX;
Mark Otto's avatar
dist    
Mark Otto committed
413
        }
Mark Otto's avatar
dist    
Mark Otto committed
414

XhmikosR's avatar
Dist    
XhmikosR committed
415
416
417
418
419
420
421
422
423
424
425
        _this3._handleSwipe();

        if (_this3._config.pause === 'hover') {
          // If it's a touch-enabled device, mouseenter/leave are fired as
          // part of the mouse compatibility events on first tap - the carousel
          // would stop cycling until user tapped out of it;
          // here, we listen for touchend, explicitly pause the carousel
          // (as if it's the second time we tap on it, mouseenter compat event
          // is NOT fired) and after a timeout (to allow for mouse compatibility
          // events to fire) we explicitly restart cycling
          _this3.pause();
fat's avatar
fat committed
426

XhmikosR's avatar
Dist    
XhmikosR committed
427
428
429
          if (_this3.touchTimeout) {
            clearTimeout(_this3.touchTimeout);
          }
fat's avatar
fat committed
430

XhmikosR's avatar
Dist    
XhmikosR committed
431
432
433
          _this3.touchTimeout = setTimeout(function (event) {
            return _this3.cycle(event);
          }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval);
Mark Otto's avatar
dist    
Mark Otto committed
434
435
        }
      };
Mark Otto's avatar
grunt    
Mark Otto committed
436

XhmikosR's avatar
XhmikosR committed
437
438
      SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(function (itemImg) {
        EventHandler.on(itemImg, EVENT_DRAG_START, function (e) {
XhmikosR's avatar
XhmikosR committed
439
440
          return e.preventDefault();
        });
XhmikosR's avatar
Dist    
XhmikosR committed
441
      });
Mark Otto's avatar
grunt    
Mark Otto committed
442

XhmikosR's avatar
Dist    
XhmikosR committed
443
      if (this._pointerEvent) {
XhmikosR's avatar
XhmikosR committed
444
        EventHandler.on(this._element, EVENT_POINTERDOWN, function (event) {
XhmikosR's avatar
Dist    
XhmikosR committed
445
446
          return start(event);
        });
XhmikosR's avatar
XhmikosR committed
447
        EventHandler.on(this._element, EVENT_POINTERUP, function (event) {
XhmikosR's avatar
Dist    
XhmikosR committed
448
449
          return end(event);
        });
Mark Otto's avatar
dist    
Mark Otto committed
450

XhmikosR's avatar
XhmikosR committed
451
        this._element.classList.add(CLASS_NAME_POINTER_EVENT);
XhmikosR's avatar
Dist    
XhmikosR committed
452
      } else {
XhmikosR's avatar
XhmikosR committed
453
        EventHandler.on(this._element, EVENT_TOUCHSTART, function (event) {
XhmikosR's avatar
Dist    
XhmikosR committed
454
455
          return start(event);
        });
XhmikosR's avatar
XhmikosR committed
456
        EventHandler.on(this._element, EVENT_TOUCHMOVE, function (event) {
XhmikosR's avatar
Dist    
XhmikosR committed
457
458
          return move(event);
        });
XhmikosR's avatar
XhmikosR committed
459
        EventHandler.on(this._element, EVENT_TOUCHEND, function (event) {
XhmikosR's avatar
Dist    
XhmikosR committed
460
461
462
463
          return end(event);
        });
      }
    };
fat's avatar
fat committed
464

XhmikosR's avatar
Dist    
XhmikosR committed
465
466
467
468
    _proto._keydown = function _keydown(event) {
      if (/input|textarea/i.test(event.target.tagName)) {
        return;
      }
fat's avatar
fat committed
469

XhmikosR's avatar
XhmikosR committed
470
471
      switch (event.key) {
        case ARROW_LEFT_KEY:
XhmikosR's avatar
Dist    
XhmikosR committed
472
473
474
          event.preventDefault();
          this.prev();
          break;
fat's avatar
fat committed
475

XhmikosR's avatar
XhmikosR committed
476
        case ARROW_RIGHT_KEY:
XhmikosR's avatar
Dist    
XhmikosR committed
477
478
479
480
481
          event.preventDefault();
          this.next();
          break;
      }
    };
fat's avatar
fat committed
482

XhmikosR's avatar
Dist    
XhmikosR committed
483
    _proto._getItemIndex = function _getItemIndex(element) {
XhmikosR's avatar
XhmikosR committed
484
      this._items = element && element.parentNode ? SelectorEngine.find(SELECTOR_ITEM, element.parentNode) : [];
XhmikosR's avatar
Dist    
XhmikosR committed
485
486
      return this._items.indexOf(element);
    };
fat's avatar
fat committed
487

XhmikosR's avatar
Dist    
XhmikosR committed
488
    _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {
XhmikosR's avatar
XhmikosR committed
489
490
      var isNextDirection = direction === DIRECTION_NEXT;
      var isPrevDirection = direction === DIRECTION_PREV;
Mark Otto's avatar
dist    
Mark Otto committed
491

XhmikosR's avatar
Dist    
XhmikosR committed
492
      var activeIndex = this._getItemIndex(activeElement);
fat's avatar
fat committed
493

XhmikosR's avatar
Dist    
XhmikosR committed
494
495
      var lastItemIndex = this._items.length - 1;
      var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;
Mark Otto's avatar
dist    
Mark Otto committed
496

XhmikosR's avatar
Dist    
XhmikosR committed
497
498
499
      if (isGoingToWrap && !this._config.wrap) {
        return activeElement;
      }
fat's avatar
fat committed
500

XhmikosR's avatar
XhmikosR committed
501
      var delta = direction === DIRECTION_PREV ? -1 : 1;
XhmikosR's avatar
Dist    
XhmikosR committed
502
503
504
      var itemIndex = (activeIndex + delta) % this._items.length;
      return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
    };
fat's avatar
fat committed
505

XhmikosR's avatar
Dist    
XhmikosR committed
506
507
    _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {
      var targetIndex = this._getItemIndex(relatedTarget);
fat's avatar
fat committed
508

XhmikosR's avatar
XhmikosR committed
509
      var fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element));
fat's avatar
fat committed
510

XhmikosR's avatar
XhmikosR committed
511
      return EventHandler.trigger(this._element, EVENT_SLIDE, {
XhmikosR's avatar
Dist    
XhmikosR committed
512
513
514
515
516
517
        relatedTarget: relatedTarget,
        direction: eventDirectionName,
        from: fromIndex,
        to: targetIndex
      });
    };
fat's avatar
fat committed
518

XhmikosR's avatar
Dist    
XhmikosR committed
519
520
    _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {
      if (this._indicatorsElement) {
XhmikosR's avatar
XhmikosR committed
521
        var indicators = SelectorEngine.find(SELECTOR_ACTIVE, this._indicatorsElement);
XhmikosR's avatar
XhmikosR committed
522
523

        for (var i = 0; i < indicators.length; i++) {
XhmikosR's avatar
XhmikosR committed
524
          indicators[i].classList.remove(CLASS_NAME_ACTIVE);
XhmikosR's avatar
XhmikosR committed
525
        }
fat's avatar
fat committed
526

XhmikosR's avatar
Dist    
XhmikosR committed
527
        var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];
fat's avatar
fat committed
528

XhmikosR's avatar
Dist    
XhmikosR committed
529
        if (nextIndicator) {
XhmikosR's avatar
XhmikosR committed
530
          nextIndicator.classList.add(CLASS_NAME_ACTIVE);
Mark Otto's avatar
dist    
Mark Otto committed
531
        }
XhmikosR's avatar
Dist    
XhmikosR committed
532
533
      }
    };
fat's avatar
fat committed
534

XhmikosR's avatar
Dist    
XhmikosR committed
535
536
    _proto._slide = function _slide(direction, element) {
      var _this4 = this;
fat's avatar
fat committed
537

XhmikosR's avatar
XhmikosR committed
538
      var activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
fat's avatar
fat committed
539

XhmikosR's avatar
Dist    
XhmikosR committed
540
      var activeElementIndex = this._getItemIndex(activeElement);
fat's avatar
fat committed
541

XhmikosR's avatar
Dist    
XhmikosR committed
542
      var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);
fat's avatar
fat committed
543

XhmikosR's avatar
Dist    
XhmikosR committed
544
      var nextElementIndex = this._getItemIndex(nextElement);
fat's avatar
fat committed
545

XhmikosR's avatar
Dist    
XhmikosR committed
546
547
548
549
      var isCycling = Boolean(this._interval);
      var directionalClassName;
      var orderClassName;
      var eventDirectionName;
fat's avatar
fat committed
550

XhmikosR's avatar
XhmikosR committed
551
552
553
554
      if (direction === DIRECTION_NEXT) {
        directionalClassName = CLASS_NAME_LEFT;
        orderClassName = CLASS_NAME_NEXT;
        eventDirectionName = DIRECTION_LEFT;
XhmikosR's avatar
Dist    
XhmikosR committed
555
      } else {
XhmikosR's avatar
XhmikosR committed
556
557
558
        directionalClassName = CLASS_NAME_RIGHT;
        orderClassName = CLASS_NAME_PREV;
        eventDirectionName = DIRECTION_RIGHT;
XhmikosR's avatar
Dist    
XhmikosR committed
559
      }
Mark Otto's avatar
dist    
Mark Otto committed
560

XhmikosR's avatar
XhmikosR committed
561
      if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE)) {
XhmikosR's avatar
Dist    
XhmikosR committed
562
563
564
        this._isSliding = false;
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
565

XhmikosR's avatar
Dist    
XhmikosR committed
566
      var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);
Mark Otto's avatar
dist    
Mark Otto committed
567

XhmikosR's avatar
XhmikosR committed
568
      if (slideEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
569
570
        return;
      }
fat's avatar
fat committed
571

XhmikosR's avatar
Dist    
XhmikosR committed
572
573
574
575
      if (!activeElement || !nextElement) {
        // Some weirdness is happening, so we bail
        return;
      }
fat's avatar
fat committed
576

XhmikosR's avatar
Dist    
XhmikosR committed
577
      this._isSliding = true;
Mark Otto's avatar
Mark Otto committed
578

XhmikosR's avatar
Dist    
XhmikosR committed
579
580
581
      if (isCycling) {
        this.pause();
      }
fat's avatar
fat committed
582

XhmikosR's avatar
Dist    
XhmikosR committed
583
      this._setActiveIndicatorElement(nextElement);
Mark Otto's avatar
dist    
Mark Otto committed
584

XhmikosR's avatar
XhmikosR committed
585
      if (this._element.classList.contains(CLASS_NAME_SLIDE)) {
XhmikosR's avatar
XhmikosR committed
586
587
588
589
        nextElement.classList.add(orderClassName);
        reflow(nextElement);
        activeElement.classList.add(directionalClassName);
        nextElement.classList.add(directionalClassName);
XhmikosR's avatar
Dist    
XhmikosR committed
590
        var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10);
fat's avatar
fat committed
591

XhmikosR's avatar
Dist    
XhmikosR committed
592
593
594
595
596
597
        if (nextElementInterval) {
          this._config.defaultInterval = this._config.defaultInterval || this._config.interval;
          this._config.interval = nextElementInterval;
        } else {
          this._config.interval = this._config.defaultInterval || this._config.interval;
        }
Mark Otto's avatar
dist    
Mark Otto committed
598

XhmikosR's avatar
XhmikosR committed
599
600
        var transitionDuration = getTransitionDurationFromElement(activeElement);
        EventHandler.one(activeElement, TRANSITION_END, function () {
XhmikosR's avatar
XhmikosR committed
601
          nextElement.classList.remove(directionalClassName, orderClassName);
XhmikosR's avatar
XhmikosR committed
602
          nextElement.classList.add(CLASS_NAME_ACTIVE);
XhmikosR's avatar
XhmikosR committed
603
          activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName);
XhmikosR's avatar
Dist    
XhmikosR committed
604
605
          _this4._isSliding = false;
          setTimeout(function () {
XhmikosR's avatar
XhmikosR committed
606
            EventHandler.trigger(_this4._element, EVENT_SLID, {
XhmikosR's avatar
XhmikosR committed
607
608
609
610
611
              relatedTarget: nextElement,
              direction: eventDirectionName,
              from: activeElementIndex,
              to: nextElementIndex
            });
XhmikosR's avatar
Dist    
XhmikosR committed
612
          }, 0);
XhmikosR's avatar
XhmikosR committed
613
614
        });
        emulateTransitionEnd(activeElement, transitionDuration);
XhmikosR's avatar
Dist    
XhmikosR committed
615
      } else {
XhmikosR's avatar
XhmikosR committed
616
617
        activeElement.classList.remove(CLASS_NAME_ACTIVE);
        nextElement.classList.add(CLASS_NAME_ACTIVE);
XhmikosR's avatar
Dist    
XhmikosR committed
618
        this._isSliding = false;
XhmikosR's avatar
XhmikosR committed
619
        EventHandler.trigger(this._element, EVENT_SLID, {
XhmikosR's avatar
XhmikosR committed
620
621
622
623
624
          relatedTarget: nextElement,
          direction: eventDirectionName,
          from: activeElementIndex,
          to: nextElementIndex
        });
XhmikosR's avatar
Dist    
XhmikosR committed
625
      }
Mark Otto's avatar
dist    
Mark Otto committed
626

XhmikosR's avatar
Dist    
XhmikosR committed
627
628
629
      if (isCycling) {
        this.cycle();
      }
Mark Otto's avatar
Mark Otto committed
630
631
    } // Static
    ;
Mark Otto's avatar
grunt    
Mark Otto committed
632

XhmikosR's avatar
XhmikosR committed
633
    Carousel.carouselInterface = function carouselInterface(element, config) {
XhmikosR's avatar
XhmikosR committed
634
      var data = Data.getData(element, DATA_KEY);
Mark Otto's avatar
dist    
Mark Otto committed
635

Mark Otto's avatar
Mark Otto committed
636
      var _config = _objectSpread(_objectSpread({}, Default), Manipulator.getDataAttributes(element));
Mark Otto's avatar
dist    
Mark Otto committed
637

XhmikosR's avatar
XhmikosR committed
638
      if (typeof config === 'object') {
Mark Otto's avatar
Mark Otto committed
639
        _config = _objectSpread(_objectSpread({}, _config), config);
XhmikosR's avatar
XhmikosR committed
640
      }
Mark Otto's avatar
dist    
Mark Otto committed
641

XhmikosR's avatar
XhmikosR committed
642
      var action = typeof config === 'string' ? config : _config.slide;
Mark Otto's avatar
dist    
Mark Otto committed
643

XhmikosR's avatar
XhmikosR committed
644
645
646
647
648
649
650
651
      if (!data) {
        data = new Carousel(element, _config);
      }

      if (typeof config === 'number') {
        data.to(config);
      } else if (typeof action === 'string') {
        if (typeof data[action] === 'undefined') {
XhmikosR's avatar
Dist.    
XhmikosR committed
652
          throw new TypeError("No method named \"" + action + "\"");
Mark Otto's avatar
dist    
Mark Otto committed
653
        }
Mark Otto's avatar
dist    
Mark Otto committed
654

XhmikosR's avatar
XhmikosR committed
655
656
657
658
659
660
        data[action]();
      } else if (_config.interval && _config.ride) {
        data.pause();
        data.cycle();
      }
    };
Mark Otto's avatar
dist    
Mark Otto committed
661

XhmikosR's avatar
XhmikosR committed
662
    Carousel.jQueryInterface = function jQueryInterface(config) {
XhmikosR's avatar
XhmikosR committed
663
      return this.each(function () {
XhmikosR's avatar
XhmikosR committed
664
        Carousel.carouselInterface(this, config);
XhmikosR's avatar
Dist    
XhmikosR committed
665
666
      });
    };
Mark Otto's avatar
dist    
Mark Otto committed
667

XhmikosR's avatar
XhmikosR committed
668
669
    Carousel.dataApiClickHandler = function dataApiClickHandler(event) {
      var target = getElementFromSelector(this);
fat's avatar
fat committed
670

XhmikosR's avatar
XhmikosR committed
671
      if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {
XhmikosR's avatar
Dist    
XhmikosR committed
672
673
        return;
      }
fat's avatar
fat committed
674

Mark Otto's avatar
Mark Otto committed
675
      var config = _objectSpread(_objectSpread({}, Manipulator.getDataAttributes(target)), Manipulator.getDataAttributes(this));
fat's avatar
fat committed
676

XhmikosR's avatar
Dist    
XhmikosR committed
677
      var slideIndex = this.getAttribute('data-slide-to');
Mark Otto's avatar
dist    
Mark Otto committed
678

XhmikosR's avatar
Dist    
XhmikosR committed
679
680
      if (slideIndex) {
        config.interval = false;
Mark Otto's avatar
dist    
Mark Otto committed
681
      }
Mark Otto's avatar
dist    
Mark Otto committed
682

XhmikosR's avatar
XhmikosR committed
683
      Carousel.carouselInterface(target, config);
XhmikosR's avatar
Dist    
XhmikosR committed
684
685

      if (slideIndex) {
XhmikosR's avatar
XhmikosR committed
686
        Data.getData(target, DATA_KEY).to(slideIndex);
XhmikosR's avatar
Dist    
XhmikosR committed
687
      }
fat's avatar
fat committed
688

XhmikosR's avatar
Dist    
XhmikosR committed
689
      event.preventDefault();
Mark Otto's avatar
dist    
Mark Otto committed
690
    };
Mark Otto's avatar
dist    
Mark Otto committed
691

XhmikosR's avatar
XhmikosR committed
692
    Carousel.getInstance = function getInstance(element) {
XhmikosR's avatar
XhmikosR committed
693
694
695
      return Data.getData(element, DATA_KEY);
    };

XhmikosR's avatar
Dist    
XhmikosR committed
696
697
698
699
700
701
702
703
704
705
706
707
    _createClass(Carousel, null, [{
      key: "VERSION",
      get: function get() {
        return VERSION;
      }
    }, {
      key: "Default",
      get: function get() {
        return Default;
      }
    }]);

Mark Otto's avatar
dist    
Mark Otto committed
708
    return Carousel;
XhmikosR's avatar
Dist    
XhmikosR committed
709
710
711
712
713
714
715
716
  }();
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */


XhmikosR's avatar
XhmikosR committed
717
718
719
  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler);
  EventHandler.on(window, EVENT_LOAD_DATA_API, function () {
    var carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);
XhmikosR's avatar
Dist    
XhmikosR committed
720
721

    for (var i = 0, len = carousels.length; i < len; i++) {
XhmikosR's avatar
XhmikosR committed
722
      Carousel.carouselInterface(carousels[i], Data.getData(carousels[i], DATA_KEY));
XhmikosR's avatar
Dist    
XhmikosR committed
723
724
    }
  });
XhmikosR's avatar
XhmikosR committed
725
  var $ = getjQuery();
XhmikosR's avatar
Dist    
XhmikosR committed
726
727
728
729
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
XhmikosR's avatar
XhmikosR committed
730
   * add .carousel to jQuery only if jQuery is present
XhmikosR's avatar
Dist    
XhmikosR committed
731
732
   */

733
734
  /* istanbul ignore if */

XhmikosR's avatar
XhmikosR committed
735
736
737
738
  if ($) {
    var JQUERY_NO_CONFLICT = $.fn[NAME];
    $.fn[NAME] = Carousel.jQueryInterface;
    $.fn[NAME].Constructor = Carousel;
XhmikosR's avatar
Dist    
XhmikosR committed
739

XhmikosR's avatar
XhmikosR committed
740
741
742
    $.fn[NAME].noConflict = function () {
      $.fn[NAME] = JQUERY_NO_CONFLICT;
      return Carousel.jQueryInterface;
XhmikosR's avatar
XhmikosR committed
743
744
    };
  }
fat's avatar
fat committed
745
746

  return Carousel;
Mark Otto's avatar
dist    
Mark Otto committed
747

XhmikosR's avatar
XhmikosR committed
748
})));
Mark Otto's avatar
dist    
Mark Otto committed
749
//# sourceMappingURL=carousel.js.map