bootstrap.js 98.2 KB
Newer Older
XhmikosR's avatar
XhmikosR committed
1
/*!
2
 * Bootstrap v4.0.0-alpha.2 (http://getbootstrap.com)
Chris Rebert's avatar
grunt    
Chris Rebert committed
3
 * Copyright 2011-2016 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
XhmikosR's avatar
XhmikosR committed
4
5
6
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 */

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
7
8
9
10
11
12
if (typeof jQuery === 'undefined') {
  throw new Error('Bootstrap\'s JavaScript requires jQuery')
}

+function ($) {
  var version = $.fn.jquery.split(' ')[0].split('.')
XhmikosR's avatar
XhmikosR committed
13
14
  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] >= 4)) {
    throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
15
16
  }
}(jQuery);
XhmikosR's avatar
XhmikosR committed
17

Mark Otto's avatar
Mark Otto committed
18

19
+function ($) {
Mark Otto's avatar
Mark Otto committed
20
21

/**
22
 * --------------------------------------------------------------------------
23
 * Bootstrap (v4.0.0-alpha.2): util.js
24
25
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * --------------------------------------------------------------------------
Mark Otto's avatar
Mark Otto committed
26
27
 */

28
'use strict';
Mark Otto's avatar
Mark Otto committed
29

XhmikosR's avatar
XhmikosR committed
30
var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
Jacob Thornton's avatar
Jacob Thornton committed
31

32
var _createClass = (function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
Mark Otto's avatar
Mark Otto committed
33

Jacob Thornton's avatar
Jacob Thornton committed
34
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
Mark Otto's avatar
Mark Otto committed
35

36
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
Mark Otto's avatar
Mark Otto committed
37

38
var Util = (function ($) {
Mark Otto's avatar
Mark Otto committed
39

40
41
42
43
44
  /**
   * ------------------------------------------------------------------------
   * Private TransitionEnd Helpers
   * ------------------------------------------------------------------------
   */
Mark Otto's avatar
Mark Otto committed
45

46
  var transition = false;
Mark Otto's avatar
Mark Otto committed
47

Chris Rebert's avatar
grunt    
Chris Rebert committed
48
49
  var MAX_UID = 1000000;

50
51
52
53
54
55
  var TransitionEndEvent = {
    WebkitTransition: 'webkitTransitionEnd',
    MozTransition: 'transitionend',
    OTransition: 'oTransitionEnd otransitionend',
    transition: 'transitionend'
  };
Mark Otto's avatar
Mark Otto committed
56

57
58
59
  // shoutout AngusCroll (https://goo.gl/pxwQGp)
  function toType(obj) {
    return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
Mark Otto's avatar
Mark Otto committed
60
61
  }

62
63
64
  function isElement(obj) {
    return (obj[0] || obj).nodeType;
  }
Mark Otto's avatar
Mark Otto committed
65

66
67
68
69
70
71
  function getSpecialTransitionEndEvent() {
    return {
      bindType: transition.end,
      delegateType: transition.end,
      handle: function handle(event) {
        if ($(event.target).is(this)) {
72
          return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params
73
        }
Chris Rebert's avatar
grunt    
Chris Rebert committed
74
        return undefined;
75
76
77
      }
    };
  }
Mark Otto's avatar
Mark Otto committed
78

79
80
81
82
  function transitionEndTest() {
    if (window.QUnit) {
      return false;
    }
Mark Otto's avatar
Mark Otto committed
83

84
    var el = document.createElement('bootstrap');
Mark Otto's avatar
Mark Otto committed
85

Mark Otto's avatar
Mark Otto committed
86
87
88
    for (var _name in TransitionEndEvent) {
      if (el.style[_name] !== undefined) {
        return { end: TransitionEndEvent[_name] };
89
90
91
92
      }
    }

    return false;
Mark Otto's avatar
Mark Otto committed
93
94
  }

95
96
  function transitionEndEmulator(duration) {
    var _this = this;
Mark Otto's avatar
Mark Otto committed
97

98
    var called = false;
Mark Otto's avatar
Mark Otto committed
99

100
101
102
    $(this).one(Util.TRANSITION_END, function () {
      called = true;
    });
Mark Otto's avatar
Mark Otto committed
103

104
105
106
107
108
    setTimeout(function () {
      if (!called) {
        Util.triggerTransitionEnd(_this);
      }
    }, duration);
Mark Otto's avatar
Mark Otto committed
109

110
    return this;
Mark Otto's avatar
Mark Otto committed
111
112
  }

113
114
  function setTransitionEndSupport() {
    transition = transitionEndTest();
Mark Otto's avatar
Mark Otto committed
115

116
    $.fn.emulateTransitionEnd = transitionEndEmulator;
Mark Otto's avatar
Mark Otto committed
117

118
119
    if (Util.supportsTransitionEnd()) {
      $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
Mark Otto's avatar
Mark Otto committed
120
    }
121
  }
Mark Otto's avatar
Mark Otto committed
122

123
124
125
126
127
  /**
   * --------------------------------------------------------------------------
   * Public Util Api
   * --------------------------------------------------------------------------
   */
Mark Otto's avatar
Mark Otto committed
128

129
  var Util = {
Mark Otto's avatar
Mark Otto committed
130

131
    TRANSITION_END: 'bsTransitionEnd',
Mark Otto's avatar
Mark Otto committed
132

133
    getUID: function getUID(prefix) {
Mark Otto's avatar
Mark Otto committed
134
      do {
Chris Rebert's avatar
Chris Rebert committed
135
        /* eslint-disable no-bitwise */
Chris Rebert's avatar
grunt    
Chris Rebert committed
136
        prefix += ~ ~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here
Chris Rebert's avatar
Chris Rebert committed
137
        /* eslint-enable no-bitwise */
Mark Otto's avatar
Mark Otto committed
138
      } while (document.getElementById(prefix));
139
140
      return prefix;
    },
Mark Otto's avatar
Mark Otto committed
141

142
143
    getSelectorFromElement: function getSelectorFromElement(element) {
      var selector = element.getAttribute('data-target');
Mark Otto's avatar
Mark Otto committed
144

145
146
147
148
      if (!selector) {
        selector = element.getAttribute('href') || '';
        selector = /^#[a-z]/i.test(selector) ? selector : null;
      }
Mark Otto's avatar
Mark Otto committed
149

150
151
      return selector;
    },
Mark Otto's avatar
Mark Otto committed
152

153
154
155
    reflow: function reflow(element) {
      new Function('bs', 'return bs')(element.offsetHeight);
    },
Mark Otto's avatar
Mark Otto committed
156

157
158
159
    triggerTransitionEnd: function triggerTransitionEnd(element) {
      $(element).trigger(transition.end);
    },
Mark Otto's avatar
Mark Otto committed
160

161
    supportsTransitionEnd: function supportsTransitionEnd() {
Mark Otto's avatar
Mark Otto committed
162
      return Boolean(transition);
163
    },
Mark Otto's avatar
Mark Otto committed
164

165
166
    typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {
      for (var property in configTypes) {
Mark Otto's avatar
Mark Otto committed
167
168
169
170
        if (configTypes.hasOwnProperty(property)) {
          var expectedTypes = configTypes[property];
          var value = config[property];
          var valueType = undefined;
Mark Otto's avatar
Mark Otto committed
171

Mark Otto's avatar
Mark Otto committed
172
173
174
175
176
          if (value && isElement(value)) {
            valueType = 'element';
          } else {
            valueType = toType(value);
          }
Mark Otto's avatar
Mark Otto committed
177

Mark Otto's avatar
Mark Otto committed
178
179
180
          if (!new RegExp(expectedTypes).test(valueType)) {
            throw new Error(componentName.toUpperCase() + ': ' + ('Option "' + property + '" provided type "' + valueType + '" ') + ('but expected type "' + expectedTypes + '".'));
          }
181
182
183
184
        }
      }
    }
  };
Mark Otto's avatar
Mark Otto committed
185

186
  setTransitionEndSupport();
Mark Otto's avatar
Mark Otto committed
187

188
189
  return Util;
})(jQuery);
Mark Otto's avatar
Mark Otto committed
190
191

/**
192
 * --------------------------------------------------------------------------
193
 * Bootstrap (v4.0.0-alpha.2): alert.js
194
195
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * --------------------------------------------------------------------------
Mark Otto's avatar
Mark Otto committed
196
197
 */

198
var Alert = (function ($) {
Mark Otto's avatar
Mark Otto committed
199

200
201
202
203
204
  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */
Mark Otto's avatar
Mark Otto committed
205

206
  var NAME = 'alert';
XhmikosR's avatar
XhmikosR committed
207
  var VERSION = '4.0.0-alpha.2';
208
209
210
211
212
  var DATA_KEY = 'bs.alert';
  var EVENT_KEY = '.' + DATA_KEY;
  var DATA_API_KEY = '.data-api';
  var JQUERY_NO_CONFLICT = $.fn[NAME];
  var TRANSITION_DURATION = 150;
Mark Otto's avatar
Mark Otto committed
213

214
215
216
  var Selector = {
    DISMISS: '[data-dismiss="alert"]'
  };
Mark Otto's avatar
Mark Otto committed
217

218
219
220
  var Event = {
    CLOSE: 'close' + EVENT_KEY,
    CLOSED: 'closed' + EVENT_KEY,
Jacob Thornton's avatar
Jacob Thornton committed
221
    CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
222
  };
Mark Otto's avatar
Mark Otto committed
223

224
225
226
227
228
  var ClassName = {
    ALERT: 'alert',
    FADE: 'fade',
    IN: 'in'
  };
Mark Otto's avatar
Mark Otto committed
229

230
231
232
233
234
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */
Mark Otto's avatar
Mark Otto committed
235

236
237
238
  var Alert = (function () {
    function Alert(element) {
      _classCallCheck(this, Alert);
Mark Otto's avatar
Mark Otto committed
239

240
241
      this._element = element;
    }
Mark Otto's avatar
Mark Otto committed
242

Jacob Thornton's avatar
Jacob Thornton committed
243
244
245
246
247
248
249
250
    /**
     * ------------------------------------------------------------------------
     * Data Api implementation
     * ------------------------------------------------------------------------
     */

    // getters

251
252
    _createClass(Alert, [{
      key: 'close',
Mark Otto's avatar
Mark Otto committed
253

254
      // public
Mark Otto's avatar
Mark Otto committed
255

256
257
      value: function close(element) {
        element = element || this._element;
Mark Otto's avatar
Mark Otto committed
258

259
260
        var rootElement = this._getRootElement(element);
        var customEvent = this._triggerCloseEvent(rootElement);
Mark Otto's avatar
Mark Otto committed
261

262
263
264
        if (customEvent.isDefaultPrevented()) {
          return;
        }
Mark Otto's avatar
Mark Otto committed
265

266
267
268
269
270
271
272
273
        this._removeElement(rootElement);
      }
    }, {
      key: 'dispose',
      value: function dispose() {
        $.removeData(this._element, DATA_KEY);
        this._element = null;
      }
Mark Otto's avatar
Mark Otto committed
274

275
      // private
Mark Otto's avatar
Mark Otto committed
276

Jacob Thornton's avatar
Jacob Thornton committed
277
278
    }, {
      key: '_getRootElement',
279
280
      value: function _getRootElement(element) {
        var selector = Util.getSelectorFromElement(element);
Mark Otto's avatar
Mark Otto committed
281
        var parent = false;
Mark Otto's avatar
Mark Otto committed
282

283
284
285
        if (selector) {
          parent = $(selector)[0];
        }
Mark Otto's avatar
Mark Otto committed
286

287
288
289
        if (!parent) {
          parent = $(element).closest('.' + ClassName.ALERT)[0];
        }
Mark Otto's avatar
Mark Otto committed
290

291
292
293
294
295
296
        return parent;
      }
    }, {
      key: '_triggerCloseEvent',
      value: function _triggerCloseEvent(element) {
        var closeEvent = $.Event(Event.CLOSE);
Mark Otto's avatar
Mark Otto committed
297

298
299
300
301
302
303
304
305
306
307
308
309
        $(element).trigger(closeEvent);
        return closeEvent;
      }
    }, {
      key: '_removeElement',
      value: function _removeElement(element) {
        $(element).removeClass(ClassName.IN);

        if (!Util.supportsTransitionEnd() || !$(element).hasClass(ClassName.FADE)) {
          this._destroyElement(element);
          return;
        }
Mark Otto's avatar
Mark Otto committed
310

Mark Otto's avatar
grunt    
Mark Otto committed
311
        $(element).one(Util.TRANSITION_END, $.proxy(this._destroyElement, this, element)).emulateTransitionEnd(TRANSITION_DURATION);
312
313
314
315
316
317
      }
    }, {
      key: '_destroyElement',
      value: function _destroyElement(element) {
        $(element).detach().trigger(Event.CLOSED).remove();
      }
Mark Otto's avatar
Mark Otto committed
318

319
      // static
Mark Otto's avatar
Mark Otto committed
320

Jacob Thornton's avatar
Jacob Thornton committed
321
322
    }], [{
      key: '_jQueryInterface',
323
324
325
326
      value: function _jQueryInterface(config) {
        return this.each(function () {
          var $element = $(this);
          var data = $element.data(DATA_KEY);
Mark Otto's avatar
Mark Otto committed
327

328
329
330
331
          if (!data) {
            data = new Alert(this);
            $element.data(DATA_KEY, data);
          }
Mark Otto's avatar
Mark Otto committed
332

333
334
335
336
337
338
339
340
341
342
343
344
          if (config === 'close') {
            data[config](this);
          }
        });
      }
    }, {
      key: '_handleDismiss',
      value: function _handleDismiss(alertInstance) {
        return function (event) {
          if (event) {
            event.preventDefault();
          }
Mark Otto's avatar
Mark Otto committed
345

346
347
348
          alertInstance.close(this);
        };
      }
Mark Otto's avatar
grunt    
Mark Otto committed
349
350
    }, {
      key: 'VERSION',
Jacob Thornton's avatar
Jacob Thornton committed
351
      get: function get() {
Mark Otto's avatar
grunt    
Mark Otto committed
352
353
        return VERSION;
      }
354
    }]);
Mark Otto's avatar
Mark Otto committed
355

356
357
    return Alert;
  })();
Mark Otto's avatar
Mark Otto committed
358

359
  $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));
Mark Otto's avatar
Mark Otto committed
360

361
362
363
364
365
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
   */
Mark Otto's avatar
Mark Otto committed
366

367
368
369
370
371
372
  $.fn[NAME] = Alert._jQueryInterface;
  $.fn[NAME].Constructor = Alert;
  $.fn[NAME].noConflict = function () {
    $.fn[NAME] = JQUERY_NO_CONFLICT;
    return Alert._jQueryInterface;
  };
Mark Otto's avatar
Mark Otto committed
373

374
375
  return Alert;
})(jQuery);
Mark Otto's avatar
Mark Otto committed
376
377

