]> git.ipfire.org Git - ipfire.org.git/blob - static/scss/bootstrap-4.0.0-alpha.6/dist/js/bootstrap.js
.gitignore: Add .vscode
[ipfire.org.git] / static / scss / bootstrap-4.0.0-alpha.6 / dist / js / bootstrap.js
1 /*!
2 * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
3 * Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5 */
6
7 if (typeof jQuery === 'undefined') {
8 throw new Error('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.')
9 }
10
11 +function ($) {
12 var version = $.fn.jquery.split(' ')[0].split('.')
13 if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] >= 4)) {
14 throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')
15 }
16 }(jQuery);
17
18
19 +function () {
20
21 var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
22
23 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; }; }();
24
25 function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
26
27 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; }
28
29 function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
30
31 /**
32 * --------------------------------------------------------------------------
33 * Bootstrap (v4.0.0-alpha.6): util.js
34 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
35 * --------------------------------------------------------------------------
36 */
37
38 var Util = function ($) {
39
40 /**
41 * ------------------------------------------------------------------------
42 * Private TransitionEnd Helpers
43 * ------------------------------------------------------------------------
44 */
45
46 var transition = false;
47
48 var MAX_UID = 1000000;
49
50 var TransitionEndEvent = {
51 WebkitTransition: 'webkitTransitionEnd',
52 MozTransition: 'transitionend',
53 OTransition: 'oTransitionEnd otransitionend',
54 transition: 'transitionend'
55 };
56
57 // shoutout AngusCroll (https://goo.gl/pxwQGp)
58 function toType(obj) {
59 return {}.toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
60 }
61
62 function isElement(obj) {
63 return (obj[0] || obj).nodeType;
64 }
65
66 function getSpecialTransitionEndEvent() {
67 return {
68 bindType: transition.end,
69 delegateType: transition.end,
70 handle: function handle(event) {
71 if ($(event.target).is(this)) {
72 return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params
73 }
74 return undefined;
75 }
76 };
77 }
78
79 function transitionEndTest() {
80 if (window.QUnit) {
81 return false;
82 }
83
84 var el = document.createElement('bootstrap');
85
86 for (var name in TransitionEndEvent) {
87 if (el.style[name] !== undefined) {
88 return {
89 end: TransitionEndEvent[name]
90 };
91 }
92 }
93
94 return false;
95 }
96
97 function transitionEndEmulator(duration) {
98 var _this = this;
99
100 var called = false;
101
102 $(this).one(Util.TRANSITION_END, function () {
103 called = true;
104 });
105
106 setTimeout(function () {
107 if (!called) {
108 Util.triggerTransitionEnd(_this);
109 }
110 }, duration);
111
112 return this;
113 }
114
115 function setTransitionEndSupport() {
116 transition = transitionEndTest();
117
118 $.fn.emulateTransitionEnd = transitionEndEmulator;
119
120 if (Util.supportsTransitionEnd()) {
121 $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
122 }
123 }
124
125 /**
126 * --------------------------------------------------------------------------
127 * Public Util Api
128 * --------------------------------------------------------------------------
129 */
130
131 var Util = {
132
133 TRANSITION_END: 'bsTransitionEnd',
134
135 getUID: function getUID(prefix) {
136 do {
137 // eslint-disable-next-line no-bitwise
138 prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here
139 } while (document.getElementById(prefix));
140 return prefix;
141 },
142 getSelectorFromElement: function getSelectorFromElement(element) {
143 var selector = element.getAttribute('data-target');
144
145 if (!selector) {
146 selector = element.getAttribute('href') || '';
147 selector = /^#[a-z]/i.test(selector) ? selector : null;
148 }
149
150 return selector;
151 },
152 reflow: function reflow(element) {
153 return element.offsetHeight;
154 },
155 triggerTransitionEnd: function triggerTransitionEnd(element) {
156 $(element).trigger(transition.end);
157 },
158 supportsTransitionEnd: function supportsTransitionEnd() {
159 return Boolean(transition);
160 },
161 typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {
162 for (var property in configTypes) {
163 if (configTypes.hasOwnProperty(property)) {
164 var expectedTypes = configTypes[property];
165 var value = config[property];
166 var valueType = value && isElement(value) ? 'element' : toType(value);
167
168 if (!new RegExp(expectedTypes).test(valueType)) {
169 throw new Error(componentName.toUpperCase() + ': ' + ('Option "' + property + '" provided type "' + valueType + '" ') + ('but expected type "' + expectedTypes + '".'));
170 }
171 }
172 }
173 }
174 };
175
176 setTransitionEndSupport();
177
178 return Util;
179 }(jQuery);
180
181 /**
182 * --------------------------------------------------------------------------
183 * Bootstrap (v4.0.0-alpha.6): alert.js
184 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
185 * --------------------------------------------------------------------------
186 */
187
188 var Alert = function ($) {
189
190 /**
191 * ------------------------------------------------------------------------
192 * Constants
193 * ------------------------------------------------------------------------
194 */
195
196 var NAME = 'alert';
197 var VERSION = '4.0.0-alpha.6';
198 var DATA_KEY = 'bs.alert';
199 var EVENT_KEY = '.' + DATA_KEY;
200 var DATA_API_KEY = '.data-api';
201 var JQUERY_NO_CONFLICT = $.fn[NAME];
202 var TRANSITION_DURATION = 150;
203
204 var Selector = {
205 DISMISS: '[data-dismiss="alert"]'
206 };
207
208 var Event = {
209 CLOSE: 'close' + EVENT_KEY,
210 CLOSED: 'closed' + EVENT_KEY,
211 CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
212 };
213
214 var ClassName = {
215 ALERT: 'alert',
216 FADE: 'fade',
217 SHOW: 'show'
218 };
219
220 /**
221 * ------------------------------------------------------------------------
222 * Class Definition
223 * ------------------------------------------------------------------------
224 */
225
226 var Alert = function () {
227 function Alert(element) {
228 _classCallCheck(this, Alert);
229
230 this._element = element;
231 }
232
233 // getters
234
235 // public
236
237 Alert.prototype.close = function close(element) {
238 element = element || this._element;
239
240 var rootElement = this._getRootElement(element);
241 var customEvent = this._triggerCloseEvent(rootElement);
242
243 if (customEvent.isDefaultPrevented()) {
244 return;
245 }
246
247 this._removeElement(rootElement);
248 };
249
250 Alert.prototype.dispose = function dispose() {
251 $.removeData(this._element, DATA_KEY);
252 this._element = null;
253 };
254
255 // private
256
257 Alert.prototype._getRootElement = function _getRootElement(element) {
258 var selector = Util.getSelectorFromElement(element);
259 var parent = false;
260
261 if (selector) {
262 parent = $(selector)[0];
263 }
264
265 if (!parent) {
266 parent = $(element).closest('.' + ClassName.ALERT)[0];
267 }
268
269 return parent;
270 };
271
272 Alert.prototype._triggerCloseEvent = function _triggerCloseEvent(element) {
273 var closeEvent = $.Event(Event.CLOSE);
274
275 $(element).trigger(closeEvent);
276 return closeEvent;
277 };
278
279 Alert.prototype._removeElement = function _removeElement(element) {
280 var _this2 = this;
281
282 $(element).removeClass(ClassName.SHOW);
283
284 if (!Util.supportsTransitionEnd() || !$(element).hasClass(ClassName.FADE)) {
285 this._destroyElement(element);
286 return;
287 }
288
289 $(element).one(Util.TRANSITION_END, function (event) {
290 return _this2._destroyElement(element, event);
291 }).emulateTransitionEnd(TRANSITION_DURATION);
292 };
293
294 Alert.prototype._destroyElement = function _destroyElement(element) {
295 $(element).detach().trigger(Event.CLOSED).remove();
296 };
297
298 // static
299
300 Alert._jQueryInterface = function _jQueryInterface(config) {
301 return this.each(function () {
302 var $element = $(this);
303 var data = $element.data(DATA_KEY);
304
305 if (!data) {
306 data = new Alert(this);
307 $element.data(DATA_KEY, data);
308 }
309
310 if (config === 'close') {
311 data[config](this);
312 }
313 });
314 };
315
316 Alert._handleDismiss = function _handleDismiss(alertInstance) {
317 return function (event) {
318 if (event) {
319 event.preventDefault();
320 }
321
322 alertInstance.close(this);
323 };
324 };
325
326 _createClass(Alert, null, [{
327 key: 'VERSION',
328 get: function get() {
329 return VERSION;
330 }
331 }]);
332
333 return Alert;
334 }();
335
336 /**
337 * ------------------------------------------------------------------------
338 * Data Api implementation
339 * ------------------------------------------------------------------------
340 */
341
342 $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));
343
344 /**
345 * ------------------------------------------------------------------------
346 * jQuery
347 * ------------------------------------------------------------------------
348 */
349
350 $.fn[NAME] = Alert._jQueryInterface;
351 $.fn[NAME].Constructor = Alert;
352 $.fn[NAME].noConflict = function () {
353 $.fn[NAME] = JQUERY_NO_CONFLICT;
354 return Alert._jQueryInterface;
355 };
356
357 return Alert;
358 }(jQuery);
359
360 /**
361 * --------------------------------------------------------------------------
362 * Bootstrap (v4.0.0-alpha.6): button.js
363 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
364 * --------------------------------------------------------------------------
365 */
366
367 var Button = function ($) {
368
369 /**
370 * ------------------------------------------------------------------------
371 * Constants
372 * ------------------------------------------------------------------------
373 */
374
375 var NAME = 'button';
376 var VERSION = '4.0.0-alpha.6';
377 var DATA_KEY = 'bs.button';
378 var EVENT_KEY = '.' + DATA_KEY;
379 var DATA_API_KEY = '.data-api';
380 var JQUERY_NO_CONFLICT = $.fn[NAME];
381
382 var ClassName = {
383 ACTIVE: 'active',
384 BUTTON: 'btn',
385 FOCUS: 'focus'
386 };
387
388 var Selector = {
389 DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
390 DATA_TOGGLE: '[data-toggle="buttons"]',
391 INPUT: 'input',
392 ACTIVE: '.active',
393 BUTTON: '.btn'
394 };
395
396 var Event = {
397 CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,
398 FOCUS_BLUR_DATA_API: 'focus' + EVENT_KEY + DATA_API_KEY + ' ' + ('blur' + EVENT_KEY + DATA_API_KEY)
399 };
400
401 /**
402 * ------------------------------------------------------------------------
403 * Class Definition
404 * ------------------------------------------------------------------------
405 */
406
407 var Button = function () {
408 function Button(element) {
409 _classCallCheck(this, Button);
410
411 this._element = element;
412 }
413
414 // getters
415
416 // public
417
418 Button.prototype.toggle = function toggle() {
419 var triggerChangeEvent = true;
420 var rootElement = $(this._element).closest(Selector.DATA_TOGGLE)[0];
421
422 if (rootElement) {
423 var input = $(this._element).find(Selector.INPUT)[0];
424
425 if (input) {
426 if (input.type === 'radio') {
427 if (input.checked && $(this._element).hasClass(ClassName.ACTIVE)) {
428 triggerChangeEvent = false;
429 } else {
430 var activeElement = $(rootElement).find(Selector.ACTIVE)[0];
431
432 if (activeElement) {
433 $(activeElement).removeClass(ClassName.ACTIVE);
434 }
435 }
436 }
437
438 if (triggerChangeEvent) {
439 input.checked = !$(this._element).hasClass(ClassName.ACTIVE);
440 $(input).trigger('change');
441 }
442
443 input.focus();
444 }
445 }
446
447 this._element.setAttribute('aria-pressed', !$(this._element).hasClass(ClassName.ACTIVE));
448
449 if (triggerChangeEvent) {
450 $(this._element).toggleClass(ClassName.ACTIVE);
451 }
452 };
453
454 Button.prototype.dispose = function dispose() {
455 $.removeData(this._element, DATA_KEY);
456 this._element = null;
457 };
458
459 // static
460
461 Button._jQueryInterface = function _jQueryInterface(config) {
462 return this.each(function () {
463 var data = $(this).data(DATA_KEY);
464
465 if (!data) {
466 data = new Button(this);
467 $(this).data(DATA_KEY, data);
468 }
469
470 if (config === 'toggle') {
471 data[config]();
472 }
473 });
474 };
475
476 _createClass(Button, null, [{
477 key: 'VERSION',
478 get: function get() {
479 return VERSION;
480 }
481 }]);
482
483 return Button;
484 }();
485
486 /**
487 * ------------------------------------------------------------------------
488 * Data Api implementation
489 * ------------------------------------------------------------------------
490 */
491
492 $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
493 event.preventDefault();
494
495 var button = event.target;
496
497 if (!$(button).hasClass(ClassName.BUTTON)) {
498 button = $(button).closest(Selector.BUTTON);
499 }
500
501 Button._jQueryInterface.call($(button), 'toggle');
502 }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
503 var button = $(event.target).closest(Selector.BUTTON)[0];
504 $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));
505 });
506
507 /**
508 * ------------------------------------------------------------------------
509 * jQuery
510 * ------------------------------------------------------------------------
511 */
512
513 $.fn[NAME] = Button._jQueryInterface;
514 $.fn[NAME].Constructor = Button;
515 $.fn[NAME].noConflict = function () {
516 $.fn[NAME] = JQUERY_NO_CONFLICT;
517 return Button._jQueryInterface;
518 };
519
520 return Button;
521 }(jQuery);
522
523 /**
524 * --------------------------------------------------------------------------
525 * Bootstrap (v4.0.0-alpha.6): carousel.js
526 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
527 * --------------------------------------------------------------------------
528 */
529
530 var Carousel = function ($) {
531
532 /**
533 * ------------------------------------------------------------------------
534 * Constants
535 * ------------------------------------------------------------------------
536 */
537
538 var NAME = 'carousel';
539 var VERSION = '4.0.0-alpha.6';
540 var DATA_KEY = 'bs.carousel';
541 var EVENT_KEY = '.' + DATA_KEY;
542 var DATA_API_KEY = '.data-api';
543 var JQUERY_NO_CONFLICT = $.fn[NAME];
544 var TRANSITION_DURATION = 600;
545 var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key
546 var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key
547
548 var Default = {
549 interval: 5000,
550 keyboard: true,
551 slide: false,
552 pause: 'hover',
553 wrap: true
554 };
555
556 var DefaultType = {
557 interval: '(number|boolean)',
558 keyboard: 'boolean',
559 slide: '(boolean|string)',
560 pause: '(string|boolean)',
561 wrap: 'boolean'
562 };
563
564 var Direction = {
565 NEXT: 'next',
566 PREV: 'prev',
567 LEFT: 'left',
568 RIGHT: 'right'
569 };
570
571 var Event = {
572 SLIDE: 'slide' + EVENT_KEY,
573 SLID: 'slid' + EVENT_KEY,
574 KEYDOWN: 'keydown' + EVENT_KEY,
575 MOUSEENTER: 'mouseenter' + EVENT_KEY,
576 MOUSELEAVE: 'mouseleave' + EVENT_KEY,
577 LOAD_DATA_API: 'load' + EVENT_KEY + DATA_API_KEY,
578 CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
579 };
580
581 var ClassName = {
582 CAROUSEL: 'carousel',
583 ACTIVE: 'active',
584 SLIDE: 'slide',
585 RIGHT: 'carousel-item-right',
586 LEFT: 'carousel-item-left',
587 NEXT: 'carousel-item-next',
588 PREV: 'carousel-item-prev',
589 ITEM: 'carousel-item'
590 };
591
592 var Selector = {
593 ACTIVE: '.active',
594 ACTIVE_ITEM: '.active.carousel-item',
595 ITEM: '.carousel-item',
596 NEXT_PREV: '.carousel-item-next, .carousel-item-prev',
597 INDICATORS: '.carousel-indicators',
598 DATA_SLIDE: '[data-slide], [data-slide-to]',
599 DATA_RIDE: '[data-ride="carousel"]'
600 };
601
602 /**
603 * ------------------------------------------------------------------------
604 * Class Definition
605 * ------------------------------------------------------------------------
606 */
607
608 var Carousel = function () {
609 function Carousel(element, config) {
610 _classCallCheck(this, Carousel);
611
612 this._items = null;
613 this._interval = null;
614 this._activeElement = null;
615
616 this._isPaused = false;
617 this._isSliding = false;
618
619 this._config = this._getConfig(config);
620 this._element = $(element)[0];
621 this._indicatorsElement = $(this._element).find(Selector.INDICATORS)[0];
622
623 this._addEventListeners();
624 }
625
626 // getters
627
628 // public
629
630 Carousel.prototype.next = function next() {
631 if (this._isSliding) {
632 throw new Error('Carousel is sliding');
633 }
634 this._slide(Direction.NEXT);
635 };
636
637 Carousel.prototype.nextWhenVisible = function nextWhenVisible() {
638 // Don't call next when the page isn't visible
639 if (!document.hidden) {
640 this.next();
641 }
642 };
643
644 Carousel.prototype.prev = function prev() {
645 if (this._isSliding) {
646 throw new Error('Carousel is sliding');
647 }
648 this._slide(Direction.PREVIOUS);
649 };
650
651 Carousel.prototype.pause = function pause(event) {
652 if (!event) {
653 this._isPaused = true;
654 }
655
656 if ($(this._element).find(Selector.NEXT_PREV)[0] && Util.supportsTransitionEnd()) {
657 Util.triggerTransitionEnd(this._element);
658 this.cycle(true);
659 }
660
661 clearInterval(this._interval);
662 this._interval = null;
663 };
664
665 Carousel.prototype.cycle = function cycle(event) {
666 if (!event) {
667 this._isPaused = false;
668 }
669
670 if (this._interval) {
671 clearInterval(this._interval);
672 this._interval = null;
673 }
674
675 if (this._config.interval && !this._isPaused) {
676 this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);
677 }
678 };
679
680 Carousel.prototype.to = function to(index) {
681 var _this3 = this;
682
683 this._activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0];
684
685 var activeIndex = this._getItemIndex(this._activeElement);
686
687 if (index > this._items.length - 1 || index < 0) {
688 return;
689 }
690
691 if (this._isSliding) {
692 $(this._element).one(Event.SLID, function () {
693 return _this3.to(index);
694 });
695 return;
696 }
697
698 if (activeIndex === index) {
699 this.pause();
700 this.cycle();
701 return;
702 }
703
704 var direction = index > activeIndex ? Direction.NEXT : Direction.PREVIOUS;
705
706 this._slide(direction, this._items[index]);
707 };
708
709 Carousel.prototype.dispose = function dispose() {
710 $(this._element).off(EVENT_KEY);
711 $.removeData(this._element, DATA_KEY);
712
713 this._items = null;
714 this._config = null;
715 this._element = null;
716 this._interval = null;
717 this._isPaused = null;
718 this._isSliding = null;
719 this._activeElement = null;
720 this._indicatorsElement = null;
721 };
722
723 // private
724
725 Carousel.prototype._getConfig = function _getConfig(config) {
726 config = $.extend({}, Default, config);
727 Util.typeCheckConfig(NAME, config, DefaultType);
728 return config;
729 };
730
731 Carousel.prototype._addEventListeners = function _addEventListeners() {
732 var _this4 = this;
733
734 if (this._config.keyboard) {
735 $(this._element).on(Event.KEYDOWN, function (event) {
736 return _this4._keydown(event);
737 });
738 }
739
740 if (this._config.pause === 'hover' && !('ontouchstart' in document.documentElement)) {
741 $(this._element).on(Event.MOUSEENTER, function (event) {
742 return _this4.pause(event);
743 }).on(Event.MOUSELEAVE, function (event) {
744 return _this4.cycle(event);
745 });
746 }
747 };
748
749 Carousel.prototype._keydown = function _keydown(event) {
750 if (/input|textarea/i.test(event.target.tagName)) {
751 return;
752 }
753
754 switch (event.which) {
755 case ARROW_LEFT_KEYCODE:
756 event.preventDefault();
757 this.prev();
758 break;
759 case ARROW_RIGHT_KEYCODE:
760 event.preventDefault();
761 this.next();
762 break;
763 default:
764 return;
765 }
766 };
767
768 Carousel.prototype._getItemIndex = function _getItemIndex(element) {
769 this._items = $.makeArray($(element).parent().find(Selector.ITEM));
770 return this._items.indexOf(element);
771 };
772
773 Carousel.prototype._getItemByDirection = function _getItemByDirection(direction, activeElement) {
774 var isNextDirection = direction === Direction.NEXT;
775 var isPrevDirection = direction === Direction.PREVIOUS;
776 var activeIndex = this._getItemIndex(activeElement);
777 var lastItemIndex = this._items.length - 1;
778 var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;
779
780 if (isGoingToWrap && !this._config.wrap) {
781 return activeElement;
782 }
783
784 var delta = direction === Direction.PREVIOUS ? -1 : 1;
785 var itemIndex = (activeIndex + delta) % this._items.length;
786
787 return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
788 };
789
790 Carousel.prototype._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {
791 var slideEvent = $.Event(Event.SLIDE, {
792 relatedTarget: relatedTarget,
793 direction: eventDirectionName
794 });
795
796 $(this._element).trigger(slideEvent);
797
798 return slideEvent;
799 };
800
801 Carousel.prototype._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {
802 if (this._indicatorsElement) {
803 $(this._indicatorsElement).find(Selector.ACTIVE).removeClass(ClassName.ACTIVE);
804
805 var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];
806
807 if (nextIndicator) {
808 $(nextIndicator).addClass(ClassName.ACTIVE);
809 }
810 }
811 };
812
813 Carousel.prototype._slide = function _slide(direction, element) {
814 var _this5 = this;
815
816 var activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0];
817 var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);
818
819 var isCycling = Boolean(this._interval);
820
821 var directionalClassName = void 0;
822 var orderClassName = void 0;
823 var eventDirectionName = void 0;
824
825 if (direction === Direction.NEXT) {
826 directionalClassName = ClassName.LEFT;
827 orderClassName = ClassName.NEXT;
828 eventDirectionName = Direction.LEFT;
829 } else {
830 directionalClassName = ClassName.RIGHT;
831 orderClassName = ClassName.PREV;
832 eventDirectionName = Direction.RIGHT;
833 }
834
835 if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {
836 this._isSliding = false;
837 return;
838 }
839
840 var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);
841 if (slideEvent.isDefaultPrevented()) {
842 return;
843 }
844
845 if (!activeElement || !nextElement) {
846 // some weirdness is happening, so we bail
847 return;
848 }
849
850 this._isSliding = true;
851
852 if (isCycling) {
853 this.pause();
854 }
855
856 this._setActiveIndicatorElement(nextElement);
857
858 var slidEvent = $.Event(Event.SLID, {
859 relatedTarget: nextElement,
860 direction: eventDirectionName
861 });
862
863 if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.SLIDE)) {
864
865 $(nextElement).addClass(orderClassName);
866
867 Util.reflow(nextElement);
868
869 $(activeElement).addClass(directionalClassName);
870 $(nextElement).addClass(directionalClassName);
871
872 $(activeElement).one(Util.TRANSITION_END, function () {
873 $(nextElement).removeClass(directionalClassName + ' ' + orderClassName).addClass(ClassName.ACTIVE);
874
875 $(activeElement).removeClass(ClassName.ACTIVE + ' ' + orderClassName + ' ' + directionalClassName);
876
877 _this5._isSliding = false;
878
879 setTimeout(function () {
880 return $(_this5._element).trigger(slidEvent);
881 }, 0);
882 }).emulateTransitionEnd(TRANSITION_DURATION);
883 } else {
884 $(activeElement).removeClass(ClassName.ACTIVE);
885 $(nextElement).addClass(ClassName.ACTIVE);
886
887 this._isSliding = false;
888 $(this._element).trigger(slidEvent);
889 }
890
891 if (isCycling) {
892 this.cycle();
893 }
894 };
895
896 // static
897
898 Carousel._jQueryInterface = function _jQueryInterface(config) {
899 return this.each(function () {
900 var data = $(this).data(DATA_KEY);
901 var _config = $.extend({}, Default, $(this).data());
902
903 if ((typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object') {
904 $.extend(_config, config);
905 }
906
907 var action = typeof config === 'string' ? config : _config.slide;
908
909 if (!data) {
910 data = new Carousel(this, _config);
911 $(this).data(DATA_KEY, data);
912 }
913
914 if (typeof config === 'number') {
915 data.to(config);
916 } else if (typeof action === 'string') {
917 if (data[action] === undefined) {
918 throw new Error('No method named "' + action + '"');
919 }
920 data[action]();
921 } else if (_config.interval) {
922 data.pause();
923 data.cycle();
924 }
925 });
926 };
927
928 Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {
929 var selector = Util.getSelectorFromElement(this);
930
931 if (!selector) {
932 return;
933 }
934
935 var target = $(selector)[0];
936
937 if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {
938 return;
939 }
940
941 var config = $.extend({}, $(target).data(), $(this).data());
942 var slideIndex = this.getAttribute('data-slide-to');
943
944 if (slideIndex) {
945 config.interval = false;
946 }
947
948 Carousel._jQueryInterface.call($(target), config);
949
950 if (slideIndex) {
951 $(target).data(DATA_KEY).to(slideIndex);
952 }
953
954 event.preventDefault();
955 };
956
957 _createClass(Carousel, null, [{
958 key: 'VERSION',
959 get: function get() {
960 return VERSION;
961 }
962 }, {
963 key: 'Default',
964 get: function get() {
965 return Default;
966 }
967 }]);
968
969 return Carousel;
970 }();
971
972 /**
973 * ------------------------------------------------------------------------
974 * Data Api implementation
975 * ------------------------------------------------------------------------
976 */
977
978 $(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler);
979
980 $(window).on(Event.LOAD_DATA_API, function () {
981 $(Selector.DATA_RIDE).each(function () {
982 var $carousel = $(this);
983 Carousel._jQueryInterface.call($carousel, $carousel.data());
984 });
985 });
986
987 /**
988 * ------------------------------------------------------------------------
989 * jQuery
990 * ------------------------------------------------------------------------
991 */
992
993 $.fn[NAME] = Carousel._jQueryInterface;
994 $.fn[NAME].Constructor = Carousel;
995 $.fn[NAME].noConflict = function () {
996 $.fn[NAME] = JQUERY_NO_CONFLICT;
997 return Carousel._jQueryInterface;
998 };
999
1000 return Carousel;
1001 }(jQuery);
1002
1003 /**
1004 * --------------------------------------------------------------------------
1005 * Bootstrap (v4.0.0-alpha.6): collapse.js
1006 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1007 * --------------------------------------------------------------------------
1008 */
1009
1010 var Collapse = function ($) {
1011
1012 /**
1013 * ------------------------------------------------------------------------
1014 * Constants
1015 * ------------------------------------------------------------------------
1016 */
1017
1018 var NAME = 'collapse';
1019 var VERSION = '4.0.0-alpha.6';
1020 var DATA_KEY = 'bs.collapse';
1021 var EVENT_KEY = '.' + DATA_KEY;
1022 var DATA_API_KEY = '.data-api';
1023 var JQUERY_NO_CONFLICT = $.fn[NAME];
1024 var TRANSITION_DURATION = 600;
1025
1026 var Default = {
1027 toggle: true,
1028 parent: ''
1029 };
1030
1031 var DefaultType = {
1032 toggle: 'boolean',
1033 parent: 'string'
1034 };
1035
1036 var Event = {
1037 SHOW: 'show' + EVENT_KEY,
1038 SHOWN: 'shown' + EVENT_KEY,
1039 HIDE: 'hide' + EVENT_KEY,
1040 HIDDEN: 'hidden' + EVENT_KEY,
1041 CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
1042 };
1043
1044 var ClassName = {
1045 SHOW: 'show',
1046 COLLAPSE: 'collapse',
1047 COLLAPSING: 'collapsing',
1048 COLLAPSED: 'collapsed'
1049 };
1050
1051 var Dimension = {
1052 WIDTH: 'width',
1053 HEIGHT: 'height'
1054 };
1055
1056 var Selector = {
1057 ACTIVES: '.card > .show, .card > .collapsing',
1058 DATA_TOGGLE: '[data-toggle="collapse"]'
1059 };
1060
1061 /**
1062 * ------------------------------------------------------------------------
1063 * Class Definition
1064 * ------------------------------------------------------------------------
1065 */
1066
1067 var Collapse = function () {
1068 function Collapse(element, config) {
1069 _classCallCheck(this, Collapse);
1070
1071 this._isTransitioning = false;
1072 this._element = element;
1073 this._config = this._getConfig(config);
1074 this._triggerArray = $.makeArray($('[data-toggle="collapse"][href="#' + element.id + '"],' + ('[data-toggle="collapse"][data-target="#' + element.id + '"]')));
1075
1076 this._parent = this._config.parent ? this._getParent() : null;
1077
1078 if (!this._config.parent) {
1079 this._addAriaAndCollapsedClass(this._element, this._triggerArray);
1080 }
1081
1082 if (this._config.toggle) {
1083 this.toggle();
1084 }
1085 }
1086
1087 // getters
1088
1089 // public
1090
1091 Collapse.prototype.toggle = function toggle() {
1092 if ($(this._element).hasClass(ClassName.SHOW)) {
1093 this.hide();
1094 } else {
1095 this.show();
1096 }
1097 };
1098
1099 Collapse.prototype.show = function show() {
1100 var _this6 = this;
1101
1102 if (this._isTransitioning) {
1103 throw new Error('Collapse is transitioning');
1104 }
1105
1106 if ($(this._element).hasClass(ClassName.SHOW)) {
1107 return;
1108 }
1109
1110 var actives = void 0;
1111 var activesData = void 0;
1112
1113 if (this._parent) {
1114 actives = $.makeArray($(this._parent).find(Selector.ACTIVES));
1115 if (!actives.length) {
1116 actives = null;
1117 }
1118 }
1119
1120 if (actives) {
1121 activesData = $(actives).data(DATA_KEY);
1122 if (activesData && activesData._isTransitioning) {
1123 return;
1124 }
1125 }
1126
1127 var startEvent = $.Event(Event.SHOW);
1128 $(this._element).trigger(startEvent);
1129 if (startEvent.isDefaultPrevented()) {
1130 return;
1131 }
1132
1133 if (actives) {
1134 Collapse._jQueryInterface.call($(actives), 'hide');
1135 if (!activesData) {
1136 $(actives).data(DATA_KEY, null);
1137 }
1138 }
1139
1140 var dimension = this._getDimension();
1141
1142 $(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
1143
1144 this._element.style[dimension] = 0;
1145 this._element.setAttribute('aria-expanded', true);
1146
1147 if (this._triggerArray.length) {
1148 $(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
1149 }
1150
1151 this.setTransitioning(true);
1152
1153 var complete = function complete() {
1154 $(_this6._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);
1155
1156 _this6._element.style[dimension] = '';
1157
1158 _this6.setTransitioning(false);
1159
1160 $(_this6._element).trigger(Event.SHOWN);
1161 };
1162
1163 if (!Util.supportsTransitionEnd()) {
1164 complete();
1165 return;
1166 }
1167
1168 var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
1169 var scrollSize = 'scroll' + capitalizedDimension;
1170
1171 $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
1172
1173 this._element.style[dimension] = this._element[scrollSize] + 'px';
1174 };
1175
1176 Collapse.prototype.hide = function hide() {
1177 var _this7 = this;
1178
1179 if (this._isTransitioning) {
1180 throw new Error('Collapse is transitioning');
1181 }
1182
1183 if (!$(this._element).hasClass(ClassName.SHOW)) {
1184 return;
1185 }
1186
1187 var startEvent = $.Event(Event.HIDE);
1188 $(this._element).trigger(startEvent);
1189 if (startEvent.isDefaultPrevented()) {
1190 return;
1191 }
1192
1193 var dimension = this._getDimension();
1194 var offsetDimension = dimension === Dimension.WIDTH ? 'offsetWidth' : 'offsetHeight';
1195
1196 this._element.style[dimension] = this._element[offsetDimension] + 'px';
1197
1198 Util.reflow(this._element);
1199
1200 $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
1201
1202 this._element.setAttribute('aria-expanded', false);
1203
1204 if (this._triggerArray.length) {
1205 $(this._triggerArray).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
1206 }
1207
1208 this.setTransitioning(true);
1209
1210 var complete = function complete() {
1211 _this7.setTransitioning(false);
1212 $(_this7._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
1213 };
1214
1215 this._element.style[dimension] = '';
1216
1217 if (!Util.supportsTransitionEnd()) {
1218 complete();
1219 return;
1220 }
1221
1222 $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
1223 };
1224
1225 Collapse.prototype.setTransitioning = function setTransitioning(isTransitioning) {
1226 this._isTransitioning = isTransitioning;
1227 };
1228
1229 Collapse.prototype.dispose = function dispose() {
1230 $.removeData(this._element, DATA_KEY);
1231
1232 this._config = null;
1233 this._parent = null;
1234 this._element = null;
1235 this._triggerArray = null;
1236 this._isTransitioning = null;
1237 };
1238
1239 // private
1240
1241 Collapse.prototype._getConfig = function _getConfig(config) {
1242 config = $.extend({}, Default, config);
1243 config.toggle = Boolean(config.toggle); // coerce string values
1244 Util.typeCheckConfig(NAME, config, DefaultType);
1245 return config;
1246 };
1247
1248 Collapse.prototype._getDimension = function _getDimension() {
1249 var hasWidth = $(this._element).hasClass(Dimension.WIDTH);
1250 return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
1251 };
1252
1253 Collapse.prototype._getParent = function _getParent() {
1254 var _this8 = this;
1255
1256 var parent = $(this._config.parent)[0];
1257 var selector = '[data-toggle="collapse"][data-parent="' + this._config.parent + '"]';
1258
1259 $(parent).find(selector).each(function (i, element) {
1260 _this8._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
1261 });
1262
1263 return parent;
1264 };
1265
1266 Collapse.prototype._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
1267 if (element) {
1268 var isOpen = $(element).hasClass(ClassName.SHOW);
1269 element.setAttribute('aria-expanded', isOpen);
1270
1271 if (triggerArray.length) {
1272 $(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
1273 }
1274 }
1275 };
1276
1277 // static
1278
1279 Collapse._getTargetFromElement = function _getTargetFromElement(element) {
1280 var selector = Util.getSelectorFromElement(element);
1281 return selector ? $(selector)[0] : null;
1282 };
1283
1284 Collapse._jQueryInterface = function _jQueryInterface(config) {
1285 return this.each(function () {
1286 var $this = $(this);
1287 var data = $this.data(DATA_KEY);
1288 var _config = $.extend({}, Default, $this.data(), (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config);
1289
1290 if (!data && _config.toggle && /show|hide/.test(config)) {
1291 _config.toggle = false;
1292 }
1293
1294 if (!data) {
1295 data = new Collapse(this, _config);
1296 $this.data(DATA_KEY, data);
1297 }
1298
1299 if (typeof config === 'string') {
1300 if (data[config] === undefined) {
1301 throw new Error('No method named "' + config + '"');
1302 }
1303 data[config]();
1304 }
1305 });
1306 };
1307
1308 _createClass(Collapse, null, [{
1309 key: 'VERSION',
1310 get: function get() {
1311 return VERSION;
1312 }
1313 }, {
1314 key: 'Default',
1315 get: function get() {
1316 return Default;
1317 }
1318 }]);
1319
1320 return Collapse;
1321 }();
1322
1323 /**
1324 * ------------------------------------------------------------------------
1325 * Data Api implementation
1326 * ------------------------------------------------------------------------
1327 */
1328
1329 $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
1330 event.preventDefault();
1331
1332 var target = Collapse._getTargetFromElement(this);
1333 var data = $(target).data(DATA_KEY);
1334 var config = data ? 'toggle' : $(this).data();
1335
1336 Collapse._jQueryInterface.call($(target), config);
1337 });
1338
1339 /**
1340 * ------------------------------------------------------------------------
1341 * jQuery
1342 * ------------------------------------------------------------------------
1343 */
1344
1345 $.fn[NAME] = Collapse._jQueryInterface;
1346 $.fn[NAME].Constructor = Collapse;
1347 $.fn[NAME].noConflict = function () {
1348 $.fn[NAME] = JQUERY_NO_CONFLICT;
1349 return Collapse._jQueryInterface;
1350 };
1351
1352 return Collapse;
1353 }(jQuery);
1354
1355 /**
1356 * --------------------------------------------------------------------------
1357 * Bootstrap (v4.0.0-alpha.6): dropdown.js
1358 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1359 * --------------------------------------------------------------------------
1360 */
1361
1362 var Dropdown = function ($) {
1363
1364 /**
1365 * ------------------------------------------------------------------------
1366 * Constants
1367 * ------------------------------------------------------------------------
1368 */
1369
1370 var NAME = 'dropdown';
1371 var VERSION = '4.0.0-alpha.6';
1372 var DATA_KEY = 'bs.dropdown';
1373 var EVENT_KEY = '.' + DATA_KEY;
1374 var DATA_API_KEY = '.data-api';
1375 var JQUERY_NO_CONFLICT = $.fn[NAME];
1376 var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
1377 var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key
1378 var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key
1379 var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)
1380
1381 var Event = {
1382 HIDE: 'hide' + EVENT_KEY,
1383 HIDDEN: 'hidden' + EVENT_KEY,
1384 SHOW: 'show' + EVENT_KEY,
1385 SHOWN: 'shown' + EVENT_KEY,
1386 CLICK: 'click' + EVENT_KEY,
1387 CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,
1388 FOCUSIN_DATA_API: 'focusin' + EVENT_KEY + DATA_API_KEY,
1389 KEYDOWN_DATA_API: 'keydown' + EVENT_KEY + DATA_API_KEY
1390 };
1391
1392 var ClassName = {
1393 BACKDROP: 'dropdown-backdrop',
1394 DISABLED: 'disabled',
1395 SHOW: 'show'
1396 };
1397
1398 var Selector = {
1399 BACKDROP: '.dropdown-backdrop',
1400 DATA_TOGGLE: '[data-toggle="dropdown"]',
1401 FORM_CHILD: '.dropdown form',
1402 ROLE_MENU: '[role="menu"]',
1403 ROLE_LISTBOX: '[role="listbox"]',
1404 NAVBAR_NAV: '.navbar-nav',
1405 VISIBLE_ITEMS: '[role="menu"] li:not(.disabled) a, ' + '[role="listbox"] li:not(.disabled) a'
1406 };
1407
1408 /**
1409 * ------------------------------------------------------------------------
1410 * Class Definition
1411 * ------------------------------------------------------------------------
1412 */
1413
1414 var Dropdown = function () {
1415 function Dropdown(element) {
1416 _classCallCheck(this, Dropdown);
1417
1418 this._element = element;
1419
1420 this._addEventListeners();
1421 }
1422
1423 // getters
1424
1425 // public
1426
1427 Dropdown.prototype.toggle = function toggle() {
1428 if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
1429 return false;
1430 }
1431
1432 var parent = Dropdown._getParentFromElement(this);
1433 var isActive = $(parent).hasClass(ClassName.SHOW);
1434
1435 Dropdown._clearMenus();
1436
1437 if (isActive) {
1438 return false;
1439 }
1440
1441 if ('ontouchstart' in document.documentElement && !$(parent).closest(Selector.NAVBAR_NAV).length) {
1442
1443 // if mobile we use a backdrop because click events don't delegate
1444 var dropdown = document.createElement('div');
1445 dropdown.className = ClassName.BACKDROP;
1446 $(dropdown).insertBefore(this);
1447 $(dropdown).on('click', Dropdown._clearMenus);
1448 }
1449
1450 var relatedTarget = {
1451 relatedTarget: this
1452 };
1453 var showEvent = $.Event(Event.SHOW, relatedTarget);
1454
1455 $(parent).trigger(showEvent);
1456
1457 if (showEvent.isDefaultPrevented()) {
1458 return false;
1459 }
1460
1461 this.focus();
1462 this.setAttribute('aria-expanded', true);
1463
1464 $(parent).toggleClass(ClassName.SHOW);
1465 $(parent).trigger($.Event(Event.SHOWN, relatedTarget));
1466
1467 return false;
1468 };
1469
1470 Dropdown.prototype.dispose = function dispose() {
1471 $.removeData(this._element, DATA_KEY);
1472 $(this._element).off(EVENT_KEY);
1473 this._element = null;
1474 };
1475
1476 // private
1477
1478 Dropdown.prototype._addEventListeners = function _addEventListeners() {
1479 $(this._element).on(Event.CLICK, this.toggle);
1480 };
1481
1482 // static
1483
1484 Dropdown._jQueryInterface = function _jQueryInterface(config) {
1485 return this.each(function () {
1486 var data = $(this).data(DATA_KEY);
1487
1488 if (!data) {
1489 data = new Dropdown(this);
1490 $(this).data(DATA_KEY, data);
1491 }
1492
1493 if (typeof config === 'string') {
1494 if (data[config] === undefined) {
1495 throw new Error('No method named "' + config + '"');
1496 }
1497 data[config].call(this);
1498 }
1499 });
1500 };
1501
1502 Dropdown._clearMenus = function _clearMenus(event) {
1503 if (event && event.which === RIGHT_MOUSE_BUTTON_WHICH) {
1504 return;
1505 }
1506
1507 var backdrop = $(Selector.BACKDROP)[0];
1508 if (backdrop) {
1509 backdrop.parentNode.removeChild(backdrop);
1510 }
1511
1512 var toggles = $.makeArray($(Selector.DATA_TOGGLE));
1513
1514 for (var i = 0; i < toggles.length; i++) {
1515 var parent = Dropdown._getParentFromElement(toggles[i]);
1516 var relatedTarget = {
1517 relatedTarget: toggles[i]
1518 };
1519
1520 if (!$(parent).hasClass(ClassName.SHOW)) {
1521 continue;
1522 }
1523
1524 if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'focusin') && $.contains(parent, event.target)) {
1525 continue;
1526 }
1527
1528 var hideEvent = $.Event(Event.HIDE, relatedTarget);
1529 $(parent).trigger(hideEvent);
1530 if (hideEvent.isDefaultPrevented()) {
1531 continue;
1532 }
1533
1534 toggles[i].setAttribute('aria-expanded', 'false');
1535
1536 $(parent).removeClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
1537 }
1538 };
1539
1540 Dropdown._getParentFromElement = function _getParentFromElement(element) {
1541 var parent = void 0;
1542 var selector = Util.getSelectorFromElement(element);
1543
1544 if (selector) {
1545 parent = $(selector)[0];
1546 }
1547
1548 return parent || element.parentNode;
1549 };
1550
1551 Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
1552 if (!/(38|40|27|32)/.test(event.which) || /input|textarea/i.test(event.target.tagName)) {
1553 return;
1554 }
1555
1556 event.preventDefault();
1557 event.stopPropagation();
1558
1559 if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
1560 return;
1561 }
1562
1563 var parent = Dropdown._getParentFromElement(this);
1564 var isActive = $(parent).hasClass(ClassName.SHOW);
1565
1566 if (!isActive && event.which !== ESCAPE_KEYCODE || isActive && event.which === ESCAPE_KEYCODE) {
1567
1568 if (event.which === ESCAPE_KEYCODE) {
1569 var toggle = $(parent).find(Selector.DATA_TOGGLE)[0];
1570 $(toggle).trigger('focus');
1571 }
1572
1573 $(this).trigger('click');
1574 return;
1575 }
1576
1577 var items = $(parent).find(Selector.VISIBLE_ITEMS).get();
1578
1579 if (!items.length) {
1580 return;
1581 }
1582
1583 var index = items.indexOf(event.target);
1584
1585 if (event.which === ARROW_UP_KEYCODE && index > 0) {
1586 // up
1587 index--;
1588 }
1589
1590 if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
1591 // down
1592 index++;
1593 }
1594
1595 if (index < 0) {
1596 index = 0;
1597 }
1598
1599 items[index].focus();
1600 };
1601
1602 _createClass(Dropdown, null, [{
1603 key: 'VERSION',
1604 get: function get() {
1605 return VERSION;
1606 }
1607 }]);
1608
1609 return Dropdown;
1610 }();
1611
1612 /**
1613 * ------------------------------------------------------------------------
1614 * Data Api implementation
1615 * ------------------------------------------------------------------------
1616 */
1617
1618 $(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_MENU, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_LISTBOX, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + ' ' + Event.FOCUSIN_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, Dropdown.prototype.toggle).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
1619 e.stopPropagation();
1620 });
1621
1622 /**
1623 * ------------------------------------------------------------------------
1624 * jQuery
1625 * ------------------------------------------------------------------------
1626 */
1627
1628 $.fn[NAME] = Dropdown._jQueryInterface;
1629 $.fn[NAME].Constructor = Dropdown;
1630 $.fn[NAME].noConflict = function () {
1631 $.fn[NAME] = JQUERY_NO_CONFLICT;
1632 return Dropdown._jQueryInterface;
1633 };
1634
1635 return Dropdown;
1636 }(jQuery);
1637
1638 /**
1639 * --------------------------------------------------------------------------
1640 * Bootstrap (v4.0.0-alpha.6): modal.js
1641 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1642 * --------------------------------------------------------------------------
1643 */
1644
1645 var Modal = function ($) {
1646
1647 /**
1648 * ------------------------------------------------------------------------
1649 * Constants
1650 * ------------------------------------------------------------------------
1651 */
1652
1653 var NAME = 'modal';
1654 var VERSION = '4.0.0-alpha.6';
1655 var DATA_KEY = 'bs.modal';
1656 var EVENT_KEY = '.' + DATA_KEY;
1657 var DATA_API_KEY = '.data-api';
1658 var JQUERY_NO_CONFLICT = $.fn[NAME];
1659 var TRANSITION_DURATION = 300;
1660 var BACKDROP_TRANSITION_DURATION = 150;
1661 var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
1662
1663 var Default = {
1664 backdrop: true,
1665 keyboard: true,
1666 focus: true,
1667 show: true
1668 };
1669
1670 var DefaultType = {
1671 backdrop: '(boolean|string)',
1672 keyboard: 'boolean',
1673 focus: 'boolean',
1674 show: 'boolean'
1675 };
1676
1677 var Event = {
1678 HIDE: 'hide' + EVENT_KEY,
1679 HIDDEN: 'hidden' + EVENT_KEY,
1680 SHOW: 'show' + EVENT_KEY,
1681 SHOWN: 'shown' + EVENT_KEY,
1682 FOCUSIN: 'focusin' + EVENT_KEY,
1683 RESIZE: 'resize' + EVENT_KEY,
1684 CLICK_DISMISS: 'click.dismiss' + EVENT_KEY,
1685 KEYDOWN_DISMISS: 'keydown.dismiss' + EVENT_KEY,
1686 MOUSEUP_DISMISS: 'mouseup.dismiss' + EVENT_KEY,
1687 MOUSEDOWN_DISMISS: 'mousedown.dismiss' + EVENT_KEY,
1688 CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
1689 };
1690
1691 var ClassName = {
1692 SCROLLBAR_MEASURER: 'modal-scrollbar-measure',
1693 BACKDROP: 'modal-backdrop',
1694 OPEN: 'modal-open',
1695 FADE: 'fade',
1696 SHOW: 'show'
1697 };
1698
1699 var Selector = {
1700 DIALOG: '.modal-dialog',
1701 DATA_TOGGLE: '[data-toggle="modal"]',
1702 DATA_DISMISS: '[data-dismiss="modal"]',
1703 FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'
1704 };
1705
1706 /**
1707 * ------------------------------------------------------------------------
1708 * Class Definition
1709 * ------------------------------------------------------------------------
1710 */
1711
1712 var Modal = function () {
1713 function Modal(element, config) {
1714 _classCallCheck(this, Modal);
1715
1716 this._config = this._getConfig(config);
1717 this._element = element;
1718 this._dialog = $(element).find(Selector.DIALOG)[0];
1719 this._backdrop = null;
1720 this._isShown = false;
1721 this._isBodyOverflowing = false;
1722 this._ignoreBackdropClick = false;
1723 this._isTransitioning = false;
1724 this._originalBodyPadding = 0;
1725 this._scrollbarWidth = 0;
1726 }
1727
1728 // getters
1729
1730 // public
1731
1732 Modal.prototype.toggle = function toggle(relatedTarget) {
1733 return this._isShown ? this.hide() : this.show(relatedTarget);
1734 };
1735
1736 Modal.prototype.show = function show(relatedTarget) {
1737 var _this9 = this;
1738
1739 if (this._isTransitioning) {
1740 throw new Error('Modal is transitioning');
1741 }
1742
1743 if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
1744 this._isTransitioning = true;
1745 }
1746 var showEvent = $.Event(Event.SHOW, {
1747 relatedTarget: relatedTarget
1748 });
1749
1750 $(this._element).trigger(showEvent);
1751
1752 if (this._isShown || showEvent.isDefaultPrevented()) {
1753 return;
1754 }
1755
1756 this._isShown = true;
1757
1758 this._checkScrollbar();
1759 this._setScrollbar();
1760
1761 $(document.body).addClass(ClassName.OPEN);
1762
1763 this._setEscapeEvent();
1764 this._setResizeEvent();
1765
1766 $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) {
1767 return _this9.hide(event);
1768 });
1769
1770 $(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {
1771 $(_this9._element).one(Event.MOUSEUP_DISMISS, function (event) {
1772 if ($(event.target).is(_this9._element)) {
1773 _this9._ignoreBackdropClick = true;
1774 }
1775 });
1776 });
1777
1778 this._showBackdrop(function () {
1779 return _this9._showElement(relatedTarget);
1780 });
1781 };
1782
1783 Modal.prototype.hide = function hide(event) {
1784 var _this10 = this;
1785
1786 if (event) {
1787 event.preventDefault();
1788 }
1789
1790 if (this._isTransitioning) {
1791 throw new Error('Modal is transitioning');
1792 }
1793
1794 var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);
1795 if (transition) {
1796 this._isTransitioning = true;
1797 }
1798
1799 var hideEvent = $.Event(Event.HIDE);
1800 $(this._element).trigger(hideEvent);
1801
1802 if (!this._isShown || hideEvent.isDefaultPrevented()) {
1803 return;
1804 }
1805
1806 this._isShown = false;
1807
1808 this._setEscapeEvent();
1809 this._setResizeEvent();
1810
1811 $(document).off(Event.FOCUSIN);
1812
1813 $(this._element).removeClass(ClassName.SHOW);
1814
1815 $(this._element).off(Event.CLICK_DISMISS);
1816 $(this._dialog).off(Event.MOUSEDOWN_DISMISS);
1817
1818 if (transition) {
1819 $(this._element).one(Util.TRANSITION_END, function (event) {
1820 return _this10._hideModal(event);
1821 }).emulateTransitionEnd(TRANSITION_DURATION);
1822 } else {
1823 this._hideModal();
1824 }
1825 };
1826
1827 Modal.prototype.dispose = function dispose() {
1828 $.removeData(this._element, DATA_KEY);
1829
1830 $(window, document, this._element, this._backdrop).off(EVENT_KEY);
1831
1832 this._config = null;
1833 this._element = null;
1834 this._dialog = null;
1835 this._backdrop = null;
1836 this._isShown = null;
1837 this._isBodyOverflowing = null;
1838 this._ignoreBackdropClick = null;
1839 this._originalBodyPadding = null;
1840 this._scrollbarWidth = null;
1841 };
1842
1843 // private
1844
1845 Modal.prototype._getConfig = function _getConfig(config) {
1846 config = $.extend({}, Default, config);
1847 Util.typeCheckConfig(NAME, config, DefaultType);
1848 return config;
1849 };
1850
1851 Modal.prototype._showElement = function _showElement(relatedTarget) {
1852 var _this11 = this;
1853
1854 var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);
1855
1856 if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
1857 // don't move modals dom position
1858 document.body.appendChild(this._element);
1859 }
1860
1861 this._element.style.display = 'block';
1862 this._element.removeAttribute('aria-hidden');
1863 this._element.scrollTop = 0;
1864
1865 if (transition) {
1866 Util.reflow(this._element);
1867 }
1868
1869 $(this._element).addClass(ClassName.SHOW);
1870
1871 if (this._config.focus) {
1872 this._enforceFocus();
1873 }
1874
1875 var shownEvent = $.Event(Event.SHOWN, {
1876 relatedTarget: relatedTarget
1877 });
1878
1879 var transitionComplete = function transitionComplete() {
1880 if (_this11._config.focus) {
1881 _this11._element.focus();
1882 }
1883 _this11._isTransitioning = false;
1884 $(_this11._element).trigger(shownEvent);
1885 };
1886
1887 if (transition) {
1888 $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(TRANSITION_DURATION);
1889 } else {
1890 transitionComplete();
1891 }
1892 };
1893
1894 Modal.prototype._enforceFocus = function _enforceFocus() {
1895 var _this12 = this;
1896
1897 $(document).off(Event.FOCUSIN) // guard against infinite focus loop
1898 .on(Event.FOCUSIN, function (event) {
1899 if (document !== event.target && _this12._element !== event.target && !$(_this12._element).has(event.target).length) {
1900 _this12._element.focus();
1901 }
1902 });
1903 };
1904
1905 Modal.prototype._setEscapeEvent = function _setEscapeEvent() {
1906 var _this13 = this;
1907
1908 if (this._isShown && this._config.keyboard) {
1909 $(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
1910 if (event.which === ESCAPE_KEYCODE) {
1911 _this13.hide();
1912 }
1913 });
1914 } else if (!this._isShown) {
1915 $(this._element).off(Event.KEYDOWN_DISMISS);
1916 }
1917 };
1918
1919 Modal.prototype._setResizeEvent = function _setResizeEvent() {
1920 var _this14 = this;
1921
1922 if (this._isShown) {
1923 $(window).on(Event.RESIZE, function (event) {
1924 return _this14._handleUpdate(event);
1925 });
1926 } else {
1927 $(window).off(Event.RESIZE);
1928 }
1929 };
1930
1931 Modal.prototype._hideModal = function _hideModal() {
1932 var _this15 = this;
1933
1934 this._element.style.display = 'none';
1935 this._element.setAttribute('aria-hidden', 'true');
1936 this._isTransitioning = false;
1937 this._showBackdrop(function () {
1938 $(document.body).removeClass(ClassName.OPEN);
1939 _this15._resetAdjustments();
1940 _this15._resetScrollbar();
1941 $(_this15._element).trigger(Event.HIDDEN);
1942 });
1943 };
1944
1945 Modal.prototype._removeBackdrop = function _removeBackdrop() {
1946 if (this._backdrop) {
1947 $(this._backdrop).remove();
1948 this._backdrop = null;
1949 }
1950 };
1951
1952 Modal.prototype._showBackdrop = function _showBackdrop(callback) {
1953 var _this16 = this;
1954
1955 var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';
1956
1957 if (this._isShown && this._config.backdrop) {
1958 var doAnimate = Util.supportsTransitionEnd() && animate;
1959
1960 this._backdrop = document.createElement('div');
1961 this._backdrop.className = ClassName.BACKDROP;
1962
1963 if (animate) {
1964 $(this._backdrop).addClass(animate);
1965 }
1966
1967 $(this._backdrop).appendTo(document.body);
1968
1969 $(this._element).on(Event.CLICK_DISMISS, function (event) {
1970 if (_this16._ignoreBackdropClick) {
1971 _this16._ignoreBackdropClick = false;
1972 return;
1973 }
1974 if (event.target !== event.currentTarget) {
1975 return;
1976 }
1977 if (_this16._config.backdrop === 'static') {
1978 _this16._element.focus();
1979 } else {
1980 _this16.hide();
1981 }
1982 });
1983
1984 if (doAnimate) {
1985 Util.reflow(this._backdrop);
1986 }
1987
1988 $(this._backdrop).addClass(ClassName.SHOW);
1989
1990 if (!callback) {
1991 return;
1992 }
1993
1994 if (!doAnimate) {
1995 callback();
1996 return;
1997 }
1998
1999 $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);
2000 } else if (!this._isShown && this._backdrop) {
2001 $(this._backdrop).removeClass(ClassName.SHOW);
2002
2003 var callbackRemove = function callbackRemove() {
2004 _this16._removeBackdrop();
2005 if (callback) {
2006 callback();
2007 }
2008 };
2009
2010 if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
2011 $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);
2012 } else {
2013 callbackRemove();
2014 }
2015 } else if (callback) {
2016 callback();
2017 }
2018 };
2019
2020 // ----------------------------------------------------------------------
2021 // the following methods are used to handle overflowing modals
2022 // todo (fat): these should probably be refactored out of modal.js
2023 // ----------------------------------------------------------------------
2024
2025 Modal.prototype._handleUpdate = function _handleUpdate() {
2026 this._adjustDialog();
2027 };
2028
2029 Modal.prototype._adjustDialog = function _adjustDialog() {
2030 var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
2031
2032 if (!this._isBodyOverflowing && isModalOverflowing) {
2033 this._element.style.paddingLeft = this._scrollbarWidth + 'px';
2034 }
2035
2036 if (this._isBodyOverflowing && !isModalOverflowing) {
2037 this._element.style.paddingRight = this._scrollbarWidth + 'px';
2038 }
2039 };
2040
2041 Modal.prototype._resetAdjustments = function _resetAdjustments() {
2042 this._element.style.paddingLeft = '';
2043 this._element.style.paddingRight = '';
2044 };
2045
2046 Modal.prototype._checkScrollbar = function _checkScrollbar() {
2047 this._isBodyOverflowing = document.body.clientWidth < window.innerWidth;
2048 this._scrollbarWidth = this._getScrollbarWidth();
2049 };
2050
2051 Modal.prototype._setScrollbar = function _setScrollbar() {
2052 var bodyPadding = parseInt($(Selector.FIXED_CONTENT).css('padding-right') || 0, 10);
2053
2054 this._originalBodyPadding = document.body.style.paddingRight || '';
2055
2056 if (this._isBodyOverflowing) {
2057 document.body.style.paddingRight = bodyPadding + this._scrollbarWidth + 'px';
2058 }
2059 };
2060
2061 Modal.prototype._resetScrollbar = function _resetScrollbar() {
2062 document.body.style.paddingRight = this._originalBodyPadding;
2063 };
2064
2065 Modal.prototype._getScrollbarWidth = function _getScrollbarWidth() {
2066 // thx d.walsh
2067 var scrollDiv = document.createElement('div');
2068 scrollDiv.className = ClassName.SCROLLBAR_MEASURER;
2069 document.body.appendChild(scrollDiv);
2070 var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
2071 document.body.removeChild(scrollDiv);
2072 return scrollbarWidth;
2073 };
2074
2075 // static
2076
2077 Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
2078 return this.each(function () {
2079 var data = $(this).data(DATA_KEY);
2080 var _config = $.extend({}, Modal.Default, $(this).data(), (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config);
2081
2082 if (!data) {
2083 data = new Modal(this, _config);
2084 $(this).data(DATA_KEY, data);
2085 }
2086
2087 if (typeof config === 'string') {
2088 if (data[config] === undefined) {
2089 throw new Error('No method named "' + config + '"');
2090 }
2091 data[config](relatedTarget);
2092 } else if (_config.show) {
2093 data.show(relatedTarget);
2094 }
2095 });
2096 };
2097
2098 _createClass(Modal, null, [{
2099 key: 'VERSION',
2100 get: function get() {
2101 return VERSION;
2102 }
2103 }, {
2104 key: 'Default',
2105 get: function get() {
2106 return Default;
2107 }
2108 }]);
2109
2110 return Modal;
2111 }();
2112
2113 /**
2114 * ------------------------------------------------------------------------
2115 * Data Api implementation
2116 * ------------------------------------------------------------------------
2117 */
2118
2119 $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
2120 var _this17 = this;
2121
2122 var target = void 0;
2123 var selector = Util.getSelectorFromElement(this);
2124
2125 if (selector) {
2126 target = $(selector)[0];
2127 }
2128
2129 var config = $(target).data(DATA_KEY) ? 'toggle' : $.extend({}, $(target).data(), $(this).data());
2130
2131 if (this.tagName === 'A' || this.tagName === 'AREA') {
2132 event.preventDefault();
2133 }
2134
2135 var $target = $(target).one(Event.SHOW, function (showEvent) {
2136 if (showEvent.isDefaultPrevented()) {
2137 // only register focus restorer if modal will actually get shown
2138 return;
2139 }
2140
2141 $target.one(Event.HIDDEN, function () {
2142 if ($(_this17).is(':visible')) {
2143 _this17.focus();
2144 }
2145 });
2146 });
2147
2148 Modal._jQueryInterface.call($(target), config, this);
2149 });
2150
2151 /**
2152 * ------------------------------------------------------------------------
2153 * jQuery
2154 * ------------------------------------------------------------------------
2155 */
2156
2157 $.fn[NAME] = Modal._jQueryInterface;
2158 $.fn[NAME].Constructor = Modal;
2159 $.fn[NAME].noConflict = function () {
2160 $.fn[NAME] = JQUERY_NO_CONFLICT;
2161 return Modal._jQueryInterface;
2162 };
2163
2164 return Modal;
2165 }(jQuery);
2166
2167 /**
2168 * --------------------------------------------------------------------------
2169 * Bootstrap (v4.0.0-alpha.6): scrollspy.js
2170 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2171 * --------------------------------------------------------------------------
2172 */
2173
2174 var ScrollSpy = function ($) {
2175
2176 /**
2177 * ------------------------------------------------------------------------
2178 * Constants
2179 * ------------------------------------------------------------------------
2180 */
2181
2182 var NAME = 'scrollspy';
2183 var VERSION = '4.0.0-alpha.6';
2184 var DATA_KEY = 'bs.scrollspy';
2185 var EVENT_KEY = '.' + DATA_KEY;
2186 var DATA_API_KEY = '.data-api';
2187 var JQUERY_NO_CONFLICT = $.fn[NAME];
2188
2189 var Default = {
2190 offset: 10,
2191 method: 'auto',
2192 target: ''
2193 };
2194
2195 var DefaultType = {
2196 offset: 'number',
2197 method: 'string',
2198 target: '(string|element)'
2199 };
2200
2201 var Event = {
2202 ACTIVATE: 'activate' + EVENT_KEY,
2203 SCROLL: 'scroll' + EVENT_KEY,
2204 LOAD_DATA_API: 'load' + EVENT_KEY + DATA_API_KEY
2205 };
2206
2207 var ClassName = {
2208 DROPDOWN_ITEM: 'dropdown-item',
2209 DROPDOWN_MENU: 'dropdown-menu',
2210 NAV_LINK: 'nav-link',
2211 NAV: 'nav',
2212 ACTIVE: 'active'
2213 };
2214
2215 var Selector = {
2216 DATA_SPY: '[data-spy="scroll"]',
2217 ACTIVE: '.active',
2218 LIST_ITEM: '.list-item',
2219 LI: 'li',
2220 LI_DROPDOWN: 'li.dropdown',
2221 NAV_LINKS: '.nav-link',
2222 DROPDOWN: '.dropdown',
2223 DROPDOWN_ITEMS: '.dropdown-item',
2224 DROPDOWN_TOGGLE: '.dropdown-toggle'
2225 };
2226
2227 var OffsetMethod = {
2228 OFFSET: 'offset',
2229 POSITION: 'position'
2230 };
2231
2232 /**
2233 * ------------------------------------------------------------------------
2234 * Class Definition
2235 * ------------------------------------------------------------------------
2236 */
2237
2238 var ScrollSpy = function () {
2239 function ScrollSpy(element, config) {
2240 var _this18 = this;
2241
2242 _classCallCheck(this, ScrollSpy);
2243
2244 this._element = element;
2245 this._scrollElement = element.tagName === 'BODY' ? window : element;
2246 this._config = this._getConfig(config);
2247 this._selector = this._config.target + ' ' + Selector.NAV_LINKS + ',' + (this._config.target + ' ' + Selector.DROPDOWN_ITEMS);
2248 this._offsets = [];
2249 this._targets = [];
2250 this._activeTarget = null;
2251 this._scrollHeight = 0;
2252
2253 $(this._scrollElement).on(Event.SCROLL, function (event) {
2254 return _this18._process(event);
2255 });
2256
2257 this.refresh();
2258 this._process();
2259 }
2260
2261 // getters
2262
2263 // public
2264
2265 ScrollSpy.prototype.refresh = function refresh() {
2266 var _this19 = this;
2267
2268 var autoMethod = this._scrollElement !== this._scrollElement.window ? OffsetMethod.POSITION : OffsetMethod.OFFSET;
2269
2270 var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
2271
2272 var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;
2273
2274 this._offsets = [];
2275 this._targets = [];
2276
2277 this._scrollHeight = this._getScrollHeight();
2278
2279 var targets = $.makeArray($(this._selector));
2280
2281 targets.map(function (element) {
2282 var target = void 0;
2283 var targetSelector = Util.getSelectorFromElement(element);
2284
2285 if (targetSelector) {
2286 target = $(targetSelector)[0];
2287 }
2288
2289 if (target && (target.offsetWidth || target.offsetHeight)) {
2290 // todo (fat): remove sketch reliance on jQuery position/offset
2291 return [$(target)[offsetMethod]().top + offsetBase, targetSelector];
2292 }
2293 return null;
2294 }).filter(function (item) {
2295 return item;
2296 }).sort(function (a, b) {
2297 return a[0] - b[0];
2298 }).forEach(function (item) {
2299 _this19._offsets.push(item[0]);
2300 _this19._targets.push(item[1]);
2301 });
2302 };
2303
2304 ScrollSpy.prototype.dispose = function dispose() {
2305 $.removeData(this._element, DATA_KEY);
2306 $(this._scrollElement).off(EVENT_KEY);
2307
2308 this._element = null;
2309 this._scrollElement = null;
2310 this._config = null;
2311 this._selector = null;
2312 this._offsets = null;
2313 this._targets = null;
2314 this._activeTarget = null;
2315 this._scrollHeight = null;
2316 };
2317
2318 // private
2319
2320 ScrollSpy.prototype._getConfig = function _getConfig(config) {
2321 config = $.extend({}, Default, config);
2322
2323 if (typeof config.target !== 'string') {
2324 var id = $(config.target).attr('id');
2325 if (!id) {
2326 id = Util.getUID(NAME);
2327 $(config.target).attr('id', id);
2328 }
2329 config.target = '#' + id;
2330 }
2331
2332 Util.typeCheckConfig(NAME, config, DefaultType);
2333
2334 return config;
2335 };
2336
2337 ScrollSpy.prototype._getScrollTop = function _getScrollTop() {
2338 return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
2339 };
2340
2341 ScrollSpy.prototype._getScrollHeight = function _getScrollHeight() {
2342 return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
2343 };
2344
2345 ScrollSpy.prototype._getOffsetHeight = function _getOffsetHeight() {
2346 return this._scrollElement === window ? window.innerHeight : this._scrollElement.offsetHeight;
2347 };
2348
2349 ScrollSpy.prototype._process = function _process() {
2350 var scrollTop = this._getScrollTop() + this._config.offset;
2351 var scrollHeight = this._getScrollHeight();
2352 var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
2353
2354 if (this._scrollHeight !== scrollHeight) {
2355 this.refresh();
2356 }
2357
2358 if (scrollTop >= maxScroll) {
2359 var target = this._targets[this._targets.length - 1];
2360
2361 if (this._activeTarget !== target) {
2362 this._activate(target);
2363 }
2364 return;
2365 }
2366
2367 if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
2368 this._activeTarget = null;
2369 this._clear();
2370 return;
2371 }
2372
2373 for (var i = this._offsets.length; i--;) {
2374 var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (this._offsets[i + 1] === undefined || scrollTop < this._offsets[i + 1]);
2375
2376 if (isActiveTarget) {
2377 this._activate(this._targets[i]);
2378 }
2379 }
2380 };
2381
2382 ScrollSpy.prototype._activate = function _activate(target) {
2383 this._activeTarget = target;
2384
2385 this._clear();
2386
2387 var queries = this._selector.split(',');
2388 queries = queries.map(function (selector) {
2389 return selector + '[data-target="' + target + '"],' + (selector + '[href="' + target + '"]');
2390 });
2391
2392 var $link = $(queries.join(','));
2393
2394 if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {
2395 $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);
2396 $link.addClass(ClassName.ACTIVE);
2397 } else {
2398 // todo (fat) this is kinda sus...
2399 // recursively add actives to tested nav-links
2400 $link.parents(Selector.LI).find('> ' + Selector.NAV_LINKS).addClass(ClassName.ACTIVE);
2401 }
2402
2403 $(this._scrollElement).trigger(Event.ACTIVATE, {
2404 relatedTarget: target
2405 });
2406 };
2407
2408 ScrollSpy.prototype._clear = function _clear() {
2409 $(this._selector).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE);
2410 };
2411
2412 // static
2413
2414 ScrollSpy._jQueryInterface = function _jQueryInterface(config) {
2415 return this.each(function () {
2416 var data = $(this).data(DATA_KEY);
2417 var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config;
2418
2419 if (!data) {
2420 data = new ScrollSpy(this, _config);
2421 $(this).data(DATA_KEY, data);
2422 }
2423
2424 if (typeof config === 'string') {
2425 if (data[config] === undefined) {
2426 throw new Error('No method named "' + config + '"');
2427 }
2428 data[config]();
2429 }
2430 });
2431 };
2432
2433 _createClass(ScrollSpy, null, [{
2434 key: 'VERSION',
2435 get: function get() {
2436 return VERSION;
2437 }
2438 }, {
2439 key: 'Default',
2440 get: function get() {
2441 return Default;
2442 }
2443 }]);
2444
2445 return ScrollSpy;
2446 }();
2447
2448 /**
2449 * ------------------------------------------------------------------------
2450 * Data Api implementation
2451 * ------------------------------------------------------------------------
2452 */
2453
2454 $(window).on(Event.LOAD_DATA_API, function () {
2455 var scrollSpys = $.makeArray($(Selector.DATA_SPY));
2456
2457 for (var i = scrollSpys.length; i--;) {
2458 var $spy = $(scrollSpys[i]);
2459 ScrollSpy._jQueryInterface.call($spy, $spy.data());
2460 }
2461 });
2462
2463 /**
2464 * ------------------------------------------------------------------------
2465 * jQuery
2466 * ------------------------------------------------------------------------
2467 */
2468
2469 $.fn[NAME] = ScrollSpy._jQueryInterface;
2470 $.fn[NAME].Constructor = ScrollSpy;
2471 $.fn[NAME].noConflict = function () {
2472 $.fn[NAME] = JQUERY_NO_CONFLICT;
2473 return ScrollSpy._jQueryInterface;
2474 };
2475
2476 return ScrollSpy;
2477 }(jQuery);
2478
2479 /**
2480 * --------------------------------------------------------------------------
2481 * Bootstrap (v4.0.0-alpha.6): tab.js
2482 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2483 * --------------------------------------------------------------------------
2484 */
2485
2486 var Tab = function ($) {
2487
2488 /**
2489 * ------------------------------------------------------------------------
2490 * Constants
2491 * ------------------------------------------------------------------------
2492 */
2493
2494 var NAME = 'tab';
2495 var VERSION = '4.0.0-alpha.6';
2496 var DATA_KEY = 'bs.tab';
2497 var EVENT_KEY = '.' + DATA_KEY;
2498 var DATA_API_KEY = '.data-api';
2499 var JQUERY_NO_CONFLICT = $.fn[NAME];
2500 var TRANSITION_DURATION = 150;
2501
2502 var Event = {
2503 HIDE: 'hide' + EVENT_KEY,
2504 HIDDEN: 'hidden' + EVENT_KEY,
2505 SHOW: 'show' + EVENT_KEY,
2506 SHOWN: 'shown' + EVENT_KEY,
2507 CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
2508 };
2509
2510 var ClassName = {
2511 DROPDOWN_MENU: 'dropdown-menu',
2512 ACTIVE: 'active',
2513 DISABLED: 'disabled',
2514 FADE: 'fade',
2515 SHOW: 'show'
2516 };
2517
2518 var Selector = {
2519 A: 'a',
2520 LI: 'li',
2521 DROPDOWN: '.dropdown',
2522 LIST: 'ul:not(.dropdown-menu), ol:not(.dropdown-menu), nav:not(.dropdown-menu)',
2523 FADE_CHILD: '> .nav-item .fade, > .fade',
2524 ACTIVE: '.active',
2525 ACTIVE_CHILD: '> .nav-item > .active, > .active',
2526 DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"]',
2527 DROPDOWN_TOGGLE: '.dropdown-toggle',
2528 DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
2529 };
2530
2531 /**
2532 * ------------------------------------------------------------------------
2533 * Class Definition
2534 * ------------------------------------------------------------------------
2535 */
2536
2537 var Tab = function () {
2538 function Tab(element) {
2539 _classCallCheck(this, Tab);
2540
2541 this._element = element;
2542 }
2543
2544 // getters
2545
2546 // public
2547
2548 Tab.prototype.show = function show() {
2549 var _this20 = this;
2550
2551 if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName.ACTIVE) || $(this._element).hasClass(ClassName.DISABLED)) {
2552 return;
2553 }
2554
2555 var target = void 0;
2556 var previous = void 0;
2557 var listElement = $(this._element).closest(Selector.LIST)[0];
2558 var selector = Util.getSelectorFromElement(this._element);
2559
2560 if (listElement) {
2561 previous = $.makeArray($(listElement).find(Selector.ACTIVE));
2562 previous = previous[previous.length - 1];
2563 }
2564
2565 var hideEvent = $.Event(Event.HIDE, {
2566 relatedTarget: this._element
2567 });
2568
2569 var showEvent = $.Event(Event.SHOW, {
2570 relatedTarget: previous
2571 });
2572
2573 if (previous) {
2574 $(previous).trigger(hideEvent);
2575 }
2576
2577 $(this._element).trigger(showEvent);
2578
2579 if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {
2580 return;
2581 }
2582
2583 if (selector) {
2584 target = $(selector)[0];
2585 }
2586
2587 this._activate(this._element, listElement);
2588
2589 var complete = function complete() {
2590 var hiddenEvent = $.Event(Event.HIDDEN, {
2591 relatedTarget: _this20._element
2592 });
2593
2594 var shownEvent = $.Event(Event.SHOWN, {
2595 relatedTarget: previous
2596 });
2597
2598 $(previous).trigger(hiddenEvent);
2599 $(_this20._element).trigger(shownEvent);
2600 };
2601
2602 if (target) {
2603 this._activate(target, target.parentNode, complete);
2604 } else {
2605 complete();
2606 }
2607 };
2608
2609 Tab.prototype.dispose = function dispose() {
2610 $.removeClass(this._element, DATA_KEY);
2611 this._element = null;
2612 };
2613
2614 // private
2615
2616 Tab.prototype._activate = function _activate(element, container, callback) {
2617 var _this21 = this;
2618
2619 var active = $(container).find(Selector.ACTIVE_CHILD)[0];
2620 var isTransitioning = callback && Util.supportsTransitionEnd() && (active && $(active).hasClass(ClassName.FADE) || Boolean($(container).find(Selector.FADE_CHILD)[0]));
2621
2622 var complete = function complete() {
2623 return _this21._transitionComplete(element, active, isTransitioning, callback);
2624 };
2625
2626 if (active && isTransitioning) {
2627 $(active).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
2628 } else {
2629 complete();
2630 }
2631
2632 if (active) {
2633 $(active).removeClass(ClassName.SHOW);
2634 }
2635 };
2636
2637 Tab.prototype._transitionComplete = function _transitionComplete(element, active, isTransitioning, callback) {
2638 if (active) {
2639 $(active).removeClass(ClassName.ACTIVE);
2640
2641 var dropdownChild = $(active.parentNode).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];
2642
2643 if (dropdownChild) {
2644 $(dropdownChild).removeClass(ClassName.ACTIVE);
2645 }
2646
2647 active.setAttribute('aria-expanded', false);
2648 }
2649
2650 $(element).addClass(ClassName.ACTIVE);
2651 element.setAttribute('aria-expanded', true);
2652
2653 if (isTransitioning) {
2654 Util.reflow(element);
2655 $(element).addClass(ClassName.SHOW);
2656 } else {
2657 $(element).removeClass(ClassName.FADE);
2658 }
2659
2660 if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {
2661
2662 var dropdownElement = $(element).closest(Selector.DROPDOWN)[0];
2663 if (dropdownElement) {
2664 $(dropdownElement).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);
2665 }
2666
2667 element.setAttribute('aria-expanded', true);
2668 }
2669
2670 if (callback) {
2671 callback();
2672 }
2673 };
2674
2675 // static
2676
2677 Tab._jQueryInterface = function _jQueryInterface(config) {
2678 return this.each(function () {
2679 var $this = $(this);
2680 var data = $this.data(DATA_KEY);
2681
2682 if (!data) {
2683 data = new Tab(this);
2684 $this.data(DATA_KEY, data);
2685 }
2686
2687 if (typeof config === 'string') {
2688 if (data[config] === undefined) {
2689 throw new Error('No method named "' + config + '"');
2690 }
2691 data[config]();
2692 }
2693 });
2694 };
2695
2696 _createClass(Tab, null, [{
2697 key: 'VERSION',
2698 get: function get() {
2699 return VERSION;
2700 }
2701 }]);
2702
2703 return Tab;
2704 }();
2705
2706 /**
2707 * ------------------------------------------------------------------------
2708 * Data Api implementation
2709 * ------------------------------------------------------------------------
2710 */
2711
2712 $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
2713 event.preventDefault();
2714 Tab._jQueryInterface.call($(this), 'show');
2715 });
2716
2717 /**
2718 * ------------------------------------------------------------------------
2719 * jQuery
2720 * ------------------------------------------------------------------------
2721 */
2722
2723 $.fn[NAME] = Tab._jQueryInterface;
2724 $.fn[NAME].Constructor = Tab;
2725 $.fn[NAME].noConflict = function () {
2726 $.fn[NAME] = JQUERY_NO_CONFLICT;
2727 return Tab._jQueryInterface;
2728 };
2729
2730 return Tab;
2731 }(jQuery);
2732
2733 /* global Tether */
2734
2735 /**
2736 * --------------------------------------------------------------------------
2737 * Bootstrap (v4.0.0-alpha.6): tooltip.js
2738 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2739 * --------------------------------------------------------------------------
2740 */
2741
2742 var Tooltip = function ($) {
2743
2744 /**
2745 * Check for Tether dependency
2746 * Tether - http://tether.io/
2747 */
2748 if (typeof Tether === 'undefined') {
2749 throw new Error('Bootstrap tooltips require Tether (http://tether.io/)');
2750 }
2751
2752 /**
2753 * ------------------------------------------------------------------------
2754 * Constants
2755 * ------------------------------------------------------------------------
2756 */
2757
2758 var NAME = 'tooltip';
2759 var VERSION = '4.0.0-alpha.6';
2760 var DATA_KEY = 'bs.tooltip';
2761 var EVENT_KEY = '.' + DATA_KEY;
2762 var JQUERY_NO_CONFLICT = $.fn[NAME];
2763 var TRANSITION_DURATION = 150;
2764 var CLASS_PREFIX = 'bs-tether';
2765
2766 var Default = {
2767 animation: true,
2768 template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-inner"></div></div>',
2769 trigger: 'hover focus',
2770 title: '',
2771 delay: 0,
2772 html: false,
2773 selector: false,
2774 placement: 'top',
2775 offset: '0 0',
2776 constraints: [],
2777 container: false
2778 };
2779
2780 var DefaultType = {
2781 animation: 'boolean',
2782 template: 'string',
2783 title: '(string|element|function)',
2784 trigger: 'string',
2785 delay: '(number|object)',
2786 html: 'boolean',
2787 selector: '(string|boolean)',
2788 placement: '(string|function)',
2789 offset: 'string',
2790 constraints: 'array',
2791 container: '(string|element|boolean)'
2792 };
2793
2794 var AttachmentMap = {
2795 TOP: 'bottom center',
2796 RIGHT: 'middle left',
2797 BOTTOM: 'top center',
2798 LEFT: 'middle right'
2799 };
2800
2801 var HoverState = {
2802 SHOW: 'show',
2803 OUT: 'out'
2804 };
2805
2806 var Event = {
2807 HIDE: 'hide' + EVENT_KEY,
2808 HIDDEN: 'hidden' + EVENT_KEY,
2809 SHOW: 'show' + EVENT_KEY,
2810 SHOWN: 'shown' + EVENT_KEY,
2811 INSERTED: 'inserted' + EVENT_KEY,
2812 CLICK: 'click' + EVENT_KEY,
2813 FOCUSIN: 'focusin' + EVENT_KEY,
2814 FOCUSOUT: 'focusout' + EVENT_KEY,
2815 MOUSEENTER: 'mouseenter' + EVENT_KEY,
2816 MOUSELEAVE: 'mouseleave' + EVENT_KEY
2817 };
2818
2819 var ClassName = {
2820 FADE: 'fade',
2821 SHOW: 'show'
2822 };
2823
2824 var Selector = {
2825 TOOLTIP: '.tooltip',
2826 TOOLTIP_INNER: '.tooltip-inner'
2827 };
2828
2829 var TetherClass = {
2830 element: false,
2831 enabled: false
2832 };
2833
2834 var Trigger = {
2835 HOVER: 'hover',
2836 FOCUS: 'focus',
2837 CLICK: 'click',
2838 MANUAL: 'manual'
2839 };
2840
2841 /**
2842 * ------------------------------------------------------------------------
2843 * Class Definition
2844 * ------------------------------------------------------------------------
2845 */
2846
2847 var Tooltip = function () {
2848 function Tooltip(element, config) {
2849 _classCallCheck(this, Tooltip);
2850
2851 // private
2852 this._isEnabled = true;
2853 this._timeout = 0;
2854 this._hoverState = '';
2855 this._activeTrigger = {};
2856 this._isTransitioning = false;
2857 this._tether = null;
2858
2859 // protected
2860 this.element = element;
2861 this.config = this._getConfig(config);
2862 this.tip = null;
2863
2864 this._setListeners();
2865 }
2866
2867 // getters
2868
2869 // public
2870
2871 Tooltip.prototype.enable = function enable() {
2872 this._isEnabled = true;
2873 };
2874
2875 Tooltip.prototype.disable = function disable() {
2876 this._isEnabled = false;
2877 };
2878
2879 Tooltip.prototype.toggleEnabled = function toggleEnabled() {
2880 this._isEnabled = !this._isEnabled;
2881 };
2882
2883 Tooltip.prototype.toggle = function toggle(event) {
2884 if (event) {
2885 var dataKey = this.constructor.DATA_KEY;
2886 var context = $(event.currentTarget).data(dataKey);
2887
2888 if (!context) {
2889 context = new this.constructor(event.currentTarget, this._getDelegateConfig());
2890 $(event.currentTarget).data(dataKey, context);
2891 }
2892
2893 context._activeTrigger.click = !context._activeTrigger.click;
2894
2895 if (context._isWithActiveTrigger()) {
2896 context._enter(null, context);
2897 } else {
2898 context._leave(null, context);
2899 }
2900 } else {
2901
2902 if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {
2903 this._leave(null, this);
2904 return;
2905 }
2906
2907 this._enter(null, this);
2908 }
2909 };
2910
2911 Tooltip.prototype.dispose = function dispose() {
2912 clearTimeout(this._timeout);
2913
2914 this.cleanupTether();
2915
2916 $.removeData(this.element, this.constructor.DATA_KEY);
2917
2918 $(this.element).off(this.constructor.EVENT_KEY);
2919 $(this.element).closest('.modal').off('hide.bs.modal');
2920
2921 if (this.tip) {
2922 $(this.tip).remove();
2923 }
2924
2925 this._isEnabled = null;
2926 this._timeout = null;
2927 this._hoverState = null;
2928 this._activeTrigger = null;
2929 this._tether = null;
2930
2931 this.element = null;
2932 this.config = null;
2933 this.tip = null;
2934 };
2935
2936 Tooltip.prototype.show = function show() {
2937 var _this22 = this;
2938
2939 if ($(this.element).css('display') === 'none') {
2940 throw new Error('Please use show on visible elements');
2941 }
2942
2943 var showEvent = $.Event(this.constructor.Event.SHOW);
2944 if (this.isWithContent() && this._isEnabled) {
2945 if (this._isTransitioning) {
2946 throw new Error('Tooltip is transitioning');
2947 }
2948 $(this.element).trigger(showEvent);
2949
2950 var isInTheDom = $.contains(this.element.ownerDocument.documentElement, this.element);
2951
2952 if (showEvent.isDefaultPrevented() || !isInTheDom) {
2953 return;
2954 }
2955
2956 var tip = this.getTipElement();
2957 var tipId = Util.getUID(this.constructor.NAME);
2958
2959 tip.setAttribute('id', tipId);
2960 this.element.setAttribute('aria-describedby', tipId);
2961
2962 this.setContent();
2963
2964 if (this.config.animation) {
2965 $(tip).addClass(ClassName.FADE);
2966 }
2967
2968 var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;
2969
2970 var attachment = this._getAttachment(placement);
2971
2972 var container = this.config.container === false ? document.body : $(this.config.container);
2973
2974 $(tip).data(this.constructor.DATA_KEY, this).appendTo(container);
2975
2976 $(this.element).trigger(this.constructor.Event.INSERTED);
2977
2978 this._tether = new Tether({
2979 attachment: attachment,
2980 element: tip,
2981 target: this.element,
2982 classes: TetherClass,
2983 classPrefix: CLASS_PREFIX,
2984 offset: this.config.offset,
2985 constraints: this.config.constraints,
2986 addTargetClasses: false
2987 });
2988
2989 Util.reflow(tip);
2990 this._tether.position();
2991
2992 $(tip).addClass(ClassName.SHOW);
2993
2994 var complete = function complete() {
2995 var prevHoverState = _this22._hoverState;
2996 _this22._hoverState = null;
2997 _this22._isTransitioning = false;
2998
2999 $(_this22.element).trigger(_this22.constructor.Event.SHOWN);
3000
3001 if (prevHoverState === HoverState.OUT) {
3002 _this22._leave(null, _this22);
3003 }
3004 };
3005
3006 if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
3007 this._isTransitioning = true;
3008 $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(Tooltip._TRANSITION_DURATION);
3009 return;
3010 }
3011
3012 complete();
3013 }
3014 };
3015
3016 Tooltip.prototype.hide = function hide(callback) {
3017 var _this23 = this;
3018
3019 var tip = this.getTipElement();
3020 var hideEvent = $.Event(this.constructor.Event.HIDE);
3021 if (this._isTransitioning) {
3022 throw new Error('Tooltip is transitioning');
3023 }
3024 var complete = function complete() {
3025 if (_this23._hoverState !== HoverState.SHOW && tip.parentNode) {
3026 tip.parentNode.removeChild(tip);
3027 }
3028
3029 _this23.element.removeAttribute('aria-describedby');
3030 $(_this23.element).trigger(_this23.constructor.Event.HIDDEN);
3031 _this23._isTransitioning = false;
3032 _this23.cleanupTether();
3033
3034 if (callback) {
3035 callback();
3036 }
3037 };
3038
3039 $(this.element).trigger(hideEvent);
3040
3041 if (hideEvent.isDefaultPrevented()) {
3042 return;
3043 }
3044
3045 $(tip).removeClass(ClassName.SHOW);
3046
3047 this._activeTrigger[Trigger.CLICK] = false;
3048 this._activeTrigger[Trigger.FOCUS] = false;
3049 this._activeTrigger[Trigger.HOVER] = false;
3050
3051 if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
3052 this._isTransitioning = true;
3053 $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
3054 } else {
3055 complete();
3056 }
3057
3058 this._hoverState = '';
3059 };
3060
3061 // protected
3062
3063 Tooltip.prototype.isWithContent = function isWithContent() {
3064 return Boolean(this.getTitle());
3065 };
3066
3067 Tooltip.prototype.getTipElement = function getTipElement() {
3068 return this.tip = this.tip || $(this.config.template)[0];
3069 };
3070
3071 Tooltip.prototype.setContent = function setContent() {
3072 var $tip = $(this.getTipElement());
3073
3074 this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle());
3075
3076 $tip.removeClass(ClassName.FADE + ' ' + ClassName.SHOW);
3077
3078 this.cleanupTether();
3079 };
3080
3081 Tooltip.prototype.setElementContent = function setElementContent($element, content) {
3082 var html = this.config.html;
3083 if ((typeof content === 'undefined' ? 'undefined' : _typeof(content)) === 'object' && (content.nodeType || content.jquery)) {
3084 // content is a DOM node or a jQuery
3085 if (html) {
3086 if (!$(content).parent().is($element)) {
3087 $element.empty().append(content);
3088 }
3089 } else {
3090 $element.text($(content).text());
3091 }
3092 } else {
3093 $element[html ? 'html' : 'text'](content);
3094 }
3095 };
3096
3097 Tooltip.prototype.getTitle = function getTitle() {
3098 var title = this.element.getAttribute('data-original-title');
3099
3100 if (!title) {
3101 title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;
3102 }
3103
3104 return title;
3105 };
3106
3107 Tooltip.prototype.cleanupTether = function cleanupTether() {
3108 if (this._tether) {
3109 this._tether.destroy();
3110 }
3111 };
3112
3113 // private
3114
3115 Tooltip.prototype._getAttachment = function _getAttachment(placement) {
3116 return AttachmentMap[placement.toUpperCase()];
3117 };
3118
3119 Tooltip.prototype._setListeners = function _setListeners() {
3120 var _this24 = this;
3121
3122 var triggers = this.config.trigger.split(' ');
3123
3124 triggers.forEach(function (trigger) {
3125 if (trigger === 'click') {
3126 $(_this24.element).on(_this24.constructor.Event.CLICK, _this24.config.selector, function (event) {
3127 return _this24.toggle(event);
3128 });
3129 } else if (trigger !== Trigger.MANUAL) {
3130 var eventIn = trigger === Trigger.HOVER ? _this24.constructor.Event.MOUSEENTER : _this24.constructor.Event.FOCUSIN;
3131 var eventOut = trigger === Trigger.HOVER ? _this24.constructor.Event.MOUSELEAVE : _this24.constructor.Event.FOCUSOUT;
3132
3133 $(_this24.element).on(eventIn, _this24.config.selector, function (event) {
3134 return _this24._enter(event);
3135 }).on(eventOut, _this24.config.selector, function (event) {
3136 return _this24._leave(event);
3137 });
3138 }
3139
3140 $(_this24.element).closest('.modal').on('hide.bs.modal', function () {
3141 return _this24.hide();
3142 });
3143 });
3144
3145 if (this.config.selector) {
3146 this.config = $.extend({}, this.config, {
3147 trigger: 'manual',
3148 selector: ''
3149 });
3150 } else {
3151 this._fixTitle();
3152 }
3153 };
3154
3155 Tooltip.prototype._fixTitle = function _fixTitle() {
3156 var titleType = _typeof(this.element.getAttribute('data-original-title'));
3157 if (this.element.getAttribute('title') || titleType !== 'string') {
3158 this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');
3159 this.element.setAttribute('title', '');
3160 }
3161 };
3162
3163 Tooltip.prototype._enter = function _enter(event, context) {
3164 var dataKey = this.constructor.DATA_KEY;
3165
3166 context = context || $(event.currentTarget).data(dataKey);
3167
3168 if (!context) {
3169 context = new this.constructor(event.currentTarget, this._getDelegateConfig());
3170 $(event.currentTarget).data(dataKey, context);
3171 }
3172
3173 if (event) {
3174 context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;
3175 }
3176
3177 if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {
3178 context._hoverState = HoverState.SHOW;
3179 return;
3180 }
3181
3182 clearTimeout(context._timeout);
3183
3184 context._hoverState = HoverState.SHOW;
3185
3186 if (!context.config.delay || !context.config.delay.show) {
3187 context.show();
3188 return;
3189 }
3190
3191 context._timeout = setTimeout(function () {
3192 if (context._hoverState === HoverState.SHOW) {
3193 context.show();
3194 }
3195 }, context.config.delay.show);
3196 };
3197
3198 Tooltip.prototype._leave = function _leave(event, context) {
3199 var dataKey = this.constructor.DATA_KEY;
3200
3201 context = context || $(event.currentTarget).data(dataKey);
3202
3203 if (!context) {
3204 context = new this.constructor(event.currentTarget, this._getDelegateConfig());
3205 $(event.currentTarget).data(dataKey, context);
3206 }
3207
3208 if (event) {
3209 context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;
3210 }
3211
3212 if (context._isWithActiveTrigger()) {
3213 return;
3214 }
3215
3216 clearTimeout(context._timeout);
3217
3218 context._hoverState = HoverState.OUT;
3219
3220 if (!context.config.delay || !context.config.delay.hide) {
3221 context.hide();
3222 return;
3223 }
3224
3225 context._timeout = setTimeout(function () {
3226 if (context._hoverState === HoverState.OUT) {
3227 context.hide();
3228 }
3229 }, context.config.delay.hide);
3230 };
3231
3232 Tooltip.prototype._isWithActiveTrigger = function _isWithActiveTrigger() {
3233 for (var trigger in this._activeTrigger) {
3234 if (this._activeTrigger[trigger]) {
3235 return true;
3236 }
3237 }
3238
3239 return false;
3240 };
3241
3242 Tooltip.prototype._getConfig = function _getConfig(config) {
3243 config = $.extend({}, this.constructor.Default, $(this.element).data(), config);
3244
3245 if (config.delay && typeof config.delay === 'number') {
3246 config.delay = {
3247 show: config.delay,
3248 hide: config.delay
3249 };
3250 }
3251
3252 Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
3253
3254 return config;
3255 };
3256
3257 Tooltip.prototype._getDelegateConfig = function _getDelegateConfig() {
3258 var config = {};
3259
3260 if (this.config) {
3261 for (var key in this.config) {
3262 if (this.constructor.Default[key] !== this.config[key]) {
3263 config[key] = this.config[key];
3264 }
3265 }
3266 }
3267
3268 return config;
3269 };
3270
3271 // static
3272
3273 Tooltip._jQueryInterface = function _jQueryInterface(config) {
3274 return this.each(function () {
3275 var data = $(this).data(DATA_KEY);
3276 var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config;
3277
3278 if (!data && /dispose|hide/.test(config)) {
3279 return;
3280 }
3281
3282 if (!data) {
3283 data = new Tooltip(this, _config);
3284 $(this).data(DATA_KEY, data);
3285 }
3286
3287 if (typeof config === 'string') {
3288 if (data[config] === undefined) {
3289 throw new Error('No method named "' + config + '"');
3290 }
3291 data[config]();
3292 }
3293 });
3294 };
3295
3296 _createClass(Tooltip, null, [{
3297 key: 'VERSION',
3298 get: function get() {
3299 return VERSION;
3300 }
3301 }, {
3302 key: 'Default',
3303 get: function get() {
3304 return Default;
3305 }
3306 }, {
3307 key: 'NAME',
3308 get: function get() {
3309 return NAME;
3310 }
3311 }, {
3312 key: 'DATA_KEY',
3313 get: function get() {
3314 return DATA_KEY;
3315 }
3316 }, {
3317 key: 'Event',
3318 get: function get() {
3319 return Event;
3320 }
3321 }, {
3322 key: 'EVENT_KEY',
3323 get: function get() {
3324 return EVENT_KEY;
3325 }
3326 }, {
3327 key: 'DefaultType',
3328 get: function get() {
3329 return DefaultType;
3330 }
3331 }]);
3332
3333 return Tooltip;
3334 }();
3335
3336 /**
3337 * ------------------------------------------------------------------------
3338 * jQuery
3339 * ------------------------------------------------------------------------
3340 */
3341
3342 $.fn[NAME] = Tooltip._jQueryInterface;
3343 $.fn[NAME].Constructor = Tooltip;
3344 $.fn[NAME].noConflict = function () {
3345 $.fn[NAME] = JQUERY_NO_CONFLICT;
3346 return Tooltip._jQueryInterface;
3347 };
3348
3349 return Tooltip;
3350 }(jQuery);
3351
3352 /**
3353 * --------------------------------------------------------------------------
3354 * Bootstrap (v4.0.0-alpha.6): popover.js
3355 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
3356 * --------------------------------------------------------------------------
3357 */
3358
3359 var Popover = function ($) {
3360
3361 /**
3362 * ------------------------------------------------------------------------
3363 * Constants
3364 * ------------------------------------------------------------------------
3365 */
3366
3367 var NAME = 'popover';
3368 var VERSION = '4.0.0-alpha.6';
3369 var DATA_KEY = 'bs.popover';
3370 var EVENT_KEY = '.' + DATA_KEY;
3371 var JQUERY_NO_CONFLICT = $.fn[NAME];
3372
3373 var Default = $.extend({}, Tooltip.Default, {
3374 placement: 'right',
3375 trigger: 'click',
3376 content: '',
3377 template: '<div class="popover" role="tooltip">' + '<h3 class="popover-title"></h3>' + '<div class="popover-content"></div></div>'
3378 });
3379
3380 var DefaultType = $.extend({}, Tooltip.DefaultType, {
3381 content: '(string|element|function)'
3382 });
3383
3384 var ClassName = {
3385 FADE: 'fade',
3386 SHOW: 'show'
3387 };
3388
3389 var Selector = {
3390 TITLE: '.popover-title',
3391 CONTENT: '.popover-content'
3392 };
3393
3394 var Event = {
3395 HIDE: 'hide' + EVENT_KEY,
3396 HIDDEN: 'hidden' + EVENT_KEY,
3397 SHOW: 'show' + EVENT_KEY,
3398 SHOWN: 'shown' + EVENT_KEY,
3399 INSERTED: 'inserted' + EVENT_KEY,
3400 CLICK: 'click' + EVENT_KEY,
3401 FOCUSIN: 'focusin' + EVENT_KEY,
3402 FOCUSOUT: 'focusout' + EVENT_KEY,
3403 MOUSEENTER: 'mouseenter' + EVENT_KEY,
3404 MOUSELEAVE: 'mouseleave' + EVENT_KEY
3405 };
3406
3407 /**
3408 * ------------------------------------------------------------------------
3409 * Class Definition
3410 * ------------------------------------------------------------------------
3411 */
3412
3413 var Popover = function (_Tooltip) {
3414 _inherits(Popover, _Tooltip);
3415
3416 function Popover() {
3417 _classCallCheck(this, Popover);
3418
3419 return _possibleConstructorReturn(this, _Tooltip.apply(this, arguments));
3420 }
3421
3422 // overrides
3423
3424 Popover.prototype.isWithContent = function isWithContent() {
3425 return this.getTitle() || this._getContent();
3426 };
3427
3428 Popover.prototype.getTipElement = function getTipElement() {
3429 return this.tip = this.tip || $(this.config.template)[0];
3430 };
3431
3432 Popover.prototype.setContent = function setContent() {
3433 var $tip = $(this.getTipElement());
3434
3435 // we use append for html objects to maintain js events
3436 this.setElementContent($tip.find(Selector.TITLE), this.getTitle());
3437 this.setElementContent($tip.find(Selector.CONTENT), this._getContent());
3438
3439 $tip.removeClass(ClassName.FADE + ' ' + ClassName.SHOW);
3440
3441 this.cleanupTether();
3442 };
3443
3444 // private
3445
3446 Popover.prototype._getContent = function _getContent() {
3447 return this.element.getAttribute('data-content') || (typeof this.config.content === 'function' ? this.config.content.call(this.element) : this.config.content);
3448 };
3449
3450 // static
3451
3452 Popover._jQueryInterface = function _jQueryInterface(config) {
3453 return this.each(function () {
3454 var data = $(this).data(DATA_KEY);
3455 var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' ? config : null;
3456
3457 if (!data && /destroy|hide/.test(config)) {
3458 return;
3459 }
3460
3461 if (!data) {
3462 data = new Popover(this, _config);
3463 $(this).data(DATA_KEY, data);
3464 }
3465
3466 if (typeof config === 'string') {
3467 if (data[config] === undefined) {
3468 throw new Error('No method named "' + config + '"');
3469 }
3470 data[config]();
3471 }
3472 });
3473 };
3474
3475 _createClass(Popover, null, [{
3476 key: 'VERSION',
3477
3478
3479 // getters
3480
3481 get: function get() {
3482 return VERSION;
3483 }
3484 }, {
3485 key: 'Default',
3486 get: function get() {
3487 return Default;
3488 }
3489 }, {
3490 key: 'NAME',
3491 get: function get() {
3492 return NAME;
3493 }
3494 }, {
3495 key: 'DATA_KEY',
3496 get: function get() {
3497 return DATA_KEY;
3498 }
3499 }, {
3500 key: 'Event',
3501 get: function get() {
3502 return Event;
3503 }
3504 }, {
3505 key: 'EVENT_KEY',
3506 get: function get() {
3507 return EVENT_KEY;
3508 }
3509 }, {
3510 key: 'DefaultType',
3511 get: function get() {
3512 return DefaultType;
3513 }
3514 }]);
3515
3516 return Popover;
3517 }(Tooltip);
3518
3519 /**
3520 * ------------------------------------------------------------------------
3521 * jQuery
3522 * ------------------------------------------------------------------------
3523 */
3524
3525 $.fn[NAME] = Popover._jQueryInterface;
3526 $.fn[NAME].Constructor = Popover;
3527 $.fn[NAME].noConflict = function () {
3528 $.fn[NAME] = JQUERY_NO_CONFLICT;
3529 return Popover._jQueryInterface;
3530 };
3531
3532 return Popover;
3533 }(jQuery);
3534
3535 }();