/**
378
 * --------------------------------------------------------------------------
379
 * Bootstrap (v4.0.0-alpha.2): button.js
380
381
382
383
384
385
386
387
388
389
390
391
392
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * --------------------------------------------------------------------------
 */

var Button = (function ($) {

  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME = 'button';
XhmikosR's avatar
XhmikosR committed
393
  var VERSION = '4.0.0-alpha.2';
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
  var DATA_KEY = 'bs.button';
  var EVENT_KEY = '.' + DATA_KEY;
  var DATA_API_KEY = '.data-api';
  var JQUERY_NO_CONFLICT = $.fn[NAME];

  var ClassName = {
    ACTIVE: 'active',
    BUTTON: 'btn',
    FOCUS: 'focus'
  };

  var Selector = {
    DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
    DATA_TOGGLE: '[data-toggle="buttons"]',
    INPUT: 'input',
    ACTIVE: '.active',
    BUTTON: '.btn'
  };

  var Event = {
Jacob Thornton's avatar
Jacob Thornton committed
414
415
    CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,
    FOCUS_BLUR_DATA_API: 'focus' + EVENT_KEY + DATA_API_KEY + ' ' + ('blur' + EVENT_KEY + DATA_API_KEY)
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
  };

  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */

  var Button = (function () {
    function Button(element) {
      _classCallCheck(this, Button);

      this._element = element;
    }

Jacob Thornton's avatar
Jacob Thornton committed
431
432
433
434
435
436
437
438
    /**
     * ------------------------------------------------------------------------
     * Data Api implementation
     * ------------------------------------------------------------------------
     */

    // getters

439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
    _createClass(Button, [{
      key: 'toggle',

      // public

      value: function toggle() {
        var triggerChangeEvent = true;
        var rootElement = $(this._element).closest(Selector.DATA_TOGGLE)[0];

        if (rootElement) {
          var input = $(this._element).find(Selector.INPUT)[0];

          if (input) {
            if (input.type === 'radio') {
              if (input.checked && $(this._element).hasClass(ClassName.ACTIVE)) {
                triggerChangeEvent = false;
              } else {
                var activeElement = $(rootElement).find(Selector.ACTIVE)[0];

                if (activeElement) {
                  $(activeElement).removeClass(ClassName.ACTIVE);
                }
              }
            }

            if (triggerChangeEvent) {
              input.checked = !$(this._element).hasClass(ClassName.ACTIVE);
              $(this._element).trigger('change');
            }
Mark Otto's avatar
grunt    
Mark Otto committed
468

XhmikosR's avatar
XhmikosR committed
469
            input.focus();
470
471
472
473
          }
        } else {
          this._element.setAttribute('aria-pressed', !$(this._element).hasClass(ClassName.ACTIVE));
        }
Mark Otto's avatar
Mark Otto committed
474

475
476
477
478
479
480
481
482
483
484
        if (triggerChangeEvent) {
          $(this._element).toggleClass(ClassName.ACTIVE);
        }
      }
    }, {
      key: 'dispose',
      value: function dispose() {
        $.removeData(this._element, DATA_KEY);
        this._element = null;
      }
Mark Otto's avatar
Mark Otto committed
485

486
      // static
Mark Otto's avatar
Mark Otto committed
487

Jacob Thornton's avatar
Jacob Thornton committed
488
489
    }], [{
      key: '_jQueryInterface',
490
491
492
      value: function _jQueryInterface(config) {
        return this.each(function () {
          var data = $(this).data(DATA_KEY);
Mark Otto's avatar
Mark Otto committed
493

494
495
496
497
          if (!data) {
            data = new Button(this);
            $(this).data(DATA_KEY, data);
          }
Mark Otto's avatar
Mark Otto committed
498

499
500
501
502
503
          if (config === 'toggle') {
            data[config]();
          }
        });
      }
Mark Otto's avatar
grunt    
Mark Otto committed
504
505
    }, {
      key: 'VERSION',
Jacob Thornton's avatar
Jacob Thornton committed
506
      get: function get() {
Mark Otto's avatar
grunt    
Mark Otto committed
507
508
        return VERSION;
      }
509
    }]);
Mark Otto's avatar
Mark Otto committed
510

511
512
    return Button;
  })();
Mark Otto's avatar
Mark Otto committed
513

514
515
  $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
    event.preventDefault();
Mark Otto's avatar
Mark Otto committed
516

517
    var button = event.target;
Mark Otto's avatar
Mark Otto committed
518

519
520
521
    if (!$(button).hasClass(ClassName.BUTTON)) {
      button = $(button).closest(Selector.BUTTON);
    }
Mark Otto's avatar
Mark Otto committed
522

523
524
525
526
527
    Button._jQueryInterface.call($(button), 'toggle');
  }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
    var button = $(event.target).closest(Selector.BUTTON)[0];
    $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));
  });
Mark Otto's avatar
Mark Otto committed
528

529
530
531
532
533
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
   */
Mark Otto's avatar
Mark Otto committed
534

535
536
537
538
539
540
  $.fn[NAME] = Button._jQueryInterface;
  $.fn[NAME].Constructor = Button;
  $.fn[NAME].noConflict = function () {
    $.fn[NAME] = JQUERY_NO_CONFLICT;
    return Button._jQueryInterface;
  };
Mark Otto's avatar
Mark Otto committed
541

542
543
  return Button;
})(jQuery);
Mark Otto's avatar
Mark Otto committed
544
545

/**
546
 * --------------------------------------------------------------------------
547
 * Bootstrap (v4.0.0-alpha.2): carousel.js
548
549
550
551
552
553
554
555
556
557
558
559
560
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * --------------------------------------------------------------------------
 */

var Carousel = (function ($) {

  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME = 'carousel';
XhmikosR's avatar
XhmikosR committed
561
  var VERSION = '4.0.0-alpha.2';
562
563
564
565
566
  var DATA_KEY = 'bs.carousel';
  var EVENT_KEY = '.' + DATA_KEY;
  var DATA_API_KEY = '.data-api';
  var JQUERY_NO_CONFLICT = $.fn[NAME];
  var TRANSITION_DURATION = 600;
Chris Rebert's avatar
grunt    
Chris Rebert committed
567
568
  var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key
  var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596

  var Default = {
    interval: 5000,
    keyboard: true,
    slide: false,
    pause: 'hover',
    wrap: true
  };

  var DefaultType = {
    interval: '(number|boolean)',
    keyboard: 'boolean',
    slide: '(boolean|string)',
    pause: '(string|boolean)',
    wrap: 'boolean'
  };

  var Direction = {
    NEXT: 'next',
    PREVIOUS: 'prev'
  };

  var Event = {
    SLIDE: 'slide' + EVENT_KEY,
    SLID: 'slid' + EVENT_KEY,
    KEYDOWN: 'keydown' + EVENT_KEY,
    MOUSEENTER: 'mouseenter' + EVENT_KEY,
    MOUSELEAVE: 'mouseleave' + EVENT_KEY,
Jacob Thornton's avatar
Jacob Thornton committed
597
598
    LOAD_DATA_API: 'load' + EVENT_KEY + DATA_API_KEY,
    CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
  };

  var ClassName = {
    CAROUSEL: 'carousel',
    ACTIVE: 'active',
    SLIDE: 'slide',
    RIGHT: 'right',
    LEFT: 'left',
    ITEM: 'carousel-item'
  };

  var Selector = {
    ACTIVE: '.active',
    ACTIVE_ITEM: '.active.carousel-item',
    ITEM: '.carousel-item',
    NEXT_PREV: '.next, .prev',
    INDICATORS: '.carousel-indicators',
    DATA_SLIDE: '[data-slide], [data-slide-to]',
    DATA_RIDE: '[data-ride="carousel"]'
  };

  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */

  var Carousel = (function () {
    function Carousel(element, config) {
      _classCallCheck(this, Carousel);

      this._items = null;
      this._interval = null;
      this._activeElement = null;

      this._isPaused = false;
      this._isSliding = false;

      this._config = this._getConfig(config);
      this._element = $(element)[0];
      this._indicatorsElement = $(this._element).find(Selector.INDICATORS)[0];

      this._addEventListeners();
    }

Jacob Thornton's avatar
Jacob Thornton committed
644
645
646
647
648
649
650
651
    /**
     * ------------------------------------------------------------------------
     * Data Api implementation
     * ------------------------------------------------------------------------
     */

    // getters

652
653
654
655
656
657
658
659
660
661
    _createClass(Carousel, [{
      key: 'next',

      // public

      value: function next() {
        if (!this._isSliding) {
          this._slide(Direction.NEXT);
        }
      }
XhmikosR's avatar
XhmikosR committed
662
663
664
665
666
667
668
669
    }, {
      key: 'nextWhenVisible',
      value: function nextWhenVisible() {
        // Don't call next when the page isn't visible
        if (!document.hidden) {
          this.next();
        }
      }
670
671
672
673
674
675
676
677
678
679
680
681
682
    }, {
      key: 'prev',
      value: function prev() {
        if (!this._isSliding) {
          this._slide(Direction.PREVIOUS);
        }
      }
    }, {
      key: 'pause',
      value: function pause(event) {
        if (!event) {
          this._isPaused = true;
        }
Mark Otto's avatar
Mark Otto committed
683

684
685
686
687
        if ($(this._element).find(Selector.NEXT_PREV)[0] && Util.supportsTransitionEnd()) {
          Util.triggerTransitionEnd(this._element);
          this.cycle(true);
        }
Mark Otto's avatar
Mark Otto committed
688

689
690
691
692
693
694
695
696
697
        clearInterval(this._interval);
        this._interval = null;
      }
    }, {
      key: 'cycle',
      value: function cycle(event) {
        if (!event) {
          this._isPaused = false;
        }
Mark Otto's avatar
Mark Otto committed
698

699
700
701
702
        if (this._interval) {
          clearInterval(this._interval);
          this._interval = null;
        }
Mark Otto's avatar
Mark Otto committed
703

704
        if (this._config.interval && !this._isPaused) {
XhmikosR's avatar
XhmikosR committed
705
          this._interval = setInterval($.proxy(document.visibilityState ? this.nextWhenVisible : this.next, this), this._config.interval);
706
707
708
709
710
711
        }
      }
    }, {
      key: 'to',
      value: function to(index) {
        var _this2 = this;
Mark Otto's avatar
Mark Otto committed
712

713
        this._activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0];
Mark Otto's avatar
Mark Otto committed
714

715
        var activeIndex = this._getItemIndex(this._activeElement);
Mark Otto's avatar
Mark Otto committed
716

717
718
719
        if (index > this._items.length - 1 || index < 0) {
          return;
        }
Mark Otto's avatar
Mark Otto committed
720

721
722
723
724
725
726
        if (this._isSliding) {
          $(this._element).one(Event.SLID, function () {
            return _this2.to(index);
          });
          return;
        }
Mark Otto's avatar
Mark Otto committed
727

Mark Otto's avatar
Mark Otto committed
728
        if (activeIndex === index) {
729
730
731
732
          this.pause();
          this.cycle();
          return;
        }
Mark Otto's avatar
Mark Otto committed
733

734
        var direction = index > activeIndex ? Direction.NEXT : Direction.PREVIOUS;
Mark Otto's avatar
Mark Otto committed
735

736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
        this._slide(direction, this._items[index]);
      }
    }, {
      key: 'dispose',
      value: function dispose() {
        $(this._element).off(EVENT_KEY);
        $.removeData(this._element, DATA_KEY);

        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
753

754
      // private
Mark Otto's avatar
Mark Otto committed
755

Jacob Thornton's avatar
Jacob Thornton committed
756
757
    }, {
      key: '_getConfig',
758
759
760
761
762
763
764
765
766
767
768
      value: function _getConfig(config) {
        config = $.extend({}, Default, config);
        Util.typeCheckConfig(NAME, config, DefaultType);
        return config;
      }
    }, {
      key: '_addEventListeners',
      value: function _addEventListeners() {
        if (this._config.keyboard) {
          $(this._element).on(Event.KEYDOWN, $.proxy(this._keydown, this));
        }
Mark Otto's avatar
Mark Otto committed
769

Mark Otto's avatar
Mark Otto committed
770
        if (this._config.pause === 'hover' && !('ontouchstart' in document.documentElement)) {
771
772
773
774
775
776
777
778
          $(this._element).on(Event.MOUSEENTER, $.proxy(this.pause, this)).on(Event.MOUSELEAVE, $.proxy(this.cycle, this));
        }
      }
    }, {
      key: '_keydown',
      value: function _keydown(event) {
        event.preventDefault();

Mark Otto's avatar
Mark Otto committed
779
780
781
        if (/input|textarea/i.test(event.target.tagName)) {
          return;
        }
782
783

        switch (event.which) {
Chris Rebert's avatar
grunt    
Chris Rebert committed
784
785
786
787
788
789
          case ARROW_LEFT_KEYCODE:
            this.prev();
            break;
          case ARROW_RIGHT_KEYCODE:
            this.next();
            break;
790
791
          default:
            return;
Mark Otto's avatar
Mark Otto committed
792
793
        }
      }
794
795
796
797
798
799
800
801
802
803
804
805
806
    }, {
      key: '_getItemIndex',
      value: function _getItemIndex(element) {
        this._items = $.makeArray($(element).parent().find(Selector.ITEM));
        return this._items.indexOf(element);
      }
    }, {
      key: '_getItemByDirection',
      value: function _getItemByDirection(direction, activeElement) {
        var isNextDirection = direction === Direction.NEXT;
        var isPrevDirection = direction === Direction.PREVIOUS;
        var activeIndex = this._getItemIndex(activeElement);
        var lastItemIndex = this._items.length - 1;
Mark Otto's avatar
Mark Otto committed
807
        var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;
808
809
810
811
812

        if (isGoingToWrap && !this._config.wrap) {
          return activeElement;
        }

Mark Otto's avatar
Mark Otto committed
813
        var delta = direction === Direction.PREVIOUS ? -1 : 1;
814
        var itemIndex = (activeIndex + delta) % this._items.length;
Mark Otto's avatar
Mark Otto committed
815

816
        return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
Mark Otto's avatar
Mark Otto committed
817
      }
818
819
820
821
822
823
824
    }, {
      key: '_triggerSlideEvent',
      value: function _triggerSlideEvent(relatedTarget, directionalClassname) {
        var slideEvent = $.Event(Event.SLIDE, {
          relatedTarget: relatedTarget,
          direction: directionalClassname
        });
Mark Otto's avatar
Mark Otto committed
825

826
        $(this._element).trigger(slideEvent);
Mark Otto's avatar
Mark Otto committed
827

828
829
830
831
832
833
834
        return slideEvent;
      }
    }, {
      key: '_setActiveIndicatorElement',
      value: function _setActiveIndicatorElement(element) {
        if (this._indicatorsElement) {
          $(this._indicatorsElement).find(Selector.ACTIVE).removeClass(ClassName.ACTIVE);
Mark Otto's avatar
Mark Otto committed
835

836
          var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];
Mark Otto's avatar
Mark Otto committed
837

838
839
840
841
842
843
844
845
846
          if (nextIndicator) {
            $(nextIndicator).addClass(ClassName.ACTIVE);
          }
        }
      }
    }, {
      key: '_slide',
      value: function _slide(direction, element) {
        var _this3 = this;
Mark Otto's avatar
Mark Otto committed
847

848
849
        var activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0];
        var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);
Mark Otto's avatar
Mark Otto committed
850

Mark Otto's avatar
Mark Otto committed
851
        var isCycling = Boolean(this._interval);
Mark Otto's avatar
Mark Otto committed
852

Mark Otto's avatar
Mark Otto committed
853
        var directionalClassName = direction === Direction.NEXT ? ClassName.LEFT : ClassName.RIGHT;
Mark Otto's avatar
Mark Otto committed
854

855
856
857
858
        if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {
          this._isSliding = false;
          return;
        }
Mark Otto's avatar
Mark Otto committed
859

860
861
862
863
        var slideEvent = this._triggerSlideEvent(nextElement, directionalClassName);
        if (slideEvent.isDefaultPrevented()) {
          return;
        }
Mark Otto's avatar
Mark Otto committed
864

865
866
867
868
        if (!activeElement || !nextElement) {
          // some weirdness is happening, so we bail
          return;
        }
Mark Otto's avatar
Mark Otto committed
869

870
        this._isSliding = true;
Mark Otto's avatar
Mark Otto committed
871

872
873
874
        if (isCycling) {
          this.pause();
        }
Mark Otto's avatar
Mark Otto committed
875

876
        this._setActiveIndicatorElement(nextElement);
Mark Otto's avatar
Mark Otto committed
877

878
879
880
881
        var slidEvent = $.Event(Event.SLID, {
          relatedTarget: nextElement,
          direction: directionalClassName
        });
Mark Otto's avatar
Mark Otto committed
882

883
        if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.SLIDE)) {
Mark Otto's avatar
Mark Otto committed
884

885
          $(nextElement).addClass(direction);
Mark Otto's avatar
Mark Otto committed
886

887
          Util.reflow(nextElement);
Mark Otto's avatar
Mark Otto committed
888

889
890
          $(activeElement).addClass(directionalClassName);
          $(nextElement).addClass(directionalClassName);
Mark Otto's avatar
Mark Otto committed
891

892
893
          $(activeElement).one(Util.TRANSITION_END, function () {
            $(nextElement).removeClass(directionalClassName).removeClass(direction);
Mark Otto's avatar
Mark Otto committed
894

895
            $(nextElement).addClass(ClassName.ACTIVE);
Mark Otto's avatar
Mark Otto committed
896

897
            $(activeElement).removeClass(ClassName.ACTIVE).removeClass(direction).removeClass(directionalClassName);
Mark Otto's avatar
Mark Otto committed
898

899
            _this3._isSliding = false;
Mark Otto's avatar
Mark Otto committed
900

901
902
903
904
905
906
907
            setTimeout(function () {
              return $(_this3._element).trigger(slidEvent);
            }, 0);
          }).emulateTransitionEnd(TRANSITION_DURATION);
        } else {
          $(activeElement).removeClass(ClassName.ACTIVE);
          $(nextElement).addClass(ClassName.ACTIVE);
Mark Otto's avatar
Mark Otto committed
908

909
910
911
          this._isSliding = false;
          $(this._element).trigger(slidEvent);
        }
Mark Otto's avatar
Mark Otto committed
912

913
914
915
916
        if (isCycling) {
          this.cycle();
        }
      }
Mark Otto's avatar
Mark Otto committed
917

918
      // static
Mark Otto's avatar
Mark Otto committed
919

Jacob Thornton's avatar
Jacob Thornton committed
920
921
    }], [{
      key: '_jQueryInterface',
922
923
924
925
      value: function _jQueryInterface(config) {
        return this.each(function () {
          var data = $(this).data(DATA_KEY);
          var _config = $.extend({}, Default, $(this).data());
Mark Otto's avatar
Mark Otto committed
926

927
928
929
          if (typeof config === 'object') {
            $.extend(_config, config);
          }
Mark Otto's avatar
Mark Otto committed
930

931
          var action = typeof config === 'string' ? config : _config.slide;
Mark Otto's avatar
Mark Otto committed
932

933
934
935
936
          if (!data) {
            data = new Carousel(this, _config);
            $(this).data(DATA_KEY, data);
          }
Mark Otto's avatar
Mark Otto committed
937

Mark Otto's avatar
Mark Otto committed
938
          if (typeof config === 'number') {
939
            data.to(config);
XhmikosR's avatar
XhmikosR committed
940
941
942
943
          } else if (typeof action === 'string') {
            if (data[action] === undefined) {
              throw new Error('No method named "' + action + '"');
            }
944
945
946
947
948
949
950
951
952
953
954
            data[action]();
          } else if (_config.interval) {
            data.pause();
            data.cycle();
          }
        });
      }
    }, {
      key: '_dataApiClickHandler',
      value: function _dataApiClickHandler(event) {
        var selector = Util.getSelectorFromElement(this);
Mark Otto's avatar
Mark Otto committed
955

956
957
958
        if (!selector) {
          return;
        }
Mark Otto's avatar
Mark Otto committed
959

960
        var target = $(selector)[0];
Mark Otto's avatar
Mark Otto committed
961

962
963
964
        if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {
          return;
        }
Mark Otto's avatar
Mark Otto committed
965

966
967
        var config = $.extend({}, $(target).data(), $(this).data());
        var slideIndex = this.getAttribute('data-slide-to');
Mark Otto's avatar
Mark Otto committed
968

969
970
971
        if (slideIndex) {
          config.interval = false;
        }
Mark Otto's avatar
Mark Otto committed
972

973
        Carousel._jQueryInterface.call($(target), config);
Mark Otto's avatar
Mark Otto committed
974

975
976
977
        if (slideIndex) {
          $(target).data(DATA_KEY).to(slideIndex);
        }
Mark Otto's avatar
Mark Otto committed
978

979
980
        event.preventDefault();
      }
Mark Otto's avatar
grunt    
Mark Otto committed
981
982
    }, {
      key: 'VERSION',
Jacob Thornton's avatar
Jacob Thornton committed
983
      get: function get() {
Mark Otto's avatar
grunt    
Mark Otto committed
984
985
986
987
        return VERSION;
      }
    }, {
      key: 'Default',
Jacob Thornton's avatar
Jacob Thornton committed
988
      get: function get() {
Mark Otto's avatar
grunt    
Mark Otto committed
989
990
        return Default;
      }
991
    }]);
Mark Otto's avatar
Mark Otto committed
992

993
994
    return Carousel;
  })();
Mark Otto's avatar
Mark Otto committed
995

996
  $(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler);
Mark Otto's avatar
Mark Otto committed
997

998
999
1000
  $(window).on(Event.LOAD_DATA_API, function () {
    $(Selector.DATA_RIDE).each(function () {
      var $carousel = $(this);
For faster browsing, not all history is shown. View entire blame