1(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ 2"use strict"; 3 4var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 5Object.defineProperty(exports, "__esModule", { 6 value: true 7}); 8exports.Form = void 0; 9var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); 10var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); 11var Form = exports.Form = /*#__PURE__*/function () { 12 function Form() { 13 (0, _classCallCheck2["default"])(this, Form); 14 } 15 return (0, _createClass2["default"])(Form, [{ 16 key: "initialize", 17 value: function initialize() { 18 function rememberElement(el) { 19 if (!el.id) el.id = 'solr-focus-' + Date.now(); 20 sessionStorage.setItem('solrLastFocus', '#' + el.id); 21 } 22 23 // focus on page load 24 var lastFocusSelector = sessionStorage.getItem('solrLastFocus'); 25 if (lastFocusSelector) { 26 var el = document.querySelector(lastFocusSelector); 27 if (el) { 28 el.focus({ 29 preventScroll: false 30 }); 31 sessionStorage.removeItem('solrLastFocus'); 32 } 33 } 34 var solrRoot = document.querySelector('.tx_solr'); 35 if (!solrRoot) return; 36 37 // results-per-page select 38 solrRoot.querySelectorAll('select[name="tx_solr[resultsPerPage]"]').forEach(function (select) { 39 select.addEventListener('change', function () { 40 rememberElement(select); 41 }); 42 }); 43 44 // sorting dropdown 45 solrRoot.querySelectorAll('#tx-solr-sorting .dropdown-menu a').forEach(function (link) { 46 link.addEventListener('click', function () { 47 var _link$closest; 48 var toggle = (_link$closest = link.closest('#tx-solr-sorting')) === null || _link$closest === void 0 ? void 0 : _link$closest.querySelector('.dropdown-toggle'); 49 if (toggle) rememberElement(toggle); 50 }); 51 }); 52 } 53 }]); 54}(); 55 56},{"@babel/runtime/helpers/classCallCheck":13,"@babel/runtime/helpers/createClass":14,"@babel/runtime/helpers/interopRequireDefault":19}],2:[function(require,module,exports){ 57"use strict"; 58 59var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 60Object.defineProperty(exports, "__esModule", { 61 value: true 62}); 63exports.ShareFlyOut = void 0; 64var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); 65var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); 66var ShareFlyOut = exports.ShareFlyOut = /*#__PURE__*/function () { 67 function ShareFlyOut() { 68 (0, _classCallCheck2["default"])(this, ShareFlyOut); 69 } 70 return (0, _createClass2["default"])(ShareFlyOut, [{ 71 key: "initialize", 72 value: function initialize() { 73 var checkbox = document.getElementById('check'); 74 var button = document.getElementById('button'); 75 checkbox.addEventListener('change', function () { 76 if (checkbox.checked) { 77 button.title = "Social Media Links verbergen"; 78 } else { 79 button.title = "Social Media Links anzeigen"; 80 } 81 }); 82 } 83 }]); 84}(); 85 86},{"@babel/runtime/helpers/classCallCheck":13,"@babel/runtime/helpers/createClass":14,"@babel/runtime/helpers/interopRequireDefault":19}],3:[function(require,module,exports){ 87"use strict"; 88 89Object.defineProperty(exports, "__esModule", { 90 value: true 91}); 92exports.swiperConfig = void 0; 93var swiperConfig = exports.swiperConfig = { 94 // Optional parameters 95 loop: true, 96 autoplay: { 97 delay: 5000 98 }, 99 // If we need pagination 100 pagination: { 101 el: '.swiper-pagination', 102 clickable: true 103 }, 104 // Navigation arrows 105 navigation: { 106 nextEl: '.swiper-button-next, .swiper-next', 107 prevEl: '.swiper-button-prev, .swiper-prev', 108 pausePlayButton: '.swiper-button-play-pause' 109 }, 110 // Accessibility 111 a11y: { 112 prevSlideMessage: 'Vorherige Slide', 113 nextSlideMessage: 'Nächste Slide', 114 firstSlideMessage: 'Dies ist die erste Slide', 115 lastSlideMessage: 'Dies ist die letzte Slide', 116 paginationBulletMessage: 'Gehe zu Slide {{index}}', 117 slideLabelMessage: 'Slide {{index}} von {{slidesLength}}' 118 } 119}; 120 121},{}],4:[function(require,module,exports){ 122"use strict"; 123 124var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 125Object.defineProperty(exports, "__esModule", { 126 value: true 127}); 128exports.WcoSwiperSliderExtended = void 0; 129var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); 130var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); 131var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); 132var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); 133var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get")); 134var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); 135var _wcoSwiperSlider = require("@wco/wco-swiper-slider"); 136function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); } 137function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } 138function _superPropGet(t, o, e, r) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } 139var WcoSwiperSliderExtended = exports.WcoSwiperSliderExtended = /*#__PURE__*/function (_WcoSwiperSlider) { 140 function WcoSwiperSliderExtended() { 141 (0, _classCallCheck2["default"])(this, WcoSwiperSliderExtended); 142 return _callSuper(this, WcoSwiperSliderExtended, arguments); 143 } 144 (0, _inherits2["default"])(WcoSwiperSliderExtended, _WcoSwiperSlider); 145 return (0, _createClass2["default"])(WcoSwiperSliderExtended, [{ 146 key: "initialize", 147 value: function initialize() { 148 var _this = this;
149 var init = function init() { 150 var containers = document.querySelectorAll(_this.queryString); 151 containers.forEach(function (container) { 152 if (!container.classList.contains('swiper')) { 153 container.classList.add('swiper'); 154 } 155 }); 156 if (document.querySelector(_this.queryString)) { 157 if (_this.config.navigation.pausePlayButton) { 158 if (Array.isArray(_this.slider)) { 159 _this.slider.forEach(function (slider) { 160 _this.initPausePlayButton(slider); 161 }); 162 } else if (_this.slider && _this.slider.el) { 163 _this.initPausePlayButton(_this.slider); 164 } 165 _this.playPauseButtons = document.querySelectorAll(_this.config.navigation.pausePlayButton); 166 } 167 if (_this.config.navigation.nextEl && _this.config.navigation.prevEl) { 168 var nextButtons = document.querySelectorAll(_this.config.navigation.nextEl); 169 nextButtons.forEach(function (nextBtn) { 170 nextBtn.addEventListener('click', function () { 171 var swiperContainer = nextBtn.closest('.swiper'); 172 if (swiperContainer) { 173 var swiperWrapper = swiperContainer.querySelector('.swiper-wrapper'); 174 if (swiperWrapper) { 175 var swiperSlides = swiperWrapper.querySelectorAll('.swiper-slide'); 176 WcoSwiperSliderExtended.setLiveRegion(swiperSlides, swiperWrapper); 177 } 178 } 179 }); 180 }); 181 var prevButtons = document.querySelectorAll(_this.config.navigation.prevEl); 182 prevButtons.forEach(function (prevBtn) { 183 prevBtn.addEventListener('click', function () { 184 var swiperContainer = prevBtn.closest('.swiper'); 185 if (swiperContainer) { 186 var swiperWrapper = swiperContainer.querySelector('.swiper-wrapper'); 187 if (swiperWrapper) { 188 var swiperSlides = swiperWrapper.querySelectorAll('.swiper-slide'); 189 WcoSwiperSliderExtended.setLiveRegion(swiperSlides, swiperWrapper); 190 } 191 } 192 }); 193 }); 194 } 195 var paginationBullets = document.querySelectorAll('.swiper-pagination-bullet'); 196 paginationBullets.forEach(function (bullet) { 197 bullet.addEventListener('keydown', function (e) { 198 if (e.key === ' ') { 199 e.preventDefault(); 200 bullet.click(); 201 } 202 }); 203 }); 204 } 205 var updateSlideLinks = function updateSlideLinks(slider) { 206 var swiperSlides = slider.el.querySelectorAll('.swiper-slide'); 207 swiperSlides.forEach(function (slide) { 208 var links = slide.querySelectorAll('a'); 209 links.forEach(function (link) { 210 link.setAttribute('tabindex', slide.classList.contains('swiper-slide-active') ? '0' : '-1'); 211 }); 212 }); 213 }; 214 if (Array.isArray(_this.slider)) { 215 _this.slider.forEach(function (slider) { 216 updateSlideLinks(slider); 217 slider.on('slideChangeTransitionEnd', function () { 218 updateSlideLinks(slider); 219 }); 220 }); 221 } else if (_this.slider && _this.slider.el) { 222 updateSlideLinks(_this.slider); 223 _this.slider.on('slideChangeTransitionEnd', function () { 224 updateSlideLinks(_this.slider); 225 }); 226 } 227 }; 228 _superPropGet(WcoSwiperSliderExtended, "initialize", this, 3)([]); 229 if (document.readyState === 'loading') { 230 document.addEventListener('DOMContentLoaded', init); 231 } else { 232 init(); 233 } 234 } 235 }, { 236 key: "initPausePlayButton", 237 value: function initPausePlayButton(slider) { 238 var pausePlayButton = slider.el.querySelector(this.config.navigation.pausePlayButton); 239 if (pausePlayButton) { 240 pausePlayButton.addEventListener('click', function () { 241 return WcoSwiperSliderExtended.togglePausePlayButton(slider, pausePlayButton); 242 }); 243 pausePlayButton.addEventListener('keypress', function (e) { 244 if (e.key === 'Enter' || e.key === ' ') { 245 e.preventDefault(); 246 WcoSwiperSliderExtended.togglePausePlayButton(slider, pausePlayButton); 247 } 248 }); 249 } 250 } 251 }], [{ 252 key: "togglePausePlayButton", 253 value: function togglePausePlayButton(slider, pausePlayButton) { 254 slider.el.classList.toggle("pause"); 255 if (slider.el.classList.contains("pause")) { 256 slider.autoplay.stop(); 257 pausePlayButton.setAttribute('aria-pressed', 'true'); 258 } else { 259 slider.autoplay.start(); 260 pausePlayButton.setAttribute('aria-pressed', 'false'); 261 } 262 } 263 }, { 264 key: "setLiveRegion", 265 value: function setLiveRegion(swiperSlides, swiperWrapper) {
266 swiperSlides.forEach(function (swiperSlide) { 267 if (swiperWrapper.closest('.swiper-container').classList.contains("pause")) { 268 setTimeout(function () { 269 if (swiperSlide.classList.contains('swiper-slide-active')) { 270 swiperSlide.setAttribute('aria-live', 'polite'); 271 } else { 272 swiperSlide.setAttribute('aria-live', 'off'); 273 } 274 }, 100); 275 } else { 276 swiperSlide.setAttribute('aria-live', 'off'); 277 } 278 }); 279 } 280 }]); 281}(_wcoSwiperSlider.WcoSwiperSlider); 282 283},{"@babel/runtime/helpers/classCallCheck":13,"@babel/runtime/helpers/createClass":14,"@babel/runtime/helpers/get":16,"@babel/runtime/helpers/getPrototypeOf":17,"@babel/runtime/helpers/inherits":18,"@babel/runtime/helpers/interopRequireDefault":19,"@babel/runtime/helpers/possibleConstructorReturn":20,"@wco/wco-swiper-slider":92}],5:[function(require,module,exports){ 284"use strict"; 285 286var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 287Object.defineProperty(exports, "__esModule", { 288 value: true 289}); 290exports.BackToTop = void 0; 291var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); 292var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); 293//** jQuery Scroll to Top Control script- (c) Dynamic Drive DHTML code library: http://www.dynamicdrive.com. 294//** Available/ usage terms at http://www.dynamicdrive.com (March 30th, 09') 295//** v1.1 (April 7th, 09'): 296//** 1) Adds ability to scroll to an absolute position (from top of page) or specific element on the page instead. 297//** 2) Fixes scroll animation not working in Opera. 298var BackToTop = exports.BackToTop = /*#__PURE__*/function () { 299 function BackToTop() { 300 (0, _classCallCheck2["default"])(this, BackToTop); 301 } 302 return (0, _createClass2["default"])(BackToTop, [{ 303 key: "initialize", 304 value: function initialize() { 305 var scrolltotop = { 306 //startline: Integer. Number of pixels from top of doc scrollbar is scrolled before showing control 307 //scrollto: Keyword (Integer, or "Scroll_to_Element_ID"). How far to scroll document up when control is clicked on (0=top). 308 setting: { 309 startline: 100, 310 scrollto: 0, 311 scrollduration: 1000, 312 fadeduration: [500, 100] 313 }, 314 controlHTML: '<i class="fa fa-chevron-up"></i>', 315 //HTML for control, which is auto wrapped in DIV w/ ID="topcontrol" 316 controlattrs: { 317 offsetx: 5, 318 offsety: 5, 319 zIndex: 1 320 }, 321 //offset of control relative to right/ bottom of window corner 322 anchorkeyword: '#top', 323 //Enter href value of HTML anchors on the page that should also act as "Scroll Up" links 324 state: { 325 isvisible: false, 326 shouldvisible: false 327 }, 328 containerElement: false, 329 scrollup: function scrollup() { 330 if (!this.cssfixedsupport) 331 //if control is positioned using JavaScript 332 this.$control.css({ 333 opacity: 0 334 }); //hide control immediately after clicking it 335 var dest = isNaN(this.setting.scrollto) ? this.setting.scrollto : parseInt(this.setting.scrollto); 336 var tempDest = jQuery('#' + dest); 337 if (typeof dest == "string" && tempDest.length == 1) 338 //check element set by string exists 339 dest = tempDest.offset().top;else dest = 0; 340 this.$body.animate({ 341 scrollTop: dest 342 }, this.setting.scrollduration, function () { 343 var main = document.querySelector('main'); 344 if (main) { 345 main.focus({ 346 preventScroll: true 347 }); 348 } 349 }); 350 }, 351 keepfixed: function keepfixed() { 352 var $window = jQuery(window); 353 var controlx = $window.scrollLeft() + $window.width() - this.$control.width() - this.controlattrs.offsetx; 354 var controly = $window.scrollTop() + $window.height() - this.$control.height() - this.controlattrs.offsety; 355 this.$control.css({ 356 left: controlx + 'px', 357 top: controly + 'px' 358 }); 359 }, 360 togglecontrol: function togglecontrol() { 361 var scrolltop = jQuery(window).scrollTop(); 362 if (!this.cssfixedsupport) this.keepfixed(); 363 this.state.shouldvisible = scrolltop >= this.setting.startline; 364 if (this.state.shouldvisible && !this.state.isvisible) { 365 this.$control.stop().animate({ 366 opacity: 1 367 }, this.setting.fadeduration[0]).attr("aria-hidden", "false").attr("tabindex", "0"); 368 this.state.isvisible = true; 369 } else if (this.state.shouldvisible == false && this.state.isvisible) { 370 this.$control.stop().animate({ 371 opacity: 0 372 }, this.setting.fadeduration[1]).attr("aria-hidden", "true").attr("tabindex", "-1"); 373 this.state.isvisible = false;
374 } 375 }, 376 init: function init($) { 377 var $canvasContainer = $('body > div[canvas="container"]'); 378 var mainobj = scrolltotop; 379 var iebrws = document.all; 380 var target = $(window); 381 if ($canvasContainer.length >= 1) { 382 // mainobj.$body = $canvasContainer; 383 // target = $canvasContainer; 384 // mainobj.controlattrs.offsetx = 25; 385 } else { 386 mainobj.$body = window.opera ? document.compatMode == "CSS1Compat" ? $('html') : $('body') : $('html,body'); 387 } 388 mainobj.$body = window.opera ? document.compatMode == "CSS1Compat" ? $('html') : $('body') : $('html,body'); 389 mainobj.cssfixedsupport = !iebrws || iebrws && document.compatMode == "CSS1Compat" && window.XMLHttpRequest; //not IE or IE7+ browsers in standards mode 390 mainobj.$control = $('<div id="topcontrol">' + mainobj.controlHTML + '</div>').css({ 391 position: mainobj.cssfixedsupport ? 'fixed' : 'absolute', 392 bottom: mainobj.controlattrs.offsety, 393 right: mainobj.controlattrs.offsetx, 394 zIndex: 20, 395 opacity: 0, 396 cursor: 'pointer' 397 }).attr({ 398 title: 'nach oben', 399 'aria-label': 'zurück nach oben', 400 'aria-hidden': 'true', 401 role: 'button', 402 tabindex: '-1' 403 }).click(function () { 404 mainobj.scrollup(); 405 return false; 406 }).keydown(function (event) { 407 if (event.key === "Enter") { 408 mainobj.scrollup(); 409 return false; 410 } 411 }).appendTo('body'); 412 if (document.all && !window.XMLHttpRequest && mainobj.$control.text() != '') 413 //loose check for IE6 and below, plus whether control contains any text 414 mainobj.$control.css({ 415 width: mainobj.$control.width() 416 }); //IE6- seems to require an explicit width on a DIV containing text 417 mainobj.togglecontrol(); 418 $('a[href="' + mainobj.anchorkeyword + '"]').click(function () { 419 mainobj.scrollup(); 420 return false; 421 }); 422 target.bind('scroll resize', function (e) { 423 mainobj.togglecontrol(); 424 }); 425 } 426 }; 427 scrolltotop.init($); 428 } 429 }]); 430}(); 431 432},{"@babel/runtime/helpers/classCallCheck":13,"@babel/runtime/helpers/createClass":14,"@babel/runtime/helpers/interopRequireDefault":19}],6:[function(require,module,exports){ 433"use strict"; 434 435var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 436Object.defineProperty(exports, "__esModule", { 437 value: true 438}); 439exports.CardGame = void 0; 440var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); 441var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); 442var _isotopeLayout = _interopRequireDefault(require("isotope-layout")); 443var CardGame = exports.CardGame = /*#__PURE__*/function () { 444 function CardGame() { 445 (0, _classCallCheck2["default"])(this, CardGame); 446 //Categorys 447 this.categorys = [{ 448 name: 'Bewegungsspiele', 449 "class": 'bewegungsspiele', 450 iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Bewegungsspiele.svg', 451 iconAlt: 'Icon Person bewegt sich' 452 }, { 453 name: 'Spiel und SpaÃ', 454 "class": 'spiel-spass', 455 iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Spiel-und-Spass.svg', 456 iconAlt: 'Icon Zwei Emojis lächeln' 457 }, { 458 name: 'Entspannung fühlen', 459 "class": 'entspannung-fuehlen', 460 iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Entspannung-fuehlen.svg', 461 iconAlt: 'Icon Yin und Yang' 462 }, {
463 name: 'Den Körper fühlen', 464 "class": 'koerper-fuehlen', 465 iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Den-Koerper-fuehlen.svg', 466 iconAlt: 'Icon Mensch mit ausgestreckten Armen' 467 }, { 468 name: 'Gut für den Rücken', 469 "class": 'gut-fuer-ruecken', 470 iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Gut-fuer-den-Ruecken.svg', 471 iconAlt: 'Icon Mensch hält Rücken' 472 }, { 473 name: 'Kraft für den Bauch', 474 "class": 'kraft-fuer-bauch', 475 iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Kraft-fuer-den-Bauch.svg', 476 iconAlt: 'Icon Bauch' 477 }, { 478 name: 'Kopf und Nacken', 479 "class": 'kopf-nacken', 480 iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Kopf-und-Nacken.svg', 481 iconAlt: 'Icon Mensch hält seinen Kopf' 482 }, { 483 name: 'Nacken lockern', 484 "class": 'nacken-lockern', 485 iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Nacken-Lockern.svg', 486 iconAlt: 'Icon Kopf und Schultern von Mensch' 487 }, { 488 name: 'Starke Beine', 489 "class": 'starke-beine', 490 iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Starke-Beine.svg', 491 iconAlt: 'Icon Bein' 492 }, { 493 name: 'Starke Füsse', 494 "class": 'starke-fuesse', 495 iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Starke-Fuesse.svg', 496 iconAlt: 'Icon FuÃ' 497 }, { 498 name: 'Kraft für die Arme', 499 "class": 'kraft-fuer-arme', 500 iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Kraft-fuer-die-Arme.svg', 501 iconAlt: 'Icon Arm von Mensch' 502 }, { 503 name: 'Kraft in den Schultern', 504 "class": 'kraft-in-schultern', 505 iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Kraft-in-den-Schultern.svg', 506 iconAlt: 'Icon Mensch streckt Arme nach oben' 507 }, { 508 name: 'Koordination', 509 "class": 'koordination', 510 iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Koordination.svg', 511 iconAlt: 'Icon Mensch bewegt sich' 512 }, { 513 name: 'Gleichgewicht', 514 "class": 'gleichgewicht', 515 iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Gleichgewicht.svg', 516 iconAlt: 'Icon Mensch hält Gleichgewicht' 517 }, { 518 name: 'Oberkörper dehnen', 519 "class": 'oberkoerper-dehnen', 520 iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Oberkoerper-dehnen.svg', 521 iconAlt: 'Icon Mensch dehnt Oberkörper' 522 }, { 523 name: 'Rücken und Beine dehnen', 524 "class": 'ruecken-beine-dehnen', 525 iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Ruecken-und-Beine-dehnen.svg', 526 iconAlt: 'Icon Mensch dehnt Beine' 527 }]; 528 529 //Cards 530 this.cards = [{ 531 category: 'Bewegungsspiele', 532 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Fang-mal.jpg', 533 imgAlt: 'Frau und Mädchen werfen sich etwas zu', 534 headline: 'Fang mal!', 535 id: 'bewegungsspiele-1', 536 text: "<ul>\n <li>2 Personen stehen sich gegen\xFCber</li>\n <li>Gegenstand mit beiden H\xE4nden werfen und wieder fangen</li>\n </ul>", 537 additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>Einh\xE4ndig werfen und fangen</li>\n <li>Einh\xE4ndig werfen und fangen mit Handwechsel\n <ul>\n <li>Ansage der Fanghand durch die werfende Person</li>\n <li>Geschlossene Augen beim Fangen: Augen \xF6ffnen auf Zuruf der werfen\xADden Person</li>\n </ul>\n </li>\n </ol>" 538 }, {
539 category: 'Bewegungsspiele', 540 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Spieglein-Spieglein.jpg', 541 imgAlt: 'Junge und Mädchen stehen sich gegenüber und Heben die Hand', 542 headline: 'Spieglein, Spieglein ...', 543 id: 'bewegungsspiele-2', 544 text: "<ul>\n <li>2 Personen stehen sich gegen\xFCber</li>\n <li>Person 1 ist der \u201ESpiegel\u201C und macht die Bewegungen von Person 2 seitenverkehrt nach</li>\n <li>Dann wechseln</li>\n </ul>", 545 additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>Bewegungsbeispiele: Hand heben, Haare k\xE4mmen, an die Nase fassen, Arm ausstrecken, seitliche Schritte</li>\n <li>Nur bestimmte K\xF6rperteile bewegen, z.B. Arme oder Beine</li>\n </ol>" 546 }, { 547 category: 'Spiel und SpaÃ', 548 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Welches-Tier-bin-ich.jpg', 549 imgAlt: 'Mädchen immitiert ein Tier', 550 headline: 'Welches Tier bin ich?', 551 id: 'spiel-spass-1', 552 text: "<ul>\n <li>Person 1 stellt durch Bewegungen und ohne Worte ein Tier dar, bis Person 2 es err\xE4t</li>\n <li>Dann wechseln</li>\n </ul>", 553 additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>Gegenst\xE4nde darstellen und erraten (z.B. Baum)</li>\n <li>Bei Nichterraten eine Bewegung ausf\xFChren, z.B. 10-mal auf der Stelle h\xFCpfen</li>\n </ol>" 554 }, { 555 category: 'Spiel und SpaÃ', 556 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Was-mache-ich.jpg', 557 imgAlt: 'Junge immitiert BogenschieÃen', 558 headline: 'Was mache ich?', 559 id: 'spiel-spass-2', 560 text: "<ul>\n <li>Person 1 ahmt eine Sportart nach (z.B. Bogenschie\xDFen), bis Person 2 sie err\xE4t</li>\n <li>Dann wechseln</li>\n </ul>", 561 additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>Ideen f\xFCr Sportarten: Skilanglauf, Tennis, Schwimmen, Basketball, Fu\xDFball</li>\n <li>f)\tBei mehreren Personen:\n <ul>\n <li>Eine Person ahmt eine Sportart nach, mehrere Personen raten</li>\n <li>Mehrere Personen ahmen eine Sportart nach, eine Person r\xE4t</li>\n </ul>\n </li>\n </ol>" 562 }, { 563 category: 'Entspannung fühlen', 564 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Anspannen-entspannen.jpg', 565 imgAlt: 'Mann spannt seinen Körper an', 566 headline: 'Anspannen - entspannen', 567 id: 'entspannung-fuehlen-1', 568 text: "<ul>\n <li>Aufrecht stehen, Arme angewinkelt nah am K\xF6rper, H\xE4nde zu F\xE4usten ballen, Gesicht anspannen, bis 10 z\xE4hlen (dabei weiteratmen!), entspannen</li>\n <li>3-mal wiederholen</li>\n </ul>", 569 additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>\xDCbung im Sitzen ausf\xFChren: Oberk\xF6rper bleibt aufrecht und angespannt, Arme liegen angewinkelt auf dem Tisch oder auf den Oberschenkeln</li>\n </ol>" 570 }, {
571 category: 'Entspannung fühlen', 572 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Einatmen-ausatmen.jpg', 573 imgAlt: 'Mann atmet ein', 574 headline: 'Einatmen - ausatmen', 575 id: 'entspannung-fuehlen-2', 576 text: "<ul>\n <li>Aufrecht stehen</li>\n <li>Eine Hand auf den Oberbauch, eine Hand auf den unteren Bauch legen, tief ein- und wieder ausatmen</li>\n <li>5- bis 10-mal wiederholen</li>\n </ul>", 577 additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>Ein- und Ausatmen in den Bauch (deutliches Heben und Senken der Bauchdecke) </li>\n <li>\xDCbung im Sitzen ausf\xFChren</li>\n </ol>" 578 }, { 579 category: 'Den Körper fühlen', 580 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Pizza-backen.jpg', 581 imgAlt: 'Mädchen massiert Frau am Rücken', 582 headline: 'Pizza backen', 583 id: 'koerper-fuehlen-1', 584 text: "<ul>\n <li>Person 1 steht aufrecht hinter der sitzenden Person 2</li>\n <li>Person 1 ahmt das Kneten eines Pizzateigs auf dem R\xFCcken von Person 2 nach</li>\n <li>Dann wechseln</li>\n </ul>", 585 additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>Weitere Ideen: Ausrollen oder Belegen eines Pizzateigs, Schneiden von Gem\xFCse</li>\n </ol>" 586 }, { 587 category: 'Den Körper fühlen', 588 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Abklopfen.jpg', 589 imgAlt: 'Mädchen Klopft seinen Arm ab', 590 headline: 'Abklopfen', 591 id: 'koerper-fuehlen-2', 592 text: "<ul>\n <li>Aufrecht sitzen, linken Arm ausstrecken und mit der rechten Handfl\xE4che von der Hand bis zur Schulter abklopfen und wieder zur\xFCck, dann Arm wechseln</li>\n <li>2-mal pro Seite</li>\n </ul>", 593 additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>Mit kleinem Ball unter leichtem Druck \xFCber den Arm rollen</li>\n <li>Andere K\xF6rperteile abklopfen, z.B. Oberschenkel</li>\n </ol>" 594 }, { 595 category: 'Gut für den Rücken', 596 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Blitzhacker.jpg', 597 imgAlt: 'Junge und Frau sitzen gegenüber un hacken mit den Händen', 598 headline: 'Blitzhacker', 599 id: 'gut-fuer-ruecken-1', 600 text: "<ul>\n <li>2 Personen sitzen sich gegen\xFCber, Arme angewinkelt</li>\n <li>Mit den Unterarmen auf und ab \"hacken\", Oberarme bleiben am K\xF6rper, bis 10 z\xE4hlen</li>\n <li>2- bis 3-mal wiederholen</li>\n </ul>", 601 additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>Hacker im Stehen ausf\xFChren</li>\n <li>Hoch-Tief-Bewegungen mit unterschiedlicher Geschwindigkeit\xAD</li>\n </ol>" 602 }, { 603 category: 'Gut für den Rücken', 604 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Tauchgang.jpg', 605 imgAlt: 'Mädchen sitz auf Stuh und berührt Zehen', 606 headline: 'Tauchgang', 607 id: 'gut-fuer-ruecken-2', 608 text: "<ul>\n <li>Aufrecht sitzen, den Oberk\xF6rper langsam nach vorn beugen, bis die Finger an den F\xFC\xDFen sind</li>\n <li>Wirbel f\xFCr Wirbel wieder aufrichten</li>\n <li>5-mal wiederholen</li>\n </ul>", 609 additionalInformation: '' 610 }, {
611 category: 'Kraft für den Bauch', 612 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Oberkoerper-drehen.jpg', 613 imgAlt: 'Mädchen sitzt auf Stuhl und dehnt Oberkörper', 614 headline: 'Oberkörper drehen', 615 id: 'kraft-fuer-bauch-1', 616 text: "<ul>\n <li>Aufrecht sitzen, Arme in Schulterh\xF6he anwinkeln und Oberk\xF6rper nach rechts und links drehen (die H\xFCfte bleibt stabil!)</li>\n <li>10-mal wiederholen</li>\n </ul>", 617 additionalInformation: '' 618 }, { 619 category: 'Kraft für den Bauch', 620 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Hueftkreisen.jpg', 621 imgAlt: 'Frau lässt die Hüften kreisen', 622 headline: 'Hüftkreisen', 623 id: 'kraft-fuer-bauch-2', 624 text: "<ul>\n <li>Aufrecht stehen, Knie leicht gebeugt, H\xE4nde auf den H\xFCften</li>\n <li>Die H\xFCften kreisen, 10-mal gegen den Uhrzeigersinn, dann andersherum</li>\n </ul>", 625 additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>Arme beim Kreisen seitlich in H\xFCfth\xF6he anheben</li>\n </ol>" 626 }, { 627 category: 'Kopf und Nacken', 628 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Schultern-abhoeren-.jpg', 629 imgAlt: 'Junge Sitzt auf Stuhl und neigt den Kopf', 630 headline: 'Schultern abhören', 631 id: 'kopf-nacken-1', 632 text: "<ul>\n <li>Aufrecht sitzen, Arme locker, linkes Ohr zur linken Schulter neigen, rechter Arm zieht aktiv zum Boden</li>\n <li>Bis 10 z\xE4hlen, l\xF6sen, entspannen und Seite wechseln</li>\n <li>3-mal je Seite</li>\n </ul>", 633 additionalInformation: '' 634 }, { 635 category: 'Kopf und Nacken', 636 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Starker-Nacken.jpg', 637 imgAlt: 'Frau sitzt auf Stuhl und streckt die Arme', 638 headline: 'Starker Nacken', 639 id: 'kopf-nacken-2', 640 text: "<ul>\n <li>Aufrecht sitzen, H\xE4nde hinter dem Kopf verschr\xE4nken</li>\n <li>H\xE4nde dr\xFCcken leicht gegen den Kopf, Nacken und Kopf bleiben gerade, bis 10 z\xE4hlen, l\xF6sen</li>\n <li>5-mal wiederholen</li>\n </ul>", 641 additionalInformation: '' 642 }, { 643 category: 'Nacken lockern', 644 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Schulterblick.jpg', 645 imgAlt: 'Mädchen sitzt auf Stuhl und lockert Nacken', 646 headline: 'Schulterblick', 647 id: 'nacken-lockern-1', 648 text: "<ul>\n <li>Aufrecht sitzen, Blick nach vorn</li>\n <li>Kopf langsam nach rechts drehen, dann nach links, der Blick geht jeweils \xFCber die Schulter</li>\n <li>5-mal wiederholen</li>\n </ul>", 649 additionalInformation: '' 650 }, { 651 category: 'Nacken lockern', 652 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Doppelkinn.jpg', 653 imgAlt: 'Mann sitzt auf Stuhl und beugt das Kinn', 654 headline: 'Doppelkinn', 655 id: 'nacken-lockern-2', 656 text: "<ul>\n <li>Aufrecht sitzen, Kinn in Richtung Brust, dann leicht nach hinten bewegen, Blick nach unten, Nacken strecken</li>\n <li>Bis 10 z\xE4hlen, Kopf anheben, Anspannung l\xF6sen</li>\n <li>5-mal wiederholen</li>\n </ul>", 657 additionalInformation: '' 658 }, {
659 category: 'Starke Beine', 660 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Hinsetzen-und-aufstehen.jpg', 661 imgAlt: 'Junge und Mann stehen von Bank auf', 662 headline: 'Hinsetzen und aufstehen', 663 id: 'starke-beine-1', 664 text: "<ul>\n <li>Aufrecht vor der Bank stehen, Oberk\xF6rper vorneigen und langsam hinsetzen, R\xFCcken aufrichten, wieder aufstehen</li>\n <li>Bis 10 z\xE4hlen, Kopf anheben, Anspannung l\xF6sen</li>\n <li>5- bis 10-mal wiederholen</li>\n </ul>", 665 additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>Arme beim Aufstehen lang nach vorne strecken (F\xFC\xDFe in Schrittstellung)</li>\n <li>Arme beim Aufstehen auf den Oberschenkeln abst\xFCtzen (F\xFC\xDFe parallel)\xAD</li>\n </ol>" 666 }, { 667 category: 'Starke Beine', 668 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Marschieren.jpg', 669 imgAlt: 'Mädchen maschiert', 670 headline: 'Marschieren', 671 id: 'starke-beine-2', 672 text: "<ul>\n <li>Aufrecht stehen, Arme locker</li>\n <li>Abwechselnd die Knie anheben und auf der Stelle gehen, Arme schwingen gegengleich vor und zur\xFCck</li>\n <li>10-mal je Bein</li>\n </ul>", 673 additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>Eine Strecke von 10 Schritten vorw\xE4rtsgehen</li>\n <li>R\xFCckw\xE4rtsmarschieren\xAD</li>\n </ol>" 674 }, { 675 category: 'Starke Füsse', 676 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Auf-Zehenspitzen.jpg', 677 imgAlt: 'Mädchen läuft auf Zehenspitzen', 678 headline: 'Auf Zehenspitzen', 679 id: 'starke-fuesse-1', 680 text: "<ul>\n <li>Aufrecht stehen, F\xFC\xDFe h\xFCftbreit</li>\n <li>Arme leicht zur Seite strecken, auf die Zehenspitzen stellen und jeweils 10 Schritte vor und zur\xFCck gehen</li>\n <li>2- bis 3-mal wiederholen</li>\n </ul>", 681 additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>Auf den Zehenspitzen r\xFCckw\xE4rtsgehen</li>\n <li>Eine mit Kreide aufgezeichnete oder gepflasterte Linie entlanggehen</li>\n </ol>" 682 }, { 683 category: 'Starke Füsse', 684 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Fersen-lauf.jpg', 685 imgAlt: 'Junge läuft auf Fersen', 686 headline: 'Fersenlauf', 687 id: 'starke-fuesse-2', 688 text: "<ul>\n <li>Aufrecht stehen, F\xFC\xDFe h\xFCftbreit, Arme leicht zur Seite strecken</li>\n <li>Auf die Fersen stellen, Zehen anziehen und jeweils 10 Schritte vor und zur\xFCck gehen</li>\n <li>2- bis 3-mal wiederholen</li>\n </ul>", 689 additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>Auf den Fersen r\xFCckw\xE4rtsgehen</li>\n <li>Eine mit Kreide aufgezeichnete oder gepflasterte Linie entlanggehen</li>\n </ol>" 690 }, { 691 category: 'Kraft für die Arme', 692 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Heben-und-halten.jpg', 693 imgAlt: 'Mädchen und Frau heben Dinge hoch', 694 headline: 'Heben und halten', 695 id: 'kraft-fuer-arme-1', 696 text: "<ul>\n <li>Aufrecht stehen, Arme ausstrecken und mit beiden H\xE4nden einen Gegenstand 5- bis 10-mal auf Schulterh\xF6he anheben, langsam wieder zur\xFCck, entspannen</li>\n <li>5-mal wiederholen</li>\n </ul>", 697 additionalInformation: "<h5>
697Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>Gegenstand mit nur einer Hand anheben</li>\n <li>Gegenst\xE4nde rechts und links im Wechsel anheben</li>\n </ol>" 698 }, { 699 category: 'Kraft für die Arme', 700 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Liegestuetz-im-Stehen.jpg', 701 imgAlt: 'Mädchen und Mann machen Liegestütze an einem Baum', 702 headline: 'Liegestütz im Stehen', 703 id: 'kraft-fuer-arme-2', 704 text: "<ul>\n <li>Eine Arml\xE4nge vor einen Baum (oder eine Wand) stellen, H\xE4nde in Schulterh\xF6he aufsetzen</li>\n <li>Arme beugen, Kopf in Richtung Baum, wegdr\xFCcken</li>\n <li>5-mal wiederholen</li>\n </ul>", 705 additionalInformation: '' 706 }, { 707 category: 'Kraft in den Schultern', 708 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Schultern-heben.jpg', 709 imgAlt: 'Frau hebt ihre Schultern', 710 headline: 'Schultern heben', 711 id: 'kraft-in-schultern-1', 712 text: "<ul>\n <li>Aufrecht stehen, Arme locker</li>\n <li>Schultern Richtung Ohren anheben, Hals bleibt gerade, bis 10 z\xE4hlen, entspannen</li>\n <li>5-mal wiederholen</li>\n </ul>", 713 additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>\xDCbung im Sitzen durchf\xFChren</li>\n </ol>" 714 }, { 715 category: 'Kraft in den Schultern', 716 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Windmuehle.jpg', 717 imgAlt: 'Mädchen und Mann machen mit dem Armen eine Windmühle', 718 headline: 'Windmühle', 719 id: 'kraft-in-schultern-2', 720 text: "<ul>\n <li>Aufrecht stehen, Arme locker</li>\n <li>Linken Arm nach oben, rechten Arm nach unten strecken, von vorn nach hinten kreisen</li>\n <li>In beide Richtungen 5- bis 10-mal kreisen</li>\n </ul>", 721 additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>Beim Schulterkreisen Arme locker seitlich herunterh\xE4ngen lassen</li>\n </ol>" 722 }, { 723 category: 'Koordination', 724 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Werfen-und-fangen.jpg', 725 imgAlt: 'Junge wirft etwas hoch', 726 headline: 'Werfen und fangen', 727 id: 'koordination', 728 text: "<ul>\n <li>Aufrecht stehen</li>\n <li>Einen leichten Gegenstand hochwerfen und mit derselben Hand wieder auffangen, dann wechseln</li>\n <li>5-mal je Hand</li>\n </ul>", 729 additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>Gegenstand nach oben werfen, dann Handfl\xE4che nach unten drehen und Gegenstand von oben greifen</li>\n </ol>" 730 }, { 731 category: 'Koordination', 732 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Flugbahn.jpg', 733 imgAlt: 'Junge wirft etwas zu einem Mann', 734 headline: 'Flugbahn', 735 id: 'koordination', 736 text: "<ul>\n <li>2 Personen stehen mit dem R\xFCcken zueinander, 2 bis 3 Schritte Abstand</li>\n <li>Person 1 wirft den Gegenstand nach hinten, Person 2 f\xE4ngt ihn auf und wirft ihn zur\xFCck</li>\n <li>5-mal wiederholen</li>\n </ul>", 737 additionalInformation: "<h5>
737Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>Auf Zuruf werfen, z.B. \u201EFang!\u201C</li>\n <li>Auf \u201E1, 2, 3\u201C zuwerfen</li>\n </ol>" 738 }, { 739 category: 'Gleichgewicht', 740 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Gaenseschritte.jpg', 741 imgAlt: 'Frau geht in Gänseschritten', 742 headline: 'Gänseschritte', 743 id: 'gleichgewicht-1', 744 text: "<ul>\n <li>Aufrecht stehen, Knie leicht gebeugt, Arme seitlich ausstrecken</li>\n <li>Einen Fu\xDF vor den anderen setzen, Ferse direkt an Fu\xDFspitze, 10 Schritte vor, 10 zur\xFCck</li>\n <li>3-mal wiederholen</li>\n </ul>", 745 additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>R\xFCckw\xE4rtsgehen</li>\n <li>Eine mit Kreide aufgezeichnete oder gepflasterte Linie entlanggehen</li>\n </ol>" 746 }, { 747 category: 'Gleichgewicht', 748 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Auf-einem-Bein-stehen.jpg', 749 imgAlt: 'Mädchen steht auf einem Bein', 750 headline: 'Auf einem Bein stehen', 751 id: 'gleichgewicht-2', 752 text: "<ul>\n <li>Aufrecht stehen, rechtes Bein mit angezogener Fu\xDFspitze seitlich nach oben heben, bis 10 z\xE4hlen, entspannen, dann Seitenwechsel</li>\n <li>3-mal je Bein</li>\n </ul>", 753 additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>Bein im H\xFCftgelenk vor- und zur\xFCck\xADpendeln</li>\n <li>Mit dem angehobenen Fu\xDF eine 8 zeichnen</li>\n </ol>" 754 }, { 755 category: 'Oberkörper dehnen', 756 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Schultern-dehnen.jpg', 757 imgAlt: 'Frau dehnt ihre Schultern', 758 headline: 'Schultern dehnen', 759 id: 'oberkoerper-dehnen-1', 760 text: "<ul>\n <li>Linken Arm \xFCber rechte Schulter f\xFChren und mit rechter Hand gegen linken Ellenbogen dr\xFCcken, bis die Dehnung sp\xFCrbar ist, bis 10 z\xE4hlen, dann l\xF6sen</li>\n <li>2- bis 3-mal je Arm</li>\n </ul>", 761 additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>\xDCbung im Sitzen ausf\xFChren</li>\n </ol>" 762 }, { 763 category: 'Oberkörper dehnen', 764 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Seiten-dehnen.jpg', 765 imgAlt: 'Mädchen dehnt ihre Seiten', 766 headline: 'Seiten dehnen', 767 id: 'oberkoerper-dehnen-1', 768 text: "<ul>\n <li>Arme \xFCber den Kopf strecken, Handfl\xE4chen zusammen, Oberk\xF6rper nach rechts beugen, bis 10 z\xE4hlen, aufrichten und l\xF6sen</li>\n <li>2- bis 3-mal je Seite</li>\n </ul>", 769 additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n <ol>\n <li>\xDCbung im Sitzen ausf\xFChren</li>\n </ol>" 770 }, { 771 category: 'Rücken und Beine dehnen', 772 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Ruecken-dehnen.jpg', 773 imgAlt: 'Mädchen dehnt ihren Rücken', 774 headline: 'Rücken dehnen', 775 id: 'ruecken-beine-dehnen-1', 776 text: "<ul>\n <li>Aufrecht sitzen, H\xE4nde verschr\xE4nken</li>\n <li>Handfl\xE4chen nach au\xDFen drehen, Arme ausstrecken, Oberk\xF6rper langsam nach vorn neigen, bis 10 z\xE4hlen, aufrichten</li>\n <li>2- bis 3-mal wiederholen</li>\n </ul>", 777 additionalInformation: '' 778 }, {
779 category: 'Rücken und Beine dehnen', 780 imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Beine-dehnen.jpg', 781 imgAlt: 'Frau dehnt ihre', 782 headline: 'Beine dehnen', 783 id: 'ruecken-beine-dehnen-2', 784 text: "<ul>\n <li>Aufrecht sitzen, ein Bein nach vorn strecken, Ferse aufsetzen, Fu\xDFspitze anziehen oder strecken, bis 10 z\xE4hlen, entspannen</li>\n <li>2- bis 3-mal je Bein</li>\n </ul>", 785 additionalInformation: '' 786 }]; 787 788 //Columns 789 this.cardContainer = document.querySelector('.cardgame .grid'); 790 } 791 792 //Render cards 793 return (0, _createClass2["default"])(CardGame, [{ 794 key: "renderCards", 795 value: function renderCards(cardArray) { 796 var _this = this; 797 if (!this.cardContainer) { 798 return; 799 } 800 cardArray.forEach(function (card) { 801 var cardElement = document.createElement('div'); 802 var category = _this.categorys.filter(function (category) { 803 return category.name === card.category; 804 })[0]; 805 cardElement.classList.add('grid-item', category["class"], 'game-card'); 806 cardElement.innerHTML = "\n <div class=\"card\" role=\"button\" tabindex=\"0\">\n <div class=\"front\" style=\"--position: 3\">\n <div class=\"card-header\">\n <h4>".concat(category.name, "</h4>\n <img src=\"").concat(category.iconPath, "\" alt=\"").concat(category.iconAlt, "\" width=\"30px\" height=\"30px\">\n </div>\n <img class=\"card-img\" src=\"").concat(card.imgPath, "\" alt=\"").concat(card.imgAlt, "\">\n <h3>").concat(card.headline, "</h3>\n </div>\n </div>\n <div class=\"modal hidden\" tabindex=\"-1\" role=\"dialog\">\n <div class=\"modal-dialog\" role=\"document\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Kartenansicht Schlie\xDFen\" tabindex=\"0\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"card\" role=\"button\">\n <div class=\"front\" style=\"--position: 3\">\n <div class=\"card-header\">\n <h4>").concat(category.name, "</h4>\n <img src=\"").concat(category.iconPath, "\" alt=\"").concat(category.iconAlt, "\" width=\"30px\" height=\"30px\">\n </div>\n <img class=\"card-img\" src=\"").concat(card.imgPath, "\" alt=\"").concat(card.imgAlt, "\">\n <h3>").concat(card.headline, "</h3>\n </div>\n </div>\n <div class=\"card\" role=\"button\">\n <div class=\"back\" style=\"--position: 3\">\n <div class=\"card-header\">\n <h4>").concat(category.name, "</h4>\n <img src=\"").concat(category.iconPath, "\" alt=\"").concat(category.iconAlt, "\" width=\"30px\" height=\"30px\">\n </div>\n <img class=\"card-img\" src=\"").concat(card.imgPath, "\" alt=\"").concat(card.imgAlt, "\">\n <h5>").concat(card.headline, "</h5>\n ").concat(card.text, "\n </div>\n </div>\n <div class=\"additional-information\">\n ").concat(card.additionalInformation, "\n </div>\n </div>\n </div>\n </div>\n </div>\n "); 807 _this.cardContainer.append(cardElement); 808 }); 809 } 810 }, { 811 key: "initialize", 812 value: function initialize() { 813 if (!this.cardContainer) { 814 return; 815 } 816 this.renderCards(this.cards); 817 var gridElem = this.cardContainer; 818 var isFilterActive = false;
819 820 //Open Modal on click 821 document.querySelectorAll('.card').forEach(function (card) { 822 function handleCardAction() { 823 card.nextElementSibling.classList.toggle('hidden'); 824 825 // Add Offset 826 var offset = Math.round(gridElem.getBoundingClientRect().top) * -1; 827 var modalDialog = card.parentElement.querySelector('.modal-dialog'); 828 if (offset <= 0) { 829 modalDialog.style.cssText = '--offset: 0px'; 830 } else { 831 modalDialog.style.cssText = "--offset: ".concat(offset, "px"); 832 } 833 834 // Add Offset 835 if (isFilterActive) { 836 gridElem.style.cssText = "--modal-height: ".concat(modalDialog.clientHeight + 50, "px"); 837 } 838 } 839 840 // Event listener for click 841 card.addEventListener('click', handleCardAction); 842 843 // Event listener for keydown 844 card.addEventListener('keydown', function (event) { 845 if (event.key === 'Enter' || event.keyCode === 13) { 846 handleCardAction(); 847 } 848 }); 849 }); 850 851 //Hide modal on close 852 document.querySelectorAll('.cardgame .modal button').forEach(function (button) { 853 button.addEventListener('click', function () { 854 var modal = button.closest('.modal'); 855 modal.classList.toggle('hidden'); 856 if (isFilterActive) { 857 gridElem.style.cssText = "--modal-height: auto"; 858 } 859 }); 860 }); 861 862 //Check if filter is active 863 var buttonGroup = document.querySelector('.filter-button-group'); 864 if (buttonGroup) { 865 buttonGroup.childNodes.forEach(function (button) { 866 button.addEventListener('click', function (event) { 867 if (button.getAttribute('data-filter') === '*') { 868 isFilterActive = false; 869 } else { 870 isFilterActive = true; 871 } 872 }); 873 }); 874 } 875 876 // Initialize Isotope 877 var iso = new _isotopeLayout["default"](gridElem, { 878 itemSelector: '.grid-item', 879 layoutMode: 'fitRows' 880 }); 881 882 // Filtering functionality 883 if (buttonGroup) { 884 buttonGroup.addEventListener('click', function (event) { 885 if (!matchesSelector(event.target, 'button')) return; 886 var filterValue = event.target.getAttribute('data-filter'); 887 iso.arrange({ 888 filter: filterValue 889 }); 890 891 // Handle active state of buttons 892 var buttons = buttonGroup.querySelectorAll('button'); 893 buttons.forEach(function (button) { 894 button.classList.remove('is-checked'); 895 }); 896 event.target.classList.add('is-checked'); 897 }); 898 } 899 900 // Helper function for event delegation 901 function matchesSelector(elem, selector) { 902 var fn = elem.matches || elem.msMatchesSelector || elem.webkitMatchesSelector; 903 if (fn) { 904 return fn.call(elem, selector); 905 } else { 906 return false; 907 } 908 } 909 } 910 }]); 911}(); 912 913},{"@babel/runtime/helpers/classCallCheck":13,"@babel/runtime/helpers/createClass":14,"@babel/runtime/helpers/interopRequireDefault":19,"isotope-layout":32}],7:[function(require,module,exports){ 914"use strict"; 915 916var _backToTop = require("./back-to-top"); 917var _cardGame = require("./cardGame"); 918var _mainNav = require("./mainNav"); 919var _WcoSwiperSliderExtended = require("./SwiperSlider/WcoSwiperSliderExtended"); 920var _SwiperConfig = require("./SwiperSlider/SwiperConfig"); 921var _responsiveImagemap = require("./responsiveImagemap"); 922var _topOffCanvasSearch = require("./topOffCanvasSearch"); 923var _wcoMediaconsent = require("@wco/wco-mediaconsent"); 924var _wcoBmiCalculator = require("@wco/wco-bmi-calculator"); 925var _wcoBzgaMethodenfinder = require("@wco/wco-bzga-methodenfinder"); 926var _ShareFlyOut = require("./ShareFlyOut"); 927var _wcoBitvForms = require("@wco/wco-bitv-forms"); 928var _Form = require("./Form"); 929/** 930 * Load jQuery into global `$` for plugin usage 931 * @type {jQuery} 932 */ 933window.$ = window.jQuery = require('jquery'); 934require('@accessible360/accessible-slick'); // Carousel plugin 935require('bootstrap'); // Bootstrap 936require('superfish'); 937require('devbridge-autocomplete'); // jquery-autocomplete 938 939new _WcoSwiperSliderExtended.WcoSwiperSliderExtended('.swiper-container', _SwiperConfig.swiperConfig).initialize(); 940$(document).ready(function () { 941 new _backToTop.BackToTop().initialize(); 942 new _mainNav.MainNav().initialize(); 943 new _responsiveImagemap.ResponsiveImagemap().initialize(); 944 new _topOffCanvasSearch.TopOffCanvasSearch().initialize(); 945 new _wcoMediaconsent.WcoMediaconsent().initialize(); 946 new _wcoBmiCalculator.WcoBmiCalculator().initialize(); 947 new _ShareFlyOut.ShareFlyOut().initialize(); 948 new _wcoBitvForms.WcoBitvForm().initialize(); 949 new _Form.Form().initialize(); 950 new _wcoBzgaMethodenfinder.WcoBzgaMethodenfinder().initialize();
951 new _cardGame.CardGame().initialize(); 952}); 953 954},{"./Form":1,"./ShareFlyOut":2,"./SwiperSlider/SwiperConfig":3,"./SwiperSlider/WcoSwiperSliderExtended":4,"./back-to-top":5,"./cardGame":6,"./mainNav":8,"./responsiveImagemap":9,"./topOffCanvasSearch":10,"@accessible360/accessible-slick":11,"@wco/wco-bitv-forms":44,"@wco/wco-bmi-calculator":51,"@wco/wco-bzga-methodenfinder":58,"@wco/wco-mediaconsent":81,"bootstrap":26,"devbridge-autocomplete":28,"jquery":38,"superfish":43}],8:[function(require,module,exports){ 955"use strict"; 956 957var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 958Object.defineProperty(exports, "__esModule", { 959 value: true 960}); 961exports.MainNav = void 0; 962var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); 963var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); 964var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); 965var MainNav = exports.MainNav = /*#__PURE__*/function () { 966 function MainNav() { 967 (0, _classCallCheck2["default"])(this, MainNav); 968 (0, _defineProperty2["default"])(this, "keyboardClose", false); 969 } 970 return (0, _createClass2["default"])(MainNav, [{ 971 key: "initialize", 972 value: function initialize() { 973 var _this = this; 974 var $nav = $('#mainNav'); 975 var navContainer = document.querySelector('.navbar-mainnavigation'); 976 if ($nav.length === 0) return; 977 $nav.superfish({ 978 delay: 0, 979 speed: 'fast', 980 speedOut: 1 981 }); 982 this.syncAriaExpanded($nav); 983 this.addEscapeKeyListener($nav, navContainer); 984 985 // Sperre aufheben (Maus) 986 $nav.find('> li').on('mouseenter', function () { 987 _this.keyboardClose = false; 988 if (navContainer) navContainer.classList.remove('dropdown-closed'); 989 }); 990 991 // Sperre aufheben (Tastatur) 992 $nav.on('keydown', function (e) { 993 if (e.key !== 'Tab') return; 994 _this.keyboardClose = false; 995 if (navContainer) { 996 navContainer.classList.remove('dropdown-closed'); 997 } 998 }); 999 if (navContainer) { 1000 navContainer.addEventListener('mouseleave', function () { 1001 _this.keyboardClose = false; 1002 navContainer.classList.remove('dropdown-closed'); 1003 }); 1004 document.addEventListener('mousedown', function () { 1005 _this.keyboardClose = false; 1006 navContainer.classList.remove('dropdown-closed'); 1007 }); 1008 } 1009 } 1010 }, { 1011 key: "syncAriaExpanded", 1012 value: function syncAriaExpanded($nav) { 1013 $nav.find('> li').each(function (index, li) { 1014 var $li = $(li); 1015 var $link = $li.children('a').first(); 1016 if ($link.length === 0) return; 1017 $link.attr('aria-expanded', 'false'); 1018 var observer = new MutationObserver(function () { 1019 var isOpen = $li.hasClass('sfHover'); 1020 $link.attr('aria-expanded', isOpen ? 'true' : 'false'); 1021 }); 1022 observer.observe(li, { 1023 attributes: true, 1024 attributeFilter: ['class'] 1025 }); 1026 }); 1027 } 1028 }, { 1029 key: "addEscapeKeyListener", 1030 value: function addEscapeKeyListener($nav, navContainer) { 1031 var _this2 = this; 1032 document.addEventListener('keydown', function (event) { 1033 if (event.key === 'Escape' || event.key === 'Esc') { 1034 var $openLi = $nav.find('> li.sfHover'); 1035 if ($openLi.length > 0) { 1036 event.preventDefault(); 1037 1038 // Merken, dass Dropdown geschlossen wurde 1039 // AnschlieÃendes Tab darf es nicht sofort wieder öffnen 1040 _this2.keyboardClose = true; 1041 if (navContainer) { 1042 navContainer.classList.add('dropdown-closed'); 1043 } 1044 var focusInsideSubmenu = $openLi.find('a:focus').length > 0; 1045 if (focusInsideSubmenu) { 1046 var $triggerLink = $openLi.children('a').first(); 1047 if ($triggerLink.length > 0) { 1048 // Fokus zurück auf trigger link 1049 $triggerLink.focus(); 1050 $nav.superfish('hide', true); 1051 $openLi.removeClass('sfHover'); 1052 } 1053 } else { 1054 $nav.superfish('hide', true); 1055 $openLi.removeClass('sfHover'); 1056 } 1057 } 1058 } 1059 }); 1060 } 1061 }]); 1062}(); 1063 1064},{"@babel/runtime/helpers/classCallCheck":13,"@babel/runtime/helpers/createClass":14,"@babel/runtime/helpers/
1064defineProperty":15,"@babel/runtime/helpers/interopRequireDefault":19}],9:[function(require,module,exports){ 1065"use strict"; 1066 1067var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 1068Object.defineProperty(exports, "__esModule", { 1069 value: true 1070}); 1071exports.ResponsiveImagemap = void 0; 1072var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); 1073var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); 1074var ResponsiveImagemap = exports.ResponsiveImagemap = /*#__PURE__*/function () { 1075 function ResponsiveImagemap() { 1076 (0, _classCallCheck2["default"])(this, ResponsiveImagemap); 1077 } 1078 return (0, _createClass2["default"])(ResponsiveImagemap, [{ 1079 key: "initialize", 1080 value: function initialize() { 1081 // $('img[usemap]').rwdImageMaps(); 1082 $('#Bewegungszeiten area').on('click', function () { 1083 $($(this).attr('href')).find('.collapse').collapse('show'); 1084 }); 1085 } 1086 }]); 1087}(); 1088 1089},{"@babel/runtime/helpers/classCallCheck":13,"@babel/runtime/helpers/createClass":14,"@babel/runtime/helpers/interopRequireDefault":19}],10:[function(require,module,exports){ 1090"use strict"; 1091 1092var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 1093Object.defineProperty(exports, "__esModule", { 1094 value: true 1095}); 1096exports.TopOffCanvasSearch = void 0; 1097var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); 1098var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); 1099var TopOffCanvasSearch = exports.TopOffCanvasSearch = /*#__PURE__*/function () { 1100 function TopOffCanvasSearch() { 1101 (0, _classCallCheck2["default"])(this, TopOffCanvasSearch); 1102 } 1103 return (0, _createClass2["default"])(TopOffCanvasSearch, [{ 1104 key: "initialize", 1105 value: function initialize() { 1106 $('.top-search-toggle').on('click', function (event) { 1107 // Stop default action and bubbling 1108 event.stopPropagation(); 1109 event.preventDefault(); 1110 $(".top-off-canvas-search").toggleClass('slideOpen'); 1111 $(".top-off-canvas-search").slideToggle(); 1112 if ($(".top-off-canvas-search").hasClass('slideOpen')) { 1113 $(".top-off-canvas-search .tx-solr-q").focus(); 1114 } 1115 }); 1116 $(".top-off-canvas-search .close-search").on("click", function () { 1117 $(".top-off-canvas-search").removeClass('slideOpen'); 1118 $(".top-off-canvas-search").slideUp(); 1119 }); 1120 $('.top-off-canvas-search .input-group-addon.search-button').on('click', function (event) { 1121 $(this).parents('form').submit(); 1122 }); 1123 } 1124 }]); 1125}(); 1126 1127},{"@babel/runtime/helpers/classCallCheck":13,"@babel/runtime/helpers/createClass":14,"@babel/runtime/helpers/interopRequireDefault":19}],11:[function(require,module,exports){ 1128/* 1129 (accessible) 1130 _ _ _ _ 1131 ___| (_) ___| | __ (_)___ 1132/ __| | |/ __| |/ / | / __| 1133\__ \ | | (__| < _ | \__ \ 1134|___/_|_|\___|_|\_(_)/ |___/ 1135 |__/ 1136 1137 Version: [email protected] 1138 Author: Jason Webb (Accessible360) 1139 Website: https://accessible360.com 1140 Docs: https://accessible360.github.io/accessible-slick 1141 Repo: https://github.com/Accessible360/accessible-slick 1142 Issues: https://github.com/Accessible360/accessible-slick/issues 1143 1144 */ 1145/* global window, document, define, jQuery, setInterval, clearInterval */ 1146;(function(factory) { 1147 'use strict'; 1148 if (typeof define === 'function' && define.amd) { 1149 define(['jquery'], factory); 1150 } else if (typeof exports !== 'undefined') { 1151 module.exports = factory(require('jquery')); 1152 } else { 1153 factory(jQuery); 1154 } 1155 1156}(function($) { 1157 'use strict'; 1158 var Slick = window.Slick || {}; 1159 1160 Slick = (function() { 1161 1162 var instanceUid = 0; 1163 1164 function Slick(element, settings) { 1165 1166 var _ = this, dataSettings; 1167 1168 _.defaults = { 1169 adaptiveHeight: false, 1170 appendArrows: $(element), 1171 appendDots: $(element), 1172 arrows: true, 1173 arrowsPlacement: null, 1174 asNavFor: null,
1175 prevArrow: '<button class="slick-prev" type="button">' 1176 + '<span class="slick-prev-icon" aria-hidden="true"></span>' 1177 + '<span class="slick-sr-only">Previous</span>' 1178 + '</button>', 1179 nextArrow: '<button class="slick-next" type="button">' 1180 + '<span class="slick-next-icon" aria-hidden="true"></span>' 1181 + '<span class="slick-sr-only">Next</span>' 1182 + '</button>', 1183 autoplay: false, 1184 autoplaySpeed: 3000, 1185 centerMode: false, 1186 centerPadding: '50px', 1187 cssEase: 'ease', 1188 customPaging: function(slider, i) { 1189 return $('<button type="button">' 1190 + '<span class="slick-dot-icon" aria-hidden="true"></span>' 1191 + '<span class="slick-sr-only">Go to slide ' + (i+1) + '</span>' 1192 + '</button>'); 1193 }, 1194 dots: false, 1195 dotsClass: 'slick-dots', 1196 draggable: true, 1197 easing: 'linear', 1198 edgeFriction: 0.35, 1199 fade: false, 1200 infinite: true, 1201 initialSlide: 0, 1202 instructionsText: null, 1203 lazyLoad: 'ondemand', 1204 mobileFirst: false, 1205 playIcon: '<span class="slick-play-icon" aria-hidden="true"></span>', 1206 pauseIcon: '<span class="slick-pause-icon" aria-hidden="true"></span>', 1207 pauseOnHover: true, 1208 pauseOnFocus: true, 1209 pauseOnDotsHover: false, 1210 regionLabel: 'carousel', 1211 respondTo: 'window', 1212 responsive: null, 1213 rows: 1, 1214 rtl: false, 1215 slide: '', 1216 slidesPerRow: 1, 1217 slidesToShow: 1, 1218 slidesToScroll: 1, 1219 speed: 500, 1220 swipe: true, 1221 swipeToSlide: false, 1222 touchMove: true, 1223 touchThreshold: 5, 1224 useAutoplayToggleButton: true, 1225 useCSS: true, 1226 useGroupRole: true, 1227 useTransform: true, 1228 variableWidth: false, 1229 vertical: false, 1230 verticalSwiping: false, 1231 waitForAnimate: true, 1232 zIndex: 1000 1233 }; 1234 1235 _.initials = { 1236 animating: false, 1237 dragging: false, 1238 autoPlayTimer: null, 1239 currentDirection: 0, 1240 currentLeft: null, 1241 currentSlide: 0, 1242 direction: 1, 1243 $dots: null, 1244 $instructionsText: null, 1245 listWidth: null, 1246 listHeight: null, 1247 loadIndex: 0, 1248 $nextArrow: null, 1249 $pauseButton: null, 1250 $pauseIcon: null, 1251 $playIcon: null, 1252 $prevArrow: null, 1253 scrolling: false, 1254 slideCount: null, 1255 slideWidth: null, 1256 $slideTrack: null, 1257 $slides: null, 1258 sliding: false, 1259 slideOffset: 0, 1260 swipeLeft: null, 1261 swiping: false, 1262 $list: null, 1263 touchObject: {}, 1264 transformsEnabled: false, 1265 unslicked: false 1266 }; 1267 1268 $.extend(_, _.initials); 1269 1270 _.activeBreakpoint = null; 1271 _.animType = null; 1272 _.animProp = null; 1273 _.breakpoints = []; 1274 _.breakpointSettings = []; 1275 _.cssTransitions = false; 1276 _.focussed = false; 1277 _.interrupted = false; 1278 _.hidden = 'hidden'; 1279 _.paused = true; 1280 _.positionProp = null; 1281 _.respondTo = null; 1282 _.rowCount = 1; 1283 _.shouldClick = true; 1284 _.$slider = $(element); 1285 _.$slidesCache = null; 1286 _.transformType = null; 1287 _.transitionType = null; 1288 _.visibilityChange = 'visibilitychange'; 1289 _.windowWidth = 0; 1290 _.windowTimer = null; 1291 1292 dataSettings = $(element).data('slick') || {}; 1293
1294 _.options = $.extend({}, _.defaults, settings, dataSettings); 1295 1296 _.currentSlide = _.options.initialSlide; 1297 1298 _.originalSettings = _.options; 1299 1300 if (typeof document.mozHidden !== 'undefined') { 1301 _.hidden = 'mozHidden'; 1302 _.visibilityChange = 'mozvisibilitychange'; 1303 } else if (typeof document.webkitHidden !== 'undefined') { 1304 _.hidden = 'webkitHidden'; 1305 _.visibilityChange = 'webkitvisibilitychange'; 1306 } 1307 1308 _.autoPlay = $.proxy(_.autoPlay, _); 1309 _.autoPlayClear = $.proxy(_.autoPlayClear, _); 1310 _.autoPlayIterator = $.proxy(_.autoPlayIterator, _); 1311 _.autoPlayToggleHandler = $.proxy(_.autoPlayToggleHandler, _); 1312 _.changeSlide = $.proxy(_.changeSlide, _); 1313 _.clickHandler = $.proxy(_.clickHandler, _); 1314 _.selectHandler = $.proxy(_.selectHandler, _); 1315 _.setPosition = $.proxy(_.setPosition, _); 1316 _.swipeHandler = $.proxy(_.swipeHandler, _); 1317 _.dragHandler = $.proxy(_.dragHandler, _); 1318 1319 _.instanceUid = instanceUid++; 1320 1321 // A simple way to check for HTML strings 1322 // Strict HTML recognition (must start with <) 1323 // Extracted from jQuery v1.11 source 1324 _.htmlExpr = /^(?:\s*(<[\w\W]+>)[^>]*)$/; 1325 1326 1327 _.registerBreakpoints(); 1328 _.init(true); 1329 1330 } 1331 1332 return Slick; 1333 1334 }()); 1335 1336 Slick.prototype.addSlide = Slick.prototype.slickAdd = function(markup, index, addBefore) { 1337 1338 var _ = this; 1339 1340 if (typeof(index) === 'boolean') { 1341 addBefore = index; 1342 index = null; 1343 } else if (index < 0 || (index >= _.slideCount)) { 1344 return false; 1345 } 1346 1347 _.unload(); 1348 1349 if (typeof(index) === 'number') { 1350 if (index === 0 && _.$slides.length === 0) { 1351 $(markup).appendTo(_.$slideTrack); 1352 } else if (addBefore) { 1353 $(markup).insertBefore(_.$slides.eq(index)); 1354 } else { 1355 $(markup).insertAfter(_.$slides.eq(index)); 1356 } 1357 } else { 1358 if (addBefore === true) { 1359 $(markup).prependTo(_.$slideTrack); 1360 } else { 1361 $(markup).appendTo(_.$slideTrack); 1362 } 1363 } 1364 1365 _.$slides = _.$slideTrack.children(this.options.slide); 1366 1367 _.$slideTrack.children(this.options.slide).detach(); 1368 1369 _.$slideTrack.append(_.$slides); 1370 1371 _.$slides.each(function(index, element) { 1372 $(element).attr('data-slick-index', index); 1373 $(element).attr('role', 'group'); 1374 $(element).attr('aria-label', 'slide ' + index); 1375 }); 1376 1377 _.$slidesCache = _.$slides; 1378 1379 _.reinit(); 1380 1381 }; 1382 1383 Slick.prototype.animateHeight = function() { 1384 var _ = this; 1385 if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) { 1386 var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true); 1387 _.$list.animate({ 1388 height: targetHeight 1389 }, _.options.speed); 1390 } 1391 }; 1392 1393 Slick.prototype.animateSlide = function(targetLeft, callback) { 1394 1395 var animProps = {}, 1396 _ = this; 1397 1398 _.animateHeight(); 1399 1400 if (_.options.rtl === true && _.options.vertical === false) { 1401 targetLeft = -targetLeft; 1402 } 1403 if (_.transformsEnabled === false) { 1404 if (_.options.vertical === false) { 1405 _.$slideTrack.animate({ 1406 left: targetLeft 1407 }, _.options.speed, _.options.easing, callback); 1408 } else { 1409 _.$slideTrack.animate({ 1410 top: targetLeft 1411 }, _.options.speed, _.options.easing, callback); 1412 } 1413 1414 } else { 1415 1416 if (_.cssTransitions === false) { 1417 if (_.options.rtl === true) { 1418 _.currentLeft = -(_.currentLeft); 1419 } 1420 $({ 1421 animStart: _.currentLeft 1422 }).animate({ 1423 animStart: targetLeft 1424 }, { 1425 duration: _.options.speed, 1426 easing: _.options.easing, 1427 step: function(now) { 1428 now = Math.ceil(now); 1429 if (_.options.vertical === false) { 1430 animProps[_.animType] = 'translate(' + 1431 now + 'px, 0px)'; 1432 _.$slideTrack.css(animProps); 1433 } else { 1434 animProps[_.animType] = 'translate(0px,' + 1435 now + 'px)'; 1436 _.$slideTrack.css(animProps); 1437 } 1438 }, 1439 complete: function() { 1440 if (callback) { 1441 callback.call(); 1442 } 1443 } 1444 }); 1445 1446 } else { 1447 1448 _.applyTransition();
1449 targetLeft = Math.ceil(targetLeft); 1450 1451 if (_.options.vertical === false) { 1452 animProps[_.animType] = 'translate3d(' + targetLeft + 'px, 0px, 0px)'; 1453 } else { 1454 animProps[_.animType] = 'translate3d(0px,' + targetLeft + 'px, 0px)'; 1455 } 1456 _.$slideTrack.css(animProps); 1457 1458 if (callback) { 1459 setTimeout(function() { 1460 1461 _.disableTransition(); 1462 1463 callback.call(); 1464 }, _.options.speed); 1465 } 1466 1467 } 1468 1469 } 1470 1471 }; 1472 1473 Slick.prototype.getNavTarget = function() { 1474 1475 var _ = this, 1476 asNavFor = _.options.asNavFor; 1477 1478 if ( asNavFor && asNavFor !== null ) { 1479 asNavFor = $(asNavFor).not(_.$slider); 1480 } 1481 1482 return asNavFor; 1483 1484 }; 1485 1486 Slick.prototype.asNavFor = function(index) { 1487 1488 var _ = this, 1489 asNavFor = _.getNavTarget(); 1490 1491 if ( asNavFor !== null && typeof asNavFor === 'object' ) { 1492 asNavFor.each(function() { 1493 var target = $(this).slick('getSlick'); 1494 if(!target.unslicked) { 1495 target.slideHandler(index, true); 1496 } 1497 }); 1498 } 1499 1500 }; 1501 1502 Slick.prototype.applyTransition = function(slide) { 1503 1504 var _ = this, 1505 transition = {}; 1506 1507 if (_.options.fade === false) { 1508 transition[_.transitionType] = _.transformType + ' ' + _.options.speed + 'ms ' + _.options.cssEase; 1509 } else { 1510 transition[_.transitionType] = 'opacity ' + _.options.speed + 'ms ' + _.options.cssEase; 1511 } 1512 1513 if (_.options.fade === false) { 1514 _.$slideTrack.css(transition); 1515 } else { 1516 _.$slides.eq(slide).css(transition); 1517 } 1518 1519 }; 1520 1521 Slick.prototype.autoPlay = function() { 1522 1523 var _ = this; 1524 1525 _.autoPlayClear(); 1526 1527 if ( _.slideCount > _.options.slidesToShow ) { 1528 _.autoPlayTimer = setInterval( _.autoPlayIterator, _.options.autoplaySpeed ); 1529 } 1530 1531 }; 1532 1533 Slick.prototype.autoPlayClear = function() { 1534 1535 var _ = this; 1536 1537 if (_.autoPlayTimer) { 1538 clearInterval(_.autoPlayTimer); 1539 } 1540 1541 }; 1542 1543 Slick.prototype.autoPlayIterator = function() { 1544 1545 var _ = this, 1546 slideTo = _.currentSlide + _.options.slidesToScroll; 1547 1548 if ( !_.paused && !_.interrupted && !_.focussed ) { 1549 1550 if ( _.options.infinite === false ) { 1551 1552 if ( _.direction === 1 && ( _.currentSlide + 1 ) === ( _.slideCount - 1 )) { 1553 _.direction = 0; 1554 } 1555 1556 else if ( _.direction === 0 ) { 1557 1558 slideTo = _.currentSlide - _.options.slidesToScroll; 1559 1560 if ( _.currentSlide - 1 === 0 ) { 1561 _.direction = 1; 1562 } 1563 1564 } 1565 1566 } 1567 1568 _.slideHandler( slideTo ); 1569 1570 } 1571 1572 }; 1573 1574 Slick.prototype.autoPlayToggleHandler = function() { 1575 var _ = this; 1576 1577 if(_.paused) { 1578 _.$playIcon.css('display', 'none'); 1579 _.$pauseIcon.css('display', 'inline'); 1580 1581 _.$pauseButton.find('.slick-play-text').attr('style', 'display: none'); 1582 _.$pauseButton.find('.slick-pause-text').removeAttr('style'); 1583 1584 _.slickPlay(); 1585 } else { 1586 _.$playIcon.css('display', 'inline'); 1587 _.$pauseIcon.css('display', 'none'); 1588 1589 _.$pauseButton.find('.slick-play-text').removeAttr('style'); 1590 _.$pauseButton.find('.slick-pause-text').attr('style', 'display: none'); 1591 1592 _.slickPause(); 1593 } 1594 }; 1595 1596 Slick.prototype.buildArrows = function() { 1597 1598 var _ = this; 1599 1600 if (_.options.arrows === true ) { 1601 1602 _.$prevArrow = $(_.options.prevArrow).addClass('slick-arrow'); 1603 _.$nextArrow = $(_.options.nextArrow).addClass('slick-arrow'); 1604 1605 if( _.slideCount > _.options.slidesToShow ) { 1606 1607 if (_.htmlExpr.test(_.options.prevArrow)) { 1608 if(_.options.arrowsPlacement != null) { 1609 switch(_.options.arrowsPlacement) { 1610 case 'beforeSlides': 1611 case 'split': 1612 console.log('test'); 1613 _.$prevArrow.prependTo(_.options.appendArrows); 1614 break; 1615 1616 case 'afterSlides': 1617 _.$prevArrow.appendTo(_.options.appendArrows); 1618 break; 1619 } 1620 1621 } else { 1622 _.$prevArrow.prependTo(_.options.appendArrows); 1623 } 1624 } 1625 1626 if (_.htmlExpr.test(_.options.nextArrow)) { 1627 if(_.options.arrowsPlacement != null) { 1628 switch(_.options.arrowsPlacement) { 1629 case 'beforeSlides': 1630 console.log('test2'); 1631 _.$prevArrow.after(_.$nextArrow); 1632 break; 1633 1634 case 'afterSlides': 1635 case 'split': 1636 _.$nextArrow.appendTo(_.options.appendArrows); 1637 } 1638 } else { 1639 _.$nextArrow.appendTo(_.options.appendArrows); 1640 } 1641 } 1642 1643 if (_.options.infinite !== true) { 1644 _.$prevArrow 1645 .addClass('slick-disabled') 1646 .prop('disabled', true); 1647 } 1648 1649 } else { 1650 1651 _.$prevArrow.add( _.$nextArrow ) 1652 1653 .addClass('slick-hidden') 1654 .prop('disabled', true); 1655 } 1656 1657 } 1658 1659 }; 1660 1661 Slick.prototype.buildDots = function() { 1662 1663 var _ = this, 1664 i, dot; 1665 1666 if (_.options.dots === true && _.slideCount > _.options.slidesToShow) { 1667 1668 _.$slider.addClass('slick-dotted'); 1669 1670 dot = $('<ul />').addClass(_.options.dotsClass); 1671 1672 for (i = 0; i <= _.getDotCount(); i += 1) { 1673 dot.append($('<li />').append(_.options.customPaging.call(this, _, i))); 1674 } 1675 1676 _.$dots = dot.appendTo(_.options.appendDots); 1677 1678 _.$dots.find('li').first().addClass('slick-active'); 1679 1680 } 1681 1682 }; 1683 1684 Slick.prototype.buildOut = function() { 1685 1686 var _ = this; 1687 1688 _.$slides = 1689 _.$slider 1690 .children( _.options.slide + ':not(.slick-cloned)') 1691 .addClass('slick-slide'); 1692 1693 _.slideCount = _.$slides.length; 1694 1695 _.$slides.each(function(index, element) { 1696 $(element) 1697 .attr('data-slick-index', index) 1698 .data('originalStyling', $(element).attr('style') || ''); 1699 1700 if(_.options.useGroupRole) { 1701 $(element) 1702 .attr('role', 'group') 1703 .attr('aria-label', 'slide ' + (index + 1)); 1704 } 1705 }); 1706 1707 _.$slider.addClass('slick-slider'); 1708 1709 _.$slider.attr('role', 'region'); 1710 _.$slider.attr('aria-label', _.options.regionLabel); 1711 1712 _.$slideTrack = (_.slideCount === 0) ? 1713 $('<div class="slick-track"/>').appendTo(_.$slider) : 1714 _.$slides.wrapAll('<div class="slick-track"/>').parent(); 1715 1716 _.$list = _.$slideTrack.wrap( 1717 '<div class="slick-list"/>').parent(); 1718 _.$slideTrack.css('opacity', 0); 1719 1720 if (_.options.centerMode === true || _.options.swipeToSlide === true) {
1721 _.options.slidesToScroll = 1; 1722 } 1723 1724 $('img[data-lazy]', _.$slider).not('[src]').addClass('slick-loading'); 1725 1726 _.setupInfinite(); 1727 1728 _.buildArrows(); 1729 1730 _.buildDots(); 1731 1732 _.updateDots(); 1733 1734 1735 _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0); 1736 1737 if (_.options.draggable === true) { 1738 _.$list.addClass('draggable'); 1739 } 1740 1741 if ( _.options.autoplay && _.options.useAutoplayToggleButton ) { 1742 _.$pauseIcon = $(_.options.pauseIcon).attr('aria-hidden', true); 1743 _.$playIcon = $(_.options.playIcon).attr('aria-hidden', true); 1744 1745 _.$pauseButton = $('<button type="button" class="slick-autoplay-toggle-button">'); 1746 _.$pauseButton.append(_.$pauseIcon); 1747 _.$pauseButton.append(_.$playIcon.css('display', 'none')); 1748 _.$pauseButton.append($('<span class="slick-pause-text slick-sr-only">Pause</span>')); 1749 _.$pauseButton.append($('<span class="slick-play-text slick-sr-only" style="display: none">Play</span>')); 1750 1751 _.$pauseButton.prependTo(_.$slider); 1752 } 1753 1754 if((_.options.instructionsText != null && _.options.instructionsText != '')) { 1755 _.$instructionsText = $('<p class="slick-instructions slick-sr-only">' + _.options.instructionsText + '</p>'); 1756 _.$instructionsText.prependTo(_.$slider); 1757 } 1758 1759 }; 1760 1761 Slick.prototype.buildRows = function() { 1762 1763 var _ = this, a, b, c, newSlides, numOfSlides, originalSlides,slidesPerSection; 1764 1765 newSlides = document.createDocumentFragment(); 1766 originalSlides = _.$slider.children(); 1767 1768 if(_.options.rows > 0) { 1769 1770 slidesPerSection = _.options.slidesPerRow * _.options.rows; 1771 numOfSlides = Math.ceil( 1772 originalSlides.length / slidesPerSection 1773 ); 1774 1775 for(a = 0; a < numOfSlides; a++){ 1776 var slide = document.createElement('div'); 1777 for(b = 0; b < _.options.rows; b++) { 1778 var row = document.createElement('div'); 1779 for(c = 0; c < _.options.slidesPerRow; c++) { 1780 var target = (a * slidesPerSection + ((b * _.options.slidesPerRow) + c)); 1781 if (originalSlides.get(target)) { 1782 row.appendChild(originalSlides.get(target)); 1783 } 1784 } 1785 slide.appendChild(row); 1786 } 1787 newSlides.appendChild(slide); 1788 } 1789 1790 _.$slider.empty().append(newSlides); 1791 _.$slider.children().children().children() 1792 .css({ 1793 'width':(100 / _.options.slidesPerRow) + '%', 1794 'display': 'inline-block' 1795 }); 1796 1797 } 1798 1799 }; 1800 1801 Slick.prototype.checkResponsive = function(initial, forceUpdate) { 1802 1803 var _ = this, 1804 breakpoint, targetBreakpoint, respondToWidth, triggerBreakpoint = false; 1805 var sliderWidth = _.$slider.width(); 1806 var windowWidth = window.innerWidth || $(window).width(); 1807 1808 if (_.respondTo === 'window') { 1809 respondToWidth = windowWidth; 1810 } else if (_.respondTo === 'slider') { 1811 respondToWidth = sliderWidth; 1812 } else if (_.respondTo === 'min') { 1813 respondToWidth = Math.min(windowWidth, sliderWidth); 1814 } 1815 1816 if ( _.options.responsive && 1817 _.options.responsive.length && 1818 _.options.responsive !== null) { 1819 1820 targetBreakpoint = null; 1821 1822 for (breakpoint in _.breakpoints) { 1823 if (_.breakpoints.hasOwnProperty(breakpoint)) { 1824 if (_.originalSettings.mobileFirst === false) { 1825 if (respondToWidth < _.breakpoints[breakpoint]) { 1826 targetBreakpoint = _.breakpoints[breakpoint]; 1827 } 1828 } else { 1829 if (respondToWidth > _.breakpoints[breakpoint]) { 1830 targetBreakpoint = _.breakpoints[breakpoint]; 1831 } 1832 } 1833 } 1834 } 1835
1836 if (targetBreakpoint !== null) { 1837 if (_.activeBreakpoint !== null) { 1838 if (targetBreakpoint !== _.activeBreakpoint || forceUpdate) { 1839 _.activeBreakpoint = 1840 targetBreakpoint; 1841 if (_.breakpointSettings[targetBreakpoint] === 'unslick') { 1842 _.unslick(targetBreakpoint); 1843 } else { 1844 _.options = $.extend({}, _.originalSettings, 1845 _.breakpointSettings[ 1846 targetBreakpoint]); 1847 if (initial === true) { 1848 _.currentSlide = _.options.initialSlide; 1849 } 1850 _.refresh(initial); 1851 } 1852 triggerBreakpoint = targetBreakpoint; 1853 } 1854 } else { 1855 _.activeBreakpoint = targetBreakpoint; 1856 if (_.breakpointSettings[targetBreakpoint] === 'unslick') { 1857 _.unslick(targetBreakpoint); 1858 } else { 1859 _.options = $.extend({}, _.originalSettings, 1860 _.breakpointSettings[ 1861 targetBreakpoint]); 1862 if (initial === true) { 1863 _.currentSlide = _.options.initialSlide; 1864 } 1865 _.refresh(initial); 1866 } 1867 triggerBreakpoint = targetBreakpoint; 1868 } 1869 } else { 1870 if (_.activeBreakpoint !== null) { 1871 _.activeBreakpoint = null; 1872 _.options = _.originalSettings; 1873 if (initial === true) { 1874 _.currentSlide = _.options.initialSlide; 1875 } 1876 _.refresh(initial); 1877 triggerBreakpoint = targetBreakpoint; 1878 } 1879 } 1880 1881 // only trigger breakpoints during an actual break. not on initialize. 1882 if( !initial && triggerBreakpoint !== false ) { 1883 _.$slider.trigger('breakpoint', [_, triggerBreakpoint]); 1884 } 1885 } 1886 1887 }; 1888 1889 Slick.prototype.changeSlide = function(event, dontAnimate) { 1890 1891 var _ = this, 1892 $target = $(event.currentTarget), 1893 indexOffset, slideOffset, unevenOffset; 1894 1895 // If target is a link, prevent default action. 1896 if($target.is('a')) { 1897 event.preventDefault(); 1898 } 1899 1900 // If target is not the <li> element (ie: a child), find the <li>. 1901 if(!$target.is('li')) { 1902 $target = $target.closest('li'); 1903 } 1904 1905 unevenOffset = (_.slideCount % _.options.slidesToScroll !== 0); 1906 indexOffset = unevenOffset ? 0 : (_.slideCount - _.currentSlide) % _.options.slidesToScroll; 1907 1908 switch (event.data.message) { 1909 1910 case 'previous': 1911 slideOffset = indexOffset === 0 ? _.options.slidesToScroll : _.options.slidesToShow - indexOffset; 1912 if (_.slideCount > _.options.slidesToShow) { 1913 _.slideHandler(_.currentSlide - slideOffset, false, dontAnimate); 1914 } 1915 break; 1916 1917 case 'next': 1918 slideOffset = indexOffset === 0 ? _.options.slidesToScroll : indexOffset; 1919 if (_.slideCount > _.options.slidesToShow) { 1920 _.slideHandler(_.currentSlide + slideOffset, false, dontAnimate); 1921 } 1922 break; 1923 1924 case 'index': 1925 var index = event.data.index === 0 ? 0 : 1926 event.data.index || $target.index() * _.options.slidesToScroll; 1927 1928 _.slideHandler(_.checkNavigable(index), false, dontAnimate); 1929 $target.children().trigger('focus'); 1930 break; 1931 1932 default: 1933 return; 1934 } 1935 1936 }; 1937 1938 Slick.prototype.checkNavigable = function(index) { 1939 1940 var _ = this, 1941 navigables, prevNavigable; 1942 1943 navigables = _.getNavigableIndexes(); 1944 prevNavigable = 0; 1945 if (index > navigables[navigables.length - 1]) { 1946 index = navigables[navigables.length - 1]; 1947 } else { 1948 for (var n in navigables) { 1949 if (index < navigables[n]) { 1950 index = prevNavigable; 1951 break; 1952 } 1953 prevNavigable = navigables[n]; 1954 } 1955 } 1956 1957 return index; 1958 }; 1959 1960 Slick.prototype.cleanUpEvents = function() { 1961 1962 var _ = this; 1963
1964 if(_.options.autoplay && _.options.useAutoplayToggleButton) { 1965 _.$pauseButton.off('click.slick', _.autoPlayToggleHandler); 1966 } 1967 1968 if (_.options.dots && _.$dots !== null) { 1969 1970 $('li', _.$dots) 1971 .off('click.slick', _.changeSlide) 1972 .off('mouseenter.slick', $.proxy(_.interrupt, _, true)) 1973 .off('mouseleave.slick', $.proxy(_.interrupt, _, false)); 1974 } 1975 1976 _.$slider.off('focus.slick blur.slick'); 1977 1978 if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) { 1979 _.$prevArrow && _.$prevArrow.off('click.slick', _.changeSlide); 1980 _.$nextArrow && _.$nextArrow.off('click.slick', _.changeSlide); 1981 } 1982 1983 _.$list.off('touchstart.slick mousedown.slick', _.swipeHandler); 1984 _.$list.off('touchmove.slick mousemove.slick', _.swipeHandler); 1985 _.$list.off('touchend.slick mouseup.slick', _.swipeHandler); 1986 _.$list.off('touchcancel.slick mouseleave.slick', _.swipeHandler); 1987 1988 _.$list.off('click.slick', _.clickHandler); 1989 1990 $(document).off(_.visibilityChange, _.visibility); 1991 1992 _.cleanUpSlideEvents(); 1993 1994 $(window).off('orientationchange.slick.slick-' + _.instanceUid, _.orientationChange); 1995 1996 $(window).off('resize.slick.slick-' + _.instanceUid, _.resize); 1997 1998 $('[draggable!=true]', _.$slideTrack).off('dragstart', _.preventDefault); 1999 2000 $(window).off('load.slick.slick-' + _.instanceUid, _.setPosition); 2001 2002 }; 2003 2004 Slick.prototype.cleanUpSlideEvents = function() { 2005 2006 var _ = this; 2007 2008 _.$list.off('mouseenter.slick', $.proxy(_.interrupt, _, true)); 2009 _.$list.off('mouseleave.slick', $.proxy(_.interrupt, _, false)); 2010 2011 }; 2012 2013 Slick.prototype.cleanUpRows = function() { 2014 2015 var _ = this, originalSlides; 2016 2017 if(_.options.rows > 0) { 2018 originalSlides = _.$slides.children().children(); 2019 originalSlides.removeAttr('style'); 2020 _.$slider.empty().append(originalSlides); 2021 } 2022 2023 }; 2024 2025 Slick.prototype.clickHandler = function(event) { 2026 2027 var _ = this; 2028 2029 if (_.shouldClick === false) { 2030 event.stopImmediatePropagation(); 2031 event.stopPropagation(); 2032 event.preventDefault(); 2033 } 2034 2035 }; 2036 2037 Slick.prototype.destroy = function(refresh) { 2038 2039 var _ = this; 2040 2041 _.autoPlayClear(); 2042 2043 _.touchObject = {}; 2044 2045 _.cleanUpEvents(); 2046 2047 $('.slick-cloned', _.$slider).detach(); 2048 2049 if(_.options.autoplay && _.options.useAutoplayToggleButton) { 2050 _.$pauseButton.remove(); 2051 } 2052 2053 if (_.$dots) { 2054 _.$dots.remove(); 2055 } 2056 2057 if ( _.$prevArrow && _.$prevArrow.length ) { 2058 2059 _.$prevArrow 2060 .removeClass('slick-disabled slick-arrow slick-hidden') 2061 .prop('disabled', false) 2062 .css('display',''); 2063 2064 if ( _.htmlExpr.test( _.options.prevArrow )) { 2065 _.$prevArrow.remove(); 2066 } 2067 } 2068 2069 if ( _.$nextArrow && _.$nextArrow.length ) { 2070 2071 _.$nextArrow 2072 .removeClass('slick-disabled slick-arrow slick-hidden') 2073 .prop('disabled', false) 2074 .css('display',''); 2075 2076 if ( _.htmlExpr.test( _.options.nextArrow )) { 2077 _.$nextArrow.remove(); 2078 } 2079 } 2080 2081 2082 if (_.$slides) { 2083 2084 _.$slides 2085 .removeClass('slick-slide slick-active slick-center slick-visible slick-current') 2086 .removeAttr('aria-hidden') 2087 .removeAttr('data-slick-index') 2088 .each(function(){ 2089 $(this).attr('style', $(this).data('originalStyling')); 2090 }); 2091 2092 _.$slideTrack.children(this.options.slide).detach(); 2093 2094 _.$slideTrack.detach(); 2095 2096 _.$list.detach(); 2097 2098 _.$slider.append(_.$slides); 2099 } 2100 2101 _.cleanUpRows(); 2102 2103 _.$slider.removeClass('slick-slider'); 2104 _.$slider.removeClass('slick-initialized'); 2105 _.$slider.removeClass('slick-dotted'); 2106 2107 _.unslicked = true; 2108 2109 if(!refresh) { 2110 _.$slider.trigger('destroy', [_]); 2111 } 2112 2113 }; 2114 2115 Slick.prototype.disableTransition = function(slide) { 2116 2117 var _ = this, 2118 transition = {}; 2119 2120 transition[_.transitionType] = ''; 2121 2122 if (_.options.fade === false) { 2123 _.$slideTrack.css(transition); 2124 } else { 2125 _.$slides.eq(slide).css(transition); 2126 } 2127 2128 }; 2129 2130 Slick.prototype.fadeSlide = function(slideIndex, callback) { 2131 2132 var _ = this; 2133 2134 if (_.cssTransitions === false) { 2135 2136 _.$slides.eq(slideIndex).css({ 2137 zIndex: _.options.zIndex 2138 }); 2139 2140 _.$slides.eq(slideIndex).animate({ 2141 opacity: 1 2142 }, _.options.speed, _.options.easing, callback); 2143 2144 } else { 2145 2146 _.applyTransition(slideIndex); 2147 2148 _.$slides.eq(slideIndex).css({ 2149 opacity: 1, 2150 zIndex: _.options.zIndex 2151 }); 2152 2153 if (callback) { 2154 setTimeout(function() { 2155 2156 _.disableTransition(slideIndex); 2157 2158 callback.call(); 2159 }, _.options.speed); 2160 } 2161 2162 } 2163 2164 }; 2165 2166 Slick.prototype.fadeSlideOut = function(slideIndex) { 2167 2168 var _ = this; 2169 2170 if (_.cssTransitions === false) { 2171 2172 _.$slides.eq(slideIndex).animate({ 2173 opacity: 0, 2174 zIndex: _.options.zIndex - 2 2175 }, _.options.speed, _.options.easing); 2176 2177 } else { 2178 2179 _.applyTransition(slideIndex); 2180 2181 _.$slides.eq(slideIndex).css({ 2182 opacity: 0, 2183 zIndex: _.options.zIndex - 2 2184 }); 2185 2186 } 2187 2188 }; 2189
2190 Slick.prototype.filterSlides = Slick.prototype.slickFilter = function(filter) { 2191 2192 var _ = this; 2193 2194 if (filter !== null) { 2195 2196 _.$slidesCache = _.$slides; 2197 2198 _.unload(); 2199 2200 _.$slideTrack.children(this.options.slide).detach(); 2201 2202 _.$slidesCache.filter(filter).appendTo(_.$slideTrack); 2203 2204 _.reinit(); 2205 2206 } 2207 2208 }; 2209 2210 Slick.prototype.focusHandler = function() { 2211 2212 var _ = this; 2213 2214 // If any child element receives focus within the slider we need to pause the autoplay 2215 _.$slider 2216 .off('focus.slick blur.slick') 2217 .on( 2218 'focus.slick', 2219 '*', 2220 function(event) { 2221 var $sf = $(this); 2222 2223 setTimeout(function() { 2224 if( _.options.pauseOnFocus ) { 2225 if ($sf.is(':focus')) { 2226 _.focussed = true; 2227 _.autoPlay(); 2228 } 2229 } 2230 }, 0); 2231 } 2232 ).on( 2233 'blur.slick', 2234 '*', 2235 function(event) { 2236 var $sf = $(this); 2237 2238 // When a blur occurs on any elements within the slider we become unfocused 2239 if( _.options.pauseOnFocus ) { 2240 _.focussed = false; 2241 _.autoPlay(); 2242 } 2243 } 2244 ); 2245 }; 2246 2247 Slick.prototype.getCurrent = Slick.prototype.slickCurrentSlide = function() { 2248 2249 var _ = this; 2250 return _.currentSlide; 2251 2252 }; 2253 2254 Slick.prototype.getDotCount = function() { 2255 2256 var _ = this; 2257 2258 var breakPoint = 0; 2259 var counter = 0; 2260 var pagerQty = 0; 2261 2262 if (_.options.infinite === true) { 2263 if (_.slideCount <= _.options.slidesToShow) { 2264 ++pagerQty; 2265 } else { 2266 while (breakPoint < _.slideCount) { 2267 ++pagerQty; 2268 breakPoint = counter + _.options.slidesToScroll; 2269 counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow; 2270 } 2271 } 2272 } else if (_.options.centerMode === true) { 2273 pagerQty = _.slideCount; 2274 } else if(!_.options.asNavFor) { 2275 pagerQty = 1 + Math.ceil((_.slideCount - _.options.slidesToShow) / _.options.slidesToScroll); 2276 }else { 2277 while (breakPoint < _.slideCount) { 2278 ++pagerQty; 2279 breakPoint = counter + _.options.slidesToScroll; 2280 counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow; 2281 } 2282 } 2283 2284 return pagerQty - 1; 2285 2286 }; 2287 2288 Slick.prototype.getLeft = function(slideIndex) { 2289 2290 var _ = this, 2291 targetLeft, 2292 verticalHeight, 2293 verticalOffset = 0, 2294 targetSlide, 2295 coef; 2296 2297 _.slideOffset = 0; 2298 verticalHeight = _.$slides.first().outerHeight(true); 2299 2300 if (_.options.infinite === true) { 2301 if (_.slideCount > _.options.slidesToShow) { 2302 _.slideOffset = (_.slideWidth * _.options.slidesToShow) * -1; 2303 coef = -1 2304 2305 if (_.options.vertical === true && _.options.centerMode === true) { 2306 if (_.options.slidesToShow === 2) { 2307 coef = -1.5; 2308 } else if (_.options.slidesToShow === 1) { 2309 coef = -2 2310 } 2311 } 2312 verticalOffset = (verticalHeight * _.options.slidesToShow) * coef; 2313 } 2314 if (_.slideCount % _.options.slidesToScroll !== 0) { 2315 if (slideIndex + _.options.slidesToScroll > _.slideCount && _.slideCount > _.options.slidesToShow) { 2316 if (slideIndex > _.slideCount) { 2317 _.slideOffset = ((_.options.slidesToShow - (sl
2317ideIndex - _.slideCount)) * _.slideWidth) * -1; 2318 verticalOffset = ((_.options.slidesToShow - (slideIndex - _.slideCount)) * verticalHeight) * -1; 2319 } else { 2320 _.slideOffset = ((_.slideCount % _.options.slidesToScroll) * _.slideWidth) * -1; 2321 verticalOffset = ((_.slideCount % _.options.slidesToScroll) * verticalHeight) * -1; 2322 } 2323 } 2324 } 2325 } else { 2326 if (slideIndex + _.options.slidesToShow > _.slideCount) { 2327 _.slideOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * _.slideWidth; 2328 verticalOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * verticalHeight; 2329 } 2330 } 2331 2332 if (_.slideCount <= _.options.slidesToShow) { 2333 _.slideOffset = 0; 2334 verticalOffset = 0; 2335 } 2336 2337 if (_.options.centerMode === true && _.slideCount <= _.options.slidesToShow) { 2338 _.slideOffset = ((_.slideWidth * Math.floor(_.options.slidesToShow)) / 2) - ((_.slideWidth * _.slideCount) / 2); 2339 } else if (_.options.centerMode === true && _.options.infinite === true) { 2340 _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2) - _.slideWidth; 2341 } else if (_.options.centerMode === true) { 2342 _.slideOffset = 0; 2343 _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2); 2344 } 2345 2346 if (_.options.vertical === false) { 2347 targetLeft = ((slideIndex * _.slideWidth) * -1) + _.slideOffset; 2348 } else { 2349 targetLeft = ((slideIndex * verticalHeight) * -1) + verticalOffset; 2350 } 2351 2352 if (_.options.variableWidth === true) { 2353
2354 if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) { 2355 targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex); 2356 } else { 2357 targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow); 2358 } 2359 2360 if (_.options.rtl === true) { 2361 if (targetSlide[0]) { 2362 targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1; 2363 } else { 2364 targetLeft = 0; 2365 } 2366 } else { 2367 targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0; 2368 } 2369 2370 if (_.options.centerMode === true) { 2371 if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) { 2372 targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex); 2373 } else { 2374 targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow + 1); 2375 } 2376 2377 if (_.options.rtl === true) { 2378 if (targetSlide[0]) { 2379 targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1; 2380 } else { 2381 targetLeft = 0; 2382 } 2383 } else { 2384 targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0; 2385 } 2386 2387 targetLeft += (_.$list.width() - targetSlide.outerWidth()) / 2; 2388 } 2389 } 2390 2391 return targetLeft; 2392 2393 }; 2394 2395 Slick.prototype.getOption = Slick.prototype.slickGetOption = function(option) { 2396 2397 var _ = this; 2398 2399 return _.options[option]; 2400 2401 }; 2402 2403 Slick.prototype.getNavigableIndexes = function() { 2404 2405 var _ = this, 2406 breakPoint = 0, 2407 counter = 0, 2408 indexes = [], 2409 max; 2410 2411 if (_.options.infinite === false) { 2412 max = _.slideCount; 2413 } else { 2414 breakPoint = _.options.slidesToScroll * -1; 2415 counter = _.options.slidesToScroll * -1; 2416 max = _.slideCount * 2; 2417 } 2418 2419 while (breakPoint < max) { 2420 indexes.push(breakPoint); 2421 breakPoint = counter + _.options.slidesToScroll; 2422 counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow; 2423 } 2424 2425 return indexes; 2426 2427 }; 2428 2429 Slick.prototype.getSlick = function() { 2430 2431 return this; 2432 2433 }; 2434 2435 Slick.prototype.getSlideCount = function() { 2436 2437 var _ = this, 2438 slidesTraversed, swipedSlide, swipeTarget, centerOffset; 2439 2440 centerOffset = _.options.centerMode === true ? Math.floor(_.$list.width() / 2) : 0; 2441 swipeTarget = (_.swipeLeft * -1) + centerOffset; 2442 2443 if (_.options.swipeToSlide === true) { 2444 2445 _.$slideTrack.find('.slick-slide').each(function(index, slide) { 2446 2447 var slideOuterWidth, slideOffset, slideRightBoundary; 2448 slideOuterWidth = $(slide).outerWidth(); 2449 slideOffset = slide.offsetLeft; 2450 if (_.options.centerMode !== true) { 2451 slideOffset += (slideOuterWidth / 2); 2452 } 2453 2454 slideRightBoundary = slideOffset + (slideOuterWidth); 2455 2456 if (swipeTarget < slideRightBoundary) { 2457 swipedSlide = slide; 2458 return false; 2459 } 2460 }); 2461 2462 slidesTraversed = Math.abs($(swipedSlide).attr('data-slick-index') - _.currentSlide) || 1; 2463 2464 return slidesTraversed; 2465 2466 } else { 2467 return _.options.slidesToScroll; 2468 } 2469 2470 }; 2471 2472 Slick.prototype.goTo = Slick.prototype.slickGoTo = function(slide, dontAnimate) { 2473 2474 var _ = this; 2475 2476 _.changeSlide({ 2477 data: { 2478 message: 'index', 2479 index: parseInt(slide) 2480 } 2481 }, dontAnimate); 2482 2483 }; 2484 2485 Slick.prototype.init = function(creation) { 2486 2487 var _ = this; 2488 2489 if (!$(_.$slider).hasClass('slick-initialized')) { 2490 2491 $(_.$slider).addClass('slick-initialized'); 2492 2493 _.buildRows(); 2494 _.buildOut(); 2495 _.setProps(); 2496 _.startLoad(); 2497 _.loadSlider(); 2498 _.initializeEvents(); 2499 _.updateArrows(); 2500 _.updateDots(); 2501 _.checkResponsive(true); 2502 _.focusHandler(); 2503 2504 } 2505 2506 if (creation) { 2507 _.$slider.trigger('init', [_]); 2508 } 2509 2510 if ( _.options.autoplay ) { 2511 2512 _.paused = false;
2513 _.autoPlay(); 2514 2515 } 2516 2517 _.updateSlideVisibility(); 2518 2519 if(_.options.accessibility != undefined) { 2520 console.warn('accessibility setting is no longer supported.') 2521 } 2522 2523 if(_.options.focusOnChange != undefined) { 2524 console.warn('focusOnChange is no longer supported.'); 2525 } 2526 2527 if(_.options.focusOnSelect != undefined) { 2528 console.warn('focusOnSelect is no longer supported.'); 2529 } 2530 2531 }; 2532 2533 Slick.prototype.initArrowEvents = function() { 2534 2535 var _ = this; 2536 2537 if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) { 2538 _.$prevArrow 2539 .off('click.slick') 2540 .on('click.slick', { 2541 message: 'previous' 2542 }, _.changeSlide); 2543 _.$nextArrow 2544 .off('click.slick') 2545 .on('click.slick', { 2546 message: 'next' 2547 }, _.changeSlide); 2548 } 2549 2550 }; 2551 2552 Slick.prototype.initDotEvents = function() { 2553 2554 var _ = this; 2555 2556 if (_.options.dots === true && _.slideCount > _.options.slidesToShow) { 2557 $('li', _.$dots).on('click.slick', { 2558 message: 'index' 2559 }, _.changeSlide); 2560 } 2561 2562 if (_.options.dots === true && _.options.pauseOnDotsHover === true && _.slideCount > _.options.slidesToShow) { 2563 2564 $('li', _.$dots) 2565 .on('mouseenter.slick', $.proxy(_.interrupt, _, true)) 2566 .on('mouseleave.slick', $.proxy(_.interrupt, _, false)); 2567 2568 } 2569 2570 }; 2571 2572 Slick.prototype.initSlideEvents = function() { 2573 2574 var _ = this; 2575 2576 if ( _.options.pauseOnHover ) { 2577 2578 _.$list.on('mouseenter.slick', $.proxy(_.interrupt, _, true)); 2579 _.$list.on('mouseleave.slick', $.proxy(_.interrupt, _, false)); 2580 2581 } 2582 2583 }; 2584 2585 Slick.prototype.initializeEvents = function() { 2586 2587 var _ = this; 2588 2589 _.initArrowEvents(); 2590 2591 _.initDotEvents(); 2592 _.initSlideEvents(); 2593 2594 if(_.options.autoplay && _.options.useAutoplayToggleButton) { 2595 _.$pauseButton.on('click.slick', _.autoPlayToggleHandler); 2596 } 2597 2598 _.$list.on('touchstart.slick mousedown.slick', { 2599 action: 'start' 2600 }, _.swipeHandler); 2601 _.$list.on('touchmove.slick mousemove.slick', { 2602 action: 'move' 2603 }, _.swipeHandler); 2604 _.$list.on('touchend.slick mouseup.slick', { 2605 action: 'end' 2606 }, _.swipeHandler);
2607 _.$list.on('touchcancel.slick mouseleave.slick', { 2608 action: 'end' 2609 }, _.swipeHandler); 2610 2611 _.$list.on('click.slick', _.clickHandler); 2612 2613 $(document).on(_.visibilityChange, $.proxy(_.visibility, _)); 2614 2615 $(window).on('orientationchange.slick.slick-' + _.instanceUid, $.proxy(_.orientationChange, _)); 2616 2617 $(window).on('resize.slick.slick-' + _.instanceUid, $.proxy(_.resize, _)); 2618 2619 $('[draggable!=true]', _.$slideTrack).on('dragstart', _.preventDefault); 2620 2621 $(window).on('load.slick.slick-' + _.instanceUid, _.setPosition); 2622 $(_.setPosition); 2623 2624 }; 2625 2626 Slick.prototype.initUI = function() { 2627 2628 var _ = this; 2629 2630 if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) { 2631 2632 _.$prevArrow.show(); 2633 _.$nextArrow.show(); 2634 2635 } 2636 2637 if (_.options.dots === true && _.slideCount > _.options.slidesToShow) { 2638 2639 _.$dots.show(); 2640 2641 } 2642 2643 }; 2644 2645 Slick.prototype.lazyLoad = function() { 2646 2647 var _ = this, 2648 loadRange, cloneRange, rangeStart, rangeEnd; 2649 2650 function loadImages(imagesScope) { 2651 2652 $('img[data-lazy]', imagesScope).each(function() { 2653 2654 var image = $(this), 2655 imageSource = $(this).attr('data-lazy'), 2656 imageSrcSet = $(this).attr('data-srcset'), 2657 imageSizes = $(this).attr('data-sizes') || _.$slider.attr('data-sizes'), 2658 imageToLoad = document.createElement('img'); 2659 2660 imageToLoad.onload = function() { 2661 2662 image 2663 .animate({ opacity: 0 }, 100, function() { 2664 2665 if (imageSrcSet) { 2666 image 2667 .attr('srcset', imageSrcSet ); 2668 2669 if (imageSizes) { 2670 image 2671 .attr('sizes', imageSizes ); 2672 } 2673 } 2674 2675 image 2676 .attr('src', imageSource) 2677 .animate({ opacity: 1 }, 200, function() { 2678 image 2679 .removeAttr('data-lazy data-srcset data-sizes') 2680 .removeClass('slick-loading'); 2681 }); 2682 _.$slider.trigger('lazyLoaded', [_, image, imageSource]); 2683 }); 2684 2685 }; 2686 2687 imageToLoad.onerror = function() { 2688 2689 image 2690 .removeAttr( 'data-lazy' ) 2691 .removeClass( 'slick-loading' ) 2692 .addClass( 'slick-lazyload-error' ); 2693 2694 _.$slider.trigger('lazyLoadError', [ _, image, imageSource ]); 2695 2696 }; 2697 2698 imageToLoad.src = imageSource; 2699 2700 }); 2701 2702 } 2703 2704 if (_.options.centerMode === true) { 2705 if (_.options.infinite === true) { 2706 rangeStart = _.currentSlide + (_.options.slidesToShow / 2 + 1); 2707 rangeEnd = rangeStart + _.options.slidesToShow + 2; 2708 } else { 2709 rangeStart = Math.max(0, _.currentSlide - (_.options.slidesToShow / 2 + 1)); 2710 rangeEnd = 2 + (_.options.slidesToShow / 2 + 1) + _.currentSlide; 2711 } 2712 } else { 2713 rangeStart = _.options.infinite ? _.options.slidesToShow + _.currentSlide : _.currentSlide; 2714 rangeEnd = Math.ceil(rangeStart + _.options.slidesToShow); 2715 if (_.options.fade === true) { 2716 if (rangeStart > 0) rangeStart--; 2717 if (rangeEnd <= _.slideCount) rangeEnd++; 2718 } 2719 } 2720 2721 loadRange = _.$slider.find('.slick-slide').slice(rangeStart, rangeEnd); 2722 2723 if (_.options.lazyLoad === 'anticipated') { 2724 var prevSlide = rangeStart - 1, 2725 nextSlide = rangeEnd, 2726 $slides = _.$slider.find('.slick-slide'); 2727 2728 for (var i = 0; i < _.options.slidesToScroll; i++) { 2729 if (prevSlide < 0) prevSlide = _.slideCount - 1; 2730 loadRange = loadRange.add($slides.eq(prevSlide)); 2731 loadRange = loadRange.add($slides.eq(nextSlide)); 2732 prevSlide--; 2733 nextSlide++; 2734 } 2735 } 2736 2737 loadImages(loadRange); 2738 2739 if (_.slideCount <= _.options.slidesToShow) { 2740 cloneRange = _.$slider.find('.slick-slide'); 2741 loadImages(cloneRange); 2742 } else 2743 if (_.currentSlide >= _.slideCount - _.options.slidesToShow) { 2744 cloneRange = _.$slider.find('.slick-cloned').slice(0, _.options.slidesToShow); 2745 loadImages(cloneRange); 2746 } else if (_.currentSlide === 0) { 2747 cloneRange = _.$slider.find('.slick-cloned').slice(_.options.slidesToShow * -1); 2748 loadImages(cloneRange); 2749 } 2750 2751 }; 2752 2753 Slick.prototype.loadSlider = function() { 2754 2755 var _ = this; 2756 2757 _.setPosition(); 2758 2759 _.$slideTrack.css({ 2760 opacity: 1 2761 }); 2762 2763 _.$slider.removeClass('slick-loading'); 2764 2765 _.initUI(); 2766 2767 if (_.options.lazyLoad === 'progressive') { 2768 _.progressiveLazyLoad(); 2769 } 2770 2771 }; 2772 2773 Slick.prototype.next = Slick.prototype.slickNext = function() { 2774 2775 var _ = this; 2776 2777 _.changeSlide({ 2778 data: { 2779 message: 'next' 2780 } 2781 }); 2782 2783 }; 2784 2785 Slick.prototype.orientationChange = function() { 2786 2787 var _ = this; 2788 2789 _.checkResponsive(); 2790 _.setPosition(); 2791 2792 }; 2793 2794 Slick.prototype.pause = Slick.prototype.slickPause = function() { 2795 2796 var _ = this; 2797 2798 _.autoPlayClear(); 2799 _.paused = true; 2800 2801 }; 2802 2803 Slick.prototype.play = Slick.prototype.slickPlay = function() { 2804 2805 var _ = this; 2806 2807 _.autoPlay();
2808 _.options.autoplay = true; 2809 _.paused = false; 2810 _.focussed = false; 2811 _.interrupted = false; 2812 2813 }; 2814 2815 Slick.prototype.postSlide = function(index) { 2816 2817 var _ = this; 2818 2819 if( !_.unslicked ) { 2820 2821 _.$slider.trigger('afterChange', [_, index]); 2822 2823 _.animating = false; 2824 2825 if (_.slideCount > _.options.slidesToShow) { 2826 _.setPosition(); 2827 } 2828 2829 _.swipeLeft = null; 2830 2831 if ( _.options.autoplay ) { 2832 _.autoPlay(); 2833 } 2834 2835 _.updateSlideVisibility(); 2836 2837 } 2838 2839 }; 2840 2841 Slick.prototype.prev = Slick.prototype.slickPrev = function() { 2842 2843 var _ = this; 2844 2845 _.changeSlide({ 2846 data: { 2847 message: 'previous' 2848 } 2849 }); 2850 2851 }; 2852 2853 Slick.prototype.preventDefault = function(event) { 2854 2855 event.preventDefault(); 2856 2857 }; 2858 2859 Slick.prototype.progressiveLazyLoad = function( tryCount ) { 2860 2861 tryCount = tryCount || 1; 2862 2863 var _ = this, 2864 $imgsToLoad = $( 'img[data-lazy]', _.$slider ), 2865 image, 2866 imageSource, 2867 imageSrcSet, 2868 imageSizes, 2869 imageToLoad; 2870 2871 if ( $imgsToLoad.length ) { 2872 2873 image = $imgsToLoad.first(); 2874 imageSource = image.attr('data-lazy'); 2875 imageSrcSet = image.attr('data-srcset'); 2876 imageSizes = image.attr('data-sizes') || _.$slider.attr('data-sizes'); 2877 imageToLoad = document.createElement('img'); 2878 2879 imageToLoad.onload = function() { 2880 2881 if (imageSrcSet) { 2882 image 2883 .attr('srcset', imageSrcSet ); 2884 2885 if (imageSizes) { 2886 image 2887 .attr('sizes', imageSizes ); 2888 } 2889 } 2890 2891 image 2892 .attr( 'src', imageSource ) 2893 .removeAttr('data-lazy data-srcset data-sizes') 2894 .removeClass('slick-loading'); 2895 2896 if ( _.options.adaptiveHeight === true ) { 2897 _.setPosition(); 2898 } 2899 2900 _.$slider.trigger('lazyLoaded', [ _, image, imageSource ]); 2901 _.progressiveLazyLoad(); 2902 2903 }; 2904 2905 imageToLoad.onerror = function() { 2906 2907 if ( tryCount < 3 ) { 2908 2909 /** 2910 * try to load the image 3 times, 2911 * leave a slight delay so we don't get 2912 * servers blocking the request. 2913 */ 2914 setTimeout( function() { 2915 _.progressiveLazyLoad( tryCount + 1 ); 2916 }, 500 ); 2917 2918 } else { 2919 2920 image 2921 .removeAttr( 'data-lazy' ) 2922 .removeClass( 'slick-loading' ) 2923 .addClass( 'slick-lazyload-error' ); 2924 2925 _.$slider.trigger('lazyLoadError', [ _, image, imageSource ]); 2926 2927 _.progressiveLazyLoad(); 2928 2929 } 2930 2931 }; 2932 2933 imageToLoad.src = imageSource; 2934 2935 } else { 2936 2937 _.$slider.trigger('allImagesLoaded', [ _ ]); 2938 2939 } 2940 2941 }; 2942 2943 Slick.prototype.refresh = function( initializing ) { 2944 2945 var _ = this, currentSlide, lastVisibleIndex; 2946 2947 lastVisibleIndex = _.slideCount - _.options.slidesToShow; 2948 2949 // in non-infinite sliders, we don't want to go past the 2950 // last visible index. 2951 if( !_.options.infinite && ( _.currentSlide > lastVisibleIndex )) { 2952 _.currentSlide = lastVisibleIndex; 2953 } 2954 2955 // if less slides than to show, go to start. 2956 if ( _.slideCount <= _.options.slidesToShow ) { 2957 _.currentSlide = 0; 2958 2959 } 2960 2961 currentSlide = _.currentSlide; 2962 2963 _.destroy(true); 2964 2965 $.extend(_, _.initials, { currentSlide: currentSlide }); 2966 2967 _.init(); 2968 2969 if( !initializing ) { 2970 2971 _.changeSlide({ 2972 data: { 2973 message: 'index', 2974 index: currentSlide 2975 } 2976 }, false); 2977 2978 } 2979 2980 }; 2981 2982 Slick.prototype.registerBreakpoints = function() { 2983 2984 var _ = this, breakpoint, currentBreakpoint, l, 2985 responsiveSettings = _.options.responsive || null; 2986 2987 if ( $.type(responsiveSettings) === 'array' && responsiveSettings.length ) { 2988 2989 _.respondTo = _.options.respondTo || 'window'; 2990 2991 for ( breakpoint in responsiveSettings ) { 2992 2993 l = _.breakpoints.length-1; 2994 2995 if (responsiveSettings.hasOwnProperty(breakpoint)) { 2996 currentBreakpoint = responsiveSettings[breakpoint].breakpoint; 2997 2998 // loop through the breakpoints and cut out any existing 2999 // ones with the same breakpoint number, we don't want dupes. 3000 while( l >= 0 ) { 3001 if( _.breakpoints[l] && _.breakpoints[l] === currentBreakpoint ) { 3002 _.breakpoints.splice(l,1); 3003 } 3004 l--; 3005 } 3006 3007 _.breakpoints.push(currentBreakpoint); 3008 _.breakpointSettings[currentBreakpoint] = responsiveSettings[breakpoint].settings; 3009 3010 } 3011 3012 } 3013 3014 _.breakpoints.sort(function(a, b) { 3015 return ( _.options.mobileFirst ) ? a-b : b-a; 3016 }); 3017 3018 } 3019 3020 }; 3021 3022 Slick.prototype.reinit = function() { 3023 3024 var _ = this; 3025 3026 _.$slides = 3027 _.$slideTrack 3028 .children(_.options.slide) 3029 .addClass('slick-slide'); 3030 3031 _.slideCount = _.$slides.length; 3032 3033 if (_.currentSlide >= _.slideCount && _.currentSlide !== 0) { 3034 _.currentSlide = _.currentSlide - _.options.slidesToScroll; 3035 } 3036 3037 if (_.slideCount <= _.options.slidesToShow) { 3038 _.currentSlide = 0; 3039 } 3040 3041 _.registerBreakpoints(); 3042 3043 _.setProps(); 3044 _.setupInfinite(); 3045 _.buildArrows(); 3046 _.updateArrows(); 3047 _.initArrowEvents(); 3048 _.buildDots(); 3049 _.updateDots(); 3050 _.initDotEvents(); 3051 _.cleanUpSlideEvents(); 3052 _.initSlideEvents(); 3053 3054 _.checkResponsive(false, true); 3055 3056 _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0); 3057 3058 _.setPosition(); 3059 _.focusHandler(); 3060 3061 _.paused = !_.options.autoplay; 3062 _.autoPlay(); 3063 3064 _.$slider.trigger('reInit', [_]); 3065 3066 }; 3067 3068 Slick.prototype.resize = function() { 3069 3070 var _ = this; 3071 3072 if ($(window).width() !== _.windowWidth) { 3073 clearTimeout(_.windowDelay); 3074 _.windowDelay = window.setTimeout(function() { 3075 _.windowWidth = $(window).width(); 3076 _.checkResponsive();
3077 if( !_.unslicked ) { _.setPosition(); } 3078 }, 50); 3079 } 3080 }; 3081 3082 Slick.prototype.removeSlide = Slick.prototype.slickRemove = function(index, removeBefore, removeAll) { 3083 3084 var _ = this; 3085 3086 if (typeof(index) === 'boolean') { 3087 removeBefore = index; 3088 index = removeBefore === true ? 0 : _.slideCount - 1; 3089 } else { 3090 index = removeBefore === true ? --index : index; 3091 } 3092 3093 if (_.slideCount < 1 || index < 0 || index > _.slideCount - 1) { 3094 return false; 3095 } 3096 3097 _.unload(); 3098 3099 if (removeAll === true) { 3100 _.$slideTrack.children().remove(); 3101 } else { 3102 _.$slideTrack.children(this.options.slide).eq(index).remove(); 3103 } 3104 3105 _.$slides = _.$slideTrack.children(this.options.slide); 3106 3107 _.$slideTrack.children(this.options.slide).detach(); 3108 3109 _.$slideTrack.append(_.$slides); 3110 3111 _.$slidesCache = _.$slides; 3112 3113 _.reinit(); 3114 3115 }; 3116 3117 Slick.prototype.setCSS = function(position) { 3118 3119 var _ = this, 3120 positionProps = {}, 3121 x, y; 3122 3123 if (_.options.rtl === true) { 3124 position = -position; 3125 } 3126 x = _.positionProp == 'left' ? Math.ceil(position) + 'px' : '0px'; 3127 y = _.positionProp == 'top' ? Math.ceil(position) + 'px' : '0px'; 3128 3129 positionProps[_.positionProp] = position; 3130 3131 if (_.transformsEnabled === false) { 3132 _.$slideTrack.css(positionProps); 3133 } else { 3134 positionProps = {}; 3135 if (_.cssTransitions === false) { 3136 positionProps[_.animType] = 'translate(' + x + ', ' + y + ')'; 3137 _.$slideTrack.css(positionProps); 3138 } else { 3139 positionProps[_.animType] = 'translate3d(' + x + ', ' + y + ', 0px)'; 3140 _.$slideTrack.css(positionProps); 3141 } 3142 } 3143 3144 }; 3145 3146 Slick.prototype.setDimensions = function() { 3147 3148 var _ = this; 3149 3150 if (_.options.vertical === false) { 3151 if (_.options.centerMode === true) { 3152 _.$list.css({ 3153 padding: ('0px ' + _.options.centerPadding) 3154 }); 3155 } 3156 } else { 3157 _.$list.height(_.$slides.first().outerHeight(true) * _.options.slidesToShow); 3158 if (_.options.centerMode === true) { 3159 _.$list.css({ 3160 padding: (_.options.centerPadding + ' 0px') 3161 }); 3162 } 3163 } 3164 3165 _.listWidth = _.$list.width(); 3166 _.listHeight = _.$list.height(); 3167 3168 3169 if (_.options.vertical === false && _.options.variableWidth === false) { 3170 _.slideWidth = Math.ceil(_.listWidth / _.options.slidesToShow); 3171 _.$slideTrack.width(Math.ceil((_.slideWidth * _.$slideTrack.children('.slick-slide').length))); 3172 3173 } else if (_.options.variableWidth === true) { 3174 _.$slideTrack.width(5000 * _.slideCount); 3175 } else { 3176 _.slideWidth = Math.ceil(_.listWidth); 3177 _.$slideTrack.height(Math.ceil((_.$slides.first().outerHeight(true) * _.$slideTrack.children('.slick-slide').length))); 3178 } 3179 3180 var offset = _.$slides.first().outerWidth(true) - _.$slides.first().width(); 3181 if (_.options.variableWidth === false) _.$slideTrack.children('.slick-slide').width(_.slideWidth - offset); 3182 3183 }; 3184 3185 Slick.prototype.setFade = function() { 3186 3187 var _ = this, 3188 targetLeft; 3189 3190 _.$slides.each(function(index, element) { 3191 targetLeft = (_.slideWidth * index) * -1; 3192 if (_.options.rtl === true) { 3193 $(element).css({ 3194 position: 'relative', 3195 right: targetLeft, 3196 top: 0, 3197 zIndex: _.options.zIndex - 2, 3198 opacity: 0 3199 }); 3200 } else { 3201 $(element).css({ 3202 position: 'relative', 3203 left: targetLeft, 3204 top: 0, 3205 zIndex: _.options.zIndex - 2, 3206 opacity: 0 3207 }); 3208 } 3209 }); 3210 3211 _.$slides.eq(_.currentSlide).css({ 3212 zIndex: _.options.zIndex - 1, 3213 opacity: 1 3214 }); 3215 3216 }; 3217 3218 Slick.prototype.setHeight = function() { 3219 3220 var _ = this; 3221 3222 if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) { 3223 var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true); 3224 _.$list.css('height', targetHeight); 3225 } 3226 3227 }; 3228 3229 Slick.prototype.setOption = 3230 Slick.prototype.slickSetOption = function() { 3231 3232 /** 3233 * accepts arguments in format of: 3234 * 3235 * - for changing a single option's value: 3236 * .slick("setOption", option, value, refresh ) 3237 * 3238 * - for changing a set of responsive options: 3239 * .slick("setOption", 'responsive', [{}, ...], refresh ) 3240 * 3241 * - for updating multiple values at once (not responsive) 3242 * .slick("setOption", { 'option': value, ... }, refresh ) 3243 */ 3244 3245 var _ = this, l, item, option, value, refresh = false, t
3245ype; 3246 3247 if( $.type( arguments[0] ) === 'object' ) { 3248 3249 option = arguments[0]; 3250 refresh = arguments[1]; 3251 type = 'multiple'; 3252 3253 } else if ( $.type( arguments[0] ) === 'string' ) { 3254 3255 option = arguments[0]; 3256 value = arguments[1]; 3257 refresh = arguments[2]; 3258 3259 if ( arguments[0] === 'responsive' && $.type( arguments[1] ) === 'array' ) { 3260 3261 type = 'responsive'; 3262 3263 } else if ( typeof arguments[1] !== 'undefined' ) { 3264 3265 type = 'single'; 3266 3267 } 3268 3269 } 3270 3271 if ( type === 'single' ) { 3272 3273 _.options[option] = value; 3274 3275 3276 } else if ( type === 'multiple' ) { 3277 3278 $.each( option , function( opt, val ) { 3279 3280 _.options[opt] = val; 3281 3282 }); 3283 3284 3285 } else if ( type === 'responsive' ) { 3286 3287 for ( item in value ) { 3288 3289 if( $.type( _.options.responsive ) !== 'array' ) { 3290 3291 _.options.responsive = [ value[item] ]; 3292 3293 } else { 3294 3295 l = _.options.responsive.length-1; 3296 3297 // loop through the responsive object and splice out duplicates. 3298 while( l >= 0 ) { 3299 3300 if( _.options.responsive[l].breakpoint === value[item].breakpoint ) { 3301 3302 _.options.responsive.splice(l,1); 3303 3304 } 3305 3306 l--; 3307 3308 } 3309 3310 _.options.responsive.push( value[item] ); 3311 3312 } 3313 3314 } 3315 3316 } 3317 3318 if ( refresh ) { 3319 3320 _.unload(); 3321 _.reinit(); 3322 3323 } 3324 3325 }; 3326 3327 Slick.prototype.setPosition = function() { 3328 3329 var _ = this; 3330 3331 _.setDimensions(); 3332 3333 _.setHeight(); 3334 3335 if (_.options.fade === false) { 3336 _.setCSS(_.getLeft(_.currentSlide)); 3337 } else { 3338 _.setFade(); 3339 } 3340 3341 _.$slider.trigger('setPosition', [_]); 3342 3343 }; 3344 3345 Slick.prototype.setProps = function() { 3346 3347 var _ = this, 3348 bodyStyle = document.body.style; 3349 3350 _.positionProp = _.options.vertical === true ? 'top' : 'left'; 3351 3352 if (_.positionProp === 'top') { 3353 _.$slider.addClass('slick-vertical'); 3354 } else { 3355 _.$slider.removeClass('slick-vertical'); 3356 } 3357 3358 if (bodyStyle.WebkitTransition !== undefined || 3359 bodyStyle.MozTransition !== undefined || 3360 bodyStyle.msTransition !== undefined) { 3361 if (_.options.useCSS === true) { 3362 _.cssTransitions = true; 3363 } 3364 } 3365 3366 if ( _.options.fade ) { 3367 if ( typeof _.options.zIndex === 'number' ) { 3368 if( _.options.zIndex < 3 ) { 3369 _.options.zIndex = 3; 3370 } 3371 } else { 3372 _.options.zIndex = _.defaults.zIndex; 3373 } 3374 } 3375 3376 if (bodyStyle.OTransform !== undefined) { 3377 _.animType = 'OTransform'; 3378 _.transformType = '-o-transform'; 3379 _.transitionType = 'OTransition'; 3380 if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false;
3381 } 3382 if (bodyStyle.MozTransform !== undefined) { 3383 _.animType = 'MozTransform'; 3384 _.transformType = '-moz-transform'; 3385 _.transitionType = 'MozTransition'; 3386 if (bodyStyle.perspectiveProperty === undefined && bodyStyle.MozPerspective === undefined) _.animType = false; 3387 } 3388 if (bodyStyle.webkitTransform !== undefined) { 3389 _.animType = 'webkitTransform'; 3390 _.transformType = '-webkit-transform'; 3391 _.transitionType = 'webkitTransition'; 3392 if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false; 3393 } 3394 if (bodyStyle.msTransform !== undefined) { 3395 _.animType = 'msTransform'; 3396 _.transformType = '-ms-transform'; 3397 _.transitionType = 'msTransition'; 3398 if (bodyStyle.msTransform === undefined) _.animType = false; 3399 } 3400 if (bodyStyle.transform !== undefined && _.animType !== false) { 3401 _.animType = 'transform'; 3402 _.transformType = 'transform'; 3403 _.transitionType = 'transition'; 3404 } 3405 _.transformsEnabled = _.options.useTransform && (_.animType !== null && _.animType !== false); 3406 }; 3407 3408 3409 Slick.prototype.setSlideClasses = function(index) { 3410 3411 var _ = this, 3412 centerOffset, allSlides, indexOffset, remainder; 3413 3414 allSlides = _.$slider 3415 .find('.slick-slide') 3416 .removeClass('slick-active slick-center slick-current') 3417 .attr('aria-hidden', 'true') 3418 .attr('aria-label', function() { 3419 return $(this).attr('aria-label').replace(' (centered)', ''); 3420 }); 3421 3422 _.$slides 3423 .eq(index) 3424 .addClass('slick-current'); 3425 3426 if (_.options.centerMode === true) { 3427 3428 var evenCoef = _.options.slidesToShow % 2 === 0 ? 1 : 0; 3429 3430 centerOffset = Math.floor(_.options.slidesToShow / 2); 3431 3432 if (_.options.infinite === true) { 3433 3434 if (index >= centerOffset && index <= (_.slideCount - 1) - centerOffset) { 3435 _.$slides 3436 .slice(index - centerOffset + evenCoef, index + centerOffset + 1) 3437 .addClass('slick-active') 3438 .removeAttr('aria-hidden'); 3439 3440 } else { 3441 3442 indexOffset = _.options.slidesToShow + index; 3443 allSlides 3444 .slice(indexOffset - centerOffset + 1 + evenCoef, indexOffset + centerOffset + 2) 3445 .addClass('slick-active') 3446 .removeAttr('aria-hidden'); 3447 3448 } 3449 3450 if (index === 0) { 3451 3452 allSlides 3453 .eq( _.options.slidesToShow + _.slideCount + 1 ) 3454 .addClass('slick-center') 3455 .attr('aria-label', function() { 3456 return $(this).attr('aria-label') + ' (centered)'; 3457 }); 3458 3459 } else if (index === _.slideCount - 1) { 3460 3461 allSlides 3462 .eq(_.options.slidesToShow) 3463 .addClass('slick-center') 3464 .attr('aria-label', function() { 3465 return $(this).attr('aria-label') + ' (centered)'; 3466 }); 3467 3468 } 3469 3470 } 3471 3472 _.$slides 3473 .eq(index) 3474 .addClass('slick-center') 3475 .attr('aria-label', function() { 3476 return $(this).attr('aria-label') + ' (centered)'; 3477 }); 3478 3479 } else { 3480 3481 if (index >= 0 && index <= (_.slideCount - _.options.slidesToShow)) { 3482 3483 _.$slides 3484 .slice(index, index + _.options.slidesToShow) 3485 .addClass('slick-active') 3486 .removeAttr('aria-hidden'); 3487 3488 } else if (allSlides.length <= _.options.slidesToShow) { 3489 3490 allSlides 3491 .addClass('slick-active') 3492 .removeAttr('aria-hidden'); 3493 3494 } else { 3495 3496 remainder = _.slideCount % _.options.slidesToShow;
3497 indexOffset = _.options.infinite === true ? _.options.slidesToShow + index : index; 3498 3499 if (_.options.slidesToShow == _.options.slidesToScroll && (_.slideCount - index) < _.options.slidesToShow) { 3500 3501 allSlides 3502 .slice(indexOffset - (_.options.slidesToShow - remainder), indexOffset + remainder) 3503 .addClass('slick-active') 3504 .removeAttr('aria-hidden'); 3505 3506 } else { 3507 3508 allSlides 3509 .slice(indexOffset, indexOffset + _.options.slidesToShow) 3510 .addClass('slick-active') 3511 .removeAttr('aria-hidden'); 3512 3513 } 3514 3515 } 3516 3517 } 3518 3519 if (_.options.lazyLoad === 'ondemand' || _.options.lazyLoad === 'anticipated') { 3520 _.lazyLoad(); 3521 } 3522 }; 3523 3524 Slick.prototype.setupInfinite = function() { 3525 3526 var _ = this, 3527 i, slideIndex, infiniteCount; 3528 3529 if (_.options.fade === true) { 3530 _.options.centerMode = false; 3531 } 3532 3533 if (_.options.infinite === true && _.options.fade === false) { 3534 3535 slideIndex = null; 3536 3537 if (_.slideCount > _.options.slidesToShow) { 3538 3539 if (_.options.centerMode === true) { 3540 infiniteCount = _.options.slidesToShow + 1; 3541 } else { 3542 infiniteCount = _.options.slidesToShow; 3543 } 3544 3545 for (i = _.slideCount; i > (_.slideCount - 3546 infiniteCount); i -= 1) { 3547 slideIndex = i - 1; 3548 $(_.$slides[slideIndex]).clone(true).attr('id', '') 3549 .attr('data-slick-index', slideIndex - _.slideCount) 3550 .prependTo(_.$slideTrack).addClass('slick-cloned'); 3551 } 3552 for (i = 0; i < infiniteCount + _.slideCount; i += 1) { 3553 slideIndex = i; 3554 $(_.$slides[slideIndex]).clone(true).attr('id', '') 3555 .attr('data-slick-index', slideIndex + _.slideCount) 3556 .appendTo(_.$slideTrack).addClass('slick-cloned'); 3557 } 3558 _.$slideTrack.find('.slick-cloned').find('[id]').each(function() { 3559 $(this).attr('id', ''); 3560 }); 3561 3562 } 3563 3564 } 3565 3566 }; 3567 3568 Slick.prototype.interrupt = function( toggle ) { 3569 3570 var _ = this; 3571 3572 if( !toggle ) { 3573 _.autoPlay(); 3574 } 3575 _.interrupted = toggle; 3576 3577 }; 3578 3579 Slick.prototype.selectHandler = function(event) { 3580 3581 var _ = this; 3582 3583 var targetElement = 3584 $(event.target).is('.slick-slide') ? 3585 $(event.target) : 3586 $(event.target).parents('.slick-slide'); 3587 3588 var index = parseInt(targetElement.attr('data-slick-index')); 3589 3590 if (!index) index = 0; 3591 3592 if (_.slideCount <= _.options.slidesToShow) { 3593 3594 _.slideHandler(index, false, true); 3595 return; 3596 3597 } 3598 3599 _.slideHandler(index); 3600 3601 }; 3602 3603 Slick.prototype.slideHandler = function(index, sync, dontAnimate) { 3604 3605 var targetSlide, animSlide, oldSlide, slideLeft, targetLeft = null, 3606 _ = this, navTarget; 3607 3608 sync = sync || false; 3609 3610 if (_.animating === true && _.options.waitForAnimate === true) { 3611 return; 3612 } 3613 3614 if (_.options.fade === true && _.currentSlide === index) { 3615 return; 3616 } 3617 3618 if (sync === false) { 3619 _.asNavFor(index); 3620 } 3621 3622 targetSlide = index; 3623 targetLeft = _.getLeft(targetSlide); 3624 slideLeft = _.getLeft(_.currentSlide); 3625 3626 _.currentLeft = _.swipeLeft === null ? slideLeft : _.swipeLeft; 3627 3628 if (_.options.infinite === false && _.options.centerMode === false && (index < 0 || index > _.getDotCount() * _.options.slidesToScroll)) { 3629 if (_.options.fade === false) { 3630 targetSlide = _.currentSlide; 3631 if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) { 3632 _.animateSlide(slideLeft, function() { 3633 _.postSlide(targetSlide); 3634 }); 3635 } else { 3636 _.postSlide(targetSlide); 3637 } 3638 } 3639 return; 3640 } else if (_.options.infinite === false && _.options.centerMode === true && (index < 0 || index > (_.slideCount - _.options.slidesToScroll))) { 3641 if (_.options.fade === false) { 3642 targetSlide = _.currentSlide; 3643 if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) { 3644 _.animateSlide(slideLeft, function() { 3645 _.postSlide(targetSlide); 3646 }); 3647 } else { 3648 _.postSlide(targetSlide); 3649 } 3650 } 3651 return; 3652 } 3653 3654 if ( _.options.autoplay ) { 3655 clearInterval(_.autoPlayTimer); 3656 } 3657
3658 if (targetSlide < 0) { 3659 if (_.slideCount % _.options.slidesToScroll !== 0) { 3660 animSlide = _.slideCount - (_.slideCount % _.options.slidesToScroll); 3661 } else { 3662 animSlide = _.slideCount + targetSlide; 3663 } 3664 } else if (targetSlide >= _.slideCount) { 3665 if (_.slideCount % _.options.slidesToScroll !== 0) { 3666 animSlide = 0; 3667 } else { 3668 animSlide = targetSlide - _.slideCount; 3669 } 3670 } else { 3671 animSlide = targetSlide; 3672 } 3673 3674 _.animating = true; 3675 3676 _.$slider.trigger('beforeChange', [_, _.currentSlide, animSlide]); 3677 3678 oldSlide = _.currentSlide; 3679 _.currentSlide = animSlide; 3680 3681 _.setSlideClasses(_.currentSlide); 3682 3683 if ( _.options.asNavFor ) { 3684 3685 navTarget = _.getNavTarget(); 3686 navTarget = navTarget.slick('getSlick'); 3687 3688 if ( navTarget.slideCount <= navTarget.options.slidesToShow ) { 3689 navTarget.setSlideClasses(_.currentSlide); 3690 } 3691 3692 } 3693 3694 _.updateDots(); 3695 _.updateArrows(); 3696 3697 if (_.options.fade === true) { 3698 if (dontAnimate !== true) { 3699 3700 _.fadeSlideOut(oldSlide); 3701 3702 _.fadeSlide(animSlide, function() { 3703 _.postSlide(animSlide); 3704 }); 3705 3706 } else { 3707 _.postSlide(animSlide); 3708 } 3709 _.animateHeight(); 3710 return; 3711 } 3712 3713 if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) { 3714 _.animateSlide(targetLeft, function() { 3715 _.postSlide(animSlide); 3716 }); 3717 } else { 3718 _.postSlide(animSlide); 3719 } 3720 3721 }; 3722 3723 Slick.prototype.startLoad = function() { 3724 3725 var _ = this; 3726 3727 if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) { 3728 3729 _.$prevArrow.hide(); 3730 _.$nextArrow.hide(); 3731 3732 } 3733 3734 if (_.options.dots === true && _.slideCount > _.options.slidesToShow) { 3735 3736 _.$dots.hide(); 3737 3738 } 3739 3740 _.$slider.addClass('slick-loading'); 3741 3742 }; 3743 3744 Slick.prototype.swipeDirection = function() { 3745 3746 var xDist, yDist, r, swipeAngle, _ = this; 3747 3748 xDist = _.touchObject.startX - _.touchObject.curX; 3749 yDist = _.touchObject.startY - _.touchObject.curY; 3750 r = Math.atan2(yDist, xDist); 3751 3752 swipeAngle = Math.round(r * 180 / Math.PI); 3753 if (swipeAngle < 0) { 3754 swipeAngle = 360 - Math.abs(swipeAngle); 3755 } 3756 3757 if ((swipeAngle <= 45) && (swipeAngle >= 0)) { 3758 return (_.options.rtl === false ? 'left' : 'right'); 3759 } 3760 if ((swipeAngle <= 360) && (swipeAngle >= 315)) { 3761 return (_.options.rtl === false ? 'left' : 'right'); 3762 } 3763 if ((swipeAngle >= 135) && (swipeAngle <= 225)) { 3764 return (_.options.rtl === false ? 'right' : 'left'); 3765 } 3766 if (_.options.verticalSwiping === true) { 3767 if ((swipeAngle >= 35) && (swipeAngle <= 135)) { 3768 return 'down'; 3769 } else { 3770 return 'up'; 3771 } 3772 } 3773 3774 return 'vertical'; 3775 3776 }; 3777 3778 Slick.prototype.swipeEnd = function(event) { 3779 3780 var _ = this, 3781 slideCount, 3782 direction; 3783 3784 _.dragging = false; 3785 _.swiping = false; 3786 3787 if (_.scrolling) { 3788 _.scrolling = false; 3789 return false; 3790 } 3791 3792 _.interrupted = false; 3793 _.shouldClick = ( _.touchObject.swipeLength > 10 ) ? false : true; 3794 3795 if ( _.touchObject.curX === undefined ) { 3796 return false; 3797 } 3798 3799 if ( _.touchObject.edgeHit === true ) { 3800 _.$slider.trigger('edge', [_, _.swipeDirection() ]); 3801 } 3802 3803 if ( _.touchObject.swipeLength >= _.touchObject.minSwipe ) { 3804 3805 direction = _.swipeDirection(); 3806 3807 switch ( direction ) { 3808 3809 case 'left': 3810 case 'down': 3811 3812 slideCount =
3813 _.options.swipeToSlide ? 3814 _.checkNavigable( _.currentSlide + _.getSlideCount() ) : 3815 _.currentSlide + _.getSlideCount(); 3816 3817 _.currentDirection = 0; 3818 3819 break; 3820 3821 case 'right': 3822 case 'up': 3823 3824 slideCount = 3825 _.options.swipeToSlide ? 3826 _.checkNavigable( _.currentSlide - _.getSlideCount() ) : 3827 _.currentSlide - _.getSlideCount(); 3828 3829 _.currentDirection = 1; 3830 3831 break; 3832 3833 default: 3834 3835 3836 } 3837 3838 if( direction != 'vertical' ) { 3839 3840 _.slideHandler( slideCount ); 3841 _.touchObject = {}; 3842 _.$slider.trigger('swipe', [_, direction ]); 3843 3844 } 3845 3846 } else { 3847 3848 if ( _.touchObject.startX !== _.touchObject.curX ) { 3849 3850 _.slideHandler( _.currentSlide ); 3851 _.touchObject = {}; 3852 3853 } 3854 3855 } 3856 3857 }; 3858 3859 Slick.prototype.swipeHandler = function(event) { 3860 3861 var _ = this; 3862 3863 if ((_.options.swipe === false) || ('ontouchend' in document && _.options.swipe === false)) { 3864 return; 3865 } else if (_.options.draggable === false && event.type.indexOf('mouse') !== -1) { 3866 return; 3867 } 3868 3869 _.touchObject.fingerCount = event.originalEvent && event.originalEvent.touches !== undefined ? 3870 event.originalEvent.touches.length : 1; 3871 3872 _.touchObject.minSwipe = _.listWidth / _.options 3873 .touchThreshold; 3874 3875 if (_.options.verticalSwiping === true) { 3876 _.touchObject.minSwipe = _.listHeight / _.options 3877 .touchThreshold; 3878 } 3879 3880 switch (event.data.action) { 3881 3882 case 'start': 3883 _.swipeStart(event); 3884 break; 3885 3886 case 'move': 3887 _.swipeMove(event); 3888 break; 3889 3890 case 'end': 3891 _.swipeEnd(event); 3892 break; 3893 3894 } 3895 3896 }; 3897 3898 Slick.prototype.swipeMove = function(event) { 3899 3900 var _ = this, 3901 edgeWasHit = false, 3902 curLeft, swipeDirection, swipeLength, positionOffset, touches, verticalSwipeLength; 3903 3904 touches = event.originalEvent !== undefined ? event.originalEvent.touches : null; 3905 3906 if (!_.dragging || _.scrolling || touches && touches.length !== 1) { 3907 return false; 3908 } 3909 3910 curLeft = _.getLeft(_.currentSlide); 3911 3912 _.touchObject.curX = touches !== undefined ? touches[0].pageX : event.clientX; 3913 _.touchObject.curY = touches !== undefined ? touches[0].pageY : event.clientY; 3914 3915 _.touchObject.swipeLength = Math.round(Math.sqrt( 3916 Math.pow(_.touchObject.curX - _.touchObject.startX, 2))); 3917 3918 verticalSwipeLength = Math.round(Math.sqrt( 3919 Math.pow(_.touchObject.curY - _.touchObject.startY, 2))); 3920 3921 if (!_.options.verticalSwiping && !_.swiping && verticalSwipeLength > 4) { 3922 _.scrolling = true; 3923 return false; 3924 } 3925 3926 if (_.options.verticalSwiping === true) { 3927 _.touchObject.swipeLength = verticalSwipeLength; 3928 } 3929 3930 swipeDirection = _.swipeDirection(); 3931 3932 if (event.originalEvent !== undefined && _.touchObject.swipeLength > 4) { 3933 _.swiping = true; 3934 event.preventDefault(); 3935 } 3936 3937 positionOffset = (_.options.rtl === false ? 1 : -1) * (_.touchObject.curX > _.touchObject.startX ? 1 : -1); 3938 if (_.options.verticalSwiping === true) { 3939 positionOffset = _.touchObject.curY > _.touchObject.startY ? 1 : -1; 3940 } 3941 3942 3943 swipeLength = _.touchObject.swipeLength; 3944 3945 _.touchObject.edgeHit = false; 3946 3947 if (_.options.infinite === false) { 3948 if ((_.currentSlide === 0 && swipeDirection === 'right') || (_.currentSlide >= _.getDotCount() && swipeDirection === 'left')) { 3949 swipeLength = _.touchObject.swipeLength * _.options.edgeFriction; 3950 _.touchObject.edgeHit = true; 3951 } 3952 } 3953 3954 if (_.options.vertical === false) { 3955 _.swipeLeft = curLeft + swipeLength * positionOffset; 3956 } else { 3957 _.swipeLeft = curLeft + (swipeLength * (_.$list.height() / _.listWidth)) * positionOffset; 3958 } 3959 if (_.options.verticalSwiping === true) { 3960 _.swipeLeft = curLeft + swipeLength * positionOffset; 3961 } 3962 3963 if (_.options.fade === true || _.options.touchMove === false) { 3964 return false;
3965 } 3966 3967 if (_.animating === true) { 3968 _.swipeLeft = null; 3969 return false; 3970 } 3971 3972 _.setCSS(_.swipeLeft); 3973 3974 }; 3975 3976 Slick.prototype.swipeStart = function(event) { 3977 3978 var _ = this, 3979 touches; 3980 3981 _.interrupted = true; 3982 3983 if (_.touchObject.fingerCount !== 1 || _.slideCount <= _.options.slidesToShow) { 3984 _.touchObject = {}; 3985 return false; 3986 } 3987 3988 if (event.originalEvent !== undefined && event.originalEvent.touches !== undefined) { 3989 touches = event.originalEvent.touches[0]; 3990 } 3991 3992 _.touchObject.startX = _.touchObject.curX = touches !== undefined ? touches.pageX : event.clientX; 3993 _.touchObject.startY = _.touchObject.curY = touches !== undefined ? touches.pageY : event.clientY; 3994 3995 _.dragging = true; 3996 3997 }; 3998 3999 Slick.prototype.unfilterSlides = Slick.prototype.slickUnfilter = function() { 4000 4001 var _ = this; 4002 4003 if (_.$slidesCache !== null) { 4004 4005 _.unload(); 4006 4007 _.$slideTrack.children(this.options.slide).detach(); 4008 4009 _.$slidesCache.appendTo(_.$slideTrack); 4010 4011 _.reinit(); 4012 4013 } 4014 4015 }; 4016 4017 Slick.prototype.unload = function() { 4018 4019 var _ = this; 4020 4021 $('.slick-cloned', _.$slider).remove(); 4022 4023 if (_.$dots) { 4024 _.$dots.remove(); 4025 } 4026 4027 if (_.$prevArrow && _.htmlExpr.test(_.options.prevArrow)) { 4028 _.$prevArrow.remove(); 4029 } 4030 4031 if (_.$nextArrow && _.htmlExpr.test(_.options.nextArrow)) { 4032 _.$nextArrow.remove(); 4033 } 4034 4035 _.$slides 4036 .removeClass('slick-slide slick-active slick-visible slick-current') 4037 .attr('aria-hidden', 'true') 4038 .css('width', ''); 4039 4040 }; 4041 4042 Slick.prototype.unslick = function(fromBreakpoint) { 4043 4044 var _ = this; 4045 _.$slider.trigger('unslick', [_, fromBreakpoint]); 4046 _.destroy(); 4047 4048 }; 4049 4050 Slick.prototype.updateArrows = function() { 4051 4052 var _ = this, 4053 centerOffset; 4054 4055 centerOffset = Math.floor(_.options.slidesToShow / 2); 4056 4057 if ( _.options.arrows === true && 4058 _.slideCount > _.options.slidesToShow && 4059 !_.options.infinite ) { 4060 4061 _.$prevArrow.removeClass('slick-disabled').prop('disabled', false); 4062 _.$nextArrow.removeClass('slick-disabled').prop('disabled', false); 4063 4064 if (_.currentSlide === 0) { 4065 4066 _.$prevArrow.addClass('slick-disabled').prop('disabled', true); 4067 _.$nextArrow.removeClass('slick-disabled').prop('disabled', false); 4068 4069 } else if (_.currentSlide >= _.slideCount - _.options.slidesToShow && _.options.centerMode === false) { 4070 4071 _.$nextArrow.addClass('slick-disabled').prop('disabled', true); 4072 _.$prevArrow.removeClass('slick-disabled').prop('disabled', false); 4073 4074 } else if (_.currentSlide >= _.slideCount - 1 && _.options.centerMode === true) { 4075 4076 _.$nextArrow.addClass('slick-disabled').prop('disabled', true); 4077 _.$prevArrow.removeClass('slick-disabled').prop('disabled', false); 4078 4079 } 4080 4081 } 4082 4083 }; 4084 4085 Slick.prototype.updateDots = function() { 4086 4087 var _ = this; 4088 4089 if (_.$dots !== null) { 4090 4091 _.$dots 4092 .find('li') 4093 .removeClass('slick-active') 4094 .find('button') 4095 .removeAttr('aria-current') 4096 .end() 4097 .end(); 4098 4099 _.$dots 4100 .find('li') 4101 .eq(Math.floor(_.currentSlide / _.options.slidesToScroll)) 4102 .addClass('slick-active') 4103 .find('button') 4104 .attr('aria-current', true) 4105 .end() 4106 .end(); 4107 4108 } 4109 4110 }; 4111 4112 Slick.prototype.updateSlideVisibility = function() { 4113 var _ = this; 4114 4115 _.$slideTrack 4116 .find('.slick-slide') 4117 .attr('aria-hidden', 'true') 4118 .find('a, input, button, select') 4119 .attr('tabindex', '-1'); 4120 4121 _.$slideTrack 4122 .find('.slick-active') 4123 .removeAttr('aria-hidden') 4124 .find('a, input, button, select') 4125 .removeAttr('tabindex'); 4126 } 4127 4128 Slick.prototype.visibility = function() { 4129 4130 var _ = this; 4131 4132 if ( _.options.autoplay ) { 4133 4134 if ( document[_.hidden] ) { 4135 4136 _.interrupted = true; 4137 4138 } else { 4139 4140 _.interrupted = false;
4141 4142 } 4143 4144 } 4145 4146 }; 4147 4148 $.fn.slick = function() { 4149 var _ = this, 4150 opt = arguments[0], 4151 args = Array.prototype.slice.call(arguments, 1), 4152 l = _.length, 4153 i, 4154 ret; 4155 for (i = 0; i < l; i++) { 4156 if (typeof opt == 'object' || typeof opt == 'undefined') 4157 _[i].slick = new Slick(_[i], opt); 4158 else 4159 ret = _[i].slick[opt].apply(_[i].slick, args); 4160 if (typeof ret != 'undefined') return ret; 4161 } 4162 return _; 4163 }; 4164 4165})); 4166 4167},{"jquery":38}],12:[function(require,module,exports){ 4168function _assertThisInitialized(e) { 4169 if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); 4170 return e; 4171} 4172module.exports = _assertThisInitialized, module.exports.__esModule = true, module.exports["default"] = module.exports; 4173},{}],13:[function(require,module,exports){ 4174function _classCallCheck(a, n) { 4175 if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); 4176} 4177module.exports = _classCallCheck, module.exports.__esModule = true, module.exports["default"] = module.exports; 4178},{}],14:[function(require,module,exports){ 4179var toPropertyKey = require("./toPropertyKey.js"); 4180function _defineProperties(e, r) { 4181 for (var t = 0; t < r.length; t++) { 4182 var o = r[t]; 4183 o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, toPropertyKey(o.key), o); 4184 } 4185} 4186function _createClass(e, r, t) { 4187 return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { 4188 writable: !1 4189 }), e; 4190} 4191module.exports = _createClass, module.exports.__esModule = true, module.exports["default"] = module.exports; 4192},{"./toPropertyKey.js":24}],15:[function(require,module,exports){ 4193var toPropertyKey = require("./toPropertyKey.js"); 4194function _defineProperty(e, r, t) { 4195 return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, { 4196 value: t, 4197 enumerable: !0, 4198 configurable: !0, 4199 writable: !0 4200 }) : e[r] = t, e; 4201} 4202module.exports = _defineProperty, module.exports.__esModule = true, module.exports["default"] = module.exports; 4203},{"./toPropertyKey.js":24}],16:[function(require,module,exports){ 4204var superPropBase = require("./superPropBase.js"); 4205function _get() { 4206 return module.exports = _get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { 4207 var p = superPropBase(e, t); 4208 if (p) { 4209 var n = Object.getOwnPropertyDescriptor(p, t); 4210 return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; 4211 } 4212 }, module.exports.__esModule = true, module.exports["default"] = module.exports, _get.apply(null, arguments); 4213} 4214module.exports = _get, module.exports.__esModule = true, module.exports["default"] = module.exports; 4215},{"./superPropBase.js":22}],17:[function(require,module,exports){ 4216function _getPrototypeOf(t) { 4217 return module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { 4218 return t.__proto__ || Object.getPrototypeOf(t); 4219 }, module.exports.__esModule = true, module.exports["default"] = module.exports, _getPrototypeOf(t); 4220} 4221module.exports = _getPrototypeOf, module.exports.__esModule = true, module.exports["default"] = module.exports; 4222},{}],18:[function(require,module,exports){ 4223var setPrototypeOf = require("./setPrototypeOf.js"); 4224function _inherits(t, e) { 4225 if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); 4226 t.prototype = Object.create(e && e.prototype, { 4227 constructor: { 4228 value: t, 4229 writable: !0, 4230 configurable: !0 4231 } 4232 }), Object.defineProperty(t, "prototype", { 4233 writable: !1 4234 }), e && setPrototypeOf(t, e); 4235} 4236module.exports = _inherits, module.exports.__esModule = true, module.exports["default"] = module.exports; 4237},{"./setPrototypeOf.js":21}],19:[function(require,module,exports){ 4238function _interopRequireDefault(e) { 4239 return e && e.__esModule ? e : { 4240 "default": e 4241 }; 4242} 4243module.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports["default"] = module.exports; 4244},{}],20:[function(require,module,exports){ 4245var _typeof = require("./typeof.js")["default"]; 4246var assertThisInitialized = require("./assertThisInitialized.js"); 4247function _possibleConstructorReturn(t, e) { 4248 if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; 4249 if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); 4250 return assertThisInitialized(t); 4251} 4252module.exports = _possibleConstructorReturn, module.exports.__esModule = true, module.exports["default"] = module.exports; 4253},{"./assertThisInitialized.js":12,"./typeof.js":25}],21:[function(require,module,exports){ 4254function _setPrototypeOf(t, e) { 4255 return module.exports = _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { 4256 return t.__proto__ = e, t; 4257 }, module.exports.__esModule = true, module.exports["default"] = module.exports, _setPrototypeOf(t, e); 4258} 4259module.exports = _setPrototypeOf, module.exports.__esModule = true, module.exports["default"] = module.exports; 4260},{}],22:[function(require,module,exports){ 4261var getPrototypeOf = require("./getPrototypeOf.js"); 4262function _superPropBase(t, o) { 4263 for (; !{}.hasOwnProperty.call(t, o) && null !== (t = getPrototypeOf(t));); 4264 return t; 4265} 4266module.exports = _superPropBase, module.exports.__esModule = true, module.exports["default"] = module.exports; 4267},{"./getPrototypeOf.js":17}],23:[function(require,module,exports){ 4268var _typeof = require("./typeof.js")["default"]; 4269function toPrimitive(t, r) { 4270 if ("object" != _typeof(t) || !t) return t; 4271 var e = t[Symbol.toPrimitive]; 4272 if (void 0 !== e) { 4273 var i = e.call(t, r || "default"); 4274 if ("object" != _typeof(i)) return i; 4275 throw new TypeError("@@toPrimitive must return a primitive value."); 4276 } 4277 return ("string" === r ? String : Number)(t); 4278} 4279module.exports = toPrimitive, module.exports.__esModule = true, module.exports["default"] = module.exports; 4280},{"./typeof.js":25}],24:[function(require,module,exports){ 4281var _typeof = require("./typeof.js")["default"]; 4282var toPrimitive = require("./toPrimitive.js"); 4283function toPropertyKey(t) { 4284 var i = toPrimitive(t, "string"); 4285 return "symbol" == _typeof(i) ? i : i + ""; 4286} 4287module.exports = toPropertyKey, module.exports.__esModule = true, module.exports["default"] = module.exports; 4288},{"./toPrimitive.js":23,"./typeof.js":25}],25:[function(require,module,exports){ 4289function _typeof(o) { 4290 "@babel/helpers - typeof"; 4291 4292 return module.exports = _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { 4293 return typeof o; 4294 } : function (o) { 4295 return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; 4296 }, module.exports.__esModule = true, module.exports["default"] = module.exports, _typeof(o); 4297} 4298module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports; 4299},{}],26:[function(require,module,exports){ 4300/*! 4301 * Bootstrap v4.6.2 (https://getbootstrap.com/) 4302 * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 4303 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 4304 */ 4305(function (global, factory) { 4306 typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery'), require('popper.js')) : 4307 typeof define === 'function' && define.amd ? define(['exports', 'jquery', 'popper.js'], factory) : 4308 (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.bootstrap = {}, global.jQuery, global.Popper)); 4309})(this, (function (exports, $, Popper) { 'use strict'; 4310 4311 function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } 4312 4313 var $__default = /*#__PURE__*/_interopDefaultLegacy($); 4314 var Popper__default = /*#__PURE__*/_interopDefaultLegacy(Popper); 4315 4316 function _defineProperties(target, props) { 4317 for (var i = 0; i < props.length; i++) { 4318 var descriptor = props[i]; 4319 descriptor.enumerable = descriptor.enumerable || false; 4320 descriptor.configurable = true; 4321 if ("value" in descriptor) descriptor.writable = true; 4322 Object.defineProperty(target, descriptor.key, descriptor); 4323 } 4324 } 4325 4326 function _createClass(Constructor, protoProps, staticProps) { 4327 if (protoProps) _defineProperties(Constructor.prototype, protoProps); 4328 if (staticProps) _defineProperties(Constructor, staticProps);
4329 Object.defineProperty(Constructor, "prototype", { 4330 writable: false 4331 }); 4332 return Constructor; 4333 } 4334 4335 function _extends() { 4336 _extends = Object.assign ? Object.assign.bind() : function (target) { 4337 for (var i = 1; i < arguments.length; i++) { 4338 var source = arguments[i]; 4339 4340 for (var key in source) { 4341 if (Object.prototype.hasOwnProperty.call(source, key)) { 4342 target[key] = source[key]; 4343 } 4344 } 4345 } 4346 4347 return target; 4348 }; 4349 return _extends.apply(this, arguments); 4350 } 4351 4352 function _inheritsLoose(subClass, superClass) { 4353 subClass.prototype = Object.create(superClass.prototype); 4354 subClass.prototype.constructor = subClass; 4355 4356 _setPrototypeOf(subClass, superClass); 4357 } 4358 4359 function _setPrototypeOf(o, p) { 4360 _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { 4361 o.__proto__ = p; 4362 return o; 4363 }; 4364 return _setPrototypeOf(o, p); 4365 } 4366 4367 /** 4368 * -------------------------------------------------------------------------- 4369 * Bootstrap (v4.6.2): util.js 4370 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 4371 * -------------------------------------------------------------------------- 4372 */ 4373 /** 4374 * Private TransitionEnd Helpers 4375 */ 4376 4377 var TRANSITION_END = 'transitionend'; 4378 var MAX_UID = 1000000; 4379 var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp) 4380 4381 function toType(obj) { 4382 if (obj === null || typeof obj === 'undefined') { 4383 return "" + obj; 4384 } 4385 4386 return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase(); 4387 } 4388 4389 function getSpecialTransitionEndEvent() { 4390 return { 4391 bindType: TRANSITION_END, 4392 delegateType: TRANSITION_END, 4393 handle: function handle(event) { 4394 if ($__default["default"](event.target).is(this)) { 4395 return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params 4396 } 4397 4398 return undefined; 4399 } 4400 }; 4401 } 4402 4403 function transitionEndEmulator(duration) { 4404 var _this = this; 4405 4406 var called = false; 4407 $__default["default"](this).one(Util.TRANSITION_END, function () { 4408 called = true; 4409 }); 4410 setTimeout(function () { 4411 if (!called) { 4412 Util.triggerTransitionEnd(_this); 4413 } 4414 }, duration); 4415 return this; 4416 } 4417 4418 function setTransitionEndSupport() { 4419 $__default["default"].fn.emulateTransitionEnd = transitionEndEmulator; 4420 $__default["default"].event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent(); 4421 } 4422 /** 4423 * Public Util API 4424 */ 4425 4426 4427 var Util = { 4428 TRANSITION_END: 'bsTransitionEnd', 4429 getUID: function getUID(prefix) { 4430 do { 4431 // eslint-disable-next-line no-bitwise 4432 prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here 4433 } while (document.getElementById(prefix)); 4434 4435 return prefix; 4436 }, 4437 getSelectorFromElement: function getSelectorFromElement(element) { 4438 var selector = element.getAttribute('data-target'); 4439 4440 if (!selector || selector === '#') { 4441 var hrefAttr = element.getAttribute('href'); 4442 selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''; 4443 } 4444 4445 try { 4446 return document.querySelector(selector) ? selector : null; 4447 } catch (_) { 4448 return null; 4449 } 4450 }, 4451 getTransitionDurationFromElement: function getTransitionDurationFromElement(element) { 4452 if (!element) { 4453 return 0; 4454 } // Get transition-duration of the element 4455 4456 4457 var transitionDuration = $__default["default"](element).css('transition-duration'); 4458 var transitionDelay = $__default["default"](element).css('transition-delay'); 4459 var floatTransitionDuration = parseFloat(transitionDuration); 4460 var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found 4461 4462 if (!floatTransitionDuration && !floatTransitionDelay) { 4463 return 0; 4464 } // If multiple durations are defined, take the first 4465 4466 4467 transitionDuration = transitionDuration.split(',')[0]; 4468 transitionDelay = transitionDelay.split(',')[0]; 4469 return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER; 4470 }, 4471 reflow: function reflow(element) { 4472 return element.offsetHeight; 4473 }, 4474 triggerTransitionEnd: function triggerTransitionEnd(element) { 4475 $__default["default"](element).trigger(TRANSITION_END); 4476 }, 4477 supportsTransitionEnd: function supportsTransitionEnd() { 4478 return Boolean(TRANSITION_END); 4479 }, 4480 isElement: function isElement(obj) { 4481 return (obj[0] || obj).nodeType; 4482 }, 4483 typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) { 4484 for (var property in configTypes) { 4485 if (Object.prototype.hasOwnProperty.call(configTypes, property)) { 4486 var expectedTypes = configTypes[property]; 4487 var value = config[property]; 4488 var valueType = value && Util.isElement(value) ? 'element' : toType(value); 4489 4490 if (!new RegExp(expectedTypes).test(valueType)) { 4491 throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\".")); 4492 } 4493 } 4494 } 4495 }, 4496 findShadowRoot: function findShadowRoot(element) { 4497 if (!document.documentElement.attachShadow) { 4498 return null; 4499 } // Can find the shadow root otherwise it'll return the document 4500 4501 4502 if (typeof element.getRootNode === 'function') { 4503 var root = element.getRootNode(); 4504 return root instanceof ShadowRoot ? root : null; 4505 } 4506 4507 if (element instanceof ShadowRoot) { 4508 return element; 4509 } // when we don't find a shadow root 4510 4511 4512 if (!element.parentNode) { 4513 return null; 4514 } 4515 4516 return Util.findShadowRoot(element.parentNode); 4517 }, 4518 jQueryDetection: function jQueryDetection() { 4519 if (typeof $__default["default"] === 'undefined') { 4520 throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.'); 4521 } 4522 4523 var version = $__default["default"].fn.jquery.split(' ')[0].split('.'); 4524 var minMajor = 1; 4525 var ltMajor = 2; 4526 var minMinor = 9; 4527 var minPatch = 1; 4528 var maxMajor = 4; 4529 4530 if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >
4530= maxMajor) { 4531 throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0'); 4532 } 4533 } 4534 }; 4535 Util.jQueryDetection(); 4536 setTransitionEndSupport(); 4537 4538 /** 4539 * Constants 4540 */ 4541 4542 var NAME$a = 'alert'; 4543 var VERSION$a = '4.6.2'; 4544 var DATA_KEY$a = 'bs.alert'; 4545 var EVENT_KEY$a = "." + DATA_KEY$a; 4546 var DATA_API_KEY$7 = '.data-api'; 4547 var JQUERY_NO_CONFLICT$a = $__default["default"].fn[NAME$a]; 4548 var CLASS_NAME_ALERT = 'alert'; 4549 var CLASS_NAME_FADE$5 = 'fade'; 4550 var CLASS_NAME_SHOW$7 = 'show'; 4551 var EVENT_CLOSE = "close" + EVENT_KEY$a; 4552 var EVENT_CLOSED = "closed" + EVENT_KEY$a; 4553 var EVENT_CLICK_DATA_API$6 = "click" + EVENT_KEY$a + DATA_API_KEY$7; 4554 var SELECTOR_DISMISS = '[data-dismiss="alert"]'; 4555 /** 4556 * Class definition 4557 */ 4558 4559 var Alert = /*#__PURE__*/function () { 4560 function Alert(element) { 4561 this._element = element; 4562 } // Getters 4563 4564 4565 var _proto = Alert.prototype; 4566 4567 // Public 4568 _proto.close = function close(element) { 4569 var rootElement = this._element; 4570 4571 if (element) { 4572 rootElement = this._getRootElement(element); 4573 } 4574 4575 var customEvent = this._triggerCloseEvent(rootElement); 4576 4577 if (customEvent.isDefaultPrevented()) { 4578 return; 4579 } 4580 4581 this._removeElement(rootElement); 4582 }; 4583 4584 _proto.dispose = function dispose() { 4585 $__default["default"].removeData(this._element, DATA_KEY$a); 4586 this._element = null; 4587 } // Private 4588 ; 4589 4590 _proto._getRootElement = function _getRootElement(element) { 4591 var selector = Util.getSelectorFromElement(element); 4592 var parent = false; 4593 4594 if (selector) { 4595 parent = document.querySelector(selector); 4596 } 4597 4598 if (!parent) { 4599 parent = $__default["default"](element).closest("." + CLASS_NAME_ALERT)[0]; 4600 } 4601 4602 return parent; 4603 }; 4604 4605 _proto._triggerCloseEvent = function _triggerCloseEvent(element) { 4606 var closeEvent = $__default["default"].Event(EVENT_CLOSE); 4607 $__default["default"](element).trigger(closeEvent); 4608 return closeEvent; 4609 }; 4610 4611 _proto._removeElement = function _removeElement(element) { 4612 var _this = this; 4613 4614 $__default["default"](element).removeClass(CLASS_NAME_SHOW$7); 4615 4616 if (!$__default["default"](element).hasClass(CLASS_NAME_FADE$5)) { 4617 this._destroyElement(element); 4618 4619 return; 4620 } 4621 4622 var transitionDuration = Util.getTransitionDurationFromElement(element); 4623 $__default["default"](element).one(Util.TRANSITION_END, function (event) { 4624 return _this._destroyElement(element, event); 4625 }).emulateTransitionEnd(transitionDuration); 4626 }; 4627 4628 _proto._destroyElement = function _destroyElement(element) { 4629 $__default["default"](element).detach().trigger(EVENT_CLOSED).remove(); 4630 } // Static 4631 ; 4632 4633 Alert._jQueryInterface = function _jQueryInterface(config) { 4634 return this.each(function () { 4635 var $element = $__default["default"](this); 4636 var data = $element.data(DATA_KEY$a); 4637 4638 if (!data) { 4639 data = new Alert(this); 4640 $element.data(DATA_KEY$a, data); 4641 } 4642 4643 if (config === 'close') { 4644 data[config](this); 4645 } 4646 }); 4647 }; 4648 4649 Alert._handleDismiss = function _handleDismiss(alertInstance) { 4650 return function (event) { 4651 if (event) { 4652 event.preventDefault(); 4653 } 4654 4655 alertInstance.close(this); 4656 }; 4657 }; 4658 4659 _createClass(Alert, null, [{ 4660 key: "VERSION", 4661 get: function get() { 4662 return VERSION$a; 4663 } 4664 }]); 4665 4666 return Alert; 4667 }(); 4668 /** 4669 * Data API implementation 4670 */ 4671 4672 4673 $__default["default"](document).on(EVENT_CLICK_DATA_API$6, SELECTOR_DISMISS, Alert._handleDismiss(new Alert())); 4674 /** 4675 * jQuery 4676 */ 4677 4678 $__default["default"].fn[NAME$a] = Alert._jQueryInterface; 4679 $__default["default"].fn[NAME$a].Constructor = Alert; 4680 4681 $__default["default"].fn[NAME$a].noConflict = function () { 4682 $__default["default"].fn[NAME$a] = JQUERY_NO_CONFLICT$a; 4683 return Alert._jQueryInterface; 4684 }; 4685 4686 /** 4687 * Constants 4688 */ 4689 4690 var NAME$9 = 'button'; 4691 var VERSION$9 = '4.6.2'; 4692 var DATA_KEY$9 = 'bs.button'; 4693 var EVENT_KEY$9 = "." + DATA_KEY$9; 4694 var DATA_API_KEY$6 = '.data-api'; 4695 var JQUERY_NO_CONFLICT$9 = $__default["default"].fn[NAME$9]; 4696 var CLASS_NAME_ACTIVE$3 = 'active'; 4697 var CLASS_NAME_BUTTON = 'btn'; 4698 var CLASS_NAME_FOCUS = 'focus'; 4699 var EVENT_CLICK_DATA_API$5 = "click" + EVENT_KEY$9 + DATA_API_KEY$6; 4700 var EVENT_FOCUS_BLUR_DATA_API = "focus" + EVENT_KEY$9 + DATA_API_KEY$6 + " " + ("blur" + EVENT_KEY$9 + DATA_API_KEY$6); 4701 var EVENT_LOAD_DATA_API$2 = "load" + EVENT_KEY$9 + DATA_API_KEY$6; 4702 var SELECTOR_DATA_TOGGLE_CARROT = '[data-toggle^="button"]'; 4703 var SELECTOR_DATA_TOGGLES = '[data-toggle="buttons"]'; 4704 var SELECTOR_DATA_TOGGLE$4 = '[data-toggle="button"]'; 4705 var SELECTOR_DATA_TOGGLES_BUTTONS = '[data-toggle="buttons"] .btn'; 4706 var SELECTOR_INPUT = 'input:not([type="hidden"])'; 4707 var SELECTOR_ACTIVE$2 = '.active'; 4708 var SELECTOR_BUTTON = '.btn'; 4709 /** 4710 * Class definition 4711 */ 4712 4713 var Button = /*#__PURE__*/function () { 4714 function Button(element) { 4715 this._element = element; 4716 this.shouldAvoidTriggerChange = false;
4717 } // Getters 4718 4719 4720 var _proto = Button.prototype; 4721 4722 // Public 4723 _proto.toggle = function toggle() { 4724 var triggerChangeEvent = true; 4725 var addAriaPressed = true; 4726 var rootElement = $__default["default"](this._element).closest(SELECTOR_DATA_TOGGLES)[0]; 4727 4728 if (rootElement) { 4729 var input = this._element.querySelector(SELECTOR_INPUT); 4730 4731 if (input) { 4732 if (input.type === 'radio') { 4733 if (input.checked && this._element.classList.contains(CLASS_NAME_ACTIVE$3)) { 4734 triggerChangeEvent = false; 4735 } else { 4736 var activeElement = rootElement.querySelector(SELECTOR_ACTIVE$2); 4737 4738 if (activeElement) { 4739 $__default["default"](activeElement).removeClass(CLASS_NAME_ACTIVE$3); 4740 } 4741 } 4742 } 4743 4744 if (triggerChangeEvent) { 4745 // if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input 4746 if (input.type === 'checkbox' || input.type === 'radio') { 4747 input.checked = !this._element.classList.contains(CLASS_NAME_ACTIVE$3); 4748 } 4749 4750 if (!this.shouldAvoidTriggerChange) { 4751 $__default["default"](input).trigger('change'); 4752 } 4753 } 4754 4755 input.focus(); 4756 addAriaPressed = false; 4757 } 4758 } 4759 4760 if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) { 4761 if (addAriaPressed) { 4762 this._element.setAttribute('aria-pressed', !this._element.classList.contains(CLASS_NAME_ACTIVE$3)); 4763 } 4764 4765 if (triggerChangeEvent) { 4766 $__default["default"](this._element).toggleClass(CLASS_NAME_ACTIVE$3); 4767 } 4768 } 4769 }; 4770 4771 _proto.dispose = function dispose() { 4772 $__default["default"].removeData(this._element, DATA_KEY$9); 4773 this._element = null; 4774 } // Static 4775 ; 4776 4777 Button._jQueryInterface = function _jQueryInterface(config, avoidTriggerChange) { 4778 return this.each(function () { 4779 var $element = $__default["default"](this); 4780 var data = $element.data(DATA_KEY$9); 4781 4782 if (!data) { 4783 data = new Button(this); 4784 $element.data(DATA_KEY$9, data); 4785 } 4786 4787 data.shouldAvoidTriggerChange = avoidTriggerChange; 4788 4789 if (config === 'toggle') { 4790 data[config](); 4791 } 4792 }); 4793 }; 4794 4795 _createClass(Button, null, [{ 4796 key: "VERSION", 4797 get: function get() { 4798 return VERSION$9; 4799 } 4800 }]); 4801 4802 return Button; 4803 }(); 4804 /** 4805 * Data API implementation 4806 */ 4807 4808 4809 $__default["default"](document).on(EVENT_CLICK_DATA_API$5, SELECTOR_DATA_TOGGLE_CARROT, function (event) { 4810 var button = event.target; 4811 var initialButton = button; 4812 4813 if (!$__default["default"](button).hasClass(CLASS_NAME_BUTTON)) { 4814 button = $__default["default"](button).closest(SELECTOR_BUTTON)[0]; 4815 } 4816 4817 if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) { 4818 event.preventDefault(); // work around Firefox bug #1540995 4819 } else { 4820 var inputBtn = button.querySelector(SELECTOR_INPUT); 4821 4822 if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) { 4823 event.preventDefault(); // work around Firefox bug #1540995 4824 4825 return; 4826 } 4827 4828 if (initialButton.tagName === 'INPUT' || button.tagName !== 'LABEL') { 4829 Button._jQueryInterface.call($__default["default"](button), 'toggle', initialButton.tagName === 'INPUT'); 4830 } 4831 } 4832 }).on(EVENT_FOCUS_BLUR_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, function (event) { 4833 var button = $__default["default"](event.target).closest(SELECTOR_BUTTON)[0]; 4834 $__default["default"](button).toggleClass(CLASS_NAME_FOCUS, /^focus(in)?$/.test(event.type)); 4835 }); 4836 $__default["default"](window).on(EVENT_LOAD_DATA_API$2, function () { 4837 // ensure correct active class is set to match the controls' actual values/states 4838 // find all checkboxes/readio buttons inside data-toggle groups 4839 var buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLES_BUTTONS)); 4840 4841 for (var i = 0, len = buttons.length; i < len; i++) { 4842 var button = buttons[i]; 4843 var input = button.querySelector(SELECTOR_INPUT); 4844 4845 if (input.checked || input.hasAttribute('checked')) { 4846 button.classList.add(CLASS_NAME_ACTIVE$3); 4847 } else { 4848 button.classList.remove(CLASS_NAME_ACTIVE$3); 4849 } 4850 } // find all button toggles 4851 4852 4853 buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE$4)); 4854 4855 for (var _i = 0, _len = buttons.length; _i < _len; _i++) { 4856 var _button = buttons[_i]; 4857 4858 if (_button.getAttribute('aria-pressed') === 'true') { 4859 _button.classList.add(CLASS_NAME_ACTIVE$3); 4860 } else { 4861 _button.classList.remove(CLASS_NAME_ACTIVE$3); 4862 } 4863 } 4864 }); 4865 /** 4866 * jQuery 4867 */ 4868 4869 $__default["default"].fn[NAME$9] = Button._jQueryInterface; 4870 $__default["default"].fn[NAME$9].Constructor = Button; 4871 4872 $__default["default"].fn[NAME$9].noConflict = function () { 4873 $__default["default"].fn[NAME$9] = JQUERY_NO_CONFLICT$9; 4874 return Button._jQueryInterface; 4875 }; 4876 4877 /** 4878 * Constants 4879 */ 4880 4881 var NAME$8 = 'carousel'; 4882 var VERSION$8 = '4.6.2'; 4883 var DATA_KEY$8 = 'bs.carousel'; 4884 var EVENT_KEY$8 = "." + DATA_KEY$8; 4885 var DATA_API_KEY$5 = '.data-api'; 4886 var JQUERY_NO_CONFLICT$8 = $__default["default"].fn[NAME$8]; 4887 var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key 4888 4889 var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key 4890 4891 var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch 4892 4893 var SWIPE_THRESHOLD = 40; 4894 var CLASS_NAME_CAROUSEL = 'carousel'; 4895 var CLASS_NAME_ACTIVE$2 = 'active'; 4896 var CLASS_NAME_SLIDE = 'slide'; 4897 var CLASS_NAME_RIGHT = 'carousel-item-right'; 4898 var CLASS_NAME_LEFT = 'carousel-item-left'; 4899 var CLASS_NAME_NEXT = 'carousel-item-next'; 4900 var CLASS_NAME_PREV = 'carousel-item-prev'; 4901 var CLASS_NAME_POINTER_EVENT = 'pointer-event'; 4902 var DIRECTION_NEXT = 'next'; 4903 var DIRECTION_PREV = 'prev'; 4904 var DIRECTION_LEFT = 'left'; 4905 var DIRECTION_RIGHT = 'right'; 4906 var EVENT_SLIDE = "slide" + EVENT_KEY$8; 4907 var EVENT_SLID = "slid" + EVENT_KEY$8; 4908 var EVENT_KEYDOWN = "keydown" + EVENT_KEY$8; 4909 var EVENT_MOUSEENTER = "mouseenter" + EVENT_KEY$8; 4910 var EVENT_MOUSELEAVE = "mouseleave" + EVENT_KEY$8; 4911 var EVENT_TOUCHSTART = "touchstart" + EVENT_KEY$8; 4912 var EVENT_TOUCHMOVE = "touchmove" + EVENT_KEY$8; 4913 var EVENT_TOUCHEND = "touchend" + EVENT_KEY$8; 4914 var EVENT_POINTERDOWN = "pointerdown" + EVENT_KEY$8; 4915 var EVENT_POINTERUP = "pointerup" + EVENT_KEY$8; 4916 var EVENT_DRAG_START = "dragstart" + EVENT_KEY$8; 4917 var EVENT_LOAD_DATA_API$1 = "load" + EVENT_KEY$8 + DATA_API_KEY$5; 4918 var EVENT_CLICK_DATA_API$4 = "click" + EVENT_KEY$8 + DATA_API_KEY$5; 4919 var SELECTOR_ACTIVE$1 = '.active'; 4920 var SELECTOR_ACTIVE_ITEM = '.active.carousel-item';
4921 var SELECTOR_ITEM = '.carousel-item'; 4922 var SELECTOR_ITEM_IMG = '.carousel-item img'; 4923 var SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'; 4924 var SELECTOR_INDICATORS = '.carousel-indicators'; 4925 var SELECTOR_DATA_SLIDE = '[data-slide], [data-slide-to]'; 4926 var SELECTOR_DATA_RIDE = '[data-ride="carousel"]'; 4927 var Default$7 = { 4928 interval: 5000, 4929 keyboard: true, 4930 slide: false, 4931 pause: 'hover', 4932 wrap: true, 4933 touch: true 4934 }; 4935 var DefaultType$7 = { 4936 interval: '(number|boolean)', 4937 keyboard: 'boolean', 4938 slide: '(boolean|string)', 4939 pause: '(string|boolean)', 4940 wrap: 'boolean', 4941 touch: 'boolean' 4942 }; 4943 var PointerType = { 4944 TOUCH: 'touch', 4945 PEN: 'pen' 4946 }; 4947 /** 4948 * Class definition 4949 */ 4950 4951 var Carousel = /*#__PURE__*/function () { 4952 function Carousel(element, config) { 4953 this._items = null; 4954 this._interval = null; 4955 this._activeElement = null; 4956 this._isPaused = false; 4957 this._isSliding = false; 4958 this.touchTimeout = null; 4959 this.touchStartX = 0; 4960 this.touchDeltaX = 0; 4961 this._config = this._getConfig(config); 4962 this._element = element; 4963 this._indicatorsElement = this._element.querySelector(SELECTOR_INDICATORS); 4964 this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0; 4965 this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent); 4966 4967 this._addEventListeners(); 4968 } // Getters 4969 4970 4971 var _proto = Carousel.prototype; 4972 4973 // Public 4974 _proto.next = function next() { 4975 if (!this._isSliding) { 4976 this._slide(DIRECTION_NEXT); 4977 } 4978 }; 4979 4980 _proto.nextWhenVisible = function nextWhenVisible() { 4981 var $element = $__default["default"](this._element); // Don't call next when the page isn't visible 4982 // or the carousel or its parent isn't visible 4983 4984 if (!document.hidden && $element.is(':visible') && $element.css('visibility') !== 'hidden') { 4985 this.next(); 4986 } 4987 }; 4988 4989 _proto.prev = function prev() { 4990 if (!this._isSliding) { 4991 this._slide(DIRECTION_PREV); 4992 } 4993 }; 4994 4995 _proto.pause = function pause(event) { 4996 if (!event) { 4997 this._isPaused = true; 4998 } 4999 5000 if (this._element.querySelector(SELECTOR_NEXT_PREV)) { 5001 Util.triggerTransitionEnd(this._element); 5002 this.cycle(true); 5003 } 5004 5005 clearInterval(this._interval); 5006 this._interval = null; 5007 }; 5008 5009 _proto.cycle = function cycle(event) { 5010 if (!event) { 5011 this._isPaused = false; 5012 } 5013 5014 if (this._interval) { 5015 clearInterval(this._interval); 5016 this._interval = null; 5017 } 5018 5019 if (this._config.interval && !this._isPaused) { 5020 this._updateInterval(); 5021 5022 this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval); 5023 } 5024 }; 5025 5026 _proto.to = function to(index) { 5027 var _this = this; 5028 5029 this._activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM); 5030 5031 var activeIndex = this._getItemIndex(this._activeElement); 5032 5033 if (index > this._items.length - 1 || index < 0) { 5034 return; 5035 } 5036 5037 if (this._isSliding) { 5038 $__default["default"](this._element).one(EVENT_SLID, function () { 5039 return _this.to(index); 5040 }); 5041 return; 5042 } 5043 5044 if (activeIndex === index) { 5045 this.pause(); 5046 this.cycle(); 5047 return; 5048 } 5049 5050 var direction = index > activeIndex ? DIRECTION_NEXT : DIRECTION_PREV; 5051 5052 this._slide(direction, this._items[index]); 5053 }; 5054 5055 _proto.dispose = function dispose() { 5056 $__default["default"](this._element).off(EVENT_KEY$8); 5057 $__default["default"].removeData(this._element, DATA_KEY$8); 5058 this._items = null; 5059 this._config = null; 5060 this._element = null; 5061 this._interval = null; 5062 this._isPaused = null; 5063 this._isSliding = null; 5064 this._activeElement = null; 5065 this._indicatorsElement = null; 5066 } // Private 5067 ; 5068 5069 _proto._getConfig = function _getConfig(config) { 5070 config = _extends({}, Default$7, config); 5071 Util.typeCheckConfig(NAME$8, config, DefaultType$7); 5072 return config; 5073 }; 5074 5075 _proto._handleSwipe = function _handleSwipe() { 5076 var absDeltax = Math.abs(this.touchDeltaX); 5077 5078 if (absDeltax <= SWIPE_THRESHOLD) { 5079 return; 5080 } 5081 5082 var direction = absDeltax / this.touchDeltaX; 5083 this.touchDeltaX = 0; // swipe left 5084 5085 if (direction > 0) { 5086 this.prev(); 5087 } // swipe right 5088 5089 5090 if (direction < 0) { 5091 this.next(); 5092 } 5093 }; 5094 5095 _proto._addEventListeners = function _addEventListeners() { 5096 var _this2 = this; 5097 5098 if (this._config.keyboard) { 5099 $__default["default"](this._element).on(EVENT_KEYDOWN, function (event) { 5100 return _this2._keydown(event); 5101 }); 5102 } 5103 5104 if (this._config.pause === 'hover') { 5105 $__default["default"](this._element).on(EVENT_MOUSEENTER, function (event) { 5106 return _this2.pause(event); 5107 }).on(EVENT_MOUSELEAVE, function (event) { 5108 return _this2.cycle(event); 5109 }); 5110 } 5111 5112 if (this._config.touch) { 5113 this._addTouchEventListeners(); 5114 } 5115 }; 5116 5117 _proto._addTouchEventListeners = function _addTouchEventListeners() { 5118 var _this3 = this; 5119 5120 if (!this._touchSupported) { 5121 return; 5122 } 5123 5124 var start = function start(event) { 5125 if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) { 5126 _this3.touchStartX = event.originalEvent.clientX; 5127 } else if (!_this3._pointerEvent) { 5128 _this3.touchStartX = event.originalEvent.touches[0].clientX; 5129 } 5130 }; 5131 5132 var move = function move(event) { 5133 // ensure swiping with one touch and not pinching 5134 _this3.touchDeltaX = event.originalEvent.touches && event.originalEvent.touches.length > 1 ? 0 : event.originalEvent.touches[0].clientX - _this3.touchStartX; 5135 }; 5136 5137 var end = function end(event) { 5138 if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) { 5139 _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX; 5140 } 5141 5142 _this3._handleSwipe(); 5143 5144 if (_this3._config.pause === 'hover') {
5145 // If it's a touch-enabled device, mouseenter/leave are fired as 5146 // part of the mouse compatibility events on first tap - the carousel 5147 // would stop cycling until user tapped out of it; 5148 // here, we listen for touchend, explicitly pause the carousel 5149 // (as if it's the second time we tap on it, mouseenter compat event 5150 // is NOT fired) and after a timeout (to allow for mouse compatibility 5151 // events to fire) we explicitly restart cycling 5152 _this3.pause(); 5153 5154 if (_this3.touchTimeout) { 5155 clearTimeout(_this3.touchTimeout); 5156 } 5157 5158 _this3.touchTimeout = setTimeout(function (event) { 5159 return _this3.cycle(event); 5160 }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval); 5161 } 5162 }; 5163 5164 $__default["default"](this._element.querySelectorAll(SELECTOR_ITEM_IMG)).on(EVENT_DRAG_START, function (e) { 5165 return e.preventDefault(); 5166 }); 5167 5168 if (this._pointerEvent) { 5169 $__default["default"](this._element).on(EVENT_POINTERDOWN, function (event) { 5170 return start(event); 5171 }); 5172 $__default["default"](this._element).on(EVENT_POINTERUP, function (event) { 5173 return end(event); 5174 }); 5175 5176 this._element.classList.add(CLASS_NAME_POINTER_EVENT); 5177 } else { 5178 $__default["default"](this._element).on(EVENT_TOUCHSTART, function (event) { 5179 return start(event); 5180 }); 5181 $__default["default"](this._element).on(EVENT_TOUCHMOVE, function (event) { 5182 return move(event); 5183 }); 5184 $__default["default"](this._element).on(EVENT_TOUCHEND, function (event) { 5185 return end(event); 5186 }); 5187 } 5188 }; 5189 5190 _proto._keydown = function _keydown(event) { 5191 if (/input|textarea/i.test(event.target.tagName)) { 5192 return; 5193 } 5194 5195 switch (event.which) { 5196 case ARROW_LEFT_KEYCODE: 5197 event.preventDefault(); 5198 this.prev(); 5199 break; 5200 5201 case ARROW_RIGHT_KEYCODE: 5202 event.preventDefault(); 5203 this.next(); 5204 break; 5205 } 5206 }; 5207 5208 _proto._getItemIndex = function _getItemIndex(element) { 5209 this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(SELECTOR_ITEM)) : []; 5210 return this._items.indexOf(element); 5211 }; 5212 5213 _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) { 5214 var isNextDirection = direction === DIRECTION_NEXT; 5215 var isPrevDirection = direction === DIRECTION_PREV; 5216 5217 var activeIndex = this._getItemIndex(activeElement); 5218 5219 var lastItemIndex = this._items.length - 1; 5220 var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex; 5221 5222 if (isGoingToWrap && !this._config.wrap) { 5223 return activeElement; 5224 } 5225 5226 var delta = direction === DIRECTION_PREV ? -1 : 1; 5227 var itemIndex = (activeIndex + delta) % this._items.length; 5228 return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex]; 5229 }; 5230 5231 _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) { 5232 var targetIndex = this._getItemIndex(relatedTarget); 5233 5234 var fromIndex = this._getItemIndex(this._element.querySelector(SELECTOR_ACTIVE_ITEM)); 5235 5236 var slideEvent = $__default["default"].Event(EVENT_SLIDE, { 5237 relatedTarget: relatedTarget, 5238 direction: eventDirectionName, 5239 from: fromIndex, 5240 to: targetIndex 5241 }); 5242 $__default["default"](this._element).trigger(slideEvent); 5243 return slideEvent; 5244 }; 5245 5246 _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) { 5247 if (this._indicatorsElement) { 5248 var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(SELECTOR_ACTIVE$1)); 5249 $__default["default"](indicators).removeClass(CLASS_NAME_ACTIVE$2); 5250 5251 var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)]; 5252 5253 if (nextIndicator) { 5254 $__default["default"](nextIndicator).addClass(CLASS_NAME_ACTIVE$2); 5255 } 5256 } 5257 }; 5258 5259 _proto._updateInterval = function _updateInterval() { 5260 var element = this._activeElement || this._element.querySelector(SELECTOR_ACTIVE_ITEM); 5261 5262 if (!element) { 5263 return; 5264 } 5265 5266 var elementInterval = parseInt(element.getAttribute('data-interval'), 10); 5267 5268 if (elementInterval) { 5269 this._config.defaultInterval = this._config.defaultInterval || this._config.interval; 5270 this._config.interval = elementInterval; 5271 } else { 5272 this._config.interval = this._config.defaultInterval || this._config.interval; 5273 } 5274 }; 5275 5276 _proto._slide = function _slide(direction, element) { 5277 var _this4 = this; 5278 5279 var activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM); 5280 5281 var activeElementIndex = this._getItemIndex(activeElement); 5282 5283 var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement); 5284 5285 var nextElementIndex = this._getItemIndex(nextElement); 5286 5287 var isCycling = Boolean(this._interval); 5288 var directionalClassName; 5289 var orderClassName; 5290 var eventDirectionName; 5291 5292 if (direction === DIRECTION_NEXT) { 5293 directionalClassName = CLASS_NAME_LEFT; 5294 orderClassName = CLASS_NAME_NEXT; 5295 eventDirectionName = DIRECTION_LEFT; 5296 } else { 5297 directionalClassName = CLASS_NAME_RIGHT; 5298 orderClassName = CLASS_NAME_PREV; 5299 eventDirectionName = DIRECTION_RIGHT; 5300 } 5301 5302 if (nextElement && $__default["default"](nextElement).hasClass(CLASS_NAME_ACTIVE$2)) { 5303 this._isSliding = false;
5304 return; 5305 } 5306 5307 var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName); 5308 5309 if (slideEvent.isDefaultPrevented()) { 5310 return; 5311 } 5312 5313 if (!activeElement || !nextElement) { 5314 // Some weirdness is happening, so we bail 5315 return; 5316 } 5317 5318 this._isSliding = true; 5319 5320 if (isCycling) { 5321 this.pause(); 5322 } 5323 5324 this._setActiveIndicatorElement(nextElement); 5325 5326 this._activeElement = nextElement; 5327 var slidEvent = $__default["default"].Event(EVENT_SLID, { 5328 relatedTarget: nextElement, 5329 direction: eventDirectionName, 5330 from: activeElementIndex, 5331 to: nextElementIndex 5332 }); 5333 5334 if ($__default["default"](this._element).hasClass(CLASS_NAME_SLIDE)) { 5335 $__default["default"](nextElement).addClass(orderClassName); 5336 Util.reflow(nextElement); 5337 $__default["default"](activeElement).addClass(directionalClassName); 5338 $__default["default"](nextElement).addClass(directionalClassName); 5339 var transitionDuration = Util.getTransitionDurationFromElement(activeElement); 5340 $__default["default"](activeElement).one(Util.TRANSITION_END, function () { 5341 $__default["default"](nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(CLASS_NAME_ACTIVE$2); 5342 $__default["default"](activeElement).removeClass(CLASS_NAME_ACTIVE$2 + " " + orderClassName + " " + directionalClassName); 5343 _this4._isSliding = false; 5344 setTimeout(function () { 5345 return $__default["default"](_this4._element).trigger(slidEvent); 5346 }, 0); 5347 }).emulateTransitionEnd(transitionDuration); 5348 } else { 5349 $__default["default"](activeElement).removeClass(CLASS_NAME_ACTIVE$2); 5350 $__default["default"](nextElement).addClass(CLASS_NAME_ACTIVE$2); 5351 this._isSliding = false; 5352 $__default["default"](this._element).trigger(slidEvent); 5353 } 5354 5355 if (isCycling) { 5356 this.cycle(); 5357 } 5358 } // Static 5359 ; 5360 5361 Carousel._jQueryInterface = function _jQueryInterface(config) { 5362 return this.each(function () { 5363 var data = $__default["default"](this).data(DATA_KEY$8); 5364 5365 var _config = _extends({}, Default$7, $__default["default"](this).data()); 5366 5367 if (typeof config === 'object') { 5368 _config = _extends({}, _config, config); 5369 } 5370 5371 var action = typeof config === 'string' ? config : _config.slide; 5372 5373 if (!data) { 5374 data = new Carousel(this, _config); 5375 $__default["default"](this).data(DATA_KEY$8, data); 5376 } 5377 5378 if (typeof config === 'number') { 5379 data.to(config); 5380 } else if (typeof action === 'string') { 5381 if (typeof data[action] === 'undefined') { 5382 throw new TypeError("No method named \"" + action + "\""); 5383 } 5384 5385 data[action](); 5386 } else if (_config.interval && _config.ride) { 5387 data.pause(); 5388 data.cycle(); 5389 } 5390 }); 5391 }; 5392 5393 Carousel._dataApiClickHandler = function _dataApiClickHandler(event) { 5394 var selector = Util.getSelectorFromElement(this); 5395 5396 if (!selector) { 5397 return; 5398 } 5399 5400 var target = $__default["default"](selector)[0]; 5401 5402 if (!target || !$__default["default"](target).hasClass(CLASS_NAME_CAROUSEL)) { 5403 return; 5404 } 5405 5406 var config = _extends({}, $__default["default"](target).data(), $__default["default"](this).data()); 5407 5408 var slideIndex = this.getAttribute('data-slide-to'); 5409 5410 if (slideIndex) { 5411 config.interval = false; 5412 } 5413 5414 Carousel._jQueryInterface.call($__default["default"](target), config); 5415 5416 if (slideIndex) { 5417 $__default["default"](target).data(DATA_KEY$8).to(slideIndex); 5418 } 5419 5420 event.preventDefault(); 5421 }; 5422 5423 _createClass(Carousel, null, [{ 5424 key: "VERSION", 5425 get: function get() { 5426 return VERSION$8; 5427 } 5428 }, { 5429 key: "Default", 5430 get: function get() { 5431 return Default$7; 5432 } 5433 }]); 5434 5435 return Carousel; 5436 }(); 5437 /** 5438 * Data API implementation 5439 */ 5440 5441 5442 $__default["default"](document).on(EVENT_CLICK_DATA_API$4, SELECTOR_DATA_SLIDE, Carousel._dataApiClickHandler); 5443 $__default["default"](window).on(EVENT_LOAD_DATA_API$1, function () { 5444 var carousels = [].slice.call(document.querySelectorAll(SELECTOR_DATA_RIDE)); 5445 5446 for (var i = 0, len = carousels.length; i < len; i++) { 5447 var $carousel = $__default["default"](carousels[i]); 5448
5449 Carousel._jQueryInterface.call($carousel, $carousel.data()); 5450 } 5451 }); 5452 /** 5453 * jQuery 5454 */ 5455 5456 $__default["default"].fn[NAME$8] = Carousel._jQueryInterface; 5457 $__default["default"].fn[NAME$8].Constructor = Carousel; 5458 5459 $__default["default"].fn[NAME$8].noConflict = function () { 5460 $__default["default"].fn[NAME$8] = JQUERY_NO_CONFLICT$8; 5461 return Carousel._jQueryInterface; 5462 }; 5463 5464 /** 5465 * Constants 5466 */ 5467 5468 var NAME$7 = 'collapse'; 5469 var VERSION$7 = '4.6.2'; 5470 var DATA_KEY$7 = 'bs.collapse'; 5471 var EVENT_KEY$7 = "." + DATA_KEY$7; 5472 var DATA_API_KEY$4 = '.data-api'; 5473 var JQUERY_NO_CONFLICT$7 = $__default["default"].fn[NAME$7]; 5474 var CLASS_NAME_SHOW$6 = 'show'; 5475 var CLASS_NAME_COLLAPSE = 'collapse'; 5476 var CLASS_NAME_COLLAPSING = 'collapsing'; 5477 var CLASS_NAME_COLLAPSED = 'collapsed'; 5478 var DIMENSION_WIDTH = 'width'; 5479 var DIMENSION_HEIGHT = 'height'; 5480 var EVENT_SHOW$4 = "show" + EVENT_KEY$7; 5481 var EVENT_SHOWN$4 = "shown" + EVENT_KEY$7; 5482 var EVENT_HIDE$4 = "hide" + EVENT_KEY$7; 5483 var EVENT_HIDDEN$4 = "hidden" + EVENT_KEY$7; 5484 var EVENT_CLICK_DATA_API$3 = "click" + EVENT_KEY$7 + DATA_API_KEY$4; 5485 var SELECTOR_ACTIVES = '.show, .collapsing'; 5486 var SELECTOR_DATA_TOGGLE$3 = '[data-toggle="collapse"]'; 5487 var Default$6 = { 5488 toggle: true, 5489 parent: '' 5490 }; 5491 var DefaultType$6 = { 5492 toggle: 'boolean', 5493 parent: '(string|element)' 5494 }; 5495 /** 5496 * Class definition 5497 */ 5498 5499 var Collapse = /*#__PURE__*/function () { 5500 function Collapse(element, config) { 5501 this._isTransitioning = false; 5502 this._element = element; 5503 this._config = this._getConfig(config); 5504 this._triggerArray = [].slice.call(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]"))); 5505 var toggleList = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE$3)); 5506 5507 for (var i = 0, len = toggleList.length; i < len; i++) { 5508 var elem = toggleList[i]; 5509 var selector = Util.getSelectorFromElement(elem); 5510 var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) { 5511 return foundElem === element; 5512 }); 5513 5514 if (selector !== null && filterElement.length > 0) { 5515 this._selector = selector; 5516 5517 this._triggerArray.push(elem); 5518 } 5519 } 5520 5521 this._parent = this._config.parent ? this._getParent() : null; 5522 5523 if (!this._config.parent) { 5524 this._addAriaAndCollapsedClass(this._element, this._triggerArray); 5525 } 5526 5527 if (this._config.toggle) { 5528 this.toggle(); 5529 } 5530 } // Getters 5531 5532 5533 var _proto = Collapse.prototype; 5534 5535 // Public 5536 _proto.toggle = function toggle() { 5537 if ($__default["default"](this._element).hasClass(CLASS_NAME_SHOW$6)) { 5538 this.hide(); 5539 } else { 5540 this.show(); 5541 } 5542 }; 5543 5544 _proto.show = function show() { 5545 var _this = this; 5546 5547 if (this._isTransitioning || $__default["default"](this._element).hasClass(CLASS_NAME_SHOW$6)) { 5548 return; 5549 } 5550 5551 var actives; 5552 var activesData; 5553 5554 if (this._parent) { 5555 actives = [].slice.call(this._parent.querySelectorAll(SELECTOR_ACTIVES)).filter(function (elem) { 5556 if (typeof _this._config.parent === 'string') { 5557 return elem.getAttribute('data-parent') === _this._config.parent; 5558 } 5559 5560 return elem.classList.contains(CLASS_NAME_COLLAPSE); 5561 }); 5562 5563 if (actives.length === 0) { 5564 actives = null; 5565 } 5566 } 5567 5568 if (actives) { 5569 activesData = $__default["default"](actives).not(this._selector).data(DATA_KEY$7); 5570 5571 if (activesData && activesData._isTransitioning) { 5572 return; 5573 } 5574 } 5575 5576 var startEvent = $__default["default"].Event(EVENT_SHOW$4); 5577 $__default["default"](this._element).trigger(startEvent); 5578 5579 if (startEvent.isDefaultPrevented()) { 5580 return; 5581 } 5582 5583 if (actives) { 5584 Collapse._jQueryInterface.call($__default["default"](actives).not(this._selector), 'hide'); 5585 5586 if (!activesData) { 5587 $__default["default"](actives).data(DATA_KEY$7, null); 5588 } 5589 } 5590 5591 var dimension = this._getDimension(); 5592 5593 $__default["default"](this._element).removeClass(CLASS_NAME_COLLAPSE).addClass(CLASS_NAME_COLLAPSING); 5594 this._element.style[dimension] = 0; 5595 5596 if (this._triggerArray.length) { 5597 $__default["default"](this._triggerArray).removeClass(CLASS_NAME_COLLAPSED).attr('aria-expanded', true); 5598 } 5599 5600 this.setTransitioning(true); 5601 5602 var complete = function complete() { 5603 $__default["default"](_this._element).removeClass(CLASS_NAME_COLLAPSING).addClass(CLASS_NAME_COLLAPSE + " " + CLASS_NAME_SHOW$6); 5604 _this._element.style[dimension] = ''; 5605 5606 _this.setTransitioning(false); 5607 5608 $__default["default"](_this._element).trigger(EVENT_SHOWN$4); 5609 }; 5610 5611 var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); 5612 var scrollSize = "scroll" + capitalizedDimension; 5613 var transitionDuration = Util.getTransitionDurationFromElement(this._element); 5614 $__default["default"](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); 5615 this._element.style[dimension] = this._element[scrollSize] + "px"; 5616 }; 5617 5618 _proto.hide = function hide() { 5619 var _this2 = this; 5620 5621 if (this._isTransitioning || !$__default["default"](this._element).hasClass(CLASS_NAME_SHOW$6)) { 5622 return; 5623 } 5624 5625 var startEvent = $__default["default"].Event(EVENT_HIDE$4); 5626 $__default["default"](this._element).trigger(startEvent); 5627 5628 if (startEvent.isDefaultPrevented()) { 5629 return; 5630 } 5631 5632 var dimension = this._getDimension(); 5633 5634 this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px"; 5635 Util.reflow(this._element); 5636 $__default["default"](this._element).addClass(CLASS_NAME_COLLAPSING).removeClass(CLASS_NAME_COLLAPSE + " " + CLASS_NAME_SHOW$6); 5637 var triggerArrayLength = this._triggerArray.length; 5638 5639 if (triggerArrayLength > 0) { 5640 for (var i = 0; i < triggerArrayLength; i++) { 5641 var trigger = this._triggerArray[i]; 5642 var selector = Util.getSelectorFromElement(trigger); 5643 5644 if (selector !== null) { 5645 var $elem = $__default["default"]([].slice.call(document.querySelectorAll(selector))); 5646 5647 if (!$elem.hasClass(CLASS_NAME_SHOW$6)) { 5648 $__default["default"](trigger).addClass(CLASS_NAME_COLLAPSED).attr('aria-expanded', false); 5649 } 5650 } 5651 } 5652 } 5653 5654 this.setTransitioning(true); 5655 5656 var complete = function complete() { 5657 _this2.setTransitioning(false); 5658 5659 $__default["default"](_this2._element).removeClass(CLASS_NAME_COLLAPSING).addClass(CLASS_NAME_COLLAPSE).trigger(EVENT_HIDDEN$4); 5660 }; 5661 5662 this._element.style[dimension] = ''; 5663 var transitionDuration = Util.getTransitionDurationFromElement(this._element); 5664 $__default["default"](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); 5665 }; 5666 5667 _proto.setTransitioning = function setTransitioning(isTransitioning) { 5668 this._isTransitioning = isTransitioning; 5669 }; 5670 5671 _proto.dispose = function dispose() { 5672 $__default["default"].removeData(this._element, DATA_KEY$7); 5673 this._config = null; 5674 this._parent = null; 5675 this._element = null; 5676 this._triggerArray = null; 5677 this._isTransitioning = null; 5678 } // Private 5679 ; 5680 5681 _proto._getConfig = function _getConfig(config) { 5682 config = _extends({}, Default$6, config); 5683 config.toggle = Boolean(config.toggle); // Coerce string values 5684 5685 Util.typeCheckConfig(NAME$7, config, DefaultType$6); 5686 return config; 5687 }; 5688 5689 _proto._getDimension = function _getDimension() { 5690 var hasWidth = $__default["default"](this._element).hasClass(DIMENSION_WIDTH); 5691 return hasWidth ? DIMENSION_WIDTH : DIMENSION_HEIGHT; 5692 }; 5693 5694 _proto._getParent = function _getParent() { 5695 var _this3 = this; 5696 5697 var parent; 5698 5699 if (Util.isElement(this._config.parent)) { 5700 parent = this._config.parent; // It's a jQuery object 5701 5702 if (typeof this._config.parent.jquery !== 'undefined') { 5703 parent = this._config.parent[0]; 5704 } 5705 } else { 5706 parent = document.querySelector(this._config.parent); 5707 } 5708 5709 var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]"; 5710 var children = [].slice.call(parent.querySelectorAll(selector)); 5711 $__default["default"](children).each(function (i, element) { 5712 _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]); 5713 }); 5714 return parent; 5715 }; 5716 5717 _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) { 5718 var isOpen = $__default["default"](element).hasClass(CLASS_NAME_SHOW$6); 5719 5720 if (triggerArray.length) { 5721 $__default["default"](triggerArray).toggleClass(CLASS_NAME_COLLAPSED, !isOpen).attr('aria-expanded', isOpen); 5722 } 5723 } // Static 5724 ; 5725 5726 Collapse._getTargetFromElement = function _getTargetFromElement(element) { 5727 var selector = Util.getSelectorFromElement(element); 5728 return selector ? document.querySelector(selector) : null; 5729 }; 5730 5731 Collapse._jQueryInterface = function _jQueryInterface(config) { 5732 return this.each(function () { 5733 var $element = $__default["default"](this); 5734 var data = $element.data(DATA_KEY$7); 5735 5736 var _config = _extends({}, Default$6, $element.data(), typeof config === 'object' && config ? config : {}); 5737 5738 if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) { 5739 _config.toggle = false;
5740 } 5741 5742 if (!data) { 5743 data = new Collapse(this, _config); 5744 $element.data(DATA_KEY$7, data); 5745 } 5746 5747 if (typeof config === 'string') { 5748 if (typeof data[config] === 'undefined') { 5749 throw new TypeError("No method named \"" + config + "\""); 5750 } 5751 5752 data[config](); 5753 } 5754 }); 5755 }; 5756 5757 _createClass(Collapse, null, [{ 5758 key: "VERSION", 5759 get: function get() { 5760 return VERSION$7; 5761 } 5762 }, { 5763 key: "Default", 5764 get: function get() { 5765 return Default$6; 5766 } 5767 }]); 5768 5769 return Collapse; 5770 }(); 5771 /** 5772 * Data API implementation 5773 */ 5774 5775 5776 $__default["default"](document).on(EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) { 5777 // preventDefault only for <a> elements (which change the URL) not inside the collapsible element 5778 if (event.currentTarget.tagName === 'A') { 5779 event.preventDefault(); 5780 } 5781 5782 var $trigger = $__default["default"](this); 5783 var selector = Util.getSelectorFromElement(this); 5784 var selectors = [].slice.call(document.querySelectorAll(selector)); 5785 $__default["default"](selectors).each(function () { 5786 var $target = $__default["default"](this); 5787 var data = $target.data(DATA_KEY$7); 5788 var config = data ? 'toggle' : $trigger.data(); 5789 5790 Collapse._jQueryInterface.call($target, config); 5791 }); 5792 }); 5793 /** 5794 * jQuery 5795 */ 5796 5797 $__default["default"].fn[NAME$7] = Collapse._jQueryInterface; 5798 $__default["default"].fn[NAME$7].Constructor = Collapse; 5799 5800 $__default["default"].fn[NAME$7].noConflict = function () { 5801 $__default["default"].fn[NAME$7] = JQUERY_NO_CONFLICT$7; 5802 return Collapse._jQueryInterface; 5803 }; 5804 5805 /** 5806 * Constants 5807 */ 5808 5809 var NAME$6 = 'dropdown'; 5810 var VERSION$6 = '4.6.2'; 5811 var DATA_KEY$6 = 'bs.dropdown'; 5812 var EVENT_KEY$6 = "." + DATA_KEY$6; 5813 var DATA_API_KEY$3 = '.data-api'; 5814 var JQUERY_NO_CONFLICT$6 = $__default["default"].fn[NAME$6]; 5815 var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key 5816 5817 var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key 5818 5819 var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key 5820 5821 var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key 5822 5823 var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key 5824 5825 var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse) 5826 5827 var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE$1); 5828 var CLASS_NAME_DISABLED$1 = 'disabled'; 5829 var CLASS_NAME_SHOW$5 = 'show'; 5830 var CLASS_NAME_DROPUP = 'dropup'; 5831 var CLASS_NAME_DROPRIGHT = 'dropright'; 5832 var CLASS_NAME_DROPLEFT = 'dropleft'; 5833 var CLASS_NAME_MENURIGHT = 'dropdown-menu-right'; 5834 var CLASS_NAME_POSITION_STATIC = 'position-static'; 5835 var EVENT_HIDE$3 = "hide" + EVENT_KEY$6; 5836 var EVENT_HIDDEN$3 = "hidden" + EVENT_KEY$6; 5837 var EVENT_SHOW$3 = "show" + EVENT_KEY$6; 5838 var EVENT_SHOWN$3 = "shown" + EVENT_KEY$6; 5839 var EVENT_CLICK = "click" + EVENT_KEY$6; 5840 var EVENT_CLICK_DATA_API$2 = "click" + EVENT_KEY$6 + DATA_API_KEY$3; 5841 var EVENT_KEYDOWN_DATA_API = "keydown" + EVENT_KEY$6 + DATA_API_KEY$3; 5842 var EVENT_KEYUP_DATA_API = "keyup" + EVENT_KEY$6 + DATA_API_KEY$3; 5843 var SELECTOR_DATA_TOGGLE$2 = '[data-toggle="dropdown"]'; 5844 var SELECTOR_FORM_CHILD = '.dropdown form'; 5845 var SELECTOR_MENU = '.dropdown-menu'; 5846 var SELECTOR_NAVBAR_NAV = '.navbar-nav'; 5847 var SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'; 5848 var PLACEMENT_TOP = 'top-start'; 5849 var PLACEMENT_TOPEND = 'top-end'; 5850 var PLACEMENT_BOTTOM = 'bottom-start'; 5851 var PLACEMENT_BOTTOMEND = 'bottom-end'; 5852 var PLACEMENT_RIGHT = 'right-start'; 5853 var PLACEMENT_LEFT = 'left-start'; 5854 var Default$5 = { 5855 offset: 0, 5856 flip: true, 5857 boundary: 'scrollParent', 5858 reference: 'toggle', 5859 display: 'dynamic', 5860 popperConfig: null 5861 }; 5862 var DefaultType$5 = { 5863 offset: '(number|string|function)', 5864 flip: 'boolean', 5865 boundary: '(string|element)', 5866 reference: '(string|element)', 5867 display: 'string', 5868 popperConfig: '(null|object)' 5869 }; 5870 /** 5871 * Class definition 5872 */ 5873 5874 var Dropdown = /*#__PURE__*/function () { 5875 function Dropdown(element, config) { 5876 this._element = element; 5877 this._popper = null; 5878 this._config = this._getConfig(config); 5879 this._menu = this._getMenuElement(); 5880 this._inNavbar = this._detectNavbar(); 5881 5882 this._addEventListeners(); 5883 } // Getters 5884 5885 5886 var _proto = Dropdown.prototype; 5887 5888 // Public
5889 _proto.toggle = function toggle() { 5890 if (this._element.disabled || $__default["default"](this._element).hasClass(CLASS_NAME_DISABLED$1)) { 5891 return; 5892 } 5893 5894 var isActive = $__default["default"](this._menu).hasClass(CLASS_NAME_SHOW$5); 5895 5896 Dropdown._clearMenus(); 5897 5898 if (isActive) { 5899 return; 5900 } 5901 5902 this.show(true); 5903 }; 5904 5905 _proto.show = function show(usePopper) { 5906 if (usePopper === void 0) { 5907 usePopper = false; 5908 } 5909 5910 if (this._element.disabled || $__default["default"](this._element).hasClass(CLASS_NAME_DISABLED$1) || $__default["default"](this._menu).hasClass(CLASS_NAME_SHOW$5)) { 5911 return; 5912 } 5913 5914 var relatedTarget = { 5915 relatedTarget: this._element 5916 }; 5917 var showEvent = $__default["default"].Event(EVENT_SHOW$3, relatedTarget); 5918 5919 var parent = Dropdown._getParentFromElement(this._element); 5920 5921 $__default["default"](parent).trigger(showEvent); 5922 5923 if (showEvent.isDefaultPrevented()) { 5924 return; 5925 } // Totally disable Popper for Dropdowns in Navbar 5926 5927 5928 if (!this._inNavbar && usePopper) { 5929 // Check for Popper dependency 5930 if (typeof Popper__default["default"] === 'undefined') { 5931 throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)'); 5932 } 5933 5934 var referenceElement = this._element; 5935 5936 if (this._config.reference === 'parent') { 5937 referenceElement = parent; 5938 } else if (Util.isElement(this._config.reference)) { 5939 referenceElement = this._config.reference; // Check if it's jQuery element 5940 5941 if (typeof this._config.reference.jquery !== 'undefined') { 5942 referenceElement = this._config.reference[0]; 5943 } 5944 } // If boundary is not `scrollParent`, then set position to `static` 5945 // to allow the menu to "escape" the scroll parent's boundaries 5946 // https://github.com/twbs/bootstrap/issues/24251 5947 5948 5949 if (this._config.boundary !== 'scrollParent') { 5950 $__default["default"](parent).addClass(CLASS_NAME_POSITION_STATIC); 5951 } 5952 5953 this._popper = new Popper__default["default"](referenceElement, this._menu, this._getPopperConfig()); 5954 } // If this is a touch-enabled device we add extra 5955 // empty mouseover listeners to the body's immediate children; 5956 // only needed because of broken event delegation on iOS 5957 // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html 5958 5959 5960 if ('ontouchstart' in document.documentElement && $__default["default"](parent).closest(SELECTOR_NAVBAR_NAV).length === 0) { 5961 $__default["default"](document.body).children().on('mouseover', null, $__default["default"].noop); 5962 } 5963 5964 this._element.focus(); 5965 5966 this._element.setAttribute('aria-expanded', true); 5967 5968 $__default["default"](this._menu).toggleClass(CLASS_NAME_SHOW$5); 5969 $__default["default"](parent).toggleClass(CLASS_NAME_SHOW$5).trigger($__default["default"].Event(EVENT_SHOWN$3, relatedTarget)); 5970 }; 5971 5972 _proto.hide = function hide() { 5973 if (this._element.disabled || $__default["default"](this._element).hasClass(CLASS_NAME_DISABLED$1) || !$__default["default"](this._menu).hasClass(CLASS_NAME_SHOW$5)) { 5974 return; 5975 } 5976 5977 var relatedTarget = { 5978 relatedTarget: this._element 5979 }; 5980 var hideEvent = $__default["default"].Event(EVENT_HIDE$3, relatedTarget); 5981 5982 var parent = Dropdown._getParentFromElement(this._element); 5983 5984 $__default["default"](parent).trigger(hideEvent); 5985 5986 if (hideEvent.isDefaultPrevented()) { 5987 return; 5988 } 5989 5990 if (this._popper) { 5991 this._popper.destroy(); 5992 } 5993 5994 $__default["default"](this._menu).toggleClass(CLASS_NAME_SHOW$5); 5995 $__default["default"](parent).toggleClass(CLASS_NAME_SHOW$5).trigger($__default["default"].Event(EVENT_HIDDEN$3, relatedTarget)); 5996 }; 5997 5998 _proto.dispose = function dispose() { 5999 $__default["default"].removeData(this._element, DATA_KEY$6); 6000 $__default["default"](this._element).off(EVENT_KEY$6); 6001 this._element = null; 6002 this._menu = null; 6003 6004 if (this._popper !== null) { 6005 this._popper.destroy(); 6006 6007 this._popper = null; 6008 } 6009 }; 6010
6011 _proto.update = function update() { 6012 this._inNavbar = this._detectNavbar(); 6013 6014 if (this._popper !== null) { 6015 this._popper.scheduleUpdate(); 6016 } 6017 } // Private 6018 ; 6019 6020 _proto._addEventListeners = function _addEventListeners() { 6021 var _this = this; 6022 6023 $__default["default"](this._element).on(EVENT_CLICK, function (event) { 6024 event.preventDefault(); 6025 event.stopPropagation(); 6026 6027 _this.toggle(); 6028 }); 6029 }; 6030 6031 _proto._getConfig = function _getConfig(config) { 6032 config = _extends({}, this.constructor.Default, $__default["default"](this._element).data(), config); 6033 Util.typeCheckConfig(NAME$6, config, this.constructor.DefaultType); 6034 return config; 6035 }; 6036 6037 _proto._getMenuElement = function _getMenuElement() { 6038 if (!this._menu) { 6039 var parent = Dropdown._getParentFromElement(this._element); 6040 6041 if (parent) { 6042 this._menu = parent.querySelector(SELECTOR_MENU); 6043 } 6044 } 6045 6046 return this._menu; 6047 }; 6048 6049 _proto._getPlacement = function _getPlacement() { 6050 var $parentDropdown = $__default["default"](this._element.parentNode); 6051 var placement = PLACEMENT_BOTTOM; // Handle dropup 6052 6053 if ($parentDropdown.hasClass(CLASS_NAME_DROPUP)) { 6054 placement = $__default["default"](this._menu).hasClass(CLASS_NAME_MENURIGHT) ? PLACEMENT_TOPEND : PLACEMENT_TOP; 6055 } else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)) { 6056 placement = PLACEMENT_RIGHT; 6057 } else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)) { 6058 placement = PLACEMENT_LEFT; 6059 } else if ($__default["default"](this._menu).hasClass(CLASS_NAME_MENURIGHT)) { 6060 placement = PLACEMENT_BOTTOMEND; 6061 } 6062 6063 return placement; 6064 }; 6065 6066 _proto._detectNavbar = function _detectNavbar() { 6067 return $__default["default"](this._element).closest('.navbar').length > 0; 6068 }; 6069 6070 _proto._getOffset = function _getOffset() { 6071 var _this2 = this; 6072 6073 var offset = {}; 6074 6075 if (typeof this._config.offset === 'function') { 6076 offset.fn = function (data) { 6077 data.offsets = _extends({}, data.offsets, _this2._config.offset(data.offsets, _this2._element)); 6078 return data; 6079 }; 6080 } else { 6081 offset.offset = this._config.offset; 6082 } 6083 6084 return offset; 6085 }; 6086 6087 _proto._getPopperConfig = function _getPopperConfig() { 6088 var popperConfig = { 6089 placement: this._getPlacement(), 6090 modifiers: { 6091 offset: this._getOffset(), 6092 flip: { 6093 enabled: this._config.flip 6094 }, 6095 preventOverflow: { 6096 boundariesElement: this._config.boundary 6097 } 6098 } 6099 }; // Disable Popper if we have a static display 6100 6101 if (this._config.display === 'static') { 6102 popperConfig.modifiers.applyStyle = { 6103 enabled: false 6104 }; 6105 } 6106 6107 return _extends({}, popperConfig, this._config.popperConfig); 6108 } // Static 6109 ; 6110 6111 Dropdown._jQueryInterface = function _jQueryInterface(config) { 6112 return this.each(function () { 6113 var data = $__default["default"](this).data(DATA_KEY$6); 6114 6115 var _config = typeof config === 'object' ? config : null; 6116 6117 if (!data) { 6118 data = new Dropdown(this, _config); 6119 $__default["default"](this).data(DATA_KEY$6, data); 6120 } 6121 6122 if (typeof config === 'string') { 6123 if (typeof data[config] === 'undefined') { 6124 throw new TypeError("No method named \"" + config + "\""); 6125 } 6126 6127 data[config](); 6128 } 6129 }); 6130 }; 6131 6132 Dropdown._clearMenus = function _clearMenus(event) { 6133 if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) { 6134 return; 6135 } 6136 6137 var toggles = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE$2)); 6138 6139 for (var i = 0, len = toggles.length; i < len; i++) { 6140 var parent = Dropdown._getParentFromElement(toggles[i]); 6141 6142 var context = $__default["default"](toggles[i]).data(DATA_KEY$6); 6143 var relatedTarget = { 6144 relatedTarget: toggles[i] 6145 }; 6146 6147 if (event && event.type === 'click') { 6148 relatedTarget.clickEvent = event; 6149 } 6150 6151 if (!context) { 6152 continue; 6153 } 6154 6155 var dropdownMenu = context._menu; 6156 6157 if (!$__default["default"](parent).hasClass(CLASS_NAME_SHOW$5)) { 6158 continue; 6159 } 6160 6161 if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $__default["default"].contains(parent, event.target)) { 6162 continue; 6163 } 6164 6165 var hideEvent = $__default["default"].Event(EVENT_HIDE$3, relatedTarget); 6166 $__default["default"](parent).trigger(hideEvent); 6167 6168 if (hideEvent.isDefaultPrevented()) { 6169 continue; 6170 } // If this is a touch-enabled device we remove the extra 6171 // empty mouseover listeners we added for iOS support 6172 6173 6174 if ('ontouchstart' in document.documentElement) { 6175 $__default["default"](document.body).children().off('mouseover', null, $__default["default"].noop); 6176 } 6177 6178 toggles[i].setAttribute('aria-expanded', 'false'); 6179 6180 if (context._popper) { 6181 context._popper.destroy(); 6182 } 6183 6184 $__default["default"](dropdownMenu).removeClass(CLASS_NAME_SHOW$5); 6185 $__default["default"](parent).removeClass(CLASS_NAME_SHOW$5).trigger($__default["default"].Event(EVENT_HIDDEN$3, relatedTarget)); 6186 } 6187 }; 6188 6189 Dropdown._getParentFromElement = function _getParentFromElement(element) { 6190 var parent; 6191 var selector = Util.getSelectorFromElement(element); 6192 6193 if (selector) { 6194 parent = document.querySelector(selector); 6195 } 6196 6197 return parent || element.parentNode; 6198 } // eslint-disable-next-line complexity 6199 ; 6200 6201 Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) { 6202 // If not input/textarea: 6203 // - And not a key in REGEXP_KEYDOWN => not a dropdown command 6204 // If input/textarea: 6205 // - If space key => not a dropdown command 6206 // - If key is other than escape 6207 // - If key is not up or down => not a dropdown command 6208 // - If trigger inside the menu =>
6208 not a dropdown command 6209 if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE$1 && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $__default["default"](event.target).closest(SELECTOR_MENU).length) : !REGEXP_KEYDOWN.test(event.which)) { 6210 return; 6211 } 6212 6213 if (this.disabled || $__default["default"](this).hasClass(CLASS_NAME_DISABLED$1)) { 6214 return; 6215 } 6216 6217 var parent = Dropdown._getParentFromElement(this); 6218 6219 var isActive = $__default["default"](parent).hasClass(CLASS_NAME_SHOW$5); 6220 6221 if (!isActive && event.which === ESCAPE_KEYCODE$1) { 6222 return; 6223 } 6224 6225 event.preventDefault(); 6226 event.stopPropagation(); 6227 6228 if (!isActive || event.which === ESCAPE_KEYCODE$1 || event.which === SPACE_KEYCODE) { 6229 if (event.which === ESCAPE_KEYCODE$1) { 6230 $__default["default"](parent.querySelector(SELECTOR_DATA_TOGGLE$2)).trigger('focus'); 6231 } 6232 6233 $__default["default"](this).trigger('click'); 6234 return; 6235 } 6236 6237 var items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS)).filter(function (item) { 6238 return $__default["default"](item).is(':visible'); 6239 }); 6240 6241 if (items.length === 0) { 6242 return; 6243 } 6244 6245 var index = items.indexOf(event.target); 6246 6247 if (event.which === ARROW_UP_KEYCODE && index > 0) { 6248 // Up 6249 index--; 6250 } 6251 6252 if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { 6253 // Down 6254 index++; 6255 } 6256 6257 if (index < 0) { 6258 index = 0; 6259 } 6260 6261 items[index].focus(); 6262 }; 6263 6264 _createClass(Dropdown, null, [{ 6265 key: "VERSION", 6266 get: function get() { 6267 return VERSION$6; 6268 } 6269 }, { 6270 key: "Default", 6271 get: function get() { 6272 return Default$5; 6273 } 6274 }, { 6275 key: "DefaultType", 6276 get: function get() { 6277 return DefaultType$5; 6278 } 6279 }]); 6280 6281 return Dropdown; 6282 }(); 6283 /** 6284 * Data API implementation 6285 */ 6286 6287 6288 $__default["default"](document).on(EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$2, Dropdown._dataApiKeydownHandler).on(EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown._dataApiKeydownHandler).on(EVENT_CLICK_DATA_API$2 + " " + EVENT_KEYUP_DATA_API, Dropdown._clearMenus).on(EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) { 6289 event.preventDefault(); 6290 event.stopPropagation(); 6291 6292 Dropdown._jQueryInterface.call($__default["default"](this), 'toggle'); 6293 }).on(EVENT_CLICK_DATA_API$2, SELECTOR_FORM_CHILD, function (e) { 6294 e.stopPropagation(); 6295 }); 6296 /** 6297 * jQuery 6298 */ 6299 6300 $__default["default"].fn[NAME$6] = Dropdown._jQueryInterface; 6301 $__default["default"].fn[NAME$6].Constructor = Dropdown; 6302 6303 $__default["default"].fn[NAME$6].noConflict = function () { 6304 $__default["default"].fn[NAME$6] = JQUERY_NO_CONFLICT$6; 6305 return Dropdown._jQueryInterface; 6306 }; 6307 6308 /** 6309 * Constants 6310 */ 6311 6312 var NAME$5 = 'modal'; 6313 var VERSION$5 = '4.6.2'; 6314 var DATA_KEY$5 = 'bs.modal'; 6315 var EVENT_KEY$5 = "." + DATA_KEY$5; 6316 var DATA_API_KEY$2 = '.data-api'; 6317 var JQUERY_NO_CONFLICT$5 = $__default["default"].fn[NAME$5]; 6318 var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key 6319 6320 var CLASS_NAME_SCROLLABLE = 'modal-dialog-scrollable'; 6321 var CLASS_NAME_SCROLLBAR_MEASURER = 'modal-scrollbar-measure'; 6322 var CLASS_NAME_BACKDROP = 'modal-backdrop'; 6323 var CLASS_NAME_OPEN = 'modal-open'; 6324 var CLASS_NAME_FADE$4 = 'fade'; 6325 var CLASS_NAME_SHOW$4 = 'show'; 6326 var CLASS_NAME_STATIC = 'modal-static'; 6327 var EVENT_HIDE$2 = "hide" + EVENT_KEY$5; 6328 var EVENT_HIDE_PREVENTED = "hidePrevented" + EVENT_KEY$5; 6329 var EVENT_HIDDEN$2 = "hidden" + EVENT_KEY$5; 6330 var EVENT_SHOW$2 = "show" + EVENT_KEY$5; 6331 var EVENT_SHOWN$2 = "shown" + EVENT_KEY$5; 6332 var EVENT_FOCUSIN = "focusin" + EVENT_KEY$5; 6333 var EVENT_RESIZE = "resize" + EVENT_KEY$5; 6334 var EVENT_CLICK_DISMISS$1 = "click.dismiss" + EVENT_KEY$5; 6335 var EVENT_KEYDOWN_DISMISS = "keydown.dismiss" + EVENT_KEY$5; 6336 var EVENT_MOUSEUP_DISMISS = "mouseup.dismiss" + EVENT_KEY$5; 6337 var EVENT_MOUSEDOWN_DISMISS = "mousedown.dismiss" + EVENT_KEY$5; 6338 var EVENT_CLICK_DATA_API$1 = "click" + EVENT_KEY$5 + DATA_API_KEY$2; 6339 var SELECTOR_DIALOG = '.modal-dialog'; 6340 var SELECTOR_MODAL_BODY = '.modal-body'; 6341 var SELECTOR_DATA_TOGGLE$1 = '[data-toggle="modal"]'; 6342 var SELECTOR_DATA_DISMISS$1 = '[data-dismiss="modal"]'; 6343 var SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'; 6344 var SELECTOR_STICKY_CONTENT = '.sticky-top'; 6345 var Default$4 = { 6346 backdrop: true, 6347 keyboard: true, 6348 focus: true, 6349 show: true 6350 }; 6351 var DefaultType$4 = { 6352 backdrop: '(boolean|string)', 6353 keyboard: 'boolean', 6354 focus: 'boolean', 6355 show: 'boolean' 6356 }; 6357 /** 6358 * Class definition 6359 */ 6360 6361 var Modal = /*#__PURE__*/function () { 6362 function Modal(element, config) { 6363 this._config = this._getConfig(config); 6364 this._element = element; 6365 this._dialog = element.querySelector(SELECTOR_DIALOG); 6366 this._backdrop = null; 6367 this._isShown = false;
6368 this._isBodyOverflowing = false; 6369 this._ignoreBackdropClick = false; 6370 this._isTransitioning = false; 6371 this._scrollbarWidth = 0; 6372 } // Getters 6373 6374 6375 var _proto = Modal.prototype; 6376 6377 // Public 6378 _proto.toggle = function toggle(relatedTarget) { 6379 return this._isShown ? this.hide() : this.show(relatedTarget); 6380 }; 6381 6382 _proto.show = function show(relatedTarget) { 6383 var _this = this; 6384 6385 if (this._isShown || this._isTransitioning) { 6386 return; 6387 } 6388 6389 var showEvent = $__default["default"].Event(EVENT_SHOW$2, { 6390 relatedTarget: relatedTarget 6391 }); 6392 $__default["default"](this._element).trigger(showEvent); 6393 6394 if (showEvent.isDefaultPrevented()) { 6395 return; 6396 } 6397 6398 this._isShown = true; 6399 6400 if ($__default["default"](this._element).hasClass(CLASS_NAME_FADE$4)) { 6401 this._isTransitioning = true; 6402 } 6403 6404 this._checkScrollbar(); 6405 6406 this._setScrollbar(); 6407 6408 this._adjustDialog(); 6409 6410 this._setEscapeEvent(); 6411 6412 this._setResizeEvent(); 6413 6414 $__default["default"](this._element).on(EVENT_CLICK_DISMISS$1, SELECTOR_DATA_DISMISS$1, function (event) { 6415 return _this.hide(event); 6416 }); 6417 $__default["default"](this._dialog).on(EVENT_MOUSEDOWN_DISMISS, function () { 6418 $__default["default"](_this._element).one(EVENT_MOUSEUP_DISMISS, function (event) { 6419 if ($__default["default"](event.target).is(_this._element)) { 6420 _this._ignoreBackdropClick = true; 6421 } 6422 }); 6423 }); 6424 6425 this._showBackdrop(function () { 6426 return _this._showElement(relatedTarget); 6427 }); 6428 }; 6429 6430 _proto.hide = function hide(event) { 6431 var _this2 = this; 6432 6433 if (event) { 6434 event.preventDefault(); 6435 } 6436 6437 if (!this._isShown || this._isTransitioning) { 6438 return; 6439 } 6440 6441 var hideEvent = $__default["default"].Event(EVENT_HIDE$2); 6442 $__default["default"](this._element).trigger(hideEvent); 6443 6444 if (!this._isShown || hideEvent.isDefaultPrevented()) { 6445 return; 6446 } 6447 6448 this._isShown = false; 6449 var transition = $__default["default"](this._element).hasClass(CLASS_NAME_FADE$4); 6450 6451 if (transition) { 6452 this._isTransitioning = true; 6453 } 6454 6455 this._setEscapeEvent(); 6456 6457 this._setResizeEvent(); 6458 6459 $__default["default"](document).off(EVENT_FOCUSIN); 6460 $__default["default"](this._element).removeClass(CLASS_NAME_SHOW$4); 6461 $__default["default"](this._element).off(EVENT_CLICK_DISMISS$1); 6462 $__default["default"](this._dialog).off(EVENT_MOUSEDOWN_DISMISS); 6463 6464 if (transition) { 6465 var transitionDuration = Util.getTransitionDurationFromElement(this._element); 6466 $__default["default"](this._element).one(Util.TRANSITION_END, function (event) { 6467 return _this2._hideModal(event); 6468 }).emulateTransitionEnd(transitionDuration); 6469 } else { 6470 this._hideModal(); 6471 } 6472 }; 6473 6474 _proto.dispose = function dispose() { 6475 [window, this._element, this._dialog].forEach(function (htmlElement) { 6476 return $__default["default"](htmlElement).off(EVENT_KEY$5); 6477 }); 6478 /** 6479 * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API` 6480 * Do not move `document` in `htmlElements` array 6481 * It will remove `EVENT_CLICK_DATA_API` event that should remain 6482 */ 6483 6484 $__default["default"](document).off(EVENT_FOCUSIN); 6485 $__default["default"].removeData(this._element, DATA_KEY$5); 6486 this._config = null; 6487 this._element = null; 6488 this._dialog = null; 6489 this._backdrop = null; 6490 this._isShown = null; 6491 this._isBodyOverflowing = null; 6492 this._ignoreBackdropClick = null; 6493 this._isTransitioning = null; 6494 this._scrollbarWidth = null; 6495 }; 6496 6497 _proto.handleUpdate = function handleUpdate() { 6498 this._adjustDialog(); 6499 } // Private 6500 ; 6501 6502 _proto._getConfig = function _getConfig(config) { 6503 config = _extends({}, Default$4, config); 6504 Util.typeCheckConfig(NAME$5, config, DefaultType$4); 6505 return config; 6506 }; 6507 6508 _proto._triggerBackdropTransition = function _triggerBackdropTransition() { 6509 var _this3 = this; 6510 6511 var hideEventPrevented = $__default["default"].Event(EVENT_HIDE_PREVENTED); 6512 $__default["default"](this._element).trigger(hideEventPrevented); 6513 6514 if (hideEventPrevented.isDefaultPrevented()) { 6515 return; 6516 } 6517 6518 var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; 6519 6520 if (!isModalOverflowing) { 6521 this._element.style.overflowY = 'hidden'; 6522 } 6523 6524 this._element.classList.add(CLASS_NAME_STATIC); 6525 6526 var modalTransitionDuration = Util.getTransitionDurationFromElement(this._dialog); 6527 $__default["default"](this._element).off(Util.TRANSITION_END); 6528 $__default["default"](this._element).one(Util.TRANSITION_END, function () { 6529 _this3._element.classList.remove(CLASS_NAME_STATIC); 6530 6531 if (!isModalOverflowing) { 6532 $__default["default"](_this3._element).one(Util.TRANSITION_END, function () { 6533 _this3._element.style.overflowY = ''; 6534 }).emulateTransitionEnd(_this3._element, modalTransitionDuration); 6535 } 6536 }).emulateTransitionEnd(modalTransitionDuration); 6537 6538 this._element.focus(); 6539 }; 6540 6541 _proto._showElement = function _showElement(relatedTarget) { 6542 var _this4 = this; 6543 6544 var transition = $__default["default"](this._element).hasClass(CLASS_NAME_FADE$4); 6545 var modalBody = this._dialog ? this._dialog.querySelector(SELECTOR_MODAL_BODY) : null; 6546 6547 if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) { 6548 // Don't move modal's DOM position 6549 document.body.appendChild(this._element); 6550 } 6551 6552 this._element.style.display = 'block'; 6553 6554 this._element.removeAttribute('aria-hidden'); 6555 6556 this._element.setAttribute('aria-modal', true); 6557 6558 this._element.setAttribute('role', 'dialog'); 6559 6560 if ($__default["default"](this._dialog).hasClass(CLASS_NAME_SCROLLABLE) && modalBody) { 6561 modalBody.scrollTop = 0; 6562 } else { 6563 this._element.scrollTop = 0; 6564 } 6565 6566 if (transition) { 6567 Util.reflow(this._element); 6568 } 6569 6570 $__default["default"](this._element).addClass(CLASS_NAME_SHOW$4); 6571 6572 if (this._config.focus) { 6573 this._enforceFocus(); 6574 } 6575 6576 var shownEvent = $__default["default"].Event(EVENT_SHOWN$2, { 6577 relatedTarget: relatedTarget 6578 }); 6579 6580 var transitionComplete = function transitionComplete() { 6581 if (_this4._config.focus) { 6582 _this4._element.focus(); 6583 } 6584 6585 _this4._isTransitioning = false;
6586 $__default["default"](_this4._element).trigger(shownEvent); 6587 }; 6588 6589 if (transition) { 6590 var transitionDuration = Util.getTransitionDurationFromElement(this._dialog); 6591 $__default["default"](this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration); 6592 } else { 6593 transitionComplete(); 6594 } 6595 }; 6596 6597 _proto._enforceFocus = function _enforceFocus() { 6598 var _this5 = this; 6599 6600 $__default["default"](document).off(EVENT_FOCUSIN) // Guard against infinite focus loop 6601 .on(EVENT_FOCUSIN, function (event) { 6602 if (document !== event.target && _this5._element !== event.target && $__default["default"](_this5._element).has(event.target).length === 0) { 6603 _this5._element.focus(); 6604 } 6605 }); 6606 }; 6607 6608 _proto._setEscapeEvent = function _setEscapeEvent() { 6609 var _this6 = this; 6610 6611 if (this._isShown) { 6612 $__default["default"](this._element).on(EVENT_KEYDOWN_DISMISS, function (event) { 6613 if (_this6._config.keyboard && event.which === ESCAPE_KEYCODE) { 6614 event.preventDefault(); 6615 6616 _this6.hide(); 6617 } else if (!_this6._config.keyboard && event.which === ESCAPE_KEYCODE) { 6618 _this6._triggerBackdropTransition(); 6619 } 6620 }); 6621 } else if (!this._isShown) { 6622 $__default["default"](this._element).off(EVENT_KEYDOWN_DISMISS); 6623 } 6624 }; 6625 6626 _proto._setResizeEvent = function _setResizeEvent() { 6627 var _this7 = this; 6628 6629 if (this._isShown) { 6630 $__default["default"](window).on(EVENT_RESIZE, function (event) { 6631 return _this7.handleUpdate(event); 6632 }); 6633 } else { 6634 $__default["default"](window).off(EVENT_RESIZE); 6635 } 6636 }; 6637 6638 _proto._hideModal = function _hideModal() { 6639 var _this8 = this; 6640 6641 this._element.style.display = 'none'; 6642 6643 this._element.setAttribute('aria-hidden', true); 6644 6645 this._element.removeAttribute('aria-modal'); 6646 6647 this._element.removeAttribute('role'); 6648 6649 this._isTransitioning = false; 6650 6651 this._showBackdrop(function () { 6652 $__default["default"](document.body).removeClass(CLASS_NAME_OPEN); 6653 6654 _this8._resetAdjustments(); 6655 6656 _this8._resetScrollbar(); 6657 6658 $__default["default"](_this8._element).trigger(EVENT_HIDDEN$2); 6659 }); 6660 }; 6661 6662 _proto._removeBackdrop = function _removeBackdrop() { 6663 if (this._backdrop) { 6664 $__default["default"](this._backdrop).remove(); 6665 this._backdrop = null; 6666 } 6667 }; 6668 6669 _proto._showBackdrop = function _showBackdrop(callback) { 6670 var _this9 = this; 6671 6672 var animate = $__default["default"](this._element).hasClass(CLASS_NAME_FADE$4) ? CLASS_NAME_FADE$4 : ''; 6673 6674 if (this._isShown && this._config.backdrop) { 6675 this._backdrop = document.createElement('div'); 6676 this._backdrop.className = CLASS_NAME_BACKDROP; 6677 6678 if (animate) { 6679 this._backdrop.classList.add(animate); 6680 } 6681 6682 $__default["default"](this._backdrop).appendTo(document.body); 6683 $__default["default"](this._element).on(EVENT_CLICK_DISMISS$1, function (event) { 6684 if (_this9._ignoreBackdropClick) { 6685 _this9._ignoreBackdropClick = false; 6686 return; 6687 } 6688 6689 if (event.target !== event.currentTarget) { 6690 return; 6691 } 6692 6693 if (_this9._config.backdrop === 'static') { 6694 _this9._triggerBackdropTransition(); 6695 } else { 6696 _this9.hide(); 6697 } 6698 }); 6699 6700 if (animate) { 6701 Util.reflow(this._backdrop); 6702 } 6703 6704 $__default["default"](this._backdrop).addClass(CLASS_NAME_SHOW$4); 6705 6706 if (!callback) { 6707 return; 6708 } 6709 6710 if (!animate) { 6711 callback(); 6712 return; 6713 } 6714 6715 var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop); 6716 $__default["default"](this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration); 6717 } else if (!this._isShown && this._backdrop) { 6718 $__default["default"](this._backdrop).removeClass(CLASS_NAME_SHOW$4); 6719 6720 var callbackRemove = function callbackRemove() { 6721 _this9._removeBackdrop(); 6722 6723 if (callback) { 6724 callback(); 6725 } 6726 }; 6727 6728 if ($__default["default"](this._element).hasClass(CLASS_NAME_FADE$4)) { 6729 var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop); 6730 6731 $__default["default"](this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration); 6732 } else { 6733 callbackRemove(); 6734 } 6735 } else if (callback) { 6736 callback(); 6737 } 6738 } // ---------------------------------------------------------------------- 6739 // the following methods are used to handle overflowing modals 6740 // todo (fat): these should probably be refactored out of modal.js 6741 // ---------------------------------------------------------------------- 6742 ; 6743
6744 _proto._adjustDialog = function _adjustDialog() { 6745 var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; 6746 6747 if (!this._isBodyOverflowing && isModalOverflowing) { 6748 this._element.style.paddingLeft = this._scrollbarWidth + "px"; 6749 } 6750 6751 if (this._isBodyOverflowing && !isModalOverflowing) { 6752 this._element.style.paddingRight = this._scrollbarWidth + "px"; 6753 } 6754 }; 6755 6756 _proto._resetAdjustments = function _resetAdjustments() { 6757 this._element.style.paddingLeft = ''; 6758 this._element.style.paddingRight = ''; 6759 }; 6760 6761 _proto._checkScrollbar = function _checkScrollbar() { 6762 var rect = document.body.getBoundingClientRect(); 6763 this._isBodyOverflowing = Math.round(rect.left + rect.right) < window.innerWidth; 6764 this._scrollbarWidth = this._getScrollbarWidth(); 6765 }; 6766 6767 _proto._setScrollbar = function _setScrollbar() { 6768 var _this10 = this; 6769 6770 if (this._isBodyOverflowing) { 6771 // Note: DOMNode.style.paddingRight returns the actual value or '' if not set 6772 // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set 6773 var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT)); 6774 var stickyContent = [].slice.call(document.querySelectorAll(SELECTOR_STICKY_CONTENT)); // Adjust fixed content padding 6775 6776 $__default["default"](fixedContent).each(function (index, element) { 6777 var actualPadding = element.style.paddingRight; 6778 var calculatedPadding = $__default["default"](element).css('padding-right'); 6779 $__default["default"](element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this10._scrollbarWidth + "px"); 6780 }); // Adjust sticky content margin 6781 6782 $__default["default"](stickyContent).each(function (index, element) { 6783 var actualMargin = element.style.marginRight; 6784 var calculatedMargin = $__default["default"](element).css('margin-right'); 6785 $__default["default"](element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this10._scrollbarWidth + "px"); 6786 }); // Adjust body padding 6787 6788 var actualPadding = document.body.style.paddingRight; 6789 var calculatedPadding = $__default["default"](document.body).css('padding-right'); 6790 $__default["default"](document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px"); 6791 } 6792 6793 $__default["default"](document.body).addClass(CLASS_NAME_OPEN); 6794 }; 6795 6796 _proto._resetScrollbar = function _resetScrollbar() { 6797 // Restore fixed content padding 6798 var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT)); 6799 $__default["default"](fixedContent).each(function (index, element) { 6800 var padding = $__default["default"](element).data('padding-right'); 6801 $__default["default"](element).removeData('padding-right'); 6802 element.style.paddingRight = padding ? padding : ''; 6803 }); // Restore sticky content 6804 6805 var elements = [].slice.call(document.querySelectorAll("" + SELECTOR_STICKY_CONTENT)); 6806 $__default["default"](elements).each(function (index, element) { 6807 var margin = $__default["default"](element).data('margin-right'); 6808 6809 if (typeof margin !== 'undefined') { 6810 $__default["default"](element).css('margin-right', margin).removeData('margin-right'); 6811 } 6812 }); // Restore body padding 6813 6814 var padding = $__default["default"](document.body).data('padding-right'); 6815 $__default["default"](document.body).removeData('padding-right'); 6816 document.body.style.paddingRight = padding ? padding : ''; 6817 }; 6818 6819 _proto._getScrollbarWidth = function _getScrollbarWidth() { 6820 // thx d.walsh 6821 var scrollDiv = document.createElement('div'); 6822 scrollDiv.className = CLASS_NAME_SCROLLBAR_MEASURER; 6823 document.body.appendChild(scrollDiv); 6824 var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth; 6825 document.body.removeChild(scrollDiv); 6826 return scrollbarWidth; 6827 } // Static 6828 ; 6829 6830 Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) { 6831 return this.each(function () { 6832 var data = $__default["default"](this).data(DATA_KEY$5); 6833 6834 var _config = _extends({}, Default$4, $__default["default"](this).data(), typeof config === 'object' && config ? config : {}); 6835 6836 if (!data) { 6837 data = new Modal(this, _config); 6838 $__default["default"](this).data(DATA_KEY$5, data); 6839 } 6840 6841 if (typeof config === 'string') { 6842 if (typeof data[config] === 'undefined') {
6843 throw new TypeError("No method named \"" + config + "\""); 6844 } 6845 6846 data[config](relatedTarget); 6847 } else if (_config.show) { 6848 data.show(relatedTarget); 6849 } 6850 }); 6851 }; 6852 6853 _createClass(Modal, null, [{ 6854 key: "VERSION", 6855 get: function get() { 6856 return VERSION$5; 6857 } 6858 }, { 6859 key: "Default", 6860 get: function get() { 6861 return Default$4; 6862 } 6863 }]); 6864 6865 return Modal; 6866 }(); 6867 /** 6868 * Data API implementation 6869 */ 6870 6871 6872 $__default["default"](document).on(EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) { 6873 var _this11 = this; 6874 6875 var target; 6876 var selector = Util.getSelectorFromElement(this); 6877 6878 if (selector) { 6879 target = document.querySelector(selector); 6880 } 6881 6882 var config = $__default["default"](target).data(DATA_KEY$5) ? 'toggle' : _extends({}, $__default["default"](target).data(), $__default["default"](this).data()); 6883 6884 if (this.tagName === 'A' || this.tagName === 'AREA') { 6885 event.preventDefault(); 6886 } 6887 6888 var $target = $__default["default"](target).one(EVENT_SHOW$2, function (showEvent) { 6889 if (showEvent.isDefaultPrevented()) { 6890 // Only register focus restorer if modal will actually get shown 6891 return; 6892 } 6893 6894 $target.one(EVENT_HIDDEN$2, function () { 6895 if ($__default["default"](_this11).is(':visible')) { 6896 _this11.focus(); 6897 } 6898 }); 6899 }); 6900 6901 Modal._jQueryInterface.call($__default["default"](target), config, this); 6902 }); 6903 /** 6904 * jQuery 6905 */ 6906 6907 $__default["default"].fn[NAME$5] = Modal._jQueryInterface; 6908 $__default["default"].fn[NAME$5].Constructor = Modal; 6909 6910 $__default["default"].fn[NAME$5].noConflict = function () { 6911 $__default["default"].fn[NAME$5] = JQUERY_NO_CONFLICT$5; 6912 return Modal._jQueryInterface; 6913 }; 6914 6915 /** 6916 * -------------------------------------------------------------------------- 6917 * Bootstrap (v4.6.2): tools/sanitizer.js 6918 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 6919 * -------------------------------------------------------------------------- 6920 */ 6921 var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']; 6922 var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; 6923 var DefaultWhitelist = { 6924 // Global attributes allowed on any supplied element below. 6925 '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], 6926 a: ['target', 'href', 'title', 'rel'], 6927 area: [], 6928 b: [], 6929 br: [], 6930 col: [], 6931 code: [], 6932 div: [], 6933 em: [], 6934 hr: [], 6935 h1: [], 6936 h2: [], 6937 h3: [], 6938 h4: [], 6939 h5: [], 6940 h6: [], 6941 i: [], 6942 img: ['src', 'srcset', 'alt', 'title', 'width', 'height'], 6943 li: [], 6944 ol: [], 6945 p: [], 6946 pre: [], 6947 s: [], 6948 small: [], 6949 span: [], 6950 sub: [], 6951 sup: [], 6952 strong: [], 6953 u: [], 6954 ul: [] 6955 }; 6956 /** 6957 * A pattern that recognizes a commonly useful subset of URLs that are safe. 6958 * 6959 * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts 6960 */ 6961 6962 var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i; 6963 /** 6964 * A pattern that matches safe data URLs. Only matches image, video and audio types. 6965 * 6966 * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts 6967 */ 6968 6969 var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i; 6970 6971 function allowedAttribute(attr, allowedAttributeList) { 6972 var attrName = attr.nodeName.toLowerCase(); 6973 6974 if (allowedAttributeList.indexOf(attrName) !== -1) { 6975 if (uriAttrs.indexOf(attrName) !== -1) { 6976 return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue)); 6977 } 6978 6979 return true; 6980 } 6981 6982 var regExp = allowedAttributeList.filter(function (attrRegex) { 6983 return attrRegex instanceof RegExp; 6984 }); // Check if a regular expression validates the attribute. 6985 6986 for (var i = 0, len = regExp.length; i < len; i++) { 6987 if (regExp[i].test(attrName)) { 6988 return true; 6989 } 6990 } 6991 6992 return false;
6993 } 6994 6995 function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) { 6996 if (unsafeHtml.length === 0) { 6997 return unsafeHtml; 6998 } 6999 7000 if (sanitizeFn && typeof sanitizeFn === 'function') { 7001 return sanitizeFn(unsafeHtml); 7002 } 7003 7004 var domParser = new window.DOMParser(); 7005 var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html'); 7006 var whitelistKeys = Object.keys(whiteList); 7007 var elements = [].slice.call(createdDocument.body.querySelectorAll('*')); 7008 7009 var _loop = function _loop(i, len) { 7010 var el = elements[i]; 7011 var elName = el.nodeName.toLowerCase(); 7012 7013 if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) { 7014 el.parentNode.removeChild(el); 7015 return "continue"; 7016 } 7017 7018 var attributeList = [].slice.call(el.attributes); // eslint-disable-next-line unicorn/prefer-spread 7019 7020 var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []); 7021 attributeList.forEach(function (attr) { 7022 if (!allowedAttribute(attr, whitelistedAttributes)) { 7023 el.removeAttribute(attr.nodeName); 7024 } 7025 }); 7026 }; 7027 7028 for (var i = 0, len = elements.length; i < len; i++) { 7029 var _ret = _loop(i); 7030 7031 if (_ret === "continue") continue; 7032 } 7033 7034 return createdDocument.body.innerHTML; 7035 } 7036 7037 /** 7038 * Constants 7039 */ 7040 7041 var NAME$4 = 'tooltip'; 7042 var VERSION$4 = '4.6.2'; 7043 var DATA_KEY$4 = 'bs.tooltip'; 7044 var EVENT_KEY$4 = "." + DATA_KEY$4; 7045 var JQUERY_NO_CONFLICT$4 = $__default["default"].fn[NAME$4]; 7046 var CLASS_PREFIX$1 = 'bs-tooltip'; 7047 var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g'); 7048 var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']; 7049 var CLASS_NAME_FADE$3 = 'fade'; 7050 var CLASS_NAME_SHOW$3 = 'show'; 7051 var HOVER_STATE_SHOW = 'show'; 7052 var HOVER_STATE_OUT = 'out'; 7053 var SELECTOR_TOOLTIP_INNER = '.tooltip-inner'; 7054 var SELECTOR_ARROW = '.arrow'; 7055 var TRIGGER_HOVER = 'hover'; 7056 var TRIGGER_FOCUS = 'focus'; 7057 var TRIGGER_CLICK = 'click'; 7058 var TRIGGER_MANUAL = 'manual'; 7059 var AttachmentMap = { 7060 AUTO: 'auto', 7061 TOP: 'top', 7062 RIGHT: 'right', 7063 BOTTOM: 'bottom', 7064 LEFT: 'left' 7065 }; 7066 var Default$3 = { 7067 animation: true, 7068 template: '<div class="tooltip" role="tooltip">' + '<div class="arrow"></div>' + '<div class="tooltip-inner"></div></div>', 7069 trigger: 'hover focus', 7070 title: '', 7071 delay: 0, 7072 html: false, 7073 selector: false, 7074 placement: 'top', 7075 offset: 0, 7076 container: false, 7077 fallbackPlacement: 'flip', 7078 boundary: 'scrollParent', 7079 customClass: '', 7080 sanitize: true, 7081 sanitizeFn: null, 7082 whiteList: DefaultWhitelist, 7083 popperConfig: null 7084 }; 7085 var DefaultType$3 = { 7086 animation: 'boolean', 7087 template: 'string', 7088 title: '(string|element|function)', 7089 trigger: 'string', 7090 delay: '(number|object)', 7091 html: 'boolean', 7092 selector: '(string|boolean)', 7093 placement: '(string|function)', 7094 offset: '(number|string|function)', 7095 container: '(string|element|boolean)', 7096 fallbackPlacement: '(string|array)', 7097 boundary: '(string|element)', 7098 customClass: '(string|function)', 7099 sanitize: 'boolean', 7100 sanitizeFn: '(null|function)', 7101 whiteList: 'object', 7102 popperConfig: '(null|object)' 7103 }; 7104 var Event$1 = { 7105 HIDE: "hide" + EVENT_KEY$4, 7106 HIDDEN: "hidden" + EVENT_KEY$4, 7107 SHOW: "show" + EVENT_KEY$4, 7108 SHOWN: "shown" + EVENT_KEY$4, 7109 INSERTED: "inserted" + EVENT_KEY$4, 7110 CLICK: "click" + EVENT_KEY$4, 7111 FOCUSIN: "focusin" + EVENT_KEY$4, 7112 FOCUSOUT: "focusout" + EVENT_KEY$4, 7113 MOUSEENTER: "mouseenter" + EVENT_KEY$4, 7114 MOUSELEAVE: "mouseleave" + EVENT_KEY$4 7115 }; 7116 /** 7117 * Class definition 7118 */ 7119 7120 var Tooltip = /*#__PURE__*/function () { 7121 function Tooltip(element, config) { 7122 if (typeof Popper__default["default"] === 'undefined') { 7123 throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)'); 7124 } // Private 7125 7126 7127 this._isEnabled = true; 7128 this._timeout = 0; 7129 this._hoverState = ''; 7130 this._activeTrigger = {}; 7131 this._popper = null; // Protected 7132 7133 this.element = element; 7134 this.config = this._getConfig(config); 7135 this.tip = null; 7136 7137 this._setListeners(); 7138 } // Getters 7139 7140 7141 var _proto = Tooltip.prototype; 7142 7143 // Public 7144 _proto.enable = function enable() { 7145 this._isEnabled = true; 7146 }; 7147 7148 _proto.disable = function disable() { 7149 this._isEnabled = false;
7150 }; 7151 7152 _proto.toggleEnabled = function toggleEnabled() { 7153 this._isEnabled = !this._isEnabled; 7154 }; 7155 7156 _proto.toggle = function toggle(event) { 7157 if (!this._isEnabled) { 7158 return; 7159 } 7160 7161 if (event) { 7162 var dataKey = this.constructor.DATA_KEY; 7163 var context = $__default["default"](event.currentTarget).data(dataKey); 7164 7165 if (!context) { 7166 context = new this.constructor(event.currentTarget, this._getDelegateConfig()); 7167 $__default["default"](event.currentTarget).data(dataKey, context); 7168 } 7169 7170 context._activeTrigger.click = !context._activeTrigger.click; 7171 7172 if (context._isWithActiveTrigger()) { 7173 context._enter(null, context); 7174 } else { 7175 context._leave(null, context); 7176 } 7177 } else { 7178 if ($__default["default"](this.getTipElement()).hasClass(CLASS_NAME_SHOW$3)) { 7179 this._leave(null, this); 7180 7181 return; 7182 } 7183 7184 this._enter(null, this); 7185 } 7186 }; 7187 7188 _proto.dispose = function dispose() { 7189 clearTimeout(this._timeout); 7190 $__default["default"].removeData(this.element, this.constructor.DATA_KEY); 7191 $__default["default"](this.element).off(this.constructor.EVENT_KEY); 7192 $__default["default"](this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler); 7193 7194 if (this.tip) { 7195 $__default["default"](this.tip).remove(); 7196 } 7197 7198 this._isEnabled = null; 7199 this._timeout = null; 7200 this._hoverState = null; 7201 this._activeTrigger = null; 7202 7203 if (this._popper) { 7204 this._popper.destroy(); 7205 } 7206 7207 this._popper = null; 7208 this.element = null; 7209 this.config = null; 7210 this.tip = null; 7211 }; 7212 7213 _proto.show = function show() { 7214 var _this = this; 7215 7216 if ($__default["default"](this.element).css('display') === 'none') { 7217 throw new Error('Please use show on visible elements'); 7218 } 7219 7220 var showEvent = $__default["default"].Event(this.constructor.Event.SHOW); 7221 7222 if (this.isWithContent() && this._isEnabled) { 7223 $__default["default"](this.element).trigger(showEvent); 7224 var shadowRoot = Util.findShadowRoot(this.element); 7225 var isInTheDom = $__default["default"].contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element); 7226 7227 if (showEvent.isDefaultPrevented() || !isInTheDom) { 7228 return; 7229 } 7230 7231 var tip = this.getTipElement(); 7232 var tipId = Util.getUID(this.constructor.NAME);
7233 tip.setAttribute('id', tipId); 7234 this.element.setAttribute('aria-describedby', tipId); 7235 this.setContent(); 7236 7237 if (this.config.animation) { 7238 $__default["default"](tip).addClass(CLASS_NAME_FADE$3); 7239 } 7240 7241 var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement; 7242 7243 var attachment = this._getAttachment(placement); 7244 7245 this.addAttachmentClass(attachment); 7246 7247 var container = this._getContainer(); 7248 7249 $__default["default"](tip).data(this.constructor.DATA_KEY, this); 7250 7251 if (!$__default["default"].contains(this.element.ownerDocument.documentElement, this.tip)) { 7252 $__default["default"](tip).appendTo(container); 7253 } 7254 7255 $__default["default"](this.element).trigger(this.constructor.Event.INSERTED); 7256 this._popper = new Popper__default["default"](this.element, tip, this._getPopperConfig(attachment)); 7257 $__default["default"](tip).addClass(CLASS_NAME_SHOW$3); 7258 $__default["default"](tip).addClass(this.config.customClass); // If this is a touch-enabled device we add extra 7259 // empty mouseover listeners to the body's immediate children; 7260 // only needed because of broken event delegation on iOS 7261 // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html 7262 7263 if ('ontouchstart' in document.documentElement) { 7264 $__default["default"](document.body).children().on('mouseover', null, $__default["default"].noop); 7265 } 7266 7267 var complete = function complete() { 7268 if (_this.config.animation) { 7269 _this._fixTransition(); 7270 } 7271 7272 var prevHoverState = _this._hoverState; 7273 _this._hoverState = null; 7274 $__default["default"](_this.element).trigger(_this.constructor.Event.SHOWN); 7275 7276 if (prevHoverState === HOVER_STATE_OUT) { 7277 _this._leave(null, _this); 7278 } 7279 }; 7280 7281 if ($__default["default"](this.tip).hasClass(CLASS_NAME_FADE$3)) { 7282 var transitionDuration = Util.getTransitionDurationFromElement(this.tip); 7283 $__default["default"](this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); 7284 } else { 7285 complete(); 7286 } 7287 } 7288 }; 7289 7290 _proto.hide = function hide(callback) { 7291 var _this2 = this; 7292 7293 var tip = this.getTipElement(); 7294 var hideEvent = $__default["default"].Event(this.constructor.Event.HIDE); 7295 7296 var complete = function complete() { 7297 if (_this2._hoverState !== HOVER_STATE_SHOW && tip.parentNode) { 7298 tip.parentNode.removeChild(tip); 7299 } 7300 7301 _this2._cleanTipClass(); 7302 7303 _this2.element.removeAttribute('aria-describedby'); 7304 7305 $__default["default"](_this2.element).trigger(_this2.constructor.Event.HIDDEN); 7306 7307 if (_this2._popper !== null) { 7308 _this2._popper.destroy(); 7309 } 7310 7311 if (callback) { 7312 callback(); 7313 } 7314 }; 7315 7316 $__default["default"](this.element).trigger(hideEvent); 7317 7318 if (hideEvent.isDefaultPrevented()) { 7319 return; 7320 } 7321 7322 $__default["default"](tip).removeClass(CLASS_NAME_SHOW$3); // If this is a touch-enabled device we remove the extra 7323 // empty mouseover listeners we added for iOS support 7324 7325 if ('ontouchstart' in document.documentElement) { 7326 $__default["default"](document.body).children().off('mouseover', null, $__default["default"].noop); 7327 } 7328 7329 this._activeTrigger[TRIGGER_CLICK] = false; 7330 this._activeTrigger[TRIGGER_FOCUS] = false; 7331 this._activeTrigger[TRIGGER_HOVER] = false; 7332 7333 if ($__default["default"](this.tip).hasClass(CLASS_NAME_FADE$3)) { 7334 var transitionDuration = Util.getTransitionDurationFromElement(tip); 7335 $__default["default"](tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); 7336 } else { 7337 complete(); 7338 } 7339 7340 this._hoverState = ''; 7341 }; 7342 7343 _proto.update = function update() { 7344 if (this._popper !== null) { 7345 this._popper.scheduleUpdate(); 7346 } 7347 } // Protected 7348 ; 7349 7350 _proto.isWithContent = function isWithContent() { 7351 return Boolean(this.getTitle()); 7352 }; 7353 7354 _proto.addAttachmentClass = function addAttachmentClass(attachment) { 7355 $__default["default"](this.getTipElement()).addClass(CLASS_PREFIX$1 + "-" + attachment); 7356 }; 7357 7358 _proto.getTipElement = function getTipElement() { 7359 this.tip = this.tip || $__default["default"](this.config.template)[0]; 7360 return this.tip; 7361 }; 7362 7363 _proto.setContent = function setContent() { 7364 var tip = this.getTipElement(); 7365 this.setElementContent($__default["default"](tip.querySelectorAll(SELECTOR_TOOLTIP_INNER)), this.getTitle()); 7366 $__default["default"](tip).removeClass(CLASS_NAME_FADE$3 + " " + CLASS_NAME_SHOW$3); 7367 }; 7368 7369 _proto.setElementContent = function setElementContent($element, content) { 7370 if (typeof content === 'object' && (content.nodeType || content.jquery)) { 7371 // Content is a DOM node or a jQuery 7372 if (this.config.html) { 7373 if (!$__default["default"](content).parent().is($element)) { 7374 $element.empty().append(content); 7375 } 7376 } else { 7377 $element.text($__default["default"](content).text()); 7378 } 7379 7380 return; 7381 } 7382 7383 if (this.config.html) { 7384 if (this.config.sanitize) { 7385 content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn); 7386 } 7387 7388 $element.html(content); 7389 } else { 7390 $element.text(content); 7391 } 7392 }; 7393 7394 _proto.getTitle = function getTitle() { 7395 var title = this.element.getAttribute('data-original-title'); 7396 7397 if (!title) { 7398 title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title; 7399 } 7400 7401 return title; 7402 } // Private 7403 ; 7404 7405 _proto._getPopperConfig = function _getPopperConfig(attachment) { 7406 var _this3 = this; 7407 7408 var defaultBsConfig = { 7409 placement: attachment, 7410 modifiers: { 7411 offset: this._getOffset(), 7412 flip: { 7413 behavior: this.config.fallbackPlacement 7414 }, 7415 arrow: { 7416 element: SELECTOR_ARROW 7417 }, 7418 preventOverflow: {
7419 boundariesElement: this.config.boundary 7420 } 7421 }, 7422 onCreate: function onCreate(data) { 7423 if (data.originalPlacement !== data.placement) { 7424 _this3._handlePopperPlacementChange(data); 7425 } 7426 }, 7427 onUpdate: function onUpdate(data) { 7428 return _this3._handlePopperPlacementChange(data); 7429 } 7430 }; 7431 return _extends({}, defaultBsConfig, this.config.popperConfig); 7432 }; 7433 7434 _proto._getOffset = function _getOffset() { 7435 var _this4 = this; 7436 7437 var offset = {}; 7438 7439 if (typeof this.config.offset === 'function') { 7440 offset.fn = function (data) { 7441 data.offsets = _extends({}, data.offsets, _this4.config.offset(data.offsets, _this4.element)); 7442 return data; 7443 }; 7444 } else { 7445 offset.offset = this.config.offset; 7446 } 7447 7448 return offset; 7449 }; 7450 7451 _proto._getContainer = function _getContainer() { 7452 if (this.config.container === false) { 7453 return document.body; 7454 } 7455 7456 if (Util.isElement(this.config.container)) { 7457 return $__default["default"](this.config.container); 7458 } 7459 7460 return $__default["default"](document).find(this.config.container); 7461 }; 7462 7463 _proto._getAttachment = function _getAttachment(placement) { 7464 return AttachmentMap[placement.toUpperCase()]; 7465 }; 7466 7467 _proto._setListeners = function _setListeners() { 7468 var _this5 = this; 7469 7470 var triggers = this.config.trigger.split(' '); 7471 triggers.forEach(function (trigger) { 7472 if (trigger === 'click') { 7473 $__default["default"](_this5.element).on(_this5.constructor.Event.CLICK, _this5.config.selector, function (event) { 7474 return _this5.toggle(event); 7475 }); 7476 } else if (trigger !== TRIGGER_MANUAL) { 7477 var eventIn = trigger === TRIGGER_HOVER ? _this5.constructor.Event.MOUSEENTER : _this5.constructor.Event.FOCUSIN; 7478 var eventOut = trigger === TRIGGER_HOVER ? _this5.constructor.Event.MOUSELEAVE : _this5.constructor.Event.FOCUSOUT; 7479 $__default["default"](_this5.element).on(eventIn, _this5.config.selector, function (event) { 7480 return _this5._enter(event); 7481 }).on(eventOut, _this5.config.selector, function (event) { 7482 return _this5._leave(event); 7483 }); 7484 } 7485 }); 7486 7487 this._hideModalHandler = function () { 7488 if (_this5.element) { 7489 _this5.hide(); 7490 } 7491 }; 7492 7493 $__default["default"](this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler); 7494 7495 if (this.config.selector) { 7496 this.config = _extends({}, this.config, { 7497 trigger: 'manual', 7498 selector: '' 7499 }); 7500 } else { 7501 this._fixTitle(); 7502 } 7503 }; 7504 7505 _proto._fixTitle = function _fixTitle() { 7506 var titleType = typeof this.element.getAttribute('data-original-title'); 7507 7508 if (this.element.getAttribute('title') || titleType !== 'string') { 7509 this.element.setAttribute('data-original-title', this.element.getAttribute('title') || ''); 7510 this.element.setAttribute('title', ''); 7511 } 7512 }; 7513 7514 _proto._enter = function _enter(event, context) { 7515 var dataKey = this.constructor.DATA_KEY; 7516 context = context || $__default["default"](event.currentTarget).data(dataKey); 7517 7518 if (!context) { 7519 context = new this.constructor(event.currentTarget, this._getDelegateConfig()); 7520 $__default["default"](event.currentTarget).data(dataKey, context); 7521 } 7522 7523 if (event) { 7524 context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true; 7525 } 7526 7527 if ($__default["default"](context.getTipElement()).hasClass(CLASS_NAME_SHOW$3) || context._hoverState === HOVER_STATE_SHOW) { 7528 context._hoverState = HOVER_STATE_SHOW; 7529 return; 7530 } 7531 7532 clearTimeout(context._timeout); 7533 context._hoverState = HOVER_STATE_SHOW; 7534 7535 if (!context.config.delay || !context.config.delay.show) { 7536 context.show(); 7537 return; 7538 } 7539 7540 context._timeout = setTimeout(function () { 7541 if (context._hoverState === HOVER_STATE_SHOW) { 7542 context.show(); 7543 } 7544 }, context.config.delay.show); 7545 }; 7546 7547 _proto._leave = function _leave(event, context) { 7548 var dataKey = this.constructor.DATA_KEY; 7549 context = context || $__default["default"](event.currentTarget).data(dataKey); 7550 7551 if (!context) { 7552 context = new this.constructor(event.currentTarget, this._getDelegateConfig()); 7553 $__default["default"](event.currentTarget).data(dataKey, context); 7554 } 7555 7556 if (event) { 7557 context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = false;
7558 } 7559 7560 if (context._isWithActiveTrigger()) { 7561 return; 7562 } 7563 7564 clearTimeout(context._timeout); 7565 context._hoverState = HOVER_STATE_OUT; 7566 7567 if (!context.config.delay || !context.config.delay.hide) { 7568 context.hide(); 7569 return; 7570 } 7571 7572 context._timeout = setTimeout(function () { 7573 if (context._hoverState === HOVER_STATE_OUT) { 7574 context.hide(); 7575 } 7576 }, context.config.delay.hide); 7577 }; 7578 7579 _proto._isWithActiveTrigger = function _isWithActiveTrigger() { 7580 for (var trigger in this._activeTrigger) { 7581 if (this._activeTrigger[trigger]) { 7582 return true; 7583 } 7584 } 7585 7586 return false; 7587 }; 7588 7589 _proto._getConfig = function _getConfig(config) { 7590 var dataAttributes = $__default["default"](this.element).data(); 7591 Object.keys(dataAttributes).forEach(function (dataAttr) { 7592 if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) { 7593 delete dataAttributes[dataAttr]; 7594 } 7595 }); 7596 config = _extends({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {}); 7597 7598 if (typeof config.delay === 'number') { 7599 config.delay = { 7600 show: config.delay, 7601 hide: config.delay 7602 }; 7603 } 7604 7605 if (typeof config.title === 'number') { 7606 config.title = config.title.toString(); 7607 } 7608 7609 if (typeof config.content === 'number') { 7610 config.content = config.content.toString(); 7611 } 7612 7613 Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType); 7614 7615 if (config.sanitize) { 7616 config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn); 7617 } 7618 7619 return config; 7620 }; 7621 7622 _proto._getDelegateConfig = function _getDelegateConfig() { 7623 var config = {}; 7624 7625 if (this.config) { 7626 for (var key in this.config) { 7627 if (this.constructor.Default[key] !== this.config[key]) { 7628 config[key] = this.config[key]; 7629 } 7630 } 7631 } 7632 7633 return config; 7634 }; 7635 7636 _proto._cleanTipClass = function _cleanTipClass() { 7637 var $tip = $__default["default"](this.getTipElement()); 7638 var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1); 7639 7640 if (tabClass !== null && tabClass.length) { 7641 $tip.removeClass(tabClass.join('')); 7642 } 7643 }; 7644 7645 _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) { 7646 this.tip = popperData.instance.popper; 7647 7648 this._cleanTipClass(); 7649 7650 this.addAttachmentClass(this._getAttachment(popperData.placement)); 7651 }; 7652 7653 _proto._fixTransition = function _fixTransition() { 7654 var tip = this.getTipElement(); 7655 var initConfigAnimation = this.config.animation; 7656 7657 if (tip.getAttribute('x-placement') !== null) { 7658 return; 7659 } 7660 7661 $__default["default"](tip).removeClass(CLASS_NAME_FADE$3); 7662 this.config.animation = false; 7663 this.hide(); 7664 this.show(); 7665 this.config.animation = initConfigAnimation; 7666 } // Static 7667 ; 7668 7669 Tooltip._jQueryInterface = function _jQueryInterface(config) { 7670 return this.each(function () { 7671 var $element = $__default["default"](this); 7672 var data = $element.data(DATA_KEY$4); 7673 7674 var _config = typeof config === 'object' && config; 7675 7676 if (!data && /dispose|hide/.test(config)) { 7677 return; 7678 } 7679 7680 if (!data) { 7681 data = new Tooltip(this, _config); 7682 $element.data(DATA_KEY$4, data); 7683 } 7684 7685 if (typeof config === 'string') { 7686 if (typeof data[config] === 'undefined') { 7687 throw new TypeError("No method named \"" + config + "\""); 7688 } 7689 7690 data[config](); 7691 } 7692 }); 7693 }; 7694 7695 _createClass(Tooltip, null, [{ 7696 key: "VERSION", 7697 get: function get() { 7698 return VERSION$4; 7699 } 7700 }, { 7701 key: "Default", 7702 get: function get() { 7703 return Default$3; 7704 } 7705 }, { 7706 key: "NAME", 7707 get: function get() { 7708 return NAME$4; 7709 } 7710 }, { 7711 key: "DATA_KEY", 7712 get: function get() { 7713 return DATA_KEY$4; 7714 } 7715 }, {
7716 key: "Event", 7717 get: function get() { 7718 return Event$1; 7719 } 7720 }, { 7721 key: "EVENT_KEY", 7722 get: function get() { 7723 return EVENT_KEY$4; 7724 } 7725 }, { 7726 key: "DefaultType", 7727 get: function get() { 7728 return DefaultType$3; 7729 } 7730 }]); 7731 7732 return Tooltip; 7733 }(); 7734 /** 7735 * jQuery 7736 */ 7737 7738 7739 $__default["default"].fn[NAME$4] = Tooltip._jQueryInterface; 7740 $__default["default"].fn[NAME$4].Constructor = Tooltip; 7741 7742 $__default["default"].fn[NAME$4].noConflict = function () { 7743 $__default["default"].fn[NAME$4] = JQUERY_NO_CONFLICT$4; 7744 return Tooltip._jQueryInterface; 7745 }; 7746 7747 /** 7748 * Constants 7749 */ 7750 7751 var NAME$3 = 'popover'; 7752 var VERSION$3 = '4.6.2'; 7753 var DATA_KEY$3 = 'bs.popover'; 7754 var EVENT_KEY$3 = "." + DATA_KEY$3; 7755 var JQUERY_NO_CONFLICT$3 = $__default["default"].fn[NAME$3]; 7756 var CLASS_PREFIX = 'bs-popover'; 7757 var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g'); 7758 var CLASS_NAME_FADE$2 = 'fade'; 7759 var CLASS_NAME_SHOW$2 = 'show'; 7760 var SELECTOR_TITLE = '.popover-header'; 7761 var SELECTOR_CONTENT = '.popover-body'; 7762 7763 var Default$2 = _extends({}, Tooltip.Default, { 7764 placement: 'right', 7765 trigger: 'click', 7766 content: '', 7767 template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>' 7768 }); 7769 7770 var DefaultType$2 = _extends({}, Tooltip.DefaultType, { 7771 content: '(string|element|function)' 7772 }); 7773 7774 var Event = { 7775 HIDE: "hide" + EVENT_KEY$3, 7776 HIDDEN: "hidden" + EVENT_KEY$3, 7777 SHOW: "show" + EVENT_KEY$3, 7778 SHOWN: "shown" + EVENT_KEY$3, 7779 INSERTED: "inserted" + EVENT_KEY$3, 7780 CLICK: "click" + EVENT_KEY$3, 7781 FOCUSIN: "focusin" + EVENT_KEY$3, 7782 FOCUSOUT: "focusout" + EVENT_KEY$3, 7783 MOUSEENTER: "mouseenter" + EVENT_KEY$3, 7784 MOUSELEAVE: "mouseleave" + EVENT_KEY$3 7785 }; 7786 /** 7787 * Class definition 7788 */ 7789 7790 var Popover = /*#__PURE__*/function (_Tooltip) { 7791 _inheritsLoose(Popover, _Tooltip); 7792 7793 function Popover() { 7794 return _Tooltip.apply(this, arguments) || this; 7795 } 7796 7797 var _proto = Popover.prototype; 7798 7799 // Overrides 7800 _proto.isWithContent = function isWithContent() { 7801 return this.getTitle() || this._getContent(); 7802 }; 7803 7804 _proto.addAttachmentClass = function addAttachmentClass(attachment) { 7805 $__default["default"](this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment); 7806 }; 7807 7808 _proto.getTipElement = function getTipElement() { 7809 this.tip = this.tip || $__default["default"](this.config.template)[0]; 7810 return this.tip; 7811 }; 7812 7813 _proto.setContent = function setContent() { 7814 var $tip = $__default["default"](this.getTipElement()); // We use append for html objects to maintain js events 7815 7816 this.setElementContent($tip.find(SELECTOR_TITLE), this.getTitle()); 7817 7818 var content = this._getContent(); 7819 7820 if (typeof content === 'function') { 7821 content = content.call(this.element); 7822 } 7823 7824 this.setElementContent($tip.find(SELECTOR_CONTENT), content); 7825 $tip.removeClass(CLASS_NAME_FADE$2 + " " + CLASS_NAME_SHOW$2); 7826 } // Private 7827 ; 7828 7829 _proto._getContent = function _getContent() { 7830 return this.element.getAttribute('data-content') || this.config.content; 7831 }; 7832 7833 _proto._cleanTipClass = function _cleanTipClass() { 7834 var $tip = $__default["default"](this.getTipElement()); 7835 var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX); 7836 7837 if (tabClass !== null && tabClass.length > 0) { 7838 $tip.removeClass(tabClass.join('')); 7839 } 7840 } // Static 7841 ; 7842 7843 Popover._jQueryInterface = function _jQueryInterface(config) { 7844 return this.each(function () { 7845 var data = $__default["default"](this).data(DATA_KEY$3); 7846 7847 var _config = typeof config === 'object' ? config : null; 7848 7849 if (!data && /dispose|hide/.test(config)) { 7850 return; 7851 } 7852 7853 if (!data) { 7854 data = new Popover(this, _config); 7855 $__default["default"](this).data(DATA_KEY$3, data); 7856 } 7857 7858 if (typeof config === 'string') { 7859 if (typeof data[config] === 'undefined') {
7860 throw new TypeError("No method named \"" + config + "\""); 7861 } 7862 7863 data[config](); 7864 } 7865 }); 7866 }; 7867 7868 _createClass(Popover, null, [{ 7869 key: "VERSION", 7870 get: // Getters 7871 function get() { 7872 return VERSION$3; 7873 } 7874 }, { 7875 key: "Default", 7876 get: function get() { 7877 return Default$2; 7878 } 7879 }, { 7880 key: "NAME", 7881 get: function get() { 7882 return NAME$3; 7883 } 7884 }, { 7885 key: "DATA_KEY", 7886 get: function get() { 7887 return DATA_KEY$3; 7888 } 7889 }, { 7890 key: "Event", 7891 get: function get() { 7892 return Event; 7893 } 7894 }, { 7895 key: "EVENT_KEY", 7896 get: function get() { 7897 return EVENT_KEY$3; 7898 } 7899 }, { 7900 key: "DefaultType", 7901 get: function get() { 7902 return DefaultType$2; 7903 } 7904 }]); 7905 7906 return Popover; 7907 }(Tooltip); 7908 /** 7909 * jQuery 7910 */ 7911 7912 7913 $__default["default"].fn[NAME$3] = Popover._jQueryInterface; 7914 $__default["default"].fn[NAME$3].Constructor = Popover; 7915 7916 $__default["default"].fn[NAME$3].noConflict = function () { 7917 $__default["default"].fn[NAME$3] = JQUERY_NO_CONFLICT$3; 7918 return Popover._jQueryInterface; 7919 }; 7920 7921 /** 7922 * Constants 7923 */ 7924 7925 var NAME$2 = 'scrollspy'; 7926 var VERSION$2 = '4.6.2'; 7927 var DATA_KEY$2 = 'bs.scrollspy'; 7928 var EVENT_KEY$2 = "." + DATA_KEY$2; 7929 var DATA_API_KEY$1 = '.data-api'; 7930 var JQUERY_NO_CONFLICT$2 = $__default["default"].fn[NAME$2]; 7931 var CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'; 7932 var CLASS_NAME_ACTIVE$1 = 'active'; 7933 var EVENT_ACTIVATE = "activate" + EVENT_KEY$2; 7934 var EVENT_SCROLL = "scroll" + EVENT_KEY$2; 7935 var EVENT_LOAD_DATA_API = "load" + EVENT_KEY$2 + DATA_API_KEY$1; 7936 var METHOD_OFFSET = 'offset'; 7937 var METHOD_POSITION = 'position'; 7938 var SELECTOR_DATA_SPY = '[data-spy="scroll"]'; 7939 var SELECTOR_NAV_LIST_GROUP$1 = '.nav, .list-group'; 7940 var SELECTOR_NAV_LINKS = '.nav-link'; 7941 var SELECTOR_NAV_ITEMS = '.nav-item'; 7942 var SELECTOR_LIST_ITEMS = '.list-group-item'; 7943 var SELECTOR_DROPDOWN$1 = '.dropdown'; 7944 var SELECTOR_DROPDOWN_ITEMS = '.dropdown-item'; 7945 var SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle'; 7946 var Default$1 = { 7947 offset: 10, 7948 method: 'auto', 7949 target: '' 7950 }; 7951 var DefaultType$1 = { 7952 offset: 'number', 7953 method: 'string', 7954 target: '(string|element)' 7955 }; 7956 /** 7957 * Class definition 7958 */ 7959 7960 var ScrollSpy = /*#__PURE__*/function () { 7961 function ScrollSpy(element, config) { 7962 var _this = this; 7963 7964 this._element = element; 7965 this._scrollElement = element.tagName === 'BODY' ? window : element; 7966 this._config = this._getConfig(config); 7967 this._selector = this._config.target + " " + SELECTOR_NAV_LINKS + "," + (this._config.target + " " + SELECTOR_LIST_ITEMS + ",") + (this._config.target + " " + SELECTOR_DROPDOWN_ITEMS); 7968 this._offsets = []; 7969 this._targets = []; 7970 this._activeTarget = null; 7971 this._scrollHeight = 0; 7972 $__default["default"](this._scrollElement).on(EVENT_SCROLL, function (event) { 7973 return _this._process(event); 7974 }); 7975 this.refresh(); 7976 7977 this._process(); 7978 } // Getters 7979 7980 7981 var _proto = ScrollSpy.prototype; 7982 7983 // Public 7984 _proto.refresh = function refresh() { 7985 var _this2 = this; 7986 7987 var autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION; 7988 var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method; 7989 var offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0; 7990 this._offsets = []; 7991 this._targets = []; 7992 this._scrollHeight = this._getScrollHeight(); 7993 var targets = [].slice.call(document.querySelectorAll(this._selector)); 7994 targets.map(function (element) { 7995 var target; 7996 var targetSelector = Util.getSelectorFromElement(element); 7997 7998 if (targetSelector) { 7999 target = document.querySelector(targetSelector); 8000 } 8001 8002 if (target) { 8003 var targetBCR = target.getBoundingClientRect(); 8004 8005 if (targetBCR.width || targetBCR.height) { 8006 // TODO (fat): remove sketch reliance on jQuery position/offset 8007 return [$__default["default"](target)[offsetMethod]().top + offsetBase, targetSelector]; 8008 } 8009 } 8010 8011 return null; 8012 }
8012).filter(Boolean).sort(function (a, b) { 8013 return a[0] - b[0]; 8014 }).forEach(function (item) { 8015 _this2._offsets.push(item[0]); 8016 8017 _this2._targets.push(item[1]); 8018 }); 8019 }; 8020 8021 _proto.dispose = function dispose() { 8022 $__default["default"].removeData(this._element, DATA_KEY$2); 8023 $__default["default"](this._scrollElement).off(EVENT_KEY$2); 8024 this._element = null; 8025 this._scrollElement = null; 8026 this._config = null; 8027 this._selector = null; 8028 this._offsets = null; 8029 this._targets = null; 8030 this._activeTarget = null; 8031 this._scrollHeight = null; 8032 } // Private 8033 ; 8034 8035 _proto._getConfig = function _getConfig(config) { 8036 config = _extends({}, Default$1, typeof config === 'object' && config ? config : {}); 8037 8038 if (typeof config.target !== 'string' && Util.isElement(config.target)) { 8039 var id = $__default["default"](config.target).attr('id'); 8040 8041 if (!id) { 8042 id = Util.getUID(NAME$2); 8043 $__default["default"](config.target).attr('id', id); 8044 } 8045 8046 config.target = "#" + id; 8047 } 8048 8049 Util.typeCheckConfig(NAME$2, config, DefaultType$1); 8050 return config; 8051 }; 8052 8053 _proto._getScrollTop = function _getScrollTop() { 8054 return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop; 8055 }; 8056 8057 _proto._getScrollHeight = function _getScrollHeight() { 8058 return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight); 8059 }; 8060 8061 _proto._getOffsetHeight = function _getOffsetHeight() { 8062 return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height; 8063 }; 8064 8065 _proto._process = function _process() { 8066 var scrollTop = this._getScrollTop() + this._config.offset; 8067 8068 var scrollHeight = this._getScrollHeight(); 8069 8070 var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight(); 8071 8072 if (this._scrollHeight !== scrollHeight) { 8073 this.refresh(); 8074 } 8075 8076 if (scrollTop >= maxScroll) { 8077 var target = this._targets[this._targets.length - 1]; 8078 8079 if (this._activeTarget !== target) { 8080 this._activate(target); 8081 } 8082 8083 return; 8084 } 8085 8086 if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) { 8087 this._activeTarget = null; 8088 8089 this._clear(); 8090 8091 return; 8092 } 8093 8094 for (var i = this._offsets.length; i--;) { 8095 var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]); 8096 8097 if (isActiveTarget) { 8098 this._activate(this._targets[i]); 8099 } 8100 } 8101 }; 8102 8103 _proto._activate = function _activate(target) { 8104 this._activeTarget = target; 8105 8106 this._clear(); 8107 8108 var queries = this._selector.split(',').map(function (selector) { 8109 return selector + "[data-target=\"" + target + "\"]," + selector + "[href=\"" + target + "\"]"; 8110 }); 8111 8112 var $link = $__default["default"]([].slice.call(document.querySelectorAll(queries.join(',')))); 8113 8114 if ($link.hasClass(CLASS_NAME_DROPDOWN_ITEM)) { 8115 $link.closest(SELECTOR_DROPDOWN$1).find(SELECTOR_DROPDOWN_TOGGLE$1).addClass(CLASS_NAME_ACTIVE$1); 8116 $link.addClass(CLASS_NAME_ACTIVE$1); 8117 } else { 8118 // Set triggered link as active 8119 $link.addClass(CLASS_NAME_ACTIVE$1); // Set triggered links parents as active 8120 // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor 8121 8122 $link.parents(SELECTOR_NAV_LIST_GROUP$1).prev(SELECTOR_NAV_LINKS + ", " + SELECTOR_LIST_ITEMS).addClass(CLASS_NAME_ACTIVE$1); // Handle special case when .nav-link is inside .nav-item 8123 8124 $link.parents(SELECTOR_NAV_LIST_GROUP$1).prev(SELECTOR_NAV_ITEMS).children(SELECTOR_NAV_LINKS).addClass(CLASS_NAME_ACTIVE$1); 8125 } 8126 8127 $__default["default"](this._scrollElement).trigger(EVENT_ACTIVATE, { 8128 relatedTarget: target 8129 }); 8130 }; 8131 8132 _proto._clear = function _clear() { 8133 [].slice.call(document.querySelectorAll(this._selector)).filter(function (node) { 8134 return node.classList.contains(CLASS_NAME_ACTIVE$1); 8135 }
8135).forEach(function (node) { 8136 return node.classList.remove(CLASS_NAME_ACTIVE$1); 8137 }); 8138 } // Static 8139 ; 8140 8141 ScrollSpy._jQueryInterface = function _jQueryInterface(config) { 8142 return this.each(function () { 8143 var data = $__default["default"](this).data(DATA_KEY$2); 8144 8145 var _config = typeof config === 'object' && config; 8146 8147 if (!data) { 8148 data = new ScrollSpy(this, _config); 8149 $__default["default"](this).data(DATA_KEY$2, data); 8150 } 8151 8152 if (typeof config === 'string') { 8153 if (typeof data[config] === 'undefined') { 8154 throw new TypeError("No method named \"" + config + "\""); 8155 } 8156 8157 data[config](); 8158 } 8159 }); 8160 }; 8161 8162 _createClass(ScrollSpy, null, [{ 8163 key: "VERSION", 8164 get: function get() { 8165 return VERSION$2; 8166 } 8167 }, { 8168 key: "Default", 8169 get: function get() { 8170 return Default$1; 8171 } 8172 }]); 8173 8174 return ScrollSpy; 8175 }(); 8176 /** 8177 * Data API implementation 8178 */ 8179 8180 8181 $__default["default"](window).on(EVENT_LOAD_DATA_API, function () { 8182 var scrollSpys = [].slice.call(document.querySelectorAll(SELECTOR_DATA_SPY)); 8183 var scrollSpysLength = scrollSpys.length; 8184 8185 for (var i = scrollSpysLength; i--;) { 8186 var $spy = $__default["default"](scrollSpys[i]); 8187 8188 ScrollSpy._jQueryInterface.call($spy, $spy.data()); 8189 } 8190 }); 8191 /** 8192 * jQuery 8193 */ 8194 8195 $__default["default"].fn[NAME$2] = ScrollSpy._jQueryInterface; 8196 $__default["default"].fn[NAME$2].Constructor = ScrollSpy; 8197 8198 $__default["default"].fn[NAME$2].noConflict = function () { 8199 $__default["default"].fn[NAME$2] = JQUERY_NO_CONFLICT$2; 8200 return ScrollSpy._jQueryInterface; 8201 }; 8202 8203 /** 8204 * Constants 8205 */ 8206 8207 var NAME$1 = 'tab'; 8208 var VERSION$1 = '4.6.2'; 8209 var DATA_KEY$1 = 'bs.tab'; 8210 var EVENT_KEY$1 = "." + DATA_KEY$1; 8211 var DATA_API_KEY = '.data-api'; 8212 var JQUERY_NO_CONFLICT$1 = $__default["default"].fn[NAME$1]; 8213 var CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu'; 8214 var CLASS_NAME_ACTIVE = 'active'; 8215 var CLASS_NAME_DISABLED = 'disabled'; 8216 var CLASS_NAME_FADE$1 = 'fade'; 8217 var CLASS_NAME_SHOW$1 = 'show'; 8218 var EVENT_HIDE$1 = "hide" + EVENT_KEY$1; 8219 var EVENT_HIDDEN$1 = "hidden" + EVENT_KEY$1; 8220 var EVENT_SHOW$1 = "show" + EVENT_KEY$1; 8221 var EVENT_SHOWN$1 = "shown" + EVENT_KEY$1; 8222 var EVENT_CLICK_DATA_API = "click" + EVENT_KEY$1 + DATA_API_KEY; 8223 var SELECTOR_DROPDOWN = '.dropdown'; 8224 var SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'; 8225 var SELECTOR_ACTIVE = '.active'; 8226 var SELECTOR_ACTIVE_UL = '> li > .active'; 8227 var SELECTOR_DATA_TOGGLE = '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]'; 8228 var SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'; 8229 var SELECTOR_DROPDOWN_ACTIVE_CHILD = '> .dropdown-menu .active'; 8230 /** 8231 * Class definition 8232 */ 8233 8234 var Tab = /*#__PURE__*/function () { 8235 function Tab(element) { 8236 this._element = element; 8237 } // Getters 8238 8239 8240 var _proto = Tab.prototype; 8241 8242 // Public 8243 _proto.show = function show() { 8244 var _this = this; 8245 8246 if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $__default["default"](this._element).hasClass(CLASS_NAME_ACTIVE) || $__default["default"](this._element).hasClass(CLASS_NAME_DISABLED) || this._element.hasAttribute('disabled')) { 8247 return; 8248 } 8249 8250 var target; 8251 var previous; 8252 var listElement = $__default["default"](this._element).closest(SELECTOR_NAV_LIST_GROUP)[0]; 8253 var selector = Util.getSelectorFromElement(this._element); 8254 8255 if (listElement) { 8256 var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE; 8257 previous = $__default["default"].makeArray($__default["default"](listElement).find(itemSelector)); 8258 previous = previous[previous.length - 1]; 8259 } 8260 8261 var hideEvent = $__default["default"].Event(EVENT_HIDE$1, { 8262 relatedTarget: this._element 8263 }); 8264 var showEvent = $__default["default"].Event(EVENT_SHOW$1, { 8265 relatedTarget: previous 8266 }); 8267 8268 if (previous) { 8269 $__default["default"](previous).trigger(hideEvent); 8270 } 8271 8272 $__default["default"](this._element).trigger(showEvent); 8273 8274 if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) { 8275 return; 8276 } 8277 8278 if (selector) { 8279 target = document.querySelector(selector); 8280 } 8281 8282 this._activate(this._element, listElement); 8283 8284 var complete = function complete() { 8285 var hiddenEvent = $__default["default"].Event(EVENT_HIDDEN$1, { 8286 relatedTarget: _this._element 8287 }); 8288 var shownEvent = $__default["default"].Event(EVENT_SHOWN$1, { 8289 relatedTarget: previous 8290 }); 8291 $__default["default"](previous).trigger(hiddenEvent); 8292 $__default["default"](_this._element).trigger(shownEvent); 8293 }; 8294 8295 if (target) { 8296 this._activate(target, target.parentNode, complete); 8297 } else { 8298 complete(); 8299 } 8300 }; 8301 8302 _proto.dispose = function dispose() { 8303 $__default["default"].removeData(this._element, DATA_KEY$1); 8304 this._element = null; 8305 } // Private 8306 ; 8307 8308 _proto._activate = function _activate(element, container, callback) { 8309 var _this2 = this; 8310 8311 var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $__default["default"](container).find(SELECTOR_ACTIVE_UL) : $__default["default"](container).children(SELECTOR_ACTIVE); 8312 var active = activeElements[0]; 8313 var isTransitioning = callback && active && $__default["default"](active).hasClass(CLASS_NAME_FADE$1); 8314 8315 var complete = function complete() { 8316 return _this2._transitionComplete(element, active, callback); 8317 }; 8318 8319 if (active && isTransitioning) { 8320 var transitionDuration = Util.getTransitionDurationFromElement(active); 8321 $__default["default"](active).removeClass(CLASS_NAME_SHOW$1).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); 8322 } else { 8323 complete(); 8324 } 8325 }; 8326 8327 _proto._transitionComplete = function _transitionComplete(element, active, callback) { 8328 if (active) { 8329 $__default["default"](active).removeClass(CLASS_NAME_ACTIVE);
8330 var dropdownChild = $__default["default"](active.parentNode).find(SELECTOR_DROPDOWN_ACTIVE_CHILD)[0]; 8331 8332 if (dropdownChild) { 8333 $__default["default"](dropdownChild).removeClass(CLASS_NAME_ACTIVE); 8334 } 8335 8336 if (active.getAttribute('role') === 'tab') { 8337 active.setAttribute('aria-selected', false); 8338 } 8339 } 8340 8341 $__default["default"](element).addClass(CLASS_NAME_ACTIVE); 8342 8343 if (element.getAttribute('role') === 'tab') { 8344 element.setAttribute('aria-selected', true); 8345 } 8346 8347 Util.reflow(element); 8348 8349 if (element.classList.contains(CLASS_NAME_FADE$1)) { 8350 element.classList.add(CLASS_NAME_SHOW$1); 8351 } 8352 8353 var parent = element.parentNode; 8354 8355 if (parent && parent.nodeName === 'LI') { 8356 parent = parent.parentNode; 8357 } 8358 8359 if (parent && $__default["default"](parent).hasClass(CLASS_NAME_DROPDOWN_MENU)) { 8360 var dropdownElement = $__default["default"](element).closest(SELECTOR_DROPDOWN)[0]; 8361 8362 if (dropdownElement) { 8363 var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(SELECTOR_DROPDOWN_TOGGLE)); 8364 $__default["default"](dropdownToggleList).addClass(CLASS_NAME_ACTIVE); 8365 } 8366 8367 element.setAttribute('aria-expanded', true); 8368 } 8369 8370 if (callback) { 8371 callback(); 8372 } 8373 } // Static 8374 ; 8375 8376 Tab._jQueryInterface = function _jQueryInterface(config) { 8377 return this.each(function () { 8378 var $this = $__default["default"](this); 8379 var data = $this.data(DATA_KEY$1); 8380 8381 if (!data) { 8382 data = new Tab(this); 8383 $this.data(DATA_KEY$1, data); 8384 } 8385 8386 if (typeof config === 'string') { 8387 if (typeof data[config] === 'undefined') { 8388 throw new TypeError("No method named \"" + config + "\""); 8389 } 8390 8391 data[config](); 8392 } 8393 }); 8394 }; 8395 8396 _createClass(Tab, null, [{ 8397 key: "VERSION", 8398 get: function get() { 8399 return VERSION$1; 8400 } 8401 }]); 8402 8403 return Tab; 8404 }(); 8405 /** 8406 * Data API implementation 8407 */ 8408 8409 8410 $__default["default"](document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { 8411 event.preventDefault(); 8412 8413 Tab._jQueryInterface.call($__default["default"](this), 'show'); 8414 }); 8415 /** 8416 * jQuery 8417 */ 8418 8419 $__default["default"].fn[NAME$1] = Tab._jQueryInterface; 8420 $__default["default"].fn[NAME$1].Constructor = Tab; 8421 8422 $__default["default"].fn[NAME$1].noConflict = function () { 8423 $__default["default"].fn[NAME$1] = JQUERY_NO_CONFLICT$1; 8424 return Tab._jQueryInterface; 8425 }; 8426 8427 /** 8428 * Constants 8429 */ 8430 8431 var NAME = 'toast'; 8432 var VERSION = '4.6.2'; 8433 var DATA_KEY = 'bs.toast'; 8434 var EVENT_KEY = "." + DATA_KEY; 8435 var JQUERY_NO_CONFLICT = $__default["default"].fn[NAME]; 8436 var CLASS_NAME_FADE = 'fade'; 8437 var CLASS_NAME_HIDE = 'hide'; 8438 var CLASS_NAME_SHOW = 'show'; 8439 var CLASS_NAME_SHOWING = 'showing'; 8440 var EVENT_CLICK_DISMISS = "click.dismiss" + EVENT_KEY; 8441 var EVENT_HIDE = "hide" + EVENT_KEY; 8442 var EVENT_HIDDEN = "hidden" + EVENT_KEY; 8443 var EVENT_SHOW = "show" + EVENT_KEY; 8444 var EVENT_SHOWN = "shown" + EVENT_KEY; 8445 var SELECTOR_DATA_DISMISS = '[data-dismiss="toast"]'; 8446 var Default = { 8447 animation: true, 8448 autohide: true, 8449 delay: 500 8450 }; 8451 var DefaultType = { 8452 animation: 'boolean', 8453 autohide: 'boolean', 8454 delay: 'number' 8455 }; 8456 /** 8457 * Class definition 8458 */ 8459 8460 var Toast = /*#__PURE__*/function () { 8461 function Toast(element, config) { 8462 this._element = element; 8463 this._config = this._getConfig(config); 8464 this._timeout = null; 8465 8466 this._setListeners(); 8467 } // Getters 8468 8469 8470 var _proto = Toast.prototype; 8471 8472 // Public 8473 _proto.show = function show() { 8474 var _this = this; 8475 8476 var showEvent = $__default["default"].Event(EVENT_SHOW); 8477 $__default["default"](this._element).trigger(showEvent); 8478 8479 if (showEvent.isDefaultPrevented()) { 8480 return; 8481 } 8482 8483 this._clearTimeout(); 8484 8485 if (this._config.animation) { 8486 this._element.classList.add(CLASS_NAME_FADE); 8487 } 8488 8489 var complete = function complete() { 8490 _this._element.classList.remove(CLASS_NAME_SHOWING); 8491 8492 _this._element.classList.add(CLASS_NAME_SHOW); 8493 8494 $__default["default"](_this._element).trigger(EVENT_SHOWN); 8495 8496 if (_this._config.autohide) { 8497 _this._timeout = setTimeout(function () { 8498 _this.hide(); 8499 }, _this._config.delay); 8500 } 8501 }; 8502 8503 this._element.classList.remove(CLASS_NAME_HIDE); 8504 8505 Util.reflow(this._element); 8506 8507 this._element.classList.add(CLASS_NAME_SHOWING); 8508 8509 if (this._config.animation) { 8510 var transitionDuration = Util.getTransitionDurationFromElement(this._element); 8511 $__default["default"](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); 8512 } else { 8513 complete(); 8514 } 8515 }; 8516 8517 _proto.hide = function hide() { 8518 if (!this._element.classList.contains(CLASS_NAME_SHOW)) { 8519 return; 8520 } 8521 8522 var hideEvent = $__default["default"].Event(EVENT_HIDE); 8523 $__default["default"](this._element).trigger(hideEvent); 8524 8525 if (hideEvent.isDefaultPrevented()) { 8526 return; 8527 } 8528 8529 this._close(); 8530 }; 8531 8532 _proto.dispose = function dispose() { 8533 this._clearTimeout(); 8534 8535 if (this._element.classList.contains(CLASS_NAME_SHOW)) { 8536 this._element.classList.remove(CLASS_NAME_SHOW); 8537 } 8538 8539 $__default["default"](this._element).off(EVENT_CLICK_DISMISS); 8540 $__default["default"].removeData(this._element, DATA_KEY); 8541 this._element = null; 8542 this._config = null; 8543 } // Private 8544 ; 8545 8546 _proto._getConfig = function _getConfig(config) { 8547 config = _extends({}, Default, $__default["default"](this._element).data(), typeof config === 'object' && config ? config : {}); 8548 Util.typeCheckConfig(NAME, config, this.constructor.DefaultType); 8549 return config; 8550 }; 8551 8552 _proto._setListeners = function _setListeners() { 8553 var _this2 = this; 8554 8555 $__default["default"](this._element).on(EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, function () { 8556 return _this2.hide(); 8557 }); 8558 }; 8559 8560 _proto._close = function _close() { 8561 var _this3 = this; 8562 8563 var complete = function complete() { 8564 _this3._element.classList.add(CLASS_NAME_HIDE); 8565 8566 $__default["default"](_this3._element).trigger(EVENT_HIDDEN); 8567 }; 8568 8569 this._element.classList.remove(CLASS_NAME_SHOW); 8570 8571 if (this._config.animation) { 8572 var transitionDuration = Util.getTransitionDurationFromElement(this._element); 8573 $__default["default"](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); 8574 } else { 8575 complete(); 8576 } 8577 }; 8578 8579 _proto._clearTimeout = function _clearTimeout() { 8580 clearTimeout(this._timeout); 8581 this._timeout = null; 8582 } // Static 8583 ; 8584 8585 Toast._jQueryInterface = function _jQueryInterface(config) { 8586 return this.each(function () { 8587 var $element = $__default["default"](this); 8588 var data = $element.data(DATA_KEY); 8589 8590 var _config = typeof config === 'object' && config; 8591 8592 if (!data) { 8593 data = new Toast(this, _config); 8594 $element.data(DATA_KEY, data); 8595 } 8596 8597 if (typeof config === 'string') { 8598 if (typeof data[config] === 'undefined') {
8599 throw new TypeError("No method named \"" + config + "\""); 8600 } 8601 8602 data[config](this); 8603 } 8604 }); 8605 }; 8606 8607 _createClass(Toast, null, [{ 8608 key: "VERSION", 8609 get: function get() { 8610 return VERSION; 8611 } 8612 }, { 8613 key: "DefaultType", 8614 get: function get() { 8615 return DefaultType; 8616 } 8617 }, { 8618 key: "Default", 8619 get: function get() { 8620 return Default; 8621 } 8622 }]); 8623 8624 return Toast; 8625 }(); 8626 /** 8627 * jQuery 8628 */ 8629 8630 8631 $__default["default"].fn[NAME] = Toast._jQueryInterface; 8632 $__default["default"].fn[NAME].Constructor = Toast; 8633 8634 $__default["default"].fn[NAME].noConflict = function () { 8635 $__default["default"].fn[NAME] = JQUERY_NO_CONFLICT; 8636 return Toast._jQueryInterface; 8637 }; 8638 8639 exports.Alert = Alert; 8640 exports.Button = Button; 8641 exports.Carousel = Carousel; 8642 exports.Collapse = Collapse; 8643 exports.Dropdown = Dropdown; 8644 exports.Modal = Modal; 8645 exports.Popover = Popover; 8646 exports.Scrollspy = ScrollSpy; 8647 exports.Tab = Tab; 8648 exports.Toast = Toast; 8649 exports.Tooltip = Tooltip; 8650 exports.Util = Util; 8651 8652 Object.defineProperty(exports, '__esModule', { value: true }); 8653 8654})); 8655 8656 8657},{"jquery":38,"popper.js":42}],27:[function(require,module,exports){ 8658/** 8659 * matchesSelector v2.0.2 8660 * matchesSelector( element, '.selector' ) 8661 * MIT license 8662 */ 8663 8664/*jshint browser: true, strict: true, undef: true, unused: true */ 8665 8666( function( window, factory ) { 8667 /*global define: false, module: false */ 8668 'use strict'; 8669 // universal module definition 8670 if ( typeof define == 'function' && define.amd ) { 8671 // AMD 8672 define( factory ); 8673 } else if ( typeof module == 'object' && module.exports ) { 8674 // CommonJS 8675 module.exports = factory(); 8676 } else { 8677 // browser global 8678 window.matchesSelector = factory(); 8679 } 8680 8681}( window, function factory() { 8682 'use strict'; 8683 8684 var matchesMethod = ( function() { 8685 var ElemProto = window.Element.prototype; 8686 // check for the standard method name first 8687 if ( ElemProto.matches ) { 8688 return 'matches'; 8689 } 8690 // check un-prefixed 8691 if ( ElemProto.matchesSelector ) { 8692 return 'matchesSelector'; 8693 } 8694 // check vendor prefixes 8695 var prefixes = [ 'webkit', 'moz', 'ms', 'o' ]; 8696 8697 for ( var i=0; i < prefixes.length; i++ ) { 8698 var prefix = prefixes[i]; 8699 var method = prefix + 'MatchesSelector'; 8700 if ( ElemProto[ method ] ) { 8701 return method; 8702 } 8703 } 8704 })(); 8705 8706 return function matchesSelector( elem, selector ) { 8707 return elem[ matchesMethod ]( selector ); 8708 }; 8709 8710})); 8711 8712},{}],28:[function(require,module,exports){ 8713/** 8714* Ajax Autocomplete for jQuery, version 1.4.11 8715* (c) 2017 Tomas Kirda 8716* 8717* Ajax Autocomplete for jQuery is freely distributable under the terms of an MIT-style license. 8718* For details, see the web site: https://github.com/devbridge/jQuery-Autocomplete 8719*/ 8720 8721/*jslint browser: true, white: true, single: true, this: true, multivar: true */ 8722/*global define, window, document, jQuery, exports, require */ 8723 8724// Expose plugin as an AMD module if AMD loader is present: 8725(function (factory) { 8726 "use strict"; 8727 if (typeof define === 'function' && define.amd) { 8728 // AMD. Register as an anonymous module. 8729 define(['jquery'], factory); 8730 } else if (typeof exports === 'object' && typeof require === 'function') { 8731 // Browserify 8732 factory(require('jquery')); 8733 } else { 8734 // Browser globals 8735 factory(jQuery); 8736 } 8737}(function ($) { 8738 'use strict'; 8739 8740 var 8741 utils = (function () { 8742 return { 8743 escapeRegExChars: function (value) { 8744 return value.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&"); 8745 }, 8746 createNode: function (containerClass) { 8747 var div = document.createElement('div'); 8748 div.className = containerClass; 8749 div.style.position = 'absolute'; 8750 div.style.display = 'none'; 8751 return div; 8752 } 8753 }; 8754 }()), 8755 8756 keys = { 8757 ESC: 27, 8758 TAB: 9, 8759 RETURN: 13, 8760 LEFT: 37, 8761 UP: 38, 8762 RIGHT: 39, 8763 DOWN: 40 8764 }, 8765 8766 noop = $.noop; 8767 8768 function Autocomplete(el, options) { 8769 var that = this; 8770 8771 // Shared variables: 8772 that.element = el; 8773 that.el = $(el); 8774 that.suggestions = []; 8775 that.badQueries = []; 8776 that.selectedIndex = -1; 8777 that.currentValue = that.element.value; 8778 that.timeoutId = null; 8779 that.cachedResponse = {}; 8780 that.onChangeTimeout = null; 8781 that.onChange = null; 8782 that.isLocal = false;
8783 that.suggestionsContainer = null; 8784 that.noSuggestionsContainer = null; 8785 that.options = $.extend(true, {}, Autocomplete.defaults, options); 8786 that.classes = { 8787 selected: 'autocomplete-selected', 8788 suggestion: 'autocomplete-suggestion' 8789 }; 8790 that.hint = null; 8791 that.hintValue = ''; 8792 that.selection = null; 8793 8794 // Initialize and set options: 8795 that.initialize(); 8796 that.setOptions(options); 8797 } 8798 8799 Autocomplete.utils = utils; 8800 8801 $.Autocomplete = Autocomplete; 8802 8803 Autocomplete.defaults = { 8804 ajaxSettings: {}, 8805 autoSelectFirst: false, 8806 appendTo: 'body', 8807 serviceUrl: null, 8808 lookup: null, 8809 onSelect: null, 8810 width: 'auto', 8811 minChars: 1, 8812 maxHeight: 300, 8813 deferRequestBy: 0, 8814 params: {}, 8815 formatResult: _formatResult, 8816 formatGroup: _formatGroup, 8817 delimiter: null, 8818 zIndex: 9999, 8819 type: 'GET', 8820 noCache: false, 8821 onSearchStart: noop, 8822 onSearchComplete: noop, 8823 onSearchError: noop, 8824 preserveInput: false, 8825 containerClass: 'autocomplete-suggestions', 8826 tabDisabled: false, 8827 dataType: 'text', 8828 currentRequest: null, 8829 triggerSelectOnValidInput: true, 8830 preventBadQueries: true, 8831 lookupFilter: _lookupFilter, 8832 paramName: 'query', 8833 transformResult: _transformResult, 8834 showNoSuggestionNotice: false, 8835 noSuggestionNotice: 'No results', 8836 orientation: 'bottom', 8837 forceFixPosition: false 8838 }; 8839 8840 function _lookupFilter(suggestion, originalQuery, queryLowerCase) { 8841 return suggestion.value.toLowerCase().indexOf(queryLowerCase) !== -1; 8842 }; 8843 8844 function _transformResult(response) { 8845 return typeof response === 'string' ? $.parseJSON(response) : response; 8846 }; 8847 8848 function _formatResult(suggestion, currentValue) { 8849 // Do not replace anything if the current value is empty 8850 if (!currentValue) { 8851 return suggestion.value; 8852 } 8853 8854 var pattern = '(' + utils.escapeRegExChars(currentValue) + ')'; 8855 8856 return suggestion.value 8857 .replace(new RegExp(pattern, 'gi'), '<strong>$1<\/strong>') 8858 .replace(/&/g, '&') 8859 .replace(/</g, '<') 8860 .replace(/>/g, '>') 8861 .replace(/"/g, '"') 8862 .replace(/<(\/?strong)>/g, '<$1>'); 8863 }; 8864 8865 function _formatGroup(suggestion, category) { 8866 return '<div class="autocomplete-group">' + category + '</div>'; 8867 }; 8868 8869 Autocomplete.prototype = { 8870 8871 initialize: function () { 8872 var that = this, 8873 suggestionSelector = '.' + that.classes.suggestion, 8874 selected = that.classes.selected, 8875 options = that.options, 8876 container; 8877 8878 that.element.setAttribute('autocomplete', 'off'); 8879 8880 // html() deals with many types: htmlString or Element or Array or jQuery
8881 that.noSuggestionsContainer = $('<div class="autocomplete-no-suggestion"></div>') 8882 .html(this.options.noSuggestionNotice).get(0); 8883 8884 that.suggestionsContainer = Autocomplete.utils.createNode(options.containerClass); 8885 8886 container = $(that.suggestionsContainer); 8887 8888 container.appendTo(options.appendTo || 'body'); 8889 8890 // Only set width if it was provided: 8891 if (options.width !== 'auto') { 8892 container.css('width', options.width); 8893 } 8894 8895 // Listen for mouse over event on suggestions list: 8896 container.on('mouseover.autocomplete', suggestionSelector, function () { 8897 that.activate($(this).data('index')); 8898 }); 8899 8900 // Deselect active element when mouse leaves suggestions container: 8901 container.on('mouseout.autocomplete', function () { 8902 that.selectedIndex = -1; 8903 container.children('.' + selected).removeClass(selected); 8904 }); 8905 8906 // Listen for click event on suggestions list: 8907 container.on('click.autocomplete', suggestionSelector, function () { 8908 that.select($(this).data('index')); 8909 }); 8910 8911 container.on('click.autocomplete', function () { 8912 clearTimeout(that.blurTimeoutId); 8913 }) 8914 8915 that.fixPositionCapture = function () { 8916 if (that.visible) { 8917 that.fixPosition(); 8918 } 8919 }; 8920 8921 $(window).on('resize.autocomplete', that.fixPositionCapture); 8922 8923 that.el.on('keydown.autocomplete', function (e) { that.onKeyPress(e); }); 8924 that.el.on('keyup.autocomplete', function (e) { that.onKeyUp(e); }); 8925 that.el.on('blur.autocomplete', function () { that.onBlur(); }); 8926 that.el.on('focus.autocomplete', function () { that.onFocus(); }); 8927 that.el.on('change.autocomplete', function (e) { that.onKeyUp(e); }); 8928 that.el.on('input.autocomplete', function (e) { that.onKeyUp(e); }); 8929 }, 8930 8931 onFocus: function () { 8932 var that = this; 8933 8934 if (that.disabled) { 8935 return; 8936 } 8937 8938 that.fixPosition(); 8939 8940 if (that.el.val().length >= that.options.minChars) { 8941 that.onValueChange(); 8942 } 8943 }, 8944 8945 onBlur: function () { 8946 var that = this, 8947 options = that.options, 8948 value = that.el.val(), 8949 query = that.getQuery(value); 8950 8951 // If user clicked on a suggestion, hide() will 8952 // be canceled, otherwise close suggestions 8953 that.blurTimeoutId = setTimeout(function () { 8954 that.hide(); 8955 8956 if (that.selection && that.currentValue !== query) { 8957 (options.onInvalidateSelection || $.noop).call(that.element); 8958 } 8959 }, 200); 8960 }, 8961 8962 abortAjax: function () { 8963 var that = this; 8964 if (that.currentRequest) { 8965 that.currentRequest.abort(); 8966 that.currentRequest = null; 8967 } 8968 }, 8969 8970 setOptions: function (suppliedOptions) { 8971 var that = this, 8972 options = $.extend({}, that.options, suppliedOptions); 8973 8974 that.isLocal = Array.isArray(options.lookup); 8975 8976 if (that.isLocal) { 8977 options.lookup = that.verifySuggestionsFormat(options.lookup); 8978 } 8979 8980 options.orientation = that.validateOrientation(options.orientation, 'bottom'); 8981 8982 // Adjust height, width and z-index: 8983 $(that.suggestionsContainer).css({ 8984 'max-height': options.maxHeight + 'px', 8985 'width': options.width + 'px', 8986 'z-index': options.zIndex 8987 }); 8988 8989 this.options = options; 8990 }, 8991 8992 8993 clearCache: function () { 8994 this.cachedResponse = {}; 8995 this.badQueries = []; 8996 }, 8997 8998 clear: function () { 8999 this.clearCache(); 9000 this.currentValue = ''; 9001 this.suggestions = []; 9002 }, 9003 9004 disable: function () { 9005 var that = this; 9006 that.disabled = true; 9007 clearTimeout(that.onChangeTimeout); 9008 that.abortAjax(); 9009 }, 9010 9011 enable: function () { 9012 this.disabled = false;
9013 }, 9014 9015 fixPosition: function () { 9016 // Use only when container has already its content 9017 9018 var that = this, 9019 $container = $(that.suggestionsContainer), 9020 containerParent = $container.parent().get(0); 9021 // Fix position automatically when appended to body. 9022 // In other cases force parameter must be given. 9023 if (containerParent !== document.body && !that.options.forceFixPosition) { 9024 return; 9025 } 9026 9027 // Choose orientation 9028 var orientation = that.options.orientation, 9029 containerHeight = $container.outerHeight(), 9030 height = that.el.outerHeight(), 9031 offset = that.el.offset(), 9032 styles = { 'top': offset.top, 'left': offset.left }; 9033 9034 if (orientation === 'auto') { 9035 var viewPortHeight = $(window).height(), 9036 scrollTop = $(window).scrollTop(), 9037 topOverflow = -scrollTop + offset.top - containerHeight, 9038 bottomOverflow = scrollTop + viewPortHeight - (offset.top + height + containerHeight); 9039 9040 orientation = (Math.max(topOverflow, bottomOverflow) === topOverflow) ? 'top' : 'bottom'; 9041 } 9042 9043 if (orientation === 'top') { 9044 styles.top += -containerHeight; 9045 } else { 9046 styles.top += height; 9047 } 9048 9049 // If container is not positioned to body, 9050 // correct its position using offset parent offset 9051 if(containerParent !== document.body) { 9052 var opacity = $container.css('opacity'), 9053 parentOffsetDiff; 9054 9055 if (!that.visible){ 9056 $container.css('opacity', 0).show(); 9057 } 9058 9059 parentOffsetDiff = $container.offsetParent().offset(); 9060 styles.top -= parentOffsetDiff.top; 9061 styles.top += containerParent.scrollTop; 9062 styles.left -= parentOffsetDiff.left; 9063 9064 if (!that.visible){ 9065 $container.css('opacity', opacity).hide(); 9066 } 9067 } 9068 9069 if (that.options.width === 'auto') { 9070 styles.width = that.el.outerWidth() + 'px'; 9071 } 9072 9073 $container.css(styles); 9074 }, 9075 9076 isCursorAtEnd: function () { 9077 var that = this, 9078 valLength = that.el.val().length, 9079 selectionStart = that.element.selectionStart, 9080 range; 9081 9082 if (typeof selectionStart === 'number') { 9083 return selectionStart === valLength; 9084 } 9085 if (document.selection) { 9086 range = document.selection.createRange(); 9087 range.moveStart('character', -valLength); 9088 return valLength === range.text.length; 9089 } 9090 return true; 9091 }, 9092 9093 onKeyPress: function (e) { 9094 var that = this; 9095 9096 // If suggestions are hidden and user presses arrow down, display suggestions: 9097 if (!that.disabled && !that.visible && e.which === keys.DOWN && that.currentValue) { 9098 that.suggest(); 9099 return; 9100 } 9101 9102 if (that.disabled || !that.visible) { 9103 return; 9104 } 9105 9106 switch (e.which) { 9107 case keys.ESC: 9108 that.el.val(that.currentValue); 9109 that.hide(); 9110 break; 9111 case keys.RIGHT: 9112 if (that.hint && that.options.onHint && that.isCursorAtEnd()) { 9113 that.selectHint(); 9114 break; 9115 } 9116 return; 9117 case keys.TAB: 9118 if (that.hint && that.options.onHint) { 9119 that.selectHint(); 9120 return; 9121 } 9122 if (that.selectedIndex === -1) { 9123 that.hide(); 9124 return; 9125 } 9126 that.select(that.selectedIndex); 9127 if (that.options.tabDisabled === false) { 9128 return; 9129 } 9130 break; 9131 case keys.RETURN: 9132 if (that.selectedIndex === -1) { 9133 that.hide(); 9134 return; 9135 } 9136 that.select(that.selectedIndex); 9137 break; 9138 case keys.UP: 9139 that.moveUp(); 9140 break; 9141 case keys.DOWN: 9142 that.moveDown(); 9143 break; 9144 default: 9145 return; 9146 } 9147 9148 // Cancel event if function did not return: 9149 e.stopImmediatePropagation(); 9150 e.preventDefault(); 9151 }, 9152 9153 onKeyUp: function (e) { 9154 var that = this; 9155 9156 if (that.disabled) { 9157 return; 9158 } 9159 9160 switch (e.which) { 9161 case keys.UP: 9162 case keys.DOWN: 9163 return; 9164 } 9165 9166 clearTimeout(that.onChangeTimeout); 9167 9168 if (that.currentValue !== that.el.val()) { 9169 that.findBestHint(); 9170 if (that.options.deferRequestBy > 0) { 9171 // Defer lookup in case when value changes very quickly: 9172 that.onChangeTimeout = setTimeout(function () { 9173 that.onValueChange(); 9174 }, that.options.deferRequestBy); 9175 } else { 9176 that.onValueChange(); 9177 } 9178 } 9179 }, 9180 9181 onValueChange: function () { 9182 if (this.ignoreValueChange) { 9183 this.ignoreValueChange = false;
9184 return; 9185 } 9186 9187 var that = this, 9188 options = that.options, 9189 value = that.el.val(), 9190 query = that.getQuery(value); 9191 9192 if (that.selection && that.currentValue !== query) { 9193 that.selection = null; 9194 (options.onInvalidateSelection || $.noop).call(that.element); 9195 } 9196 9197 clearTimeout(that.onChangeTimeout); 9198 that.currentValue = value; 9199 that.selectedIndex = -1; 9200 9201 // Check existing suggestion for the match before proceeding: 9202 if (options.triggerSelectOnValidInput && that.isExactMatch(query)) { 9203 that.select(0); 9204 return; 9205 } 9206 9207 if (query.length < options.minChars) { 9208 that.hide(); 9209 } else { 9210 that.getSuggestions(query); 9211 } 9212 }, 9213 9214 isExactMatch: function (query) { 9215 var suggestions = this.suggestions; 9216 9217 return (suggestions.length === 1 && suggestions[0].value.toLowerCase() === query.toLowerCase()); 9218 }, 9219 9220 getQuery: function (value) { 9221 var delimiter = this.options.delimiter, 9222 parts; 9223 9224 if (!delimiter) { 9225 return value; 9226 } 9227 parts = value.split(delimiter); 9228 return $.trim(parts[parts.length - 1]); 9229 }, 9230 9231 getSuggestionsLocal: function (query) { 9232 var that = this, 9233 options = that.options, 9234 queryLowerCase = query.toLowerCase(), 9235 filter = options.lookupFilter, 9236 limit = parseInt(options.lookupLimit, 10), 9237 data; 9238 9239 data = { 9240 suggestions: $.grep(options.lookup, function (suggestion) { 9241 return filter(suggestion, query, queryLowerCase); 9242 }) 9243 }; 9244 9245 if (limit && data.suggestions.length > limit) { 9246 data.suggestions = data.suggestions.slice(0, limit); 9247 } 9248 9249 return data; 9250 }, 9251 9252 getSuggestions: function (q) { 9253 var response, 9254 that = this, 9255 options = that.options, 9256 serviceUrl = options.serviceUrl, 9257 params, 9258 cacheKey, 9259 ajaxSettings; 9260 9261 options.params[options.paramName] = q; 9262 9263 if (options.onSearchStart.call(that.element, options.params) === false) { 9264 return; 9265 } 9266 9267 params = options.ignoreParams ? null : options.params; 9268 9269 if ($.isFunction(options.lookup)){ 9270 options.lookup(q, function (data) { 9271 that.suggestions = data.suggestions; 9272 that.suggest(); 9273 options.onSearchComplete.call(that.element, q, data.suggestions); 9274 }); 9275 return; 9276 } 9277 9278 if (that.isLocal) { 9279 response = that.getSuggestionsLocal(q); 9280 } else { 9281 if ($.isFunction(serviceUrl)) { 9282 serviceUrl = serviceUrl.call(that.element, q); 9283 } 9284 cacheKey = serviceUrl + '?' + $.param(params || {}); 9285 response = that.cachedResponse[cacheKey]; 9286 } 9287 9288 if (response && Array.isArray(response.suggestions)) { 9289 that.suggestions = response.suggestions; 9290 that.suggest(); 9291 options.onSearchComplete.call(that.element, q, response.suggestions); 9292 } else if (!that.isBadQuery(q)) { 9293 that.abortAjax(); 9294 9295 ajaxSettings = { 9296 url: serviceUrl, 9297 data: params, 9298 type: options.type, 9299 dataType: options.dataType 9300 }; 9301 9302 $.extend(ajaxSettings, options.ajaxSettings); 9303 9304 that.currentRequest = $.ajax(ajaxSettings).done(function (data) { 9305 var result; 9306 that.currentRequest = null; 9307 result = options.transformResult(data, q); 9308 that.processResponse(result, q, cacheKey); 9309 options.onSearchComplete.call(that.element, q, result.suggestions); 9310 }).fail(function (jqXHR, textStatus, errorThrown) { 9311 options.onSearchError.call(that.element, q, jqXHR, textStatus, errorThrown); 9312 }); 9313 } else { 9314 options.onSearchComplete.call(that.element, q, []); 9315 } 9316 }, 9317 9318 isBadQuery: function (q) { 9319 if (!this.options.preventBadQueries){ 9320 return false;
9321 } 9322 9323 var badQueries = this.badQueries, 9324 i = badQueries.length; 9325 9326 while (i--) { 9327 if (q.indexOf(badQueries[i]) === 0) { 9328 return true; 9329 } 9330 } 9331 9332 return false; 9333 }, 9334 9335 hide: function () { 9336 var that = this, 9337 container = $(that.suggestionsContainer); 9338 9339 if ($.isFunction(that.options.onHide) && that.visible) { 9340 that.options.onHide.call(that.element, container); 9341 } 9342 9343 that.visible = false; 9344 that.selectedIndex = -1; 9345 clearTimeout(that.onChangeTimeout); 9346 $(that.suggestionsContainer).hide(); 9347 that.signalHint(null); 9348 }, 9349 9350 suggest: function () { 9351 if (!this.suggestions.length) { 9352 if (this.options.showNoSuggestionNotice) { 9353 this.noSuggestions(); 9354 } else { 9355 this.hide(); 9356 } 9357 return; 9358 } 9359 9360 var that = this, 9361 options = that.options, 9362 groupBy = options.groupBy, 9363 formatResult = options.formatResult, 9364 value = that.getQuery(that.currentValue), 9365 className = that.classes.suggestion, 9366 classSelected = that.classes.selected, 9367 container = $(that.suggestionsContainer), 9368 noSuggestionsContainer = $(that.noSuggestionsContainer), 9369 beforeRender = options.beforeRender, 9370 html = '', 9371 category, 9372 formatGroup = function (suggestion, index) { 9373 var currentCategory = suggestion.data[groupBy]; 9374 9375 if (category === currentCategory){ 9376 return ''; 9377 } 9378 9379 category = currentCategory; 9380 9381 return options.formatGroup(suggestion, category); 9382 }; 9383 9384 if (options.triggerSelectOnValidInput && that.isExactMatch(value)) { 9385 that.select(0); 9386 return; 9387 } 9388 9389 // Build suggestions inner HTML: 9390 $.each(that.suggestions, function (i, suggestion) { 9391 if (groupBy){ 9392 html += formatGroup(suggestion, value, i); 9393 } 9394 9395 html += '<div class="' + className + '" data-index="' + i + '">' + formatResult(suggestion, value, i) + '</div>'; 9396 }); 9397 9398 this.adjustContainerWidth(); 9399 9400 noSuggestionsContainer.detach(); 9401 container.html(html); 9402 9403 if ($.isFunction(beforeRender)) { 9404 beforeRender.call(that.element, container, that.suggestions); 9405 } 9406 9407 that.fixPosition(); 9408 container.show(); 9409 9410 // Select first value by default: 9411 if (options.autoSelectFirst) { 9412 that.selectedIndex = 0; 9413 container.scrollTop(0); 9414 container.children('.' + className).first().addClass(classSelected); 9415 } 9416 9417 that.visible = true; 9418 that.findBestHint(); 9419 }, 9420 9421 noSuggestions: function() { 9422 var that = this, 9423 beforeRender = that.options.beforeRender, 9424 container = $(that.suggestionsContainer), 9425 noSuggestionsContainer = $(that.noSuggestionsContainer); 9426 9427 this.adjustContainerWidth(); 9428 9429 // Some explicit steps. Be careful here as it easy to get 9430 // noSuggestionsContainer removed from DOM if not detached properly. 9431 noSuggestionsContainer.detach(); 9432 9433 // clean suggestions if any 9434 container.empty(); 9435 container.append(noSuggestionsContainer); 9436 9437 if ($.isFunction(beforeRender)) { 9438 beforeRender.call(that.element, container, that.suggestions); 9439 } 9440 9441 that.fixPosition(); 9442 9443 container.show(); 9444 that.visible = true; 9445 }, 9446 9447 adjustContainerWidth: function() { 9448 var that = this, 9449 options = that.options, 9450 width, 9451 container = $(that.suggestionsContainer); 9452
9453 // If width is auto, adjust width before displaying suggestions, 9454 // because if instance was created before input had width, it will be zero. 9455 // Also it adjusts if input width has changed. 9456 if (options.width === 'auto') { 9457 width = that.el.outerWidth(); 9458 container.css('width', width > 0 ? width : 300); 9459 } else if(options.width === 'flex') { 9460 // Trust the source! Unset the width property so it will be the max length 9461 // the containing elements. 9462 container.css('width', ''); 9463 } 9464 }, 9465 9466 findBestHint: function () { 9467 var that = this, 9468 value = that.el.val().toLowerCase(), 9469 bestMatch = null; 9470 9471 if (!value) { 9472 return; 9473 } 9474 9475 $.each(that.suggestions, function (i, suggestion) { 9476 var foundMatch = suggestion.value.toLowerCase().indexOf(value) === 0; 9477 if (foundMatch) { 9478 bestMatch = suggestion; 9479 } 9480 return !foundMatch; 9481 }); 9482 9483 that.signalHint(bestMatch); 9484 }, 9485 9486 signalHint: function (suggestion) { 9487 var hintValue = '', 9488 that = this; 9489 if (suggestion) { 9490 hintValue = that.currentValue + suggestion.value.substr(that.currentValue.length); 9491 } 9492 if (that.hintValue !== hintValue) { 9493 that.hintValue = hintValue; 9494 that.hint = suggestion; 9495 (this.options.onHint || $.noop)(hintValue); 9496 } 9497 }, 9498 9499 verifySuggestionsFormat: function (suggestions) { 9500 // If suggestions is string array, convert them to supported format: 9501 if (suggestions.length && typeof suggestions[0] === 'string') { 9502 return $.map(suggestions, function (value) { 9503 return { value: value, data: null }; 9504 }); 9505 } 9506 9507 return suggestions; 9508 }, 9509 9510 validateOrientation: function(orientation, fallback) { 9511 orientation = $.trim(orientation || '').toLowerCase(); 9512 9513 if($.inArray(orientation, ['auto', 'bottom', 'top']) === -1){ 9514 orientation = fallback; 9515 } 9516 9517 return orientation; 9518 }, 9519 9520 processResponse: function (result, originalQuery, cacheKey) { 9521 var that = this, 9522 options = that.options; 9523 9524 result.suggestions = that.verifySuggestionsFormat(result.suggestions); 9525 9526 // Cache results if cache is not disabled: 9527 if (!options.noCache) { 9528 that.cachedResponse[cacheKey] = result; 9529 if (options.preventBadQueries && !result.suggestions.length) { 9530 that.badQueries.push(originalQuery); 9531 } 9532 } 9533 9534 // Return if originalQuery is not matching current query: 9535 if (originalQuery !== that.getQuery(that.currentValue)) { 9536 return; 9537 } 9538 9539 that.suggestions = result.suggestions; 9540 that.suggest(); 9541 }, 9542 9543 activate: function (index) { 9544 var that = this, 9545 activeItem, 9546 selected = that.classes.selected, 9547 container = $(that.suggestionsContainer), 9548 children = container.find('.' + that.classes.suggestion); 9549 9550 container.find('.' + selected).removeClass(selected); 9551 9552 that.selectedIndex = index; 9553 9554 if (that.selectedIndex !== -1 && children.length > that.selectedIndex) { 9555 activeItem = children.get(that.selectedIndex); 9556 $(activeItem).addClass(selected); 9557 return activeItem; 9558 } 9559 9560 return null; 9561 }, 9562 9563 selectHint: function () { 9564 var that = this, 9565 i = $.inArray(that.hint, that.suggestions); 9566 9567 that.select(i); 9568 }, 9569 9570 select: function (i) { 9571 var that = this; 9572 that.hide(); 9573 that.onSelect(i); 9574 }, 9575 9576 moveUp: function () { 9577 var that = this; 9578 9579 if (that.selectedIndex === -1) { 9580 return; 9581 } 9582 9583 if (that.selectedIndex === 0) { 9584 $(that.suggestionsContainer).children('.' + that.classes.suggestion).first().removeClass(that.classes.selected); 9585 that.selectedIndex = -1; 9586 that.ignoreValueChange = false;
9587 that.el.val(that.currentValue); 9588 that.findBestHint(); 9589 return; 9590 } 9591 9592 that.adjustScroll(that.selectedIndex - 1); 9593 }, 9594 9595 moveDown: function () { 9596 var that = this; 9597 9598 if (that.selectedIndex === (that.suggestions.length - 1)) { 9599 return; 9600 } 9601 9602 that.adjustScroll(that.selectedIndex + 1); 9603 }, 9604 9605 adjustScroll: function (index) { 9606 var that = this, 9607 activeItem = that.activate(index); 9608 9609 if (!activeItem) { 9610 return; 9611 } 9612 9613 var offsetTop, 9614 upperBound, 9615 lowerBound, 9616 heightDelta = $(activeItem).outerHeight(); 9617 9618 offsetTop = activeItem.offsetTop; 9619 upperBound = $(that.suggestionsContainer).scrollTop(); 9620 lowerBound = upperBound + that.options.maxHeight - heightDelta; 9621 9622 if (offsetTop < upperBound) { 9623 $(that.suggestionsContainer).scrollTop(offsetTop); 9624 } else if (offsetTop > lowerBound) { 9625 $(that.suggestionsContainer).scrollTop(offsetTop - that.options.maxHeight + heightDelta); 9626 } 9627 9628 if (!that.options.preserveInput) { 9629 // During onBlur event, browser will trigger "change" event, 9630 // because value has changed, to avoid side effect ignore, 9631 // that event, so that correct suggestion can be selected 9632 // when clicking on suggestion with a mouse 9633 that.ignoreValueChange = true; 9634 that.el.val(that.getValue(that.suggestions[index].value)); 9635 } 9636 9637 that.signalHint(null); 9638 }, 9639 9640 onSelect: function (index) { 9641 var that = this, 9642 onSelectCallback = that.options.onSelect, 9643 suggestion = that.suggestions[index]; 9644 9645 that.currentValue = that.getValue(suggestion.value); 9646 9647 if (that.currentValue !== that.el.val() && !that.options.preserveInput) { 9648 that.el.val(that.currentValue); 9649 } 9650 9651 that.signalHint(null); 9652 that.suggestions = []; 9653 that.selection = suggestion; 9654 9655 if ($.isFunction(onSelectCallback)) { 9656 onSelectCallback.call(that.element, suggestion); 9657 } 9658 }, 9659 9660 getValue: function (value) { 9661 var that = this, 9662 delimiter = that.options.delimiter, 9663 currentValue, 9664 parts; 9665 9666 if (!delimiter) { 9667 return value; 9668 } 9669 9670 currentValue = that.currentValue; 9671 parts = currentValue.split(delimiter); 9672 9673 if (parts.length === 1) { 9674 return value; 9675 } 9676 9677 return currentValue.substr(0, currentValue.length - parts[parts.length - 1].length) + value; 9678 }, 9679 9680 dispose: function () { 9681 var that = this; 9682 that.el.off('.autocomplete').removeData('autocomplete'); 9683 $(window).off('resize.autocomplete', that.fixPositionCapture); 9684 $(that.suggestionsContainer).remove(); 9685 } 9686 }; 9687 9688 // Create chainable jQuery plugin: 9689 $.fn.devbridgeAutocomplete = function (options, args) { 9690 var dataKey = 'autocomplete'; 9691 // If function invoked without argument return 9692 // instance of the first matched element: 9693 if (!arguments.length) { 9694 return this.first().data(dataKey); 9695 } 9696 9697 return this.each(function () { 9698 var inputElement = $(this), 9699 instance = inputElement.data(dataKey); 9700 9701 if (typeof options === 'string') { 9702 if (instance && typeof instance[options] === 'function') { 9703 instance[options](args); 9704 } 9705 } else { 9706 // If instance already exists, destroy it: 9707 if (instance && instance.dispose) { 9708 instance.dispose(); 9709 } 9710 instance = new Autocomplete(this, options); 9711 inputElement.data(dataKey, instance); 9712 } 9713 }); 9714 }; 9715 9716 // Don't overwrite if it already exists 9717 if (!$.fn.autocomplete) { 9718 $.fn.autocomplete = $.fn.devbridgeAutocomplete; 9719 } 9720})); 9721 9722},{"jquery":38}],29:[function(require,module,exports){ 9723/** 9724 * EvEmitter v1.1.0 9725 * Lil' event emitter 9726 * MIT License 9727 */ 9728 9729/* jshint unused: true, undef: true, strict: true */ 9730 9731( function( global, factory ) { 9732 // universal module definition 9733 /* jshint strict: false */ /* globals define, module, window */ 9734 if ( typeof define == 'function' && define.amd ) { 9735 // AMD - RequireJS 9736 define( factory ); 9737 } else if ( typeof module == 'object' && module.exports ) { 9738 // CommonJS - Browserify, Webpack 9739 module.exports = factory(); 9740 } else { 9741 // Browser globals 9742 global.EvEmitter = factory(); 9743 } 9744 9745}( typeof window != 'undefined' ? window : this, function() { 9746 9747"use strict"; 9748 9749function EvEmitter() {} 9750 9751var proto = EvEmitter.prototype; 9752 9753proto.on = function( eventName, listener ) { 9754 if ( !eventName || !listener ) { 9755 return; 9756 } 9757 // set events hash 9758 var events = this._events = this._events || {}; 9759 // set listeners array 9760 var listeners = events[ eventName ] = events[ eventName ] || []; 9761 // only add once 9762 if ( listeners.indexOf( listener ) == -1 ) { 9763 listeners.push( listener ); 9764 } 9765 9766 return this; 9767}; 9768 9769proto.once = function( eventName, listener ) { 9770 if ( !eventName || !listener ) { 9771 return; 9772 } 9773 // add event 9774 this.on( eventName, listener ); 9775 // set once flag 9776 // set onceEvents hash 9777 var onceEvents = this._onceEvents = this._onceEvents || {}; 9778 // set onceListeners object 9779 var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {}; 9780 // set flag 9781 onceListeners[ listener ] = true; 9782 9783 return this; 9784}; 9785 9786proto.off = function( eventName, listener ) { 9787 var listeners = this._events && this._events[ eventName ]; 9788 if ( !listeners || !listeners.length ) { 9789 return; 9790 } 9791 var index = listeners.indexOf( listener ); 9792 if ( index != -1 ) { 9793 listeners.splice( index, 1 ); 9794 } 9795 9796 return this; 9797}; 9798 9799proto.emitEvent = function( eventName, args ) { 9800 var listeners = this._events && this._events[ eventName ]; 9801 if ( !listeners || !listeners.length ) { 9802 return; 9803 } 9804 // copy over to avoid interference if .off() in listener 9805 listeners = listeners.slice(0); 9806 args = args || []; 9807 // once stuff 9808 var onceListeners = this._onceEvents && this._onceEvents[ eventName ]; 9809 9810 for ( var i=0; i < listeners.length; i++ ) { 9811 var listener = listeners[i] 9812 var isOnce = onceListeners && onceListeners[ listener ]; 9813 if ( isOnce ) { 9814 // remove listener 9815 // remove before trigger to prevent recursion 9816 this.off( eventName, listener ); 9817 // unset once flag 9818 delete onceListeners[ listener ]; 9819 } 9820 // trigger listener 9821 listener.apply( this, args ); 9822 } 9823 9824 return this; 9825}; 9826 9827proto.allOff = function() { 9828 delete this._events; 9829 delete this._onceEvents; 9830}; 9831 9832return EvEmitter; 9833 9834})); 9835 9836},{}],30:[function(require,module,exports){ 9837/** 9838 * Fizzy UI utils v2.0.7 9839 * MIT license 9840 */ 9841 9842/*jshint browser: true, undef: true, unused: true, strict: true */ 9843 9844( function( window, factory ) { 9845 // universal module definition 9846 /*jshint strict: false */ /*globals define, module, require */ 9847 9848 if ( typeof define == 'function' && define.amd ) { 9849 // AMD 9850 define( [ 9851 'desandro-matches-selector/matches-selector' 9852 ], function( matchesSelector ) { 9853 return factory( window, matchesSelector ); 9854 }); 9855 } else if ( typeof module == 'object' && module.exports ) { 9856 // CommonJS 9857 module.exports = factory( 9858 window, 9859 require('desandro-matches-selector') 9860 ); 9861 } else { 9862 // browser global 9863 window.fizzyUIUtils = factory( 9864 window, 9865 window.matchesSelector 9866 ); 9867 } 9868 9869}( window, function factory( window, matchesSelector ) { 9870 9871'use strict'; 9872 9873var utils = {}; 9874 9875// ----- extend ----- // 9876 9877// extends objects 9878utils.extend = function( a, b ) { 9879 for ( var prop in b ) { 9880 a[ prop ] = b[ prop ]; 9881 } 9882 return a; 9883}; 9884 9885// ----- modulo ----- // 9886 9887utils.modulo = function( num, div ) { 9888 return ( ( num % div ) + div ) % div; 9889}; 9890 9891// ----- makeArray ----- // 9892 9893var arraySlice = Array.prototype.slice; 9894 9895// turn element or nodeList into an array 9896utils.makeArray = function( obj ) { 9897 if ( Array.isArray( obj ) ) { 9898 // use object if already an array 9899 return obj; 9900 } 9901 // return empty array if undefined or null. #6 9902 if ( obj === null || obj === undefined ) { 9903 return []; 9904 } 9905 9906 var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number'; 9907 if ( isArrayLike ) { 9908 // convert nodeList to array 9909 return arraySlice.call( obj ); 9910 } 9911 9912 // array of single index 9913 return [ obj ]; 9914}; 9915 9916// ----- removeFrom ----- // 9917 9918utils.removeFrom = function( ary, obj ) { 9919 var index = ary.indexOf( obj ); 9920 if ( index != -1 ) { 9921 ary.splice( index, 1 ); 9922 } 9923}; 9924 9925// ----- getParent ----- // 9926 9927utils.getParent = function( elem, selector ) { 9928 while ( elem.parentNode && elem != document.body ) { 9929 elem = elem.parentNode; 9930 if ( matchesSelector( elem, selector ) ) { 9931 return elem; 9932 } 9933 } 9934}; 9935 9936// ----- getQueryElement ----- // 9937 9938// use element as selector string 9939utils.getQueryElement = function( elem ) { 9940 if ( typeof elem == 'string' ) { 9941 return document.querySelector( elem ); 9942 } 9943 return elem; 9944}; 9945 9946// ----- handleEvent ----- // 9947 9948// enable .ontype to trigger from .addEventListener( elem, 'type' ) 9949utils.handleEvent = function( event ) { 9950 var method = 'on' + event.type; 9951 if ( this[ method ] ) { 9952 this[ method ]( event ); 9953 } 9954}; 9955 9956// ----- filterFindElements ----- // 9957 9958utils.filterFindElements = function( elems, selector ) { 9959 // make array of elems 9960 elems = utils.makeArray( elems ); 9961 var ffElems = []; 9962
vendor: 5,583 bytes, lines 9963-10175
9963 elems.forEach( function( elem ) { 9964 // check that elem is an actual element 9965 if ( !( elem instanceof HTMLElement ) ) { 9966 return; 9967 } 9968 // add elem if no selector 9969 if ( !selector ) { 9970 ffElems.push( elem ); 9971 return; 9972 } 9973 // filter & find items if we have a selector 9974 // filter 9975 if ( matchesSelector( elem, selector ) ) { 9976 ffElems.push( elem ); 9977 } 9978 // find children 9979 var childElems = elem.querySelectorAll( selector ); 9980 // concat childElems to filterFound array 9981 for ( var i=0; i < childElems.length; i++ ) { 9982 ffElems.push( childElems[i] ); 9983 } 9984 }); 9985 9986 return ffElems; 9987}; 9988 9989// ----- debounceMethod ----- // 9990 9991utils.debounceMethod = function( _class, methodName, threshold ) { 9992 threshold = threshold || 100; 9993 // original method 9994 var method = _class.prototype[ methodName ]; 9995 var timeoutName = methodName + 'Timeout'; 9996 9997 _class.prototype[ methodName ] = function() { 9998 var timeout = this[ timeoutName ]; 9999 clearTimeout( timeout ); 10000 10001 var args = arguments; 10002 var _this = this; 10003 this[ timeoutName ] = setTimeout( function() { 10004 method.apply( _this, args ); 10005 delete _this[ timeoutName ]; 10006 }, threshold ); 10007 }; 10008}; 10009 10010// ----- docReady ----- // 10011 10012utils.docReady = function( callback ) { 10013 var readyState = document.readyState; 10014 if ( readyState == 'complete' || readyState == 'interactive' ) { 10015 // do async to allow for other scripts to run. metafizzy/flickity#441 10016 setTimeout( callback ); 10017 } else { 10018 document.addEventListener( 'DOMContentLoaded', callback ); 10019 } 10020}; 10021 10022// ----- htmlInit ----- // 10023 10024// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/ 10025utils.toDashed = function( str ) { 10026 return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) { 10027 return $1 + '-' + $2; 10028 }).toLowerCase(); 10029}; 10030 10031var console = window.console; 10032/** 10033 * allow user to initialize classes via [data-namespace] or .js-namespace class 10034 * htmlInit( Widget, 'widgetName' ) 10035 * options are parsed from data-namespace-options 10036 */ 10037utils.htmlInit = function( WidgetClass, namespace ) { 10038 utils.docReady( function() { 10039 var dashedNamespace = utils.toDashed( namespace ); 10040 var dataAttr = 'data-' + dashedNamespace; 10041 var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' ); 10042 var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace ); 10043 var elems = utils.makeArray( dataAttrElems ) 10044 .concat( utils.makeArray( jsDashElems ) ); 10045 var dataOptionsAttr = dataAttr + '-options'; 10046 var jQuery = window.jQuery; 10047 10048 elems.forEach( function( elem ) { 10049 var attr = elem.getAttribute( dataAttr ) || 10050 elem.getAttribute( dataOptionsAttr ); 10051 var options; 10052 try { 10053 options = attr && JSON.parse( attr ); 10054 } catch ( error ) { 10055 // log error, do not initialize 10056 if ( console ) { 10057 console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className + 10058 ': ' + error ); 10059 } 10060 return; 10061 } 10062 // initialize 10063 var instance = new WidgetClass( elem, options ); 10064 // make available via $().data('namespace') 10065 if ( jQuery ) { 10066 jQuery.data( elem, namespace, instance ); 10067 } 10068 }); 10069 10070 }); 10071}; 10072 10073// ----- ----- // 10074 10075return utils; 10076 10077})); 10078 10079},{"desandro-matches-selector":27}],31:[function(require,module,exports){ 10080/*! 10081 * getSize v2.0.3 10082 * measure size of elements 10083 * MIT license 10084 */ 10085 10086/* jshint browser: true, strict: true, undef: true, unused: true */ 10087/* globals console: false */ 10088 10089( function( window, factory ) { 10090 /* jshint strict: false */ /* globals define, module */ 10091 if ( typeof define == 'function' && define.amd ) { 10092 // AMD 10093 define( factory ); 10094 } else if ( typeof module == 'object' && module.exports ) { 10095 // CommonJS 10096 module.exports = factory(); 10097 } else { 10098 // browser global 10099 window.getSize = factory(); 10100 } 10101 10102})( window, function factory() { 10103'use strict'; 10104 10105// -------------------------- helpers -------------------------- // 10106 10107// get a number from a string, not a percentage 10108function getStyleSize( value ) { 10109 var num = parseFloat( value ); 10110 // not a percent like '100%', and a number 10111 var isValid = value.indexOf('%') == -1 && !isNaN( num ); 10112 return isValid && num; 10113} 10114 10115function noop() {} 10116 10117var logError = typeof console == 'undefined' ? noop : 10118 function( message ) { 10119 console.error( message ); 10120 }; 10121 10122// -------------------------- measurements -------------------------- // 10123 10124var measurements = [ 10125 'paddingLeft', 10126 'paddingRight', 10127 'paddingTop', 10128 'paddingBottom', 10129 'marginLeft', 10130 'marginRight', 10131 'marginTop', 10132 'marginBottom', 10133 'borderLeftWidth', 10134 'borderRightWidth', 10135 'borderTopWidth', 10136 'borderBottomWidth' 10137]; 10138 10139var measurementsLength = measurements.length; 10140 10141function getZeroSize() { 10142 var size = { 10143 width: 0, 10144 height: 0, 10145 innerWidth: 0, 10146 innerHeight: 0, 10147 outerWidth: 0, 10148 outerHeight: 0 10149 }; 10150 for ( var i=0; i < measurementsLength; i++ ) { 10151 var measurement = measurements[i]; 10152 size[ measurement ] = 0; 10153 } 10154 return size; 10155} 10156 10157// -------------------------- getStyle -------------------------- // 10158 10159/** 10160 * getStyle, get style of element, check for Firefox bug 10161 * https://bugzilla.mozilla.org/show_bug.cgi?id=548397 10162 */ 10163function getStyle( elem ) { 10164 var style = getComputedStyle( elem ); 10165 if ( !style ) { 10166 logError( 'Style returned ' + style + 10167 '. Are you running this code in a hidden iframe on Firefox? ' + 10168 'See https://bit.ly/getsizebug1' ); 10169 } 10170 return style; 10171} 10172 10173// -------------------------- setup -------------------------- // 10174 10175var isSetup = false;
vendor: 4,966 bytes, lines 10176-10350
10176 10177var isBoxSizeOuter; 10178 10179/** 10180 * setup 10181 * check isBoxSizerOuter 10182 * do on first getSize() rather than on page load for Firefox bug 10183 */ 10184function setup() { 10185 // setup once 10186 if ( isSetup ) { 10187 return; 10188 } 10189 isSetup = true; 10190 10191 // -------------------------- box sizing -------------------------- // 10192 10193 /** 10194 * Chrome & Safari measure the outer-width on style.width on border-box elems 10195 * IE11 & Firefox<29 measures the inner-width 10196 */ 10197 var div = document.createElement('div'); 10198 div.style.width = '200px'; 10199 div.style.padding = '1px 2px 3px 4px'; 10200 div.style.borderStyle = 'solid'; 10201 div.style.borderWidth = '1px 2px 3px 4px'; 10202 div.style.boxSizing = 'border-box'; 10203 10204 var body = document.body || document.documentElement; 10205 body.appendChild( div ); 10206 var style = getStyle( div ); 10207 // round value for browser zoom. desandro/masonry#928 10208 isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200; 10209 getSize.isBoxSizeOuter = isBoxSizeOuter; 10210 10211 body.removeChild( div ); 10212} 10213 10214// -------------------------- getSize -------------------------- // 10215 10216function getSize( elem ) { 10217 setup(); 10218 10219 // use querySeletor if elem is string 10220 if ( typeof elem == 'string' ) { 10221 elem = document.querySelector( elem ); 10222 } 10223 10224 // do not proceed on non-objects 10225 if ( !elem || typeof elem != 'object' || !elem.nodeType ) { 10226 return; 10227 } 10228 10229 var style = getStyle( elem ); 10230 10231 // if hidden, everything is 0 10232 if ( style.display == 'none' ) { 10233 return getZeroSize(); 10234 } 10235 10236 var size = {}; 10237 size.width = elem.offsetWidth; 10238 size.height = elem.offsetHeight; 10239 10240 var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box'; 10241 10242 // get all measurements 10243 for ( var i=0; i < measurementsLength; i++ ) { 10244 var measurement = measurements[i]; 10245 var value = style[ measurement ]; 10246 var num = parseFloat( value ); 10247 // any 'auto', 'medium' value will be 0 10248 size[ measurement ] = !isNaN( num ) ? num : 0; 10249 } 10250 10251 var paddingWidth = size.paddingLeft + size.paddingRight; 10252 var paddingHeight = size.paddingTop + size.paddingBottom; 10253 var marginWidth = size.marginLeft + size.marginRight; 10254 var marginHeight = size.marginTop + size.marginBottom; 10255 var borderWidth = size.borderLeftWidth + size.borderRightWidth; 10256 var borderHeight = size.borderTopWidth + size.borderBottomWidth; 10257 10258 var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter; 10259 10260 // overwrite width and height if we can get it from style 10261 var styleWidth = getStyleSize( style.width ); 10262 if ( styleWidth !== false ) { 10263 size.width = styleWidth + 10264 // add padding and border unless it's already including it 10265 ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth ); 10266 } 10267 10268 var styleHeight = getStyleSize( style.height ); 10269 if ( styleHeight !== false ) { 10270 size.height = styleHeight + 10271 // add padding and border unless it's already including it 10272 ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight ); 10273 } 10274 10275 size.innerWidth = size.width - ( paddingWidth + borderWidth ); 10276 size.innerHeight = size.height - ( paddingHeight + borderHeight ); 10277 10278 size.outerWidth = size.width + marginWidth; 10279 size.outerHeight = size.height + marginHeight; 10280 10281 return size; 10282} 10283 10284return getSize; 10285 10286}); 10287 10288},{}],32:[function(require,module,exports){ 10289/*! 10290 * Isotope v3.0.6 10291 * 10292 * Licensed GPLv3 for open source use 10293 * or Isotope Commercial License for commercial use 10294 * 10295 * https://isotope.metafizzy.co 10296 * Copyright 2010-2018 Metafizzy 10297 */ 10298 10299( function( window, factory ) { 10300 // universal module definition 10301 /* jshint strict: false */ /*globals define, module, require */ 10302 if ( typeof define == 'function' && define.amd ) { 10303 // AMD 10304 define( [ 10305 'outlayer/outlayer', 10306 'get-size/get-size', 10307 'desandro-matches-selector/matches-selector', 10308 'fizzy-ui-utils/utils', 10309 './item', 10310 './layout-mode', 10311 // include default layout modes 10312 './layout-modes/masonry', 10313 './layout-modes/fit-rows', 10314 './layout-modes/vertical' 10315 ], 10316 function( Outlayer, getSize, matchesSelector, utils, Item, LayoutMode ) { 10317 return factory( window, Outlayer, getSize, matchesSelector, utils, Item, LayoutMode ); 10318 }); 10319 } else if ( typeof module == 'object' && module.exports ) { 10320 // CommonJS 10321 module.exports = factory( 10322 window, 10323 require('outlayer'), 10324 require('get-size'), 10325 require('desandro-matches-selector'), 10326 require('fizzy-ui-utils'), 10327 require('./item'), 10328 require('./layout-mode'), 10329 // include default layout modes 10330 require('./layout-modes/masonry'), 10331 require('./layout-modes/fit-rows'), 10332 require('./layout-modes/vertical') 10333 ); 10334 } else { 10335 // browser global 10336 window.Isotope = factory( 10337 window, 10338 window.Outlayer, 10339 window.getSize, 10340 window.matchesSelector, 10341 window.fizzyUIUtils, 10342 window.Isotope.Item, 10343 window.Isotope.LayoutMode 10344 ); 10345 } 10346 10347}( window, function factory( window, Outlayer, getSize, matchesSelector, utils, 10348 Item, LayoutMode ) { 10349 10350'use strict';
vendor: 15,771 bytes, lines 10350-10910
10350 10351 10352// -------------------------- vars -------------------------- // 10353 10354var jQuery = window.jQuery; 10355 10356// -------------------------- helpers -------------------------- // 10357 10358var trim = String.prototype.trim ? 10359 function( str ) { 10360 return str.trim(); 10361 } : 10362 function( str ) { 10363 return str.replace( /^\s+|\s+$/g, '' ); 10364 }; 10365 10366// -------------------------- isotopeDefinition -------------------------- // 10367 10368 // create an Outlayer layout class 10369 var Isotope = Outlayer.create( 'isotope', { 10370 layoutMode: 'masonry', 10371 isJQueryFiltering: true, 10372 sortAscending: true 10373 }); 10374 10375 Isotope.Item = Item; 10376 Isotope.LayoutMode = LayoutMode; 10377 10378 var proto = Isotope.prototype; 10379 10380 proto._create = function() { 10381 this.itemGUID = 0; 10382 // functions that sort items 10383 this._sorters = {}; 10384 this._getSorters(); 10385 // call super 10386 Outlayer.prototype._create.call( this ); 10387 10388 // create layout modes 10389 this.modes = {}; 10390 // start filteredItems with all items 10391 this.filteredItems = this.items; 10392 // keep of track of sortBys 10393 this.sortHistory = [ 'original-order' ]; 10394 // create from registered layout modes 10395 for ( var name in LayoutMode.modes ) { 10396 this._initLayoutMode( name ); 10397 } 10398 }; 10399 10400 proto.reloadItems = function() { 10401 // reset item ID counter 10402 this.itemGUID = 0; 10403 // call super 10404 Outlayer.prototype.reloadItems.call( this ); 10405 }; 10406 10407 proto._itemize = function() { 10408 var items = Outlayer.prototype._itemize.apply( this, arguments ); 10409 // assign ID for original-order 10410 for ( var i=0; i < items.length; i++ ) { 10411 var item = items[i]; 10412 item.id = this.itemGUID++; 10413 } 10414 this._updateItemsSortData( items ); 10415 return items; 10416 }; 10417 10418 10419 // -------------------------- layout -------------------------- // 10420 10421 proto._initLayoutMode = function( name ) { 10422 var Mode = LayoutMode.modes[ name ]; 10423 // set mode options 10424 // HACK extend initial options, back-fill in default options 10425 var initialOpts = this.options[ name ] || {}; 10426 this.options[ name ] = Mode.options ? 10427 utils.extend( Mode.options, initialOpts ) : initialOpts; 10428 // init layout mode instance 10429 this.modes[ name ] = new Mode( this ); 10430 }; 10431 10432 10433 proto.layout = function() { 10434 // if first time doing layout, do all magic 10435 if ( !this._isLayoutInited && this._getOption('initLayout') ) { 10436 this.arrange(); 10437 return; 10438 } 10439 this._layout(); 10440 }; 10441 10442 // private method to be used in layout() & magic() 10443 proto._layout = function() { 10444 // don't animate first layout 10445 var isInstant = this._getIsInstant(); 10446 // layout flow 10447 this._resetLayout(); 10448 this._manageStamps(); 10449 this.layoutItems( this.filteredItems, isInstant ); 10450 10451 // flag for initalized 10452 this._isLayoutInited = true; 10453 }; 10454 10455 // filter + sort + layout 10456 proto.arrange = function( opts ) { 10457 // set any options pass 10458 this.option( opts ); 10459 this._getIsInstant(); 10460 // filter, sort, and layout 10461 10462 // filter 10463 var filtered = this._filter( this.items ); 10464 this.filteredItems = filtered.matches; 10465 10466 this._bindArrangeComplete(); 10467 10468 if ( this._isInstant ) { 10469 this._noTransition( this._hideReveal, [ filtered ] ); 10470 } else { 10471 this._hideReveal( filtered ); 10472 } 10473 10474 this._sort(); 10475 this._layout(); 10476 }; 10477 // alias to _init for main plugin method 10478 proto._init = proto.arrange; 10479 10480 proto._hideReveal = function( filtered ) { 10481 this.reveal( filtered.needReveal ); 10482 this.hide( filtered.needHide ); 10483 }; 10484 10485 // HACK 10486 // Don't animate/transition first layout 10487 // Or don't animate/transition other layouts 10488 proto._getIsInstant = function() { 10489 var isLayoutInstant = this._getOption('layoutInstant'); 10490 var isInstant = isLayoutInstant !== undefined ? isLayoutInstant : 10491 !this._isLayoutInited; 10492 this._isInstant = isInstant; 10493 return isInstant; 10494 }; 10495 10496 // listen for layoutComplete, hideComplete and revealComplete 10497 // to trigger arrangeComplete 10498 proto._bindArrangeComplete = function() { 10499 // listen for 3 events to trigger arrangeComplete 10500 var isLayoutComplete, isHideComplete, isRevealComplete; 10501 var _this = this; 10502 function arrangeParallelCallback() { 10503 if ( isLayoutComplete && isHideComplete && isRevealComplete ) { 10504 _this.dispatchEvent( 'arrangeComplete', null, [ _this.filteredItems ] ); 10505 } 10506 } 10507 this.once( 'layoutComplete', function() { 10508 isLayoutComplete = true; 10509 arrangeParallelCallback(); 10510 }); 10511 this.once( 'hideComplete', function() { 10512 isHideComplete = true; 10513 arrangeParallelCallback(); 10514 }); 10515 this.once( 'revealComplete', function() { 10516 isRevealComplete = true; 10517 arrangeParallelCallback(); 10518 }); 10519 }; 10520 10521 // -------------------------- filter -------------------------- // 10522 10523 proto._filter = function( items ) { 10524 var filter = this.options.filter; 10525 filter = filter || '*'; 10526 var matches = []; 10527 var hiddenMatched = []; 10528 var visibleUnmatched = []; 10529 10530 var test = this._getFilterTest( filter ); 10531 10532 // test each item 10533 for ( var i=0; i < items.length; i++ ) { 10534 var item = items[i]; 10535 if ( item.isIgnored ) { 10536 continue; 10537 } 10538 // add item to either matched or unmatched group 10539 var isMatched = test( item ); 10540 // item.isFilterMatched = isMatched; 10541 // add to matches if its a match 10542 if ( isMatched ) { 10543 matches.push( item ); 10544 } 10545 // add to additional group if item needs to be hidden or revealed 10546 if ( isMatched && item.isHidden ) { 10547 hiddenMatched.push( item ); 10548 } else if ( !isMatched && !item.isHidden ) { 10549 visibleUnmatched.push( item ); 10550 } 10551 } 10552 10553 // return collections of items to be manipulated 10554 return { 10555 matches: matches, 10556 needReveal: hiddenMatched, 10557 needHide: visibleUnmatched 10558 }; 10559 }; 10560 10561 // get a jQuery, function, or a matchesSelector test given the filter 10562 proto._getFilterTest = function( filter ) { 10563 if ( jQuery && this.options.isJQueryFiltering ) { 10564 // use jQuery 10565 return function( item ) { 10566 return jQuery( item.element ).is( filter ); 10567 }; 10568 } 10569 if ( typeof filter == 'function' ) { 10570 // use filter as function 10571 return function( item ) { 10572 return filter( item.element ); 10573 }; 10574 } 10575 // default, use filter as selector string 10576 return function( item ) { 10577 return matchesSelector( item.element, filter ); 10578 }; 10579 }; 10580 10581 // -------------------------- sorting -------------------------- // 10582 10583 /** 10584 * @params {Array} elems 10585 * @public 10586 */ 10587 proto.updateSortData = function( elems ) { 10588 // get items 10589 var items; 10590 if ( elems ) { 10591 elems = utils.makeArray( elems ); 10592 items = this.getItems( elems ); 10593 } else { 10594 // update all items if no elems provided 10595 items = this.items; 10596 } 10597 10598 this._getSorters(); 10599 this._updateItemsSortData( items ); 10600 }; 10601 10602 proto._getSorters = function() { 10603 var getSortData = this.options.getSortData; 10604 for ( var key in getSortData ) { 10605 var sorter = getSortData[ key ]; 10606 this._sorters[ key ] = mungeSorter( sorter ); 10607 } 10608 }; 10609 10610 /** 10611 * @params {Array} items - of Isotope.Items 10612 * @private 10613 */ 10614 proto._updateItemsSortData = function( items ) { 10615 // do not update if no items 10616 var len = items && items.length; 10617 10618 for ( var i=0; len && i < len; i++ ) { 10619 var item = items[i]; 10620 item.updateSortData(); 10621 } 10622 }; 10623 10624 // ----- munge sorter ----- // 10625 10626 // encapsulate this, as we just need mungeSorter 10627 // other functions in here are just for munging 10628 var mungeSorter = ( function() { 10629 // add a magic layer to sorters for convienent shorthands 10630 // `.foo-bar` will use the text of .foo-bar querySelector 10631 // `[foo-bar]` will use attribute 10632 // you can also add parser 10633 // `.foo-bar parseInt` will parse that as a number 10634 function mungeSorter( sorter ) { 10635 // if not a string, return function or whatever it is 10636 if ( typeof sorter != 'string' ) { 10637 return sorter; 10638 } 10639 // parse the sorter string 10640 var args = trim( sorter ).split(' '); 10641 var query = args[0]; 10642 // check if query looks like [an-attribute] 10643 var attrMatch = query.match( /^\[(.+)\]$/ ); 10644 var attr = attrMatch && attrMatch[1]; 10645 var getValue = getValueGetter( attr, query ); 10646 // use second argument as a parser 10647 var parser = Isotope.sortDataParsers[ args[1] ]; 10648 // parse the value, if there was a parser 10649 sorter = parser ? function( elem ) { 10650 return elem && parser( getValue( elem ) ); 10651 } : 10652 // otherwise just return value 10653 function( elem ) { 10654 return elem && getValue( elem ); 10655 }; 10656 10657 return sorter; 10658 } 10659 10660 // get an attribute getter, or get text of the querySelector 10661 function getValueGetter( attr, query ) { 10662 // if query looks like [foo-bar], get attribute 10663 if ( attr ) { 10664 return function getAttribute( elem ) { 10665 return elem.getAttribute( attr ); 10666 }; 10667 } 10668 10669 // otherwise, assume its a querySelector, and get its text 10670 return function getChildText( elem ) { 10671 var child = elem.querySelector( query ); 10672 return child && child.textContent; 10673 }; 10674 } 10675 10676 return mungeSorter; 10677 })(); 10678 10679 // parsers used in getSortData shortcut strings 10680 Isotope.sortDataParsers = { 10681 'parseInt': function( val ) { 10682 return parseInt( val, 10 ); 10683 }, 10684 'parseFloat': function( val ) { 10685 return parseFloat( val ); 10686 } 10687 }; 10688 10689 // ----- sort method ----- // 10690 10691 // sort filteredItem order 10692 proto._sort = function() { 10693 if ( !this.options.sortBy ) { 10694 return; 10695 } 10696 // keep track of sortBy History 10697 var sortBys = utils.makeArray( this.options.sortBy ); 10698 if ( !this._getIsSameSortBy( sortBys ) ) { 10699 // concat all sortBy and sortHistory, add to front, oldest goes in last 10700 this.sortHistory = sortBys.concat( this.sortHistory ); 10701 } 10702 // sort magic 10703 var itemSorter = getItemSorter( this.sortHistory, this.options.sortAscending ); 10704 this.filteredItems.sort( itemSorter ); 10705 }; 10706 10707 // check if sortBys is same as start of sortHistory 10708 proto._getIsSameSortBy = function( sortBys ) { 10709 for ( var i=0; i < sortBys.length; i++ ) { 10710 if ( sortBys[i] != this.sortHistory[i] ) { 10711 return false; 10712 } 10713 } 10714 return true; 10715 }; 10716 10717 // returns a function used for sorting 10718 function getItemSorter( sortBys, sortAsc ) { 10719 return function sorter( itemA, itemB ) { 10720 // cycle through all sortKeys 10721 for ( var i = 0; i < sortBys.length; i++ ) { 10722 var sortBy = sortBys[i]; 10723 var a = itemA.sortData[ sortBy ]; 10724 var b = itemB.sortData[ sortBy ]; 10725 if ( a > b || a < b ) { 10726 // if sortAsc is an object, use the value given the sortBy key 10727 var isAscending = sortAsc[ sortBy ] !== undefined ? sortAsc[ sortBy ] : sortAsc; 10728 var direction = isAscending ? 1 : -1; 10729 return ( a > b ? 1 : -1 ) * direction; 10730 } 10731 } 10732 return 0; 10733 }; 10734 } 10735 10736 // -------------------------- methods -------------------------- // 10737 10738 // get layout mode 10739 proto._mode = function() { 10740 var layoutMode = this.options.layoutMode; 10741 var mode = this.modes[ layoutMode ]; 10742 if ( !mode ) { 10743 // TODO console.error 10744 throw new Error( 'No layout mode: ' + layoutMode ); 10745 } 10746 // HACK sync mode's options 10747 // any options set after init for layout mode need to be synced 10748 mode.options = this.options[ layoutMode ]; 10749 return mode; 10750 }; 10751 10752 proto._resetLayout = function() { 10753 // trigger original reset layout 10754 Outlayer.prototype._resetLayout.call( this ); 10755 this._mode()._resetLayout(); 10756 }; 10757 10758 proto._getItemLayoutPosition = function( item ) { 10759 return this._mode()._getItemLayoutPosition( item ); 10760 }; 10761 10762 proto._manageStamp = function( stamp ) { 10763 this._mode()._manageStamp( stamp ); 10764 }; 10765 10766 proto._getContainerSize = function() { 10767 return this._mode()._getContainerSize(); 10768 }; 10769 10770 proto.needsResizeLayout = function() { 10771 return this._mode().needsResizeLayout(); 10772 }; 10773 10774 // -------------------------- adding & removing -------------------------- // 10775 10776 // HEADS UP overwrites default Outlayer appended 10777 proto.appended = function( elems ) { 10778 var items = this.addItems( elems ); 10779 if ( !items.length ) { 10780 return; 10781 } 10782 // filter, layout, reveal new items 10783 var filteredItems = this._filterRevealAdded( items ); 10784 // add to filteredItems 10785 this.filteredItems = this.filteredItems.concat( filteredItems ); 10786 }; 10787 10788 // HEADS UP overwrites default Outlayer prepended 10789 proto.prepended = function( elems ) { 10790 var items = this._itemize( elems ); 10791 if ( !items.length ) { 10792 return; 10793 } 10794 // start new layout 10795 this._resetLayout(); 10796 this._manageStamps(); 10797 // filter, layout, reveal new items 10798 var filteredItems = this._filterRevealAdded( items ); 10799 // layout previous items 10800 this.layoutItems( this.filteredItems ); 10801 // add to items and filteredItems 10802 this.filteredItems = filteredItems.concat( this.filteredItems ); 10803 this.items = items.concat( this.items ); 10804 }; 10805 10806 proto._filterRevealAdded = function( items ) { 10807 var filtered = this._filter( items ); 10808 this.hide( filtered.needHide ); 10809 // reveal all new items 10810 this.reveal( filtered.matches ); 10811 // layout new items, no transition 10812 this.layoutItems( filtered.matches, true ); 10813 return filtered.matches; 10814 }; 10815 10816 /** 10817 * Filter, sort, and layout newly-appended item elements 10818 * @param {Array or NodeList or Element} elems 10819 */ 10820 proto.insert = function( elems ) { 10821 var items = this.addItems( elems ); 10822 if ( !items.length ) { 10823 return; 10824 } 10825 // append item elements 10826 var i, item; 10827 var len = items.length; 10828 for ( i=0; i < len; i++ ) { 10829 item = items[i]; 10830 this.element.appendChild( item.element ); 10831 } 10832 // filter new stuff 10833 var filteredInsertItems = this._filter( items ).matches; 10834 // set flag 10835 for ( i=0; i < len; i++ ) { 10836 items[i].isLayoutInstant = true; 10837 } 10838 this.arrange(); 10839 // reset flag 10840 for ( i=0; i < len; i++ ) { 10841 delete items[i].isLayoutInstant; 10842 } 10843 this.reveal( filteredInsertItems ); 10844 }; 10845 10846 var _remove = proto.remove; 10847 proto.remove = function( elems ) { 10848 elems = utils.makeArray( elems ); 10849 var removeItems = this.getItems( elems ); 10850 // do regular thing 10851 _remove.call( this, elems ); 10852 // bail if no items to remove 10853 var len = removeItems && removeItems.length; 10854 // remove elems from filteredItems 10855 for ( var i=0; len && i < len; i++ ) { 10856 var item = removeItems[i]; 10857 // remove item from collection 10858 utils.removeFrom( this.filteredItems, item ); 10859 } 10860 }; 10861 10862 proto.shuffle = function() { 10863 // update random sortData 10864 for ( var i=0; i < this.items.length; i++ ) { 10865 var item = this.items[i]; 10866 item.sortData.random = Math.random(); 10867 } 10868 this.options.sortBy = 'random'; 10869 this._sort(); 10870 this._layout(); 10871 }; 10872 10873 /** 10874 * trigger fn without transition 10875 * kind of hacky to have this in the first place 10876 * @param {Function} fn 10877 * @param {Array} args 10878 * @returns ret 10879 * @private 10880 */ 10881 proto._noTransition = function( fn, args ) { 10882 // save transitionDuration before disabling 10883 var transitionDuration = this.options.transitionDuration; 10884 // disable transition 10885 this.options.transitionDuration = 0; 10886 // do it 10887 var returnValue = fn.apply( this, args ); 10888 // re-enable transition for reveal 10889 this.options.transitionDuration = transitionDuration; 10890 return returnValue; 10891 }; 10892 10893 // ----- helper methods ----- // 10894 10895 /** 10896 * getter method for getting filtered item elements 10897 * @returns {Array} elems - collection of item elements 10898 */ 10899 proto.getFilteredItemElements = function() { 10900 return this.filteredItems.map( function( item ) { 10901 return item.element; 10902 }); 10903 }; 10904 10905 // ----- ----- // 10906 10907 return Isotope; 10908 10909})); 10910
vendor: 8,474 bytes, lines 10911-11255
10911},{"./item":33,"./layout-mode":34,"./layout-modes/fit-rows":35,"./layout-modes/masonry":36,"./layout-modes/vertical":37,"desandro-matches-selector":27,"fizzy-ui-utils":30,"get-size":31,"outlayer":41}],33:[function(require,module,exports){ 10912/** 10913 * Isotope Item 10914**/ 10915 10916( function( window, factory ) { 10917 // universal module definition 10918 /* jshint strict: false */ /*globals define, module, require */ 10919 if ( typeof define == 'function' && define.amd ) { 10920 // AMD 10921 define( [ 10922 'outlayer/outlayer' 10923 ], 10924 factory ); 10925 } else if ( typeof module == 'object' && module.exports ) { 10926 // CommonJS 10927 module.exports = factory( 10928 require('outlayer') 10929 ); 10930 } else { 10931 // browser global 10932 window.Isotope = window.Isotope || {}; 10933 window.Isotope.Item = factory( 10934 window.Outlayer 10935 ); 10936 } 10937 10938}( window, function factory( Outlayer ) { 10939'use strict'; 10940 10941// -------------------------- Item -------------------------- // 10942 10943// sub-class Outlayer Item 10944function Item() { 10945 Outlayer.Item.apply( this, arguments ); 10946} 10947 10948var proto = Item.prototype = Object.create( Outlayer.Item.prototype ); 10949 10950var _create = proto._create; 10951proto._create = function() { 10952 // assign id, used for original-order sorting 10953 this.id = this.layout.itemGUID++; 10954 _create.call( this ); 10955 this.sortData = {}; 10956}; 10957 10958proto.updateSortData = function() { 10959 if ( this.isIgnored ) { 10960 return; 10961 } 10962 // default sorters 10963 this.sortData.id = this.id; 10964 // for backward compatibility 10965 this.sortData['original-order'] = this.id; 10966 this.sortData.random = Math.random(); 10967 // go thru getSortData obj and apply the sorters 10968 var getSortData = this.layout.options.getSortData; 10969 var sorters = this.layout._sorters; 10970 for ( var key in getSortData ) { 10971 var sorter = sorters[ key ]; 10972 this.sortData[ key ] = sorter( this.element, this ); 10973 } 10974}; 10975 10976var _destroy = proto.destroy; 10977proto.destroy = function() { 10978 // call super 10979 _destroy.apply( this, arguments ); 10980 // reset display, #741 10981 this.css({ 10982 display: '' 10983 }); 10984}; 10985 10986return Item; 10987 10988})); 10989 10990},{"outlayer":41}],34:[function(require,module,exports){ 10991/** 10992 * Isotope LayoutMode 10993 */ 10994 10995( function( window, factory ) { 10996 // universal module definition 10997 /* jshint strict: false */ /*globals define, module, require */ 10998 if ( typeof define == 'function' && define.amd ) { 10999 // AMD 11000 define( [ 11001 'get-size/get-size', 11002 'outlayer/outlayer' 11003 ], 11004 factory ); 11005 } else if ( typeof module == 'object' && module.exports ) { 11006 // CommonJS 11007 module.exports = factory( 11008 require('get-size'), 11009 require('outlayer') 11010 ); 11011 } else { 11012 // browser global 11013 window.Isotope = window.Isotope || {}; 11014 window.Isotope.LayoutMode = factory( 11015 window.getSize, 11016 window.Outlayer 11017 ); 11018 } 11019 11020}( window, function factory( getSize, Outlayer ) { 11021 'use strict'; 11022 11023 // layout mode class 11024 function LayoutMode( isotope ) { 11025 this.isotope = isotope; 11026 // link properties 11027 if ( isotope ) { 11028 this.options = isotope.options[ this.namespace ]; 11029 this.element = isotope.element; 11030 this.items = isotope.filteredItems; 11031 this.size = isotope.size; 11032 } 11033 } 11034 11035 var proto = LayoutMode.prototype; 11036 11037 /** 11038 * some methods should just defer to default Outlayer method 11039 * and reference the Isotope instance as `this` 11040 **/ 11041 var facadeMethods = [ 11042 '_resetLayout', 11043 '_getItemLayoutPosition', 11044 '_manageStamp', 11045 '_getContainerSize', 11046 '_getElementOffset', 11047 'needsResizeLayout', 11048 '_getOption' 11049 ]; 11050 11051 facadeMethods.forEach( function( methodName ) { 11052 proto[ methodName ] = function() { 11053 return Outlayer.prototype[ methodName ].apply( this.isotope, arguments ); 11054 }; 11055 }); 11056 11057 // ----- ----- // 11058 11059 // for horizontal layout modes, check vertical size 11060 proto.needsVerticalResizeLayout = function() { 11061 // don't trigger if size did not change 11062 var size = getSize( this.isotope.element ); 11063 // check that this.size and size are there 11064 // IE8 triggers resize on body size change, so they might not be 11065 var hasSizes = this.isotope.size && size; 11066 return hasSizes && size.innerHeight != this.isotope.size.innerHeight; 11067 }; 11068 11069 // ----- measurements ----- // 11070 11071 proto._getMeasurement = function() { 11072 this.isotope._getMeasurement.apply( this, arguments ); 11073 }; 11074 11075 proto.getColumnWidth = function() { 11076 this.getSegmentSize( 'column', 'Width' ); 11077 }; 11078 11079 proto.getRowHeight = function() { 11080 this.getSegmentSize( 'row', 'Height' ); 11081 }; 11082 11083 /** 11084 * get columnWidth or rowHeight 11085 * segment: 'column' or 'row' 11086 * size 'Width' or 'Height' 11087 **/ 11088 proto.getSegmentSize = function( segment, size ) { 11089 var segmentName = segment + size; 11090 var outerSize = 'outer' + size; 11091 // columnWidth / outerWidth // rowHeight / outerHeight 11092 this._getMeasurement( segmentName, outerSize ); 11093 // got rowHeight or columnWidth, we can chill 11094 if ( this[ segmentName ] ) { 11095 return; 11096 } 11097 // fall back to item of first element 11098 var firstItemSize = this.getFirstItemSize(); 11099 this[ segmentName ] = firstItemSize && firstItemSize[ outerSize ] || 11100 // or size of container 11101 this.isotope.size[ 'inner' + size ]; 11102 }; 11103 11104 proto.getFirstItemSize = function() { 11105 var firstItem = this.isotope.filteredItems[0]; 11106 return firstItem && firstItem.element && getSize( firstItem.element ); 11107 }; 11108 11109 // ----- methods that should reference isotope ----- // 11110 11111 proto.layout = function() { 11112 this.isotope.layout.apply( this.isotope, arguments ); 11113 }; 11114 11115 proto.getSize = function() { 11116 this.isotope.getSize(); 11117 this.size = this.isotope.size; 11118 }; 11119 11120 // -------------------------- create -------------------------- // 11121 11122 LayoutMode.modes = {}; 11123 11124 LayoutMode.create = function( namespace, options ) { 11125 11126 function Mode() { 11127 LayoutMode.apply( this, arguments ); 11128 } 11129 11130 Mode.prototype = Object.create( proto ); 11131 Mode.prototype.constructor = Mode; 11132 11133 // default options 11134 if ( options ) { 11135 Mode.options = options; 11136 } 11137 11138 Mode.prototype.namespace = namespace; 11139 // register in Isotope 11140 LayoutMode.modes[ namespace ] = Mode; 11141 11142 return Mode; 11143 }; 11144 11145 return LayoutMode; 11146 11147})); 11148 11149},{"get-size":31,"outlayer":41}],35:[function(require,module,exports){ 11150/** 11151 * fitRows layout mode 11152 */ 11153 11154( function( window, factory ) { 11155 // universal module definition 11156 /* jshint strict: false */ /*globals define, module, require */ 11157 if ( typeof define == 'function' && define.amd ) { 11158 // AMD 11159 define( [ 11160 '../layout-mode' 11161 ], 11162 factory ); 11163 } else if ( typeof exports == 'object' ) { 11164 // CommonJS 11165 module.exports = factory( 11166 require('../layout-mode') 11167 ); 11168 } else { 11169 // browser global 11170 factory( 11171 window.Isotope.LayoutMode 11172 ); 11173 } 11174 11175}( window, function factory( LayoutMode ) { 11176'use strict'; 11177 11178var FitRows = LayoutMode.create('fitRows'); 11179 11180var proto = FitRows.prototype; 11181 11182proto._resetLayout = function() { 11183 this.x = 0; 11184 this.y = 0; 11185 this.maxY = 0; 11186 this._getMeasurement( 'gutter', 'outerWidth' ); 11187}; 11188 11189proto._getItemLayoutPosition = function( item ) { 11190 item.getSize(); 11191 11192 var itemWidth = item.size.outerWidth + this.gutter; 11193 // if this element cannot fit in the current row 11194 var containerWidth = this.isotope.size.innerWidth + this.gutter; 11195 if ( this.x !== 0 && itemWidth + this.x > containerWidth ) { 11196 this.x = 0; 11197 this.y = this.maxY; 11198 } 11199 11200 var position = { 11201 x: this.x, 11202 y: this.y 11203 }; 11204 11205 this.maxY = Math.max( this.maxY, this.y + item.size.outerHeight ); 11206 this.x += itemWidth; 11207 11208 return position; 11209}; 11210 11211proto._getContainerSize = function() { 11212 return { height: this.maxY }; 11213}; 11214 11215return FitRows; 11216 11217})); 11218 11219},{"../layout-mode":34}],36:[function(require,module,exports){ 11220/*! 11221 * Masonry layout mode 11222 * sub-classes Masonry 11223 * https://masonry.desandro.com 11224 */ 11225 11226( function( window, factory ) { 11227 // universal module definition 11228 /* jshint strict: false */ /*globals define, module, require */ 11229 if ( typeof define == 'function' && define.amd ) { 11230 // AMD 11231 define( [ 11232 '../layout-mode', 11233 'masonry-layout/masonry' 11234 ], 11235 factory ); 11236 } else if ( typeof module == 'object' && module.exports ) { 11237 // CommonJS 11238 module.exports = factory( 11239 require('../layout-mode'), 11240 require('masonry-layout') 11241 ); 11242 } else { 11243 // browser global 11244 factory( 11245 window.Isotope.LayoutMode, 11246 window.Masonry 11247 ); 11248 } 11249 11250}( window, function factory( LayoutMode, Masonry ) { 11251'use strict'; 11252 11253// -------------------------- masonryDefinition -------------------------- // 11254 11255 // create an Outlayer layout class
11256 var MasonryMode = LayoutMode.create('masonry'); 11257 11258 var proto = MasonryMode.prototype; 11259 11260 var keepModeMethods = { 11261 _getElementOffset: true, 11262 layout: true, 11263 _getMeasurement: true 11264 }; 11265 11266 // inherit Masonry prototype 11267 for ( var method in Masonry.prototype ) { 11268 // do not inherit mode methods 11269 if ( !keepModeMethods[ method ] ) { 11270 proto[ method ] = Masonry.prototype[ method ]; 11271 } 11272 } 11273 11274 var measureColumns = proto.measureColumns; 11275 proto.measureColumns = function() { 11276 // set items, used if measuring first item 11277 this.items = this.isotope.filteredItems; 11278 measureColumns.call( this ); 11279 }; 11280 11281 // point to mode options for fitWidth 11282 var _getOption = proto._getOption; 11283 proto._getOption = function( option ) { 11284 if ( option == 'fitWidth' ) { 11285 return this.options.isFitWidth !== undefined ? 11286 this.options.isFitWidth : this.options.fitWidth; 11287 } 11288 return _getOption.apply( this.isotope, arguments ); 11289 }; 11290 11291 return MasonryMode; 11292 11293})); 11294 11295},{"../layout-mode":34,"masonry-layout":39}],37:[function(require,module,exports){ 11296/** 11297 * vertical layout mode 11298 */ 11299 11300( function( window, factory ) { 11301 // universal module definition 11302 /* jshint strict: false */ /*globals define, module, require */ 11303 if ( typeof define == 'function' && define.amd ) { 11304 // AMD 11305 define( [ 11306 '../layout-mode' 11307 ], 11308 factory ); 11309 } else if ( typeof module == 'object' && module.exports ) { 11310 // CommonJS 11311 module.exports = factory( 11312 require('../layout-mode') 11313 ); 11314 } else { 11315 // browser global 11316 factory( 11317 window.Isotope.LayoutMode 11318 ); 11319 } 11320 11321}( window, function factory( LayoutMode ) { 11322'use strict'; 11323 11324var Vertical = LayoutMode.create( 'vertical', { 11325 horizontalAlignment: 0 11326}); 11327 11328var proto = Vertical.prototype; 11329 11330proto._resetLayout = function() { 11331 this.y = 0; 11332}; 11333 11334proto._getItemLayoutPosition = function( item ) { 11335 item.getSize(); 11336 var x = ( this.isotope.size.innerWidth - item.size.outerWidth ) * 11337 this.options.horizontalAlignment; 11338 var y = this.y; 11339 this.y += item.size.outerHeight; 11340 return { x: x, y: y }; 11341}; 11342 11343proto._getContainerSize = function() { 11344 return { height: this.y }; 11345}; 11346 11347return Vertical; 11348 11349})); 11350 11351},{"../layout-mode":34}],38:[function(require,module,exports){ 11352/*! 11353 * jQuery JavaScript Library v3.6.1 11354 * https://jquery.com/ 11355 * 11356 * Includes Sizzle.js 11357 * https://sizzlejs.com/ 11358 * 11359 * Copyright OpenJS Foundation and other contributors 11360 * Released under the MIT license 11361 * https://jquery.org/license 11362 * 11363 * Date: 2022-08-26T17:52Z 11364 */ 11365( function( global, factory ) { 11366 11367 "use strict"; 11368 11369 if ( typeof module === "object" && typeof module.exports === "object" ) { 11370 11371 // For CommonJS and CommonJS-like environments where a proper `window` 11372 // is present, execute the factory and get jQuery. 11373 // For environments that do not have a `window` with a `document` 11374 // (such as Node.js), expose a factory as module.exports. 11375 // This accentuates the need for the creation of a real `window`. 11376 // e.g. var jQuery = require("jquery")(window); 11377 // See ticket trac-14549 for more info. 11378 module.exports = global.document ? 11379 factory( global, true ) : 11380 function( w ) { 11381 if ( !w.document ) { 11382 throw new Error( "jQuery requires a window with a document" ); 11383 } 11384 return factory( w ); 11385 }; 11386 } else { 11387 factory( global ); 11388 } 11389 11390// Pass this if window is not defined yet 11391} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { 11392 11393// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 11394// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode 11395// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common 11396// enough that all such attempts are guarded in a try block. 11397"use strict"; 11398 11399var arr = []; 11400 11401var getProto = Object.getPrototypeOf; 11402 11403var slice = arr.slice; 11404 11405var flat = arr.flat ? function( array ) { 11406 return arr.flat.call( array ); 11407} : function( array ) { 11408 return arr.concat.apply( [], array ); 11409}; 11410 11411 11412var push = arr.push; 11413 11414var indexOf = arr.indexOf; 11415 11416var class2type = {}; 11417 11418var toString = class2type.toString; 11419 11420var hasOwn = class2type.hasOwnProperty; 11421 11422var fnToString = hasOwn.toString; 11423 11424var ObjectFunctionString = fnToString.call( Object ); 11425 11426var support = {}; 11427 11428var isFunction = function isFunction( obj ) { 11429
vendor: 9,428 bytes, lines 11430-11820
11430 // Support: Chrome <=57, Firefox <=52 11431 // In some browsers, typeof returns "function" for HTML <object> elements 11432 // (i.e., `typeof document.createElement( "object" ) === "function"`). 11433 // We don't want to classify *any* DOM node as a function. 11434 // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 11435 // Plus for old WebKit, typeof returns "function" for HTML collections 11436 // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) 11437 return typeof obj === "function" && typeof obj.nodeType !== "number" && 11438 typeof obj.item !== "function"; 11439 }; 11440 11441 11442var isWindow = function isWindow( obj ) { 11443 return obj != null && obj === obj.window; 11444 }; 11445 11446 11447var document = window.document; 11448 11449 11450 11451 var preservedScriptAttributes = { 11452 type: true, 11453 src: true, 11454 nonce: true, 11455 noModule: true 11456 }; 11457 11458 function DOMEval( code, node, doc ) { 11459 doc = doc || document; 11460 11461 var i, val, 11462 script = doc.createElement( "script" ); 11463 11464 script.text = code; 11465 if ( node ) { 11466 for ( i in preservedScriptAttributes ) { 11467 11468 // Support: Firefox 64+, Edge 18+ 11469 // Some browsers don't support the "nonce" property on scripts. 11470 // On the other hand, just using `getAttribute` is not enough as 11471 // the `nonce` attribute is reset to an empty string whenever it 11472 // becomes browsing-context connected. 11473 // See https://github.com/whatwg/html/issues/2369 11474 // See https://html.spec.whatwg.org/#nonce-attributes 11475 // The `node.getAttribute` check was added for the sake of 11476 // `jQuery.globalEval` so that it can fake a nonce-containing node 11477 // via an object. 11478 val = node[ i ] || node.getAttribute && node.getAttribute( i ); 11479 if ( val ) { 11480 script.setAttribute( i, val ); 11481 } 11482 } 11483 } 11484 doc.head.appendChild( script ).parentNode.removeChild( script ); 11485 } 11486 11487 11488function toType( obj ) { 11489 if ( obj == null ) { 11490 return obj + ""; 11491 } 11492 11493 // Support: Android <=2.3 only (functionish RegExp) 11494 return typeof obj === "object" || typeof obj === "function" ? 11495 class2type[ toString.call( obj ) ] || "object" : 11496 typeof obj; 11497} 11498/* global Symbol */ 11499// Defining this global in .eslintrc.json would create a danger of using the global 11500// unguarded in another place, it seems safer to define global only for this module 11501 11502 11503 11504var 11505 version = "3.6.1", 11506 11507 // Define a local copy of jQuery 11508 jQuery = function( selector, context ) { 11509 11510 // The jQuery object is actually just the init constructor 'enhanced' 11511 // Need init if jQuery is called (just allow error to be thrown if not included) 11512 return new jQuery.fn.init( selector, context ); 11513 }; 11514 11515jQuery.fn = jQuery.prototype = { 11516 11517 // The current version of jQuery being used 11518 jquery: version, 11519 11520 constructor: jQuery, 11521 11522 // The default length of a jQuery object is 0 11523 length: 0, 11524 11525 toArray: function() { 11526 return slice.call( this ); 11527 }, 11528 11529 // Get the Nth element in the matched element set OR 11530 // Get the whole matched element set as a clean array 11531 get: function( num ) { 11532 11533 // Return all the elements in a clean array 11534 if ( num == null ) { 11535 return slice.call( this ); 11536 } 11537 11538 // Return just the one element from the set 11539 return num < 0 ? this[ num + this.length ] : this[ num ]; 11540 }, 11541 11542 // Take an array of elements and push it onto the stack 11543 // (returning the new matched element set) 11544 pushStack: function( elems ) { 11545 11546 // Build a new jQuery matched element set 11547 var ret = jQuery.merge( this.constructor(), elems ); 11548 11549 // Add the old object onto the stack (as a reference) 11550 ret.prevObject = this; 11551 11552 // Return the newly-formed element set 11553 return ret; 11554 }, 11555 11556 // Execute a callback for every element in the matched set. 11557 each: function( callback ) { 11558 return jQuery.each( this, callback ); 11559 }, 11560 11561 map: function( callback ) { 11562 return this.pushStack( jQuery.map( this, function( elem, i ) { 11563 return callback.call( elem, i, elem ); 11564 } ) ); 11565 }, 11566 11567 slice: function() { 11568 return this.pushStack( slice.apply( this, arguments ) ); 11569 }, 11570 11571 first: function() { 11572 return this.eq( 0 ); 11573 }, 11574 11575 last: function() { 11576 return this.eq( -1 ); 11577 }, 11578 11579 even: function() { 11580 return this.pushStack( jQuery.grep( this, function( _elem, i ) { 11581 return ( i + 1 ) % 2; 11582 } ) ); 11583 }, 11584 11585 odd: function() { 11586 return this.pushStack( jQuery.grep( this, function( _elem, i ) { 11587 return i % 2; 11588 } ) ); 11589 }, 11590 11591 eq: function( i ) { 11592 var len = this.length, 11593 j = +i + ( i < 0 ? len : 0 ); 11594 return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); 11595 }, 11596 11597 end: function() { 11598 return this.prevObject || this.constructor(); 11599 }, 11600 11601 // For internal use only. 11602 // Behaves like an Array's method, not like a jQuery method. 11603 push: push, 11604 sort: arr.sort, 11605 splice: arr.splice 11606}; 11607 11608jQuery.extend = jQuery.fn.extend = function() { 11609 var options, name, src, copy, copyIsArray, clone, 11610 target = arguments[ 0 ] || {}, 11611 i = 1, 11612 length = arguments.length, 11613 deep = false; 11614 11615 // Handle a deep copy situation 11616 if ( typeof target === "boolean" ) { 11617 deep = target; 11618 11619 // Skip the boolean and the target 11620 target = arguments[ i ] || {}; 11621 i++; 11622 } 11623 11624 // Handle case when target is a string or something (possible in deep copy) 11625 if ( typeof target !== "object" && !isFunction( target ) ) { 11626 target = {}; 11627 } 11628 11629 // Extend jQuery itself if only one argument is passed 11630 if ( i === length ) { 11631 target = this; 11632 i--; 11633 } 11634 11635 for ( ; i < length; i++ ) { 11636 11637 // Only deal with non-null/undefined values 11638 if ( ( options = arguments[ i ] ) != null ) { 11639 11640 // Extend the base object 11641 for ( name in options ) { 11642 copy = options[ name ]; 11643 11644 // Prevent Object.prototype pollution 11645 // Prevent never-ending loop 11646 if ( name === "__proto__" || target === copy ) { 11647 continue; 11648 } 11649 11650 // Recurse if we're merging plain objects or arrays 11651 if ( deep && copy && ( jQuery.isPlainObject( copy ) || 11652 ( copyIsArray = Array.isArray( copy ) ) ) ) { 11653 src = target[ name ]; 11654 11655 // Ensure proper type for the source value 11656 if ( copyIsArray && !Array.isArray( src ) ) { 11657 clone = []; 11658 } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { 11659 clone = {}; 11660 } else { 11661 clone = src; 11662 } 11663 copyIsArray = false; 11664 11665 // Never move original objects, clone them 11666 target[ name ] = jQuery.extend( deep, clone, copy ); 11667 11668 // Don't bring in undefined values 11669 } else if ( copy !== undefined ) { 11670 target[ name ] = copy; 11671 } 11672 } 11673 } 11674 } 11675 11676 // Return the modified object 11677 return target; 11678}; 11679 11680jQuery.extend( { 11681 11682 // Unique for each copy of jQuery on the page 11683 expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), 11684 11685 // Assume jQuery is ready without the ready module 11686 isReady: true, 11687 11688 error: function( msg ) { 11689 throw new Error( msg ); 11690 }, 11691 11692 noop: function() {}, 11693 11694 isPlainObject: function( obj ) { 11695 var proto, Ctor; 11696 11697 // Detect obvious negatives 11698 // Use toString instead of jQuery.type to catch host objects 11699 if ( !obj || toString.call( obj ) !== "[object Object]" ) { 11700 return false; 11701 } 11702 11703 proto = getProto( obj ); 11704 11705 // Objects with no prototype (e.g., `Object.create( null )`) are plain 11706 if ( !proto ) { 11707 return true; 11708 } 11709 11710 // Objects with prototype are plain iff they were constructed by a global Object function 11711 Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; 11712 return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; 11713 }, 11714 11715 isEmptyObject: function( obj ) { 11716 var name; 11717 11718 for ( name in obj ) { 11719 return false; 11720 } 11721 return true; 11722 }, 11723 11724 // Evaluates a script in a provided context; falls back to the global one 11725 // if not specified. 11726 globalEval: function( code, options, doc ) { 11727 DOMEval( code, { nonce: options && options.nonce }, doc ); 11728 }, 11729 11730 each: function( obj, callback ) { 11731 var length, i = 0; 11732 11733 if ( isArrayLike( obj ) ) { 11734 length = obj.length; 11735 for ( ; i < length; i++ ) { 11736 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 11737 break; 11738 } 11739 } 11740 } else { 11741 for ( i in obj ) { 11742 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 11743 break; 11744 } 11745 } 11746 } 11747 11748 return obj; 11749 }, 11750 11751 // results is for internal usage only 11752 makeArray: function( arr, results ) { 11753 var ret = results || []; 11754 11755 if ( arr != null ) { 11756 if ( isArrayLike( Object( arr ) ) ) { 11757 jQuery.merge( ret, 11758 typeof arr === "string" ? 11759 [ arr ] : arr 11760 ); 11761 } else { 11762 push.call( ret, arr ); 11763 } 11764 } 11765 11766 return ret; 11767 }, 11768 11769 inArray: function( elem, arr, i ) { 11770 return arr == null ? -1 : indexOf.call( arr, elem, i ); 11771 }, 11772 11773 // Support: Android <=4.0 only, PhantomJS 1 only 11774 // push.apply(_, arraylike) throws on ancient WebKit 11775 merge: function( first, second ) { 11776 var len = +second.length, 11777 j = 0, 11778 i = first.length; 11779 11780 for ( ; j < len; j++ ) { 11781 first[ i++ ] = second[ j ]; 11782 } 11783 11784 first.length = i; 11785 11786 return first; 11787 }, 11788 11789 grep: function( elems, callback, invert ) { 11790 var callbackInverse, 11791 matches = [], 11792 i = 0, 11793 length = elems.length, 11794 callbackExpect = !invert; 11795 11796 // Go through the array, only saving the items 11797 // that pass the validator function 11798 for ( ; i < length; i++ ) { 11799 callbackInverse = !callback( elems[ i ], i ); 11800 if ( callbackInverse !== callbackExpect ) { 11801 matches.push( elems[ i ] ); 11802 } 11803 } 11804 11805 return matches; 11806 }, 11807 11808 // arg is for internal usage only 11809 map: function( elems, callback, arg ) { 11810 var length, value, 11811 i = 0, 11812 ret = []; 11813 11814 // Go through the array, translating each of the items to their new values 11815 if ( isArrayLike( elems ) ) { 11816 length = elems.length; 11817 for ( ; i < length; i++ ) { 11818 value = callback( elems[ i ], i, arg ); 11819 11820 if ( value != null ) {
vendor: 4,201 bytes, lines 11821-11988
11821 ret.push( value ); 11822 } 11823 } 11824 11825 // Go through every key on the object, 11826 } else { 11827 for ( i in elems ) { 11828 value = callback( elems[ i ], i, arg ); 11829 11830 if ( value != null ) { 11831 ret.push( value ); 11832 } 11833 } 11834 } 11835 11836 // Flatten any nested arrays 11837 return flat( ret ); 11838 }, 11839 11840 // A global GUID counter for objects 11841 guid: 1, 11842 11843 // jQuery.support is not used in Core but other projects attach their 11844 // properties to it so it needs to exist. 11845 support: support 11846} ); 11847 11848if ( typeof Symbol === "function" ) { 11849 jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; 11850} 11851 11852// Populate the class2type map 11853jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), 11854 function( _i, name ) { 11855 class2type[ "[object " + name + "]" ] = name.toLowerCase(); 11856 } ); 11857 11858function isArrayLike( obj ) { 11859 11860 // Support: real iOS 8.2 only (not reproducible in simulator) 11861 // `in` check used to prevent JIT error (gh-2145) 11862 // hasOwn isn't used here due to false negatives 11863 // regarding Nodelist length in IE 11864 var length = !!obj && "length" in obj && obj.length, 11865 type = toType( obj ); 11866 11867 if ( isFunction( obj ) || isWindow( obj ) ) { 11868 return false; 11869 } 11870 11871 return type === "array" || length === 0 || 11872 typeof length === "number" && length > 0 && ( length - 1 ) in obj; 11873} 11874var Sizzle = 11875/*! 11876 * Sizzle CSS Selector Engine v2.3.6 11877 * https://sizzlejs.com/ 11878 * 11879 * Copyright JS Foundation and other contributors 11880 * Released under the MIT license 11881 * https://js.foundation/ 11882 * 11883 * Date: 2021-02-16 11884 */ 11885( function( window ) { 11886var i, 11887 support, 11888 Expr, 11889 getText, 11890 isXML, 11891 tokenize, 11892 compile, 11893 select, 11894 outermostContext, 11895 sortInput, 11896 hasDuplicate, 11897 11898 // Local document vars 11899 setDocument, 11900 document, 11901 docElem, 11902 documentIsHTML, 11903 rbuggyQSA, 11904 rbuggyMatches, 11905 matches, 11906 contains, 11907 11908 // Instance-specific data 11909 expando = "sizzle" + 1 * new Date(), 11910 preferredDoc = window.document, 11911 dirruns = 0, 11912 done = 0, 11913 classCache = createCache(), 11914 tokenCache = createCache(), 11915 compilerCache = createCache(), 11916 nonnativeSelectorCache = createCache(), 11917 sortOrder = function( a, b ) { 11918 if ( a === b ) { 11919 hasDuplicate = true; 11920 } 11921 return 0; 11922 }, 11923 11924 // Instance methods 11925 hasOwn = ( {} ).hasOwnProperty, 11926 arr = [], 11927 pop = arr.pop, 11928 pushNative = arr.push, 11929 push = arr.push, 11930 slice = arr.slice, 11931 11932 // Use a stripped-down indexOf as it's faster than native 11933 // https://jsperf.com/thor-indexof-vs-for/5 11934 indexOf = function( list, elem ) { 11935 var i = 0, 11936 len = list.length; 11937 for ( ; i < len; i++ ) { 11938 if ( list[ i ] === elem ) { 11939 return i; 11940 } 11941 } 11942 return -1; 11943 }, 11944 11945 booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + 11946 "ismap|loop|multiple|open|readonly|required|scoped", 11947 11948 // Regular expressions 11949 11950 // http://www.w3.org/TR/css3-selectors/#whitespace 11951 whitespace = "[\\x20\\t\\r\\n\\f]", 11952 11953 // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram 11954 identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + 11955 "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", 11956 11957 // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors 11958 attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + 11959 11960 // Operator (capture 2) 11961 "*([*^$|!~]?=)" + whitespace + 11962 11963 // "Attribute values must be CSS identifiers [capture 5] 11964 // or strings [capture 3 or capture 4]" 11965 "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + 11966 whitespace + "*\\]", 11967 11968 pseudos = ":(" + identifier + ")(?:\\((" + 11969 11970 // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: 11971 // 1. quoted (capture 3; capture 4 or capture 5) 11972 "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + 11973 11974 // 2. simple (capture 6) 11975 "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + 11976 11977 // 3. anything else (capture 2) 11978 ".*" + 11979 ")\\)|)", 11980 11981 // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter 11982 rwhitespace = new RegExp( whitespace + "+", "g" ), 11983 rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + 11984 whitespace + "+$", "g" ), 11985 11986 rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), 11987 rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + 11988 "*" ),
vendor: 4,651 bytes, lines 11989-12143
11989 rdescend = new RegExp( whitespace + "|>" ), 11990 11991 rpseudo = new RegExp( pseudos ), 11992 ridentifier = new RegExp( "^" + identifier + "$" ), 11993 11994 matchExpr = { 11995 "ID": new RegExp( "^#(" + identifier + ")" ), 11996 "CLASS": new RegExp( "^\\.(" + identifier + ")" ), 11997 "TAG": new RegExp( "^(" + identifier + "|[*])" ), 11998 "ATTR": new RegExp( "^" + attributes ), 11999 "PSEUDO": new RegExp( "^" + pseudos ), 12000 "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + 12001 whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + 12002 whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), 12003 "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), 12004 12005 // For use in libraries implementing .is() 12006 // We use this for POS matching in `select` 12007 "needsContext": new RegExp( "^" + whitespace + 12008 "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + 12009 "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) 12010 }, 12011 12012 rhtml = /HTML$/i, 12013 rinputs = /^(?:input|select|textarea|button)$/i, 12014 rheader = /^h\d$/i, 12015 12016 rnative = /^[^{]+\{\s*\[native \w/, 12017 12018 // Easily-parseable/retrievable ID or TAG or CLASS selectors 12019 rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, 12020 12021 rsibling = /[+~]/, 12022 12023 // CSS escapes 12024 // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters 12025 runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), 12026 funescape = function( escape, nonHex ) { 12027 var high = "0x" + escape.slice( 1 ) - 0x10000; 12028 12029 return nonHex ? 12030 12031 // Strip the backslash prefix from a non-hex escape sequence 12032 nonHex : 12033 12034 // Replace a hexadecimal escape sequence with the encoded Unicode code point 12035 // Support: IE <=11+ 12036 // For values outside the Basic Multilingual Plane (BMP), manually construct a 12037 // surrogate pair 12038 high < 0 ? 12039 String.fromCharCode( high + 0x10000 ) : 12040 String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); 12041 }, 12042 12043 // CSS string/identifier serialization 12044 // https://drafts.csswg.org/cssom/#common-serializing-idioms 12045 rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, 12046 fcssescape = function( ch, asCodePoint ) { 12047 if ( asCodePoint ) { 12048 12049 // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER 12050 if ( ch === "\0" ) { 12051 return "\uFFFD"; 12052 } 12053 12054 // Control characters and (dependent upon position) numbers get escaped as code points 12055 return ch.slice( 0, -1 ) + "\\" + 12056 ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; 12057 } 12058 12059 // Other potentially-special ASCII characters get backslash-escaped 12060 return "\\" + ch; 12061 }, 12062 12063 // Used for iframes 12064 // See setDocument() 12065 // Removing the function wrapper causes a "Permission Denied" 12066 // error in IE 12067 unloadHandler = function() { 12068 setDocument(); 12069 }, 12070 12071 inDisabledFieldset = addCombinator( 12072 function( elem ) { 12073 return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; 12074 }, 12075 { dir: "parentNode", next: "legend" } 12076 ); 12077 12078// Optimize for push.apply( _, NodeList ) 12079try { 12080 push.apply( 12081 ( arr = slice.call( preferredDoc.childNodes ) ), 12082 preferredDoc.childNodes 12083 ); 12084 12085 // Support: Android<4.0 12086 // Detect silently failing push.apply 12087 // eslint-disable-next-line no-unused-expressions 12088 arr[ preferredDoc.childNodes.length ].nodeType; 12089} catch ( e ) { 12090 push = { apply: arr.length ? 12091 12092 // Leverage slice if possible 12093 function( target, els ) { 12094 pushNative.apply( target, slice.call( els ) ); 12095 } : 12096 12097 // Support: IE<9 12098 // Otherwise append directly 12099 function( target, els ) { 12100 var j = target.length, 12101 i = 0; 12102 12103 // Can't trust NodeList.length 12104 while ( ( target[ j++ ] = els[ i++ ] ) ) {} 12105 target.length = j - 1; 12106 } 12107 }; 12108} 12109 12110function Sizzle( selector, context, results, seed ) { 12111 var m, i, elem, nid, match, groups, newSelector, 12112 newContext = context && context.ownerDocument, 12113 12114 // nodeType defaults to 9, since context defaults to document 12115 nodeType = context ? context.nodeType : 9; 12116 12117 results = results || []; 12118 12119 // Return early from calls with invalid selector or context 12120 if ( typeof selector !== "string" || !selector || 12121 nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { 12122 12123 return results; 12124 } 12125 12126 // Try to shortcut find operations (as opposed to filters) in HTML documents 12127 if ( !seed ) { 12128 setDocument( context ); 12129 context = context || document; 12130 12131 if ( documentIsHTML ) { 12132 12133 // If the selector is sufficiently simple, try using a "get*By*" DOM method 12134 // (excepting DocumentFragment context, where the methods don't exist) 12135 if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { 12136 12137 // ID selector 12138 if ( ( m = match[ 1 ] ) ) { 12139 12140 // Document context 12141 if ( nodeType === 9 ) { 12142 if ( ( elem = context.getElementById( m ) ) ) { 12143
12144 // Support: IE, Opera, Webkit 12145 // TODO: identify versions 12146 // getElementById can match elements by name instead of ID 12147 if ( elem.id === m ) { 12148 results.push( elem ); 12149 return results; 12150 } 12151 } else { 12152 return results; 12153 } 12154 12155 // Element context 12156 } else { 12157 12158 // Support: IE, Opera, Webkit 12159 // TODO: identify versions 12160 // getElementById can match elements by name instead of ID 12161 if ( newContext && ( elem = newContext.getElementById( m ) ) && 12162 contains( context, elem ) && 12163 elem.id === m ) { 12164 12165 results.push( elem ); 12166 return results; 12167 } 12168 } 12169 12170 // Type selector 12171 } else if ( match[ 2 ] ) { 12172 push.apply( results, context.getElementsByTagName( selector ) ); 12173 return results; 12174 12175 // Class selector 12176 } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && 12177 context.getElementsByClassName ) { 12178 12179 push.apply( results, context.getElementsByClassName( m ) ); 12180 return results; 12181 } 12182 } 12183 12184 // Take advantage of querySelectorAll 12185 if ( support.qsa && 12186 !nonnativeSelectorCache[ selector + " " ] && 12187 ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && 12188 12189 // Support: IE 8 only 12190 // Exclude object elements 12191 ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { 12192 12193 newSelector = selector; 12194 newContext = context; 12195 12196 // qSA considers elements outside a scoping root when evaluating child or 12197 // descendant combinators, which is not what we want. 12198 // In such cases, we work around the behavior by prefixing every selector in the 12199 // list with an ID selector referencing the scope context. 12200 // The technique has to be used as well when a leading combinator is used 12201 // as such selectors are not recognized by querySelectorAll. 12202 // Thanks to Andrew Dupont for this technique. 12203 if ( nodeType === 1 && 12204 ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { 12205 12206 // Expand context for sibling selectors 12207 newContext = rsibling.test( selector ) && testContext( context.parentNode ) || 12208 context; 12209 12210 // We can use :scope instead of the ID hack if the browser 12211 // supports it & if we're not changing the context. 12212 if ( newContext !== context || !support.scope ) { 12213 12214 // Capture the context ID, setting it first if necessary 12215 if ( ( nid = context.getAttribute( "id" ) ) ) { 12216 nid = nid.replace( rcssescape, fcssescape ); 12217 } else { 12218 context.setAttribute( "id", ( nid = expando ) ); 12219 } 12220 } 12221 12222 // Prefix every selector in the list 12223 groups = tokenize( selector ); 12224 i = groups.length; 12225 while ( i-- ) { 12226 groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + 12227 toSelector( groups[ i ] ); 12228 } 12229 newSelector = groups.join( "," ); 12230 } 12231 12232 try { 12233 push.apply( results, 12234 newContext.querySelectorAll( newSelector ) 12235 ); 12236 return results; 12237 } catch ( qsaError ) { 12238 nonnativeSelectorCache( selector, true ); 12239 } finally { 12240 if ( nid === expando ) { 12241 context.removeAttribute( "id" ); 12242 } 12243 } 12244 } 12245 } 12246 } 12247 12248 // All others 12249 return select( selector.replace( rtrim, "$1" ), context, results, seed ); 12250} 12251 12252/** 12253 * Create key-value caches of limited size 12254 * @returns {function(string, object)} Returns the Object data after storing it on itself with 12255 * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) 12256 * deleting the oldest entry 12257 */ 12258function createCache() { 12259 var keys = []; 12260 12261 function cache( key, value ) { 12262 12263 // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) 12264 if ( keys.push( key + " " ) > Expr.cacheLength ) { 12265 12266 // Only keep the most recent entries 12267 delete cache[ keys.shift() ]; 12268 } 12269 return ( cache[ key + " " ] = value ); 12270 } 12271 return cache; 12272} 12273 12274/** 12275 * Mark a function for special use by Sizzle 12276 * @param {Function} fn The function to mark 12277 */ 12278function markFunction( fn ) { 12279 fn[ expando ] = true; 12280 return fn; 12281} 12282 12283/** 12284 * Support testing using an element 12285 * @param {Function} fn Passed the created element and returns a boolean result 12286 */ 12287function assert( fn ) { 12288 var el = document.createElement( "fieldset" ); 12289 12290 try { 12291 return !!fn( el ); 12292 } catch ( e ) { 12293 return false;
vendor: 4,247 bytes, lines 12294-12449
12294 } finally { 12295 12296 // Remove from its parent by default 12297 if ( el.parentNode ) { 12298 el.parentNode.removeChild( el ); 12299 } 12300 12301 // release memory in IE 12302 el = null; 12303 } 12304} 12305 12306/** 12307 * Adds the same handler for all of the specified attrs 12308 * @param {String} attrs Pipe-separated list of attributes 12309 * @param {Function} handler The method that will be applied 12310 */ 12311function addHandle( attrs, handler ) { 12312 var arr = attrs.split( "|" ), 12313 i = arr.length; 12314 12315 while ( i-- ) { 12316 Expr.attrHandle[ arr[ i ] ] = handler; 12317 } 12318} 12319 12320/** 12321 * Checks document order of two siblings 12322 * @param {Element} a 12323 * @param {Element} b 12324 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b 12325 */ 12326function siblingCheck( a, b ) { 12327 var cur = b && a, 12328 diff = cur && a.nodeType === 1 && b.nodeType === 1 && 12329 a.sourceIndex - b.sourceIndex; 12330 12331 // Use IE sourceIndex if available on both nodes 12332 if ( diff ) { 12333 return diff; 12334 } 12335 12336 // Check if b follows a 12337 if ( cur ) { 12338 while ( ( cur = cur.nextSibling ) ) { 12339 if ( cur === b ) { 12340 return -1; 12341 } 12342 } 12343 } 12344 12345 return a ? 1 : -1; 12346} 12347 12348/** 12349 * Returns a function to use in pseudos for input types 12350 * @param {String} type 12351 */ 12352function createInputPseudo( type ) { 12353 return function( elem ) { 12354 var name = elem.nodeName.toLowerCase(); 12355 return name === "input" && elem.type === type; 12356 }; 12357} 12358 12359/** 12360 * Returns a function to use in pseudos for buttons 12361 * @param {String} type 12362 */ 12363function createButtonPseudo( type ) { 12364 return function( elem ) { 12365 var name = elem.nodeName.toLowerCase(); 12366 return ( name === "input" || name === "button" ) && elem.type === type; 12367 }; 12368} 12369 12370/** 12371 * Returns a function to use in pseudos for :enabled/:disabled 12372 * @param {Boolean} disabled true for :disabled; false for :enabled 12373 */ 12374function createDisabledPseudo( disabled ) { 12375 12376 // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable 12377 return function( elem ) { 12378 12379 // Only certain elements can match :enabled or :disabled 12380 // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled 12381 // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled 12382 if ( "form" in elem ) { 12383 12384 // Check for inherited disabledness on relevant non-disabled elements: 12385 // * listed form-associated elements in a disabled fieldset 12386 // https://html.spec.whatwg.org/multipage/forms.html#category-listed 12387 // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled 12388 // * option elements in a disabled optgroup 12389 // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled 12390 // All such elements have a "form" property. 12391 if ( elem.parentNode && elem.disabled === false ) { 12392 12393 // Option elements defer to a parent optgroup if present 12394 if ( "label" in elem ) { 12395 if ( "label" in elem.parentNode ) { 12396 return elem.parentNode.disabled === disabled; 12397 } else { 12398 return elem.disabled === disabled; 12399 } 12400 } 12401 12402 // Support: IE 6 - 11 12403 // Use the isDisabled shortcut property to check for disabled fieldset ancestors 12404 return elem.isDisabled === disabled || 12405 12406 // Where there is no isDisabled, check manually 12407 /* jshint -W018 */ 12408 elem.isDisabled !== !disabled && 12409 inDisabledFieldset( elem ) === disabled; 12410 } 12411 12412 return elem.disabled === disabled; 12413 12414 // Try to winnow out elements that can't be disabled before trusting the disabled property. 12415 // Some victims get caught in our net (label, legend, menu, track), but it shouldn't 12416 // even exist on them, let alone have a boolean value. 12417 } else if ( "label" in elem ) { 12418 return elem.disabled === disabled; 12419 } 12420 12421 // Remaining elements are neither :enabled nor :disabled 12422 return false; 12423 }; 12424} 12425 12426/** 12427 * Returns a function to use in pseudos for positionals 12428 * @param {Function} fn 12429 */ 12430function createPositionalPseudo( fn ) { 12431 return markFunction( function( argument ) { 12432 argument = +argument; 12433 return markFunction( function( seed, matches ) { 12434 var j, 12435 matchIndexes = fn( [], seed.length, argument ), 12436 i = matchIndexes.length; 12437 12438 // Match elements found at the specified indexes 12439 while ( i-- ) { 12440 if ( seed[ ( j = matchIndexes[ i ] ) ] ) { 12441 seed[ j ] = !( matches[ j ] = seed[ j ] ); 12442 } 12443 } 12444 } ); 12445 } ); 12446} 12447 12448/** 12449 * Checks a node for validity as a Sizzle context
12450 * @param {Element|Object=} context 12451 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value 12452 */ 12453function testContext( context ) { 12454 return context && typeof context.getElementsByTagName !== "undefined" && context; 12455} 12456 12457// Expose support vars for convenience 12458support = Sizzle.support = {}; 12459 12460/** 12461 * Detects XML nodes 12462 * @param {Element|Object} elem An element or a document 12463 * @returns {Boolean} True iff elem is a non-HTML XML node 12464 */ 12465isXML = Sizzle.isXML = function( elem ) { 12466 var namespace = elem && elem.namespaceURI, 12467 docElem = elem && ( elem.ownerDocument || elem ).documentElement; 12468 12469 // Support: IE <=8 12470 // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes 12471 // https://bugs.jquery.com/ticket/4833 12472 return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); 12473}; 12474 12475/** 12476 * Sets document-related variables once based on the current document 12477 * @param {Element|Object} [doc] An element or document object to use to set the document 12478 * @returns {Object} Returns the current document 12479 */ 12480setDocument = Sizzle.setDocument = function( node ) { 12481 var hasCompare, subWindow, 12482 doc = node ? node.ownerDocument || node : preferredDoc; 12483 12484 // Return early if doc is invalid or already selected 12485 // Support: IE 11+, Edge 17 - 18+ 12486 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 12487 // two documents; shallow comparisons work. 12488 // eslint-disable-next-line eqeqeq 12489 if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { 12490 return document; 12491 } 12492 12493 // Update global variables 12494 document = doc; 12495 docElem = document.documentElement; 12496 documentIsHTML = !isXML( document ); 12497 12498 // Support: IE 9 - 11+, Edge 12 - 18+ 12499 // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) 12500 // Support: IE 11+, Edge 17 - 18+ 12501 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 12502 // two documents; shallow comparisons work. 12503 // eslint-disable-next-line eqeqeq 12504 if ( preferredDoc != document && 12505 ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { 12506 12507 // Support: IE 11, Edge 12508 if ( subWindow.addEventListener ) { 12509 subWindow.addEventListener( "unload", unloadHandler, false ); 12510 12511 // Support: IE 9 - 10 only 12512 } else if ( subWindow.attachEvent ) { 12513 subWindow.attachEvent( "onunload", unloadHandler ); 12514 } 12515 } 12516 12517 // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, 12518 // Safari 4 - 5 only, Opera <=11.6 - 12.x only 12519 // IE/Edge & older browsers don't support the :scope pseudo-class. 12520 // Support: Safari 6.0 only 12521 // Safari 6.0 supports :scope but it's an alias of :root there. 12522 support.scope = assert( function( el ) { 12523 docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); 12524 return typeof el.querySelectorAll !== "undefined" && 12525 !el.querySelectorAll( ":scope fieldset div" ).length; 12526 } ); 12527 12528 /* Attributes 12529 ---------------------------------------------------------------------- */ 12530 12531 // Support: IE<8 12532 // Verify that getAttribute really returns attributes and not properties 12533 // (excepting IE8 booleans) 12534 support.attributes = assert( function( el ) { 12535 el.className = "i"; 12536 return !el.getAttribute( "className" ); 12537 } ); 12538 12539 /* getElement(s)By* 12540 ---------------------------------------------------------------------- */ 12541 12542 // Check if getElementsByTagName("*") returns only elements 12543 support.getElementsByTagName = assert( function( el ) { 12544 el.appendChild( document.createComment( "" ) ); 12545 return !el.getElementsByTagName( "*" ).length; 12546 } ); 12547 12548 // Support: IE<9 12549 support.getElementsByClassName = rnative.test( document.getElementsByClassName ); 12550 12551 // Support: IE<10 12552 // Check if getElementById returns elements by name 12553 // The broken getElementById methods don't pick up programmatically-set names, 12554 // so use a roundabout getElementsByName test 12555 support.getById = assert( function( el ) { 12556 docElem.appendChild( el ).id = expando; 12557 return !document.getElementsByName || !document.getElementsByName( expando ).length; 12558 } ); 12559 12560 // ID filter and find 12561 if ( support.getById ) { 12562 Expr.filter[ "ID" ] = function( id ) { 12563 var attrId = id.replace( runescape, funescape ); 12564 return function( elem ) { 12565 return elem.getAttribute( "id" ) === attrId; 12566 }; 12567 }; 12568 Expr.find[ "ID" ] = function( id, context ) { 12569 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { 12570 var elem = context.getElementById( id ); 12571 return elem ? [ elem ] : []; 12572 } 12573 }; 12574 } else { 12575 Expr.filter[ "ID" ] = function( id ) { 12576 var attrId = id.replace( runescape, funescape ); 12577 return function( elem ) { 12578 var node = typeof elem.getAttributeNode !== "undefined" && 12579 elem.getAttributeNode( "id" ); 12580 return node && node.value === attrId; 12581 }; 12582 }; 12583
vendor: 4,196 bytes, lines 12584-12715
12584 // Support: IE 6 - 7 only 12585 // getElementById is not reliable as a find shortcut 12586 Expr.find[ "ID" ] = function( id, context ) { 12587 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { 12588 var node, i, elems, 12589 elem = context.getElementById( id ); 12590 12591 if ( elem ) { 12592 12593 // Verify the id attribute 12594 node = elem.getAttributeNode( "id" ); 12595 if ( node && node.value === id ) { 12596 return [ elem ]; 12597 } 12598 12599 // Fall back on getElementsByName 12600 elems = context.getElementsByName( id ); 12601 i = 0; 12602 while ( ( elem = elems[ i++ ] ) ) { 12603 node = elem.getAttributeNode( "id" ); 12604 if ( node && node.value === id ) { 12605 return [ elem ]; 12606 } 12607 } 12608 } 12609 12610 return []; 12611 } 12612 }; 12613 } 12614 12615 // Tag 12616 Expr.find[ "TAG" ] = support.getElementsByTagName ? 12617 function( tag, context ) { 12618 if ( typeof context.getElementsByTagName !== "undefined" ) { 12619 return context.getElementsByTagName( tag ); 12620 12621 // DocumentFragment nodes don't have gEBTN 12622 } else if ( support.qsa ) { 12623 return context.querySelectorAll( tag ); 12624 } 12625 } : 12626 12627 function( tag, context ) { 12628 var elem, 12629 tmp = [], 12630 i = 0, 12631 12632 // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too 12633 results = context.getElementsByTagName( tag ); 12634 12635 // Filter out possible comments 12636 if ( tag === "*" ) { 12637 while ( ( elem = results[ i++ ] ) ) { 12638 if ( elem.nodeType === 1 ) { 12639 tmp.push( elem ); 12640 } 12641 } 12642 12643 return tmp; 12644 } 12645 return results; 12646 }; 12647 12648 // Class 12649 Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { 12650 if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { 12651 return context.getElementsByClassName( className ); 12652 } 12653 }; 12654 12655 /* QSA/matchesSelector 12656 ---------------------------------------------------------------------- */ 12657 12658 // QSA and matchesSelector support 12659 12660 // matchesSelector(:active) reports false when true (IE9/Opera 11.5) 12661 rbuggyMatches = []; 12662 12663 // qSa(:focus) reports false when true (Chrome 21) 12664 // We allow this because of a bug in IE8/9 that throws an error 12665 // whenever `document.activeElement` is accessed on an iframe 12666 // So, we allow :focus to pass through QSA all the time to avoid the IE error 12667 // See https://bugs.jquery.com/ticket/13378 12668 rbuggyQSA = []; 12669 12670 if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { 12671 12672 // Build QSA regex 12673 // Regex strategy adopted from Diego Perini 12674 assert( function( el ) { 12675 12676 var input; 12677 12678 // Select is set to empty string on purpose 12679 // This is to test IE's treatment of not explicitly 12680 // setting a boolean content attribute, 12681 // since its presence should be enough 12682 // https://bugs.jquery.com/ticket/12359 12683 docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" + 12684 "<select id='" + expando + "-\r\\' msallowcapture=''>" + 12685 "<option selected=''></option></select>"; 12686 12687 // Support: IE8, Opera 11-12.16 12688 // Nothing should be selected when empty strings follow ^= or $= or *= 12689 // The test attribute must be unknown in Opera but "safe" for WinRT 12690 // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section 12691 if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { 12692 rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); 12693 } 12694 12695 // Support: IE8 12696 // Boolean attributes and "value" are not treated correctly 12697 if ( !el.querySelectorAll( "[selected]" ).length ) { 12698 rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); 12699 } 12700 12701 // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ 12702 if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { 12703 rbuggyQSA.push( "~=" ); 12704 } 12705 12706 // Support: IE 11+, Edge 15 - 18+ 12707 // IE 11/Edge don't find elements on a `[name='']` query in some cases. 12708 // Adding a temporary attribute to the document before the selection works 12709 // around the issue. 12710 // Interestingly, IE 10 & older don't seem to have the issue. 12711 input = document.createElement( "input" ); 12712 input.setAttribute( "name", "" ); 12713 el.appendChild( input ); 12714 if ( !el.querySelectorAll( "[name='']" ).length ) { 12715 rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*="
vendor: 4,065 bytes, lines 12715-12844
12715+ 12716 whitespace + "*(?:''|\"\")" ); 12717 } 12718 12719 // Webkit/Opera - :checked should return selected option elements 12720 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 12721 // IE8 throws error here and will not see later tests 12722 if ( !el.querySelectorAll( ":checked" ).length ) { 12723 rbuggyQSA.push( ":checked" ); 12724 } 12725 12726 // Support: Safari 8+, iOS 8+ 12727 // https://bugs.webkit.org/show_bug.cgi?id=136851 12728 // In-page `selector#id sibling-combinator selector` fails 12729 if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { 12730 rbuggyQSA.push( ".#.+[+~]" ); 12731 } 12732 12733 // Support: Firefox <=3.6 - 5 only 12734 // Old Firefox doesn't throw on a badly-escaped identifier. 12735 el.querySelectorAll( "\\\f" ); 12736 rbuggyQSA.push( "[\\r\\n\\f]" ); 12737 } ); 12738 12739 assert( function( el ) { 12740 el.innerHTML = "<a href='' disabled='disabled'></a>" + 12741 "<select disabled='disabled'><option/></select>"; 12742 12743 // Support: Windows 8 Native Apps 12744 // The type and name attributes are restricted during .innerHTML assignment 12745 var input = document.createElement( "input" ); 12746 input.setAttribute( "type", "hidden" ); 12747 el.appendChild( input ).setAttribute( "name", "D" ); 12748 12749 // Support: IE8 12750 // Enforce case-sensitivity of name attribute 12751 if ( el.querySelectorAll( "[name=d]" ).length ) { 12752 rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); 12753 } 12754 12755 // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) 12756 // IE8 throws error here and will not see later tests 12757 if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { 12758 rbuggyQSA.push( ":enabled", ":disabled" ); 12759 } 12760 12761 // Support: IE9-11+ 12762 // IE's :disabled selector does not pick up the children of disabled fieldsets 12763 docElem.appendChild( el ).disabled = true; 12764 if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { 12765 rbuggyQSA.push( ":enabled", ":disabled" ); 12766 } 12767 12768 // Support: Opera 10 - 11 only 12769 // Opera 10-11 does not throw on post-comma invalid pseudos 12770 el.querySelectorAll( "*,:x" ); 12771 rbuggyQSA.push( ",.*:" ); 12772 } ); 12773 } 12774 12775 if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || 12776 docElem.webkitMatchesSelector || 12777 docElem.mozMatchesSelector || 12778 docElem.oMatchesSelector || 12779 docElem.msMatchesSelector ) ) ) ) { 12780 12781 assert( function( el ) { 12782 12783 // Check to see if it's possible to do matchesSelector 12784 // on a disconnected node (IE 9) 12785 support.disconnectedMatch = matches.call( el, "*" ); 12786 12787 // This should fail with an exception 12788 // Gecko does not error, returns false instead 12789 matches.call( el, "[s!='']:x" ); 12790 rbuggyMatches.push( "!=", pseudos ); 12791 } ); 12792 } 12793 12794 rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); 12795 rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); 12796 12797 /* Contains 12798 ---------------------------------------------------------------------- */ 12799 hasCompare = rnative.test( docElem.compareDocumentPosition ); 12800 12801 // Element contains another 12802 // Purposefully self-exclusive 12803 // As in, an element does not contain itself 12804 contains = hasCompare || rnative.test( docElem.contains ) ? 12805 function( a, b ) { 12806 var adown = a.nodeType === 9 ? a.documentElement : a, 12807 bup = b && b.parentNode; 12808 return a === bup || !!( bup && bup.nodeType === 1 && ( 12809 adown.contains ? 12810 adown.contains( bup ) : 12811 a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 12812 ) ); 12813 } : 12814 function( a, b ) { 12815 if ( b ) { 12816 while ( ( b = b.parentNode ) ) { 12817 if ( b === a ) { 12818 return true; 12819 } 12820 } 12821 } 12822 return false; 12823 }; 12824 12825 /* Sorting 12826 ---------------------------------------------------------------------- */ 12827 12828 // Document order sorting 12829 sortOrder = hasCompare ? 12830 function( a, b ) { 12831 12832 // Flag for duplicate removal 12833 if ( a === b ) { 12834 hasDuplicate = true; 12835 return 0; 12836 } 12837 12838 // Sort on method existence if only one input has compareDocumentPosition 12839 var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; 12840 if ( compare ) { 12841 return compare; 12842 } 12843 12844 // Calculate position if both inputs belong to the same document
12845 // Support: IE 11+, Edge 17 - 18+ 12846 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 12847 // two documents; shallow comparisons work. 12848 // eslint-disable-next-line eqeqeq 12849 compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? 12850 a.compareDocumentPosition( b ) : 12851 12852 // Otherwise we know they are disconnected 12853 1; 12854 12855 // Disconnected nodes 12856 if ( compare & 1 || 12857 ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { 12858 12859 // Choose the first element that is related to our preferred document 12860 // Support: IE 11+, Edge 17 - 18+ 12861 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 12862 // two documents; shallow comparisons work. 12863 // eslint-disable-next-line eqeqeq 12864 if ( a == document || a.ownerDocument == preferredDoc && 12865 contains( preferredDoc, a ) ) { 12866 return -1; 12867 } 12868 12869 // Support: IE 11+, Edge 17 - 18+ 12870 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 12871 // two documents; shallow comparisons work. 12872 // eslint-disable-next-line eqeqeq 12873 if ( b == document || b.ownerDocument == preferredDoc && 12874 contains( preferredDoc, b ) ) { 12875 return 1; 12876 } 12877 12878 // Maintain original order 12879 return sortInput ? 12880 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 12881 0; 12882 } 12883 12884 return compare & 4 ? -1 : 1; 12885 } : 12886 function( a, b ) { 12887 12888 // Exit early if the nodes are identical 12889 if ( a === b ) { 12890 hasDuplicate = true; 12891 return 0; 12892 } 12893 12894 var cur, 12895 i = 0, 12896 aup = a.parentNode, 12897 bup = b.parentNode, 12898 ap = [ a ], 12899 bp = [ b ]; 12900 12901 // Parentless nodes are either documents or disconnected 12902 if ( !aup || !bup ) { 12903 12904 // Support: IE 11+, Edge 17 - 18+ 12905 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 12906 // two documents; shallow comparisons work. 12907 /* eslint-disable eqeqeq */ 12908 return a == document ? -1 : 12909 b == document ? 1 : 12910 /* eslint-enable eqeqeq */ 12911 aup ? -1 : 12912 bup ? 1 : 12913 sortInput ? 12914 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 12915 0; 12916 12917 // If the nodes are siblings, we can do a quick check 12918 } else if ( aup === bup ) { 12919 return siblingCheck( a, b ); 12920 } 12921 12922 // Otherwise we need full lists of their ancestors for comparison 12923 cur = a; 12924 while ( ( cur = cur.parentNode ) ) { 12925 ap.unshift( cur ); 12926 } 12927 cur = b; 12928 while ( ( cur = cur.parentNode ) ) { 12929 bp.unshift( cur ); 12930 } 12931 12932 // Walk down the tree looking for a discrepancy 12933 while ( ap[ i ] === bp[ i ] ) { 12934 i++; 12935 } 12936 12937 return i ? 12938 12939 // Do a sibling check if the nodes have a common ancestor 12940 siblingCheck( ap[ i ], bp[ i ] ) : 12941 12942 // Otherwise nodes in our document sort first 12943 // Support: IE 11+, Edge 17 - 18+ 12944 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 12945 // two documents; shallow comparisons work. 12946 /* eslint-disable eqeqeq */ 12947 ap[ i ] == preferredDoc ? -1 : 12948 bp[ i ] == preferredDoc ? 1 : 12949 /* eslint-enable eqeqeq */ 12950 0; 12951 }; 12952 12953 return document; 12954}; 12955 12956Sizzle.matches = function( expr, elements ) { 12957 return Sizzle( expr, null, null, elements ); 12958}; 12959 12960Sizzle.matchesSelector = function( elem, expr ) { 12961 setDocument( elem ); 12962 12963 if ( support.matchesSelector && documentIsHTML && 12964 !nonnativeSelectorCache[ expr + " " ] && 12965 ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && 12966 ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { 12967 12968 try { 12969 var ret = matches.call( elem, expr ); 12970 12971 // IE 9's matchesSelector returns false on disconnected nodes 12972 if ( ret || support.disconnectedMatch || 12973 12974 // As well, disconnected nodes are said to be in a document 12975 // fragment in IE 9 12976 elem.document && elem.document.nodeType !== 11 ) { 12977 return ret; 12978 } 12979 } catch ( e ) { 12980 nonnativeSelectorCache( expr, true ); 12981 } 12982 } 12983 12984 return Sizzle( expr, document, null, [ elem ] ).length > 0; 12985}; 12986 12987Sizzle.contains = function( context, elem ) { 12988 12989 // Set document vars if needed 12990 // Support: IE 11+, Edge 17 - 18+ 12991 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 12992 // two documents; shallow comparisons work. 12993 // eslint-disable-next-line eqeqeq 12994 if ( ( context.ownerDocument || context ) != document ) { 12995 setDocument( context ); 12996 } 12997 return contains( context, elem ); 12998}; 12999 13000Sizzle.attr = function( elem, name ) { 13001 13002 // Set document vars if needed
vendor: 16,419 bytes, lines 13003-13595
13003 // Support: IE 11+, Edge 17 - 18+ 13004 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 13005 // two documents; shallow comparisons work. 13006 // eslint-disable-next-line eqeqeq 13007 if ( ( elem.ownerDocument || elem ) != document ) { 13008 setDocument( elem ); 13009 } 13010 13011 var fn = Expr.attrHandle[ name.toLowerCase() ], 13012 13013 // Don't get fooled by Object.prototype properties (jQuery #13807) 13014 val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? 13015 fn( elem, name, !documentIsHTML ) : 13016 undefined; 13017 13018 return val !== undefined ? 13019 val : 13020 support.attributes || !documentIsHTML ? 13021 elem.getAttribute( name ) : 13022 ( val = elem.getAttributeNode( name ) ) && val.specified ? 13023 val.value : 13024 null; 13025}; 13026 13027Sizzle.escape = function( sel ) { 13028 return ( sel + "" ).replace( rcssescape, fcssescape ); 13029}; 13030 13031Sizzle.error = function( msg ) { 13032 throw new Error( "Syntax error, unrecognized expression: " + msg ); 13033}; 13034 13035/** 13036 * Document sorting and removing duplicates 13037 * @param {ArrayLike} results 13038 */ 13039Sizzle.uniqueSort = function( results ) { 13040 var elem, 13041 duplicates = [], 13042 j = 0, 13043 i = 0; 13044 13045 // Unless we *know* we can detect duplicates, assume their presence 13046 hasDuplicate = !support.detectDuplicates; 13047 sortInput = !support.sortStable && results.slice( 0 ); 13048 results.sort( sortOrder ); 13049 13050 if ( hasDuplicate ) { 13051 while ( ( elem = results[ i++ ] ) ) { 13052 if ( elem === results[ i ] ) { 13053 j = duplicates.push( i ); 13054 } 13055 } 13056 while ( j-- ) { 13057 results.splice( duplicates[ j ], 1 ); 13058 } 13059 } 13060 13061 // Clear input after sorting to release objects 13062 // See https://github.com/jquery/sizzle/pull/225 13063 sortInput = null; 13064 13065 return results; 13066}; 13067 13068/** 13069 * Utility function for retrieving the text value of an array of DOM nodes 13070 * @param {Array|Element} elem 13071 */ 13072getText = Sizzle.getText = function( elem ) { 13073 var node, 13074 ret = "", 13075 i = 0, 13076 nodeType = elem.nodeType; 13077 13078 if ( !nodeType ) { 13079 13080 // If no nodeType, this is expected to be an array 13081 while ( ( node = elem[ i++ ] ) ) { 13082 13083 // Do not traverse comment nodes 13084 ret += getText( node ); 13085 } 13086 } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { 13087 13088 // Use textContent for elements 13089 // innerText usage removed for consistency of new lines (jQuery #11153) 13090 if ( typeof elem.textContent === "string" ) { 13091 return elem.textContent; 13092 } else { 13093 13094 // Traverse its children 13095 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 13096 ret += getText( elem ); 13097 } 13098 } 13099 } else if ( nodeType === 3 || nodeType === 4 ) { 13100 return elem.nodeValue; 13101 } 13102 13103 // Do not include comment or processing instruction nodes 13104 13105 return ret; 13106}; 13107 13108Expr = Sizzle.selectors = { 13109 13110 // Can be adjusted by the user 13111 cacheLength: 50, 13112 13113 createPseudo: markFunction, 13114 13115 match: matchExpr, 13116 13117 attrHandle: {}, 13118 13119 find: {}, 13120 13121 relative: { 13122 ">": { dir: "parentNode", first: true }, 13123 " ": { dir: "parentNode" }, 13124 "+": { dir: "previousSibling", first: true }, 13125 "~": { dir: "previousSibling" } 13126 }, 13127 13128 preFilter: { 13129 "ATTR": function( match ) { 13130 match[ 1 ] = match[ 1 ].replace( runescape, funescape ); 13131 13132 // Move the given value to match[3] whether quoted or unquoted 13133 match[ 3 ] = ( match[ 3 ] || match[ 4 ] || 13134 match[ 5 ] || "" ).replace( runescape, funescape ); 13135 13136 if ( match[ 2 ] === "~=" ) { 13137 match[ 3 ] = " " + match[ 3 ] + " "; 13138 } 13139 13140 return match.slice( 0, 4 ); 13141 }, 13142 13143 "CHILD": function( match ) { 13144 13145 /* matches from matchExpr["CHILD"] 13146 1 type (only|nth|...) 13147 2 what (child|of-type) 13148 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 13149 4 xn-component of xn+y argument ([+-]?\d*n|) 13150 5 sign of xn-component 13151 6 x of xn-component 13152 7 sign of y-component 13153 8 y of y-component 13154 */ 13155 match[ 1 ] = match[ 1 ].toLowerCase(); 13156 13157 if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { 13158 13159 // nth-* requires argument 13160 if ( !match[ 3 ] ) { 13161 Sizzle.error( match[ 0 ] ); 13162 } 13163 13164 // numeric x and y parameters for Expr.filter.CHILD 13165 // remember that false/true cast respectively to 0/1 13166 match[ 4 ] = +( match[ 4 ] ? 13167 match[ 5 ] + ( match[ 6 ] || 1 ) : 13168 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); 13169 match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); 13170 13171 // other types prohibit arguments 13172 } else if ( match[ 3 ] ) { 13173 Sizzle.error( match[ 0 ] ); 13174 } 13175 13176 return match; 13177 }, 13178 13179 "PSEUDO": function( match ) { 13180 var excess, 13181 unquoted = !match[ 6 ] && match[ 2 ]; 13182 13183 if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { 13184 return null; 13185 } 13186 13187 // Accept quoted arguments as-is 13188 if ( match[ 3 ] ) { 13189 match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; 13190 13191 // Strip excess characters from unquoted arguments 13192 } else if ( unquoted && rpseudo.test( unquoted ) && 13193 13194 // Get excess from tokenize (recursively) 13195 ( excess = tokenize( unquoted, true ) ) && 13196 13197 // advance to the next closing parenthesis 13198 ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { 13199 13200 // excess is a negative index 13201 match[ 0 ] = match[ 0 ].slice( 0, excess ); 13202 match[ 2 ] = unquoted.slice( 0, excess ); 13203 } 13204 13205 // Return only captures needed by the pseudo filter method (type and argument) 13206 return match.slice( 0, 3 ); 13207 } 13208 }, 13209 13210 filter: { 13211 13212 "TAG": function( nodeNameSelector ) { 13213 var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); 13214 return nodeNameSelector === "*" ? 13215 function() { 13216 return true; 13217 } : 13218 function( elem ) { 13219 return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; 13220 }; 13221 }, 13222 13223 "CLASS": function( className ) { 13224 var pattern = classCache[ className + " " ]; 13225 13226 return pattern || 13227 ( pattern = new RegExp( "(^|" + whitespace + 13228 ")" + className + "(" + whitespace + "|$)" ) ) && classCache( 13229 className, function( elem ) { 13230 return pattern.test( 13231 typeof elem.className === "string" && elem.className || 13232 typeof elem.getAttribute !== "undefined" && 13233 elem.getAttribute( "class" ) || 13234 "" 13235 ); 13236 } ); 13237 }, 13238 13239 "ATTR": function( name, operator, check ) { 13240 return function( elem ) { 13241 var result = Sizzle.attr( elem, name ); 13242 13243 if ( result == null ) { 13244 return operator === "!="; 13245 } 13246 if ( !operator ) { 13247 return true; 13248 } 13249 13250 result += ""; 13251 13252 /* eslint-disable max-len */ 13253 13254 return operator === "=" ? result === check : 13255 operator === "!=" ? result !== check : 13256 operator === "^=" ? check && result.indexOf( check ) === 0 : 13257 operator === "*=" ? check && result.indexOf( check ) > -1 : 13258 operator === "$=" ? check && result.slice( -check.length ) === check : 13259 operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : 13260 operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : 13261 false; 13262 /* eslint-enable max-len */ 13263 13264 }; 13265 }, 13266 13267 "CHILD": function( type, what, _argument, first, last ) { 13268 var simple = type.slice( 0, 3 ) !== "nth", 13269 forward = type.slice( -4 ) !== "last", 13270 ofType = what === "of-type"; 13271 13272 return first === 1 && last === 0 ? 13273 13274 // Shortcut for :nth-*(n) 13275 function( elem ) { 13276 return !!elem.parentNode; 13277 } : 13278 13279 function( elem, _context, xml ) { 13280 var cache, uniqueCache, outerCache, node, nodeIndex, start, 13281 dir = simple !== forward ? "nextSibling" : "previousSibling", 13282 parent = elem.parentNode, 13283 name = ofType && elem.nodeName.toLowerCase(), 13284 useCache = !xml && !ofType, 13285 diff = false; 13286 13287 if ( parent ) { 13288 13289 // :(first|last|only)-(child|of-type) 13290 if ( simple ) { 13291 while ( dir ) { 13292 node = elem; 13293 while ( ( node = node[ dir ] ) ) { 13294 if ( ofType ? 13295 node.nodeName.toLowerCase() === name : 13296 node.nodeType === 1 ) { 13297 13298 return false; 13299 } 13300 } 13301 13302 // Reverse direction for :only-* (if we haven't yet done so) 13303 start = dir = type === "only" && !start && "nextSibling"; 13304 } 13305 return true; 13306 } 13307 13308 start = [ forward ? parent.firstChild : parent.lastChild ]; 13309 13310 // non-xml :nth-child(...) stores cache data on `parent` 13311 if ( forward && useCache ) { 13312 13313 // Seek `elem` from a previously-cached index 13314 13315 // ...in a gzip-friendly way 13316 node = parent; 13317 outerCache = node[ expando ] || ( node[ expando ] = {} ); 13318 13319 // Support: IE <9 only 13320 // Defend against cloned attroperties (jQuery gh-1709) 13321 uniqueCache = outerCache[ node.uniqueID ] || 13322 ( outerCache[ node.uniqueID ] = {} ); 13323 13324 cache = uniqueCache[ type ] || []; 13325 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 13326 diff = nodeIndex && cache[ 2 ]; 13327 node = nodeIndex && parent.childNodes[ nodeIndex ]; 13328 13329 while ( ( node = ++nodeIndex && node && node[ dir ] || 13330 13331 // Fallback to seeking `elem` from the start 13332 ( diff = nodeIndex = 0 ) || start.pop() ) ) { 13333 13334 // When found, cache indexes on `parent` and break 13335 if ( node.nodeType === 1 && ++diff && node === elem ) { 13336 uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; 13337 break; 13338 } 13339 } 13340 13341 } else { 13342 13343 // Use previously-cached element index if available 13344 if ( useCache ) { 13345 13346 // ...in a gzip-friendly way 13347 node = elem; 13348 outerCache = node[ expando ] || ( node[ expando ] = {} ); 13349 13350 // Support: IE <9 only 13351 // Defend against cloned attroperties (jQuery gh-1709) 13352 uniqueCache = outerCache[ node.uniqueID ] || 13353 ( outerCache[ node.uniqueID ] = {} ); 13354 13355 cache = uniqueCache[ type ] || []; 13356 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 13357 diff = nodeIndex; 13358 } 13359 13360 // xml :nth-child(...) 13361 // or :nth-last-child(...) or :nth(-last)?-of-type(...) 13362 if ( diff === false ) { 13363 13364 // Use the same loop as above to seek `elem` from the start 13365 while ( ( node = ++nodeIndex && node && node[ dir ] || 13366 ( diff = nodeIndex = 0 ) || start.pop() ) ) { 13367 13368 if ( ( ofType ? 13369 node.nodeName.toLowerCase() === name : 13370 node.nodeType === 1 ) && 13371 ++diff ) { 13372 13373 // Cache the index of each encountered element 13374 if ( useCache ) { 13375 outerCache = node[ expando ] || 13376 ( node[ expando ] = {} ); 13377 13378 // Support: IE <9 only 13379 // Defend against cloned attroperties (jQuery gh-1709) 13380 uniqueCache = outerCache[ node.uniqueID ] || 13381 ( outerCache[ node.uniqueID ] = {} ); 13382 13383 uniqueCache[ type ] = [ dirruns, diff ]; 13384 } 13385 13386 if ( node === elem ) { 13387 break; 13388 } 13389 } 13390 } 13391 } 13392 } 13393 13394 // Incorporate the offset, then check against cycle size 13395 diff -= last; 13396 return diff === first || ( diff % first === 0 && diff / first >= 0 ); 13397 } 13398 }; 13399 }, 13400 13401 "PSEUDO": function( pseudo, argument ) { 13402 13403 // pseudo-class names are case-insensitive 13404 // http://www.w3.org/TR/selectors/#pseudo-classes 13405 // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters 13406 // Remember that setFilters inherits from pseudos 13407 var args, 13408 fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || 13409 Sizzle.error( "unsupported pseudo: " + pseudo ); 13410 13411 // The user may use createPseudo to indicate that 13412 // arguments are needed to create the filter function 13413 // just as Sizzle does 13414 if ( fn[ expando ] ) { 13415 return fn( argument ); 13416 } 13417 13418 // But maintain support for old signatures 13419 if ( fn.length > 1 ) { 13420 args = [ pseudo, pseudo, "", argument ]; 13421 return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? 13422 markFunction( function( seed, matches ) { 13423 var idx, 13424 matched = fn( seed, argument ), 13425 i = matched.length; 13426 while ( i-- ) { 13427 idx = indexOf( seed, matched[ i ] ); 13428 seed[ idx ] = !( matches[ idx ] = matched[ i ] ); 13429 } 13430 } ) : 13431 function( elem ) { 13432 return fn( elem, 0, args ); 13433 }; 13434 } 13435 13436 return fn; 13437 } 13438 }, 13439 13440 pseudos: { 13441 13442 // Potentially complex pseudos 13443 "not": markFunction( function( selector ) { 13444 13445 // Trim the selector passed to compile 13446 // to avoid treating leading and trailing 13447 // spaces as combinators 13448 var input = [], 13449 results = [], 13450 matcher = compile( selector.replace( rtrim, "$1" ) ); 13451 13452 return matcher[ expando ] ? 13453 markFunction( function( seed, matches, _context, xml ) { 13454 var elem, 13455 unmatched = matcher( seed, null, xml, [] ), 13456 i = seed.length; 13457 13458 // Match elements unmatched by `matcher` 13459 while ( i-- ) { 13460 if ( ( elem = unmatched[ i ] ) ) { 13461 seed[ i ] = !( matches[ i ] = elem ); 13462 } 13463 } 13464 } ) : 13465 function( elem, _context, xml ) { 13466 input[ 0 ] = elem; 13467 matcher( input, null, xml, results ); 13468 13469 // Don't keep the element (issue #299) 13470 input[ 0 ] = null; 13471 return !results.pop(); 13472 }; 13473 } ), 13474 13475 "has": markFunction( function( selector ) { 13476 return function( elem ) { 13477 return Sizzle( selector, elem ).length > 0; 13478 }; 13479 } ), 13480 13481 "contains": markFunction( function( text ) { 13482 text = text.replace( runescape, funescape ); 13483 return function( elem ) { 13484 return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; 13485 }; 13486 } ), 13487 13488 // "Whether an element is represented by a :lang() selector 13489 // is based solely on the element's language value 13490 // being equal to the identifier C, 13491 // or beginning with the identifier C immediately followed by "-". 13492 // The matching of C against the element's language value is performed case-insensitively. 13493 // The identifier C does not have to be a valid language name." 13494 // http://www.w3.org/TR/selectors/#lang-pseudo 13495 "lang": markFunction( function( lang ) { 13496 13497 // lang value must be a valid identifier 13498 if ( !ridentifier.test( lang || "" ) ) { 13499 Sizzle.error( "unsupported lang: " + lang ); 13500 } 13501 lang = lang.replace( runescape, funescape ).toLowerCase(); 13502 return function( elem ) { 13503 var elemLang; 13504 do { 13505 if ( ( elemLang = documentIsHTML ? 13506 elem.lang : 13507 elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { 13508 13509 elemLang = elemLang.toLowerCase(); 13510 return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; 13511 } 13512 } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); 13513 return false; 13514 }; 13515 } ), 13516 13517 // Miscellaneous 13518 "target": function( elem ) { 13519 var hash = window.location && window.location.hash; 13520 return hash && hash.slice( 1 ) === elem.id; 13521 }, 13522 13523 "root": function( elem ) { 13524 return elem === docElem; 13525 }, 13526 13527 "focus": function( elem ) { 13528 return elem === document.activeElement && 13529 ( !document.hasFocus || document.hasFocus() ) && 13530 !!( elem.type || elem.href || ~elem.tabIndex ); 13531 }, 13532 13533 // Boolean properties 13534 "enabled": createDisabledPseudo( false ), 13535 "disabled": createDisabledPseudo( true ), 13536 13537 "checked": function( elem ) { 13538 13539 // In CSS3, :checked should return both checked and selected elements 13540 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 13541 var nodeName = elem.nodeName.toLowerCase(); 13542 return ( nodeName === "input" && !!elem.checked ) || 13543 ( nodeName === "option" && !!elem.selected ); 13544 }, 13545 13546 "selected": function( elem ) { 13547 13548 // Accessing this property makes selected-by-default 13549 // options in Safari work properly 13550 if ( elem.parentNode ) { 13551 // eslint-disable-next-line no-unused-expressions 13552 elem.parentNode.selectedIndex; 13553 } 13554 13555 return elem.selected === true; 13556 }, 13557 13558 // Contents 13559 "empty": function( elem ) { 13560 13561 // http://www.w3.org/TR/selectors/#empty-pseudo 13562 // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), 13563 // but not by others (comment: 8; processing instruction: 7; etc.) 13564 // nodeType < 6 works because attributes (2) do not appear as children 13565 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 13566 if ( elem.nodeType < 6 ) { 13567 return false; 13568 } 13569 } 13570 return true; 13571 }, 13572 13573 "parent": function( elem ) { 13574 return !Expr.pseudos[ "empty" ]( elem ); 13575 }, 13576 13577 // Element/input types 13578 "header": function( elem ) { 13579 return rheader.test( elem.nodeName ); 13580 }, 13581 13582 "input": function( elem ) { 13583 return rinputs.test( elem.nodeName ); 13584 }, 13585 13586 "button": function( elem ) { 13587 var name = elem.nodeName.toLowerCase(); 13588 return name === "input" && elem.type === "button" || name === "button"; 13589 }, 13590 13591 "text": function( elem ) { 13592 var attr; 13593 return elem.nodeName.toLowerCase() === "input" && 13594 elem.type === "text" && 13595
vendor: 22,617 bytes, lines 13596-14437
13596 // Support: IE<8 13597 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" 13598 ( ( attr = elem.getAttribute( "type" ) ) == null || 13599 attr.toLowerCase() === "text" ); 13600 }, 13601 13602 // Position-in-collection 13603 "first": createPositionalPseudo( function() { 13604 return [ 0 ]; 13605 } ), 13606 13607 "last": createPositionalPseudo( function( _matchIndexes, length ) { 13608 return [ length - 1 ]; 13609 } ), 13610 13611 "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { 13612 return [ argument < 0 ? argument + length : argument ]; 13613 } ), 13614 13615 "even": createPositionalPseudo( function( matchIndexes, length ) { 13616 var i = 0; 13617 for ( ; i < length; i += 2 ) { 13618 matchIndexes.push( i ); 13619 } 13620 return matchIndexes; 13621 } ), 13622 13623 "odd": createPositionalPseudo( function( matchIndexes, length ) { 13624 var i = 1; 13625 for ( ; i < length; i += 2 ) { 13626 matchIndexes.push( i ); 13627 } 13628 return matchIndexes; 13629 } ), 13630 13631 "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { 13632 var i = argument < 0 ? 13633 argument + length : 13634 argument > length ? 13635 length : 13636 argument; 13637 for ( ; --i >= 0; ) { 13638 matchIndexes.push( i ); 13639 } 13640 return matchIndexes; 13641 } ), 13642 13643 "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { 13644 var i = argument < 0 ? argument + length : argument; 13645 for ( ; ++i < length; ) { 13646 matchIndexes.push( i ); 13647 } 13648 return matchIndexes; 13649 } ) 13650 } 13651}; 13652 13653Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; 13654 13655// Add button/input type pseudos 13656for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { 13657 Expr.pseudos[ i ] = createInputPseudo( i ); 13658} 13659for ( i in { submit: true, reset: true } ) { 13660 Expr.pseudos[ i ] = createButtonPseudo( i ); 13661} 13662 13663// Easy API for creating new setFilters 13664function setFilters() {} 13665setFilters.prototype = Expr.filters = Expr.pseudos; 13666Expr.setFilters = new setFilters(); 13667 13668tokenize = Sizzle.tokenize = function( selector, parseOnly ) { 13669 var matched, match, tokens, type, 13670 soFar, groups, preFilters, 13671 cached = tokenCache[ selector + " " ]; 13672 13673 if ( cached ) { 13674 return parseOnly ? 0 : cached.slice( 0 ); 13675 } 13676 13677 soFar = selector; 13678 groups = []; 13679 preFilters = Expr.preFilter; 13680 13681 while ( soFar ) { 13682 13683 // Comma and first run 13684 if ( !matched || ( match = rcomma.exec( soFar ) ) ) { 13685 if ( match ) { 13686 13687 // Don't consume trailing commas as valid 13688 soFar = soFar.slice( match[ 0 ].length ) || soFar; 13689 } 13690 groups.push( ( tokens = [] ) ); 13691 } 13692 13693 matched = false; 13694 13695 // Combinators 13696 if ( ( match = rcombinators.exec( soFar ) ) ) { 13697 matched = match.shift(); 13698 tokens.push( { 13699 value: matched, 13700 13701 // Cast descendant combinators to space 13702 type: match[ 0 ].replace( rtrim, " " ) 13703 } ); 13704 soFar = soFar.slice( matched.length ); 13705 } 13706 13707 // Filters 13708 for ( type in Expr.filter ) { 13709 if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || 13710 ( match = preFilters[ type ]( match ) ) ) ) { 13711 matched = match.shift(); 13712 tokens.push( { 13713 value: matched, 13714 type: type, 13715 matches: match 13716 } ); 13717 soFar = soFar.slice( matched.length ); 13718 } 13719 } 13720 13721 if ( !matched ) { 13722 break; 13723 } 13724 } 13725 13726 // Return the length of the invalid excess 13727 // if we're just parsing 13728 // Otherwise, throw an error or return tokens 13729 return parseOnly ? 13730 soFar.length : 13731 soFar ? 13732 Sizzle.error( selector ) : 13733 13734 // Cache the tokens 13735 tokenCache( selector, groups ).slice( 0 ); 13736}; 13737 13738function toSelector( tokens ) { 13739 var i = 0, 13740 len = tokens.length, 13741 selector = ""; 13742 for ( ; i < len; i++ ) { 13743 selector += tokens[ i ].value; 13744 } 13745 return selector; 13746} 13747 13748function addCombinator( matcher, combinator, base ) { 13749 var dir = combinator.dir, 13750 skip = combinator.next, 13751 key = skip || dir, 13752 checkNonElements = base && key === "parentNode", 13753 doneName = done++; 13754 13755 return combinator.first ? 13756 13757 // Check against closest ancestor/preceding element 13758 function( elem, context, xml ) { 13759 while ( ( elem = elem[ dir ] ) ) { 13760 if ( elem.nodeType === 1 || checkNonElements ) { 13761 return matcher( elem, context, xml ); 13762 } 13763 } 13764 return false; 13765 } : 13766 13767 // Check against all ancestor/preceding elements 13768 function( elem, context, xml ) { 13769 var oldCache, uniqueCache, outerCache, 13770 newCache = [ dirruns, doneName ]; 13771 13772 // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching 13773 if ( xml ) { 13774 while ( ( elem = elem[ dir ] ) ) { 13775 if ( elem.nodeType === 1 || checkNonElements ) { 13776 if ( matcher( elem, context, xml ) ) { 13777 return true; 13778 } 13779 } 13780 } 13781 } else { 13782 while ( ( elem = elem[ dir ] ) ) { 13783 if ( elem.nodeType === 1 || checkNonElements ) { 13784 outerCache = elem[ expando ] || ( elem[ expando ] = {} ); 13785 13786 // Support: IE <9 only 13787 // Defend against cloned attroperties (jQuery gh-1709) 13788 uniqueCache = outerCache[ elem.uniqueID ] || 13789 ( outerCache[ elem.uniqueID ] = {} ); 13790 13791 if ( skip && skip === elem.nodeName.toLowerCase() ) { 13792 elem = elem[ dir ] || elem; 13793 } else if ( ( oldCache = uniqueCache[ key ] ) && 13794 oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { 13795 13796 // Assign to newCache so results back-propagate to previous elements 13797 return ( newCache[ 2 ] = oldCache[ 2 ] ); 13798 } else { 13799 13800 // Reuse newcache so results back-propagate to previous elements 13801 uniqueCache[ key ] = newCache; 13802 13803 // A match means we're done; a fail means we have to keep checking 13804 if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { 13805 return true; 13806 } 13807 } 13808 } 13809 } 13810 } 13811 return false; 13812 }; 13813} 13814 13815function elementMatcher( matchers ) { 13816 return matchers.length > 1 ? 13817 function( elem, context, xml ) { 13818 var i = matchers.length; 13819 while ( i-- ) { 13820 if ( !matchers[ i ]( elem, context, xml ) ) { 13821 return false; 13822 } 13823 } 13824 return true; 13825 } : 13826 matchers[ 0 ]; 13827} 13828 13829function multipleContexts( selector, contexts, results ) { 13830 var i = 0, 13831 len = contexts.length; 13832 for ( ; i < len; i++ ) { 13833 Sizzle( selector, contexts[ i ], results ); 13834 } 13835 return results; 13836} 13837 13838function condense( unmatched, map, filter, context, xml ) { 13839 var elem, 13840 newUnmatched = [], 13841 i = 0, 13842 len = unmatched.length, 13843 mapped = map != null; 13844 13845 for ( ; i < len; i++ ) { 13846 if ( ( elem = unmatched[ i ] ) ) { 13847 if ( !filter || filter( elem, context, xml ) ) { 13848 newUnmatched.push( elem ); 13849 if ( mapped ) { 13850 map.push( i ); 13851 } 13852 } 13853 } 13854 } 13855 13856 return newUnmatched; 13857} 13858 13859function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { 13860 if ( postFilter && !postFilter[ expando ] ) { 13861 postFilter = setMatcher( postFilter ); 13862 } 13863 if ( postFinder && !postFinder[ expando ] ) { 13864 postFinder = setMatcher( postFinder, postSelector ); 13865 } 13866 return markFunction( function( seed, results, context, xml ) { 13867 var temp, i, elem, 13868 preMap = [], 13869 postMap = [], 13870 preexisting = results.length, 13871 13872 // Get initial elements from seed or context 13873 elems = seed || multipleContexts( 13874 selector || "*", 13875 context.nodeType ? [ context ] : context, 13876 [] 13877 ), 13878 13879 // Prefilter to get matcher input, preserving a map for seed-results synchronization 13880 matcherIn = preFilter && ( seed || !selector ) ? 13881 condense( elems, preMap, preFilter, context, xml ) : 13882 elems, 13883 13884 matcherOut = matcher ? 13885 13886 // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, 13887 postFinder || ( seed ? preFilter : preexisting || postFilter ) ? 13888 13889 // ...intermediate processing is necessary 13890 [] : 13891 13892 // ...otherwise use results directly 13893 results : 13894 matcherIn; 13895 13896 // Find primary matches 13897 if ( matcher ) { 13898 matcher( matcherIn, matcherOut, context, xml ); 13899 } 13900 13901 // Apply postFilter 13902 if ( postFilter ) { 13903 temp = condense( matcherOut, postMap ); 13904 postFilter( temp, [], context, xml ); 13905 13906 // Un-match failing elements by moving them back to matcherIn 13907 i = temp.length; 13908 while ( i-- ) { 13909 if ( ( elem = temp[ i ] ) ) { 13910 matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); 13911 } 13912 } 13913 } 13914 13915 if ( seed ) { 13916 if ( postFinder || preFilter ) { 13917 if ( postFinder ) { 13918 13919 // Get the final matcherOut by condensing this intermediate into postFinder contexts 13920 temp = []; 13921 i = matcherOut.length; 13922 while ( i-- ) { 13923 if ( ( elem = matcherOut[ i ] ) ) { 13924 13925 // Restore matcherIn since elem is not yet a final match 13926 temp.push( ( matcherIn[ i ] = elem ) ); 13927 } 13928 } 13929 postFinder( null, ( matcherOut = [] ), temp, xml ); 13930 } 13931 13932 // Move matched elements from seed to results to keep them synchronized 13933 i = matcherOut.length; 13934 while ( i-- ) { 13935 if ( ( elem = matcherOut[ i ] ) && 13936 ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { 13937 13938 seed[ temp ] = !( results[ temp ] = elem ); 13939 } 13940 } 13941 } 13942 13943 // Add elements to results, through postFinder if defined 13944 } else { 13945 matcherOut = condense( 13946 matcherOut === results ? 13947 matcherOut.splice( preexisting, matcherOut.length ) : 13948 matcherOut 13949 ); 13950 if ( postFinder ) { 13951 postFinder( null, results, matcherOut, xml ); 13952 } else { 13953 push.apply( results, matcherOut ); 13954 } 13955 } 13956 } ); 13957} 13958 13959function matcherFromTokens( tokens ) { 13960 var checkContext, matcher, j, 13961 len = tokens.length, 13962 leadingRelative = Expr.relative[ tokens[ 0 ].type ], 13963 implicitRelative = leadingRelative || Expr.relative[ " " ], 13964 i = leadingRelative ? 1 : 0, 13965 13966 // The foundational matcher ensures that elements are reachable from top-level context(s) 13967 matchContext = addCombinator( function( elem ) { 13968 return elem === checkContext; 13969 }, implicitRelative, true ), 13970 matchAnyContext = addCombinator( function( elem ) { 13971 return indexOf( checkContext, elem ) > -1; 13972 }, implicitRelative, true ), 13973 matchers = [ function( elem, context, xml ) { 13974 var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( 13975 ( checkContext = context ).nodeType ? 13976 matchContext( elem, context, xml ) : 13977 matchAnyContext( elem, context, xml ) ); 13978 13979 // Avoid hanging onto element (issue #299) 13980 checkContext = null; 13981 return ret; 13982 } ]; 13983 13984 for ( ; i < len; i++ ) { 13985 if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { 13986 matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; 13987 } else { 13988 matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); 13989 13990 // Return special upon seeing a positional matcher 13991 if ( matcher[ expando ] ) { 13992 13993 // Find the next relative operator (if any) for proper handling 13994 j = ++i; 13995 for ( ; j < len; j++ ) { 13996 if ( Expr.relative[ tokens[ j ].type ] ) { 13997 break; 13998 } 13999 } 14000 return setMatcher( 14001 i > 1 && elementMatcher( matchers ), 14002 i > 1 && toSelector( 14003 14004 // If the preceding token was a descendant combinator, insert an implicit any-element `*` 14005 tokens 14006 .slice( 0, i - 1 ) 14007 .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) 14008 ).replace( rtrim, "$1" ), 14009 matcher, 14010 i < j && matcherFromTokens( tokens.slice( i, j ) ), 14011 j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), 14012 j < len && toSelector( tokens ) 14013 ); 14014 } 14015 matchers.push( matcher ); 14016 } 14017 } 14018 14019 return elementMatcher( matchers ); 14020} 14021 14022function matcherFromGroupMatchers( elementMatchers, setMatchers ) { 14023 var bySet = setMatchers.length > 0, 14024 byElement = elementMatchers.length > 0, 14025 superMatcher = function( seed, context, xml, results, outermost ) { 14026 var elem, j, matcher, 14027 matchedCount = 0, 14028 i = "0", 14029 unmatched = seed && [], 14030 setMatched = [], 14031 contextBackup = outermostContext, 14032 14033 // We must always have either seed elements or outermost context 14034 elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), 14035 14036 // Use integer dirruns iff this is the outermost matcher 14037 dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), 14038 len = elems.length; 14039 14040 if ( outermost ) { 14041 14042 // Support: IE 11+, Edge 17 - 18+ 14043 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 14044 // two documents; shallow comparisons work. 14045 // eslint-disable-next-line eqeqeq 14046 outermostContext = context == document || context || outermost; 14047 } 14048 14049 // Add elements passing elementMatchers directly to results 14050 // Support: IE<9, Safari 14051 // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id 14052 for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { 14053 if ( byElement && elem ) { 14054 j = 0; 14055 14056 // Support: IE 11+, Edge 17 - 18+ 14057 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 14058 // two documents; shallow comparisons work. 14059 // eslint-disable-next-line eqeqeq 14060 if ( !context && elem.ownerDocument != document ) { 14061 setDocument( elem ); 14062 xml = !documentIsHTML; 14063 } 14064 while ( ( matcher = elementMatchers[ j++ ] ) ) { 14065 if ( matcher( elem, context || document, xml ) ) { 14066 results.push( elem ); 14067 break; 14068 } 14069 } 14070 if ( outermost ) { 14071 dirruns = dirrunsUnique; 14072 } 14073 } 14074 14075 // Track unmatched elements for set filters 14076 if ( bySet ) { 14077 14078 // They will have gone through all possible matchers 14079 if ( ( elem = !matcher && elem ) ) { 14080 matchedCount--; 14081 } 14082 14083 // Lengthen the array for every element, matched or not 14084 if ( seed ) { 14085 unmatched.push( elem ); 14086 } 14087 } 14088 } 14089 14090 // `i` is now the count of elements visited above, and adding it to `matchedCount` 14091 // makes the latter nonnegative. 14092 matchedCount += i; 14093 14094 // Apply set filters to unmatched elements 14095 // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` 14096 // equals `i`), unless we didn't visit _any_ elements in the above loop because we have 14097 // no element matchers and no seed. 14098 // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that 14099 // case, which will result in a "00" `matchedCount` that differs from `i` but is also 14100 // numerically zero. 14101 if ( bySet && i !== matchedCount ) { 14102 j = 0; 14103 while ( ( matcher = setMatchers[ j++ ] ) ) { 14104 matcher( unmatched, setMatched, context, xml ); 14105 } 14106 14107 if ( seed ) { 14108 14109 // Reintegrate element matches to eliminate the need for sorting 14110 if ( matchedCount > 0 ) { 14111 while ( i-- ) { 14112 if ( !( unmatched[ i ] || setMatched[ i ] ) ) { 14113 setMatched[ i ] = pop.call( results ); 14114 } 14115 } 14116 } 14117 14118 // Discard index placeholder values to get only actual matches 14119 setMatched = condense( setMatched ); 14120 } 14121 14122 // Add matches to results 14123 push.apply( results, setMatched ); 14124 14125 // Seedless set matches succeeding multiple successful matchers stipulate sorting 14126 if ( outermost && !seed && setMatched.length > 0 && 14127 ( matchedCount + setMatchers.length ) > 1 ) { 14128 14129 Sizzle.uniqueSort( results ); 14130 } 14131 } 14132 14133 // Override manipulation of globals by nested matchers 14134 if ( outermost ) { 14135 dirruns = dirrunsUnique; 14136 outermostContext = contextBackup; 14137 } 14138 14139 return unmatched; 14140 }; 14141 14142 return bySet ? 14143 markFunction( superMatcher ) : 14144 superMatcher; 14145} 14146 14147compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { 14148 var i, 14149 setMatchers = [], 14150 elementMatchers = [], 14151 cached = compilerCache[ selector + " " ]; 14152 14153 if ( !cached ) { 14154 14155 // Generate a function of recursive functions that can be used to check each element 14156 if ( !match ) { 14157 match = tokenize( selector ); 14158 } 14159 i = match.length; 14160 while ( i-- ) { 14161 cached = matcherFromTokens( match[ i ] ); 14162 if ( cached[ expando ] ) { 14163 setMatchers.push( cached ); 14164 } else { 14165 elementMatchers.push( cached ); 14166 } 14167 } 14168 14169 // Cache the compiled function 14170 cached = compilerCache( 14171 selector, 14172 matcherFromGroupMatchers( elementMatchers, setMatchers ) 14173 ); 14174 14175 // Save selector and tokenization 14176 cached.selector = selector; 14177 } 14178 return cached; 14179}; 14180 14181/** 14182 * A low-level selection function that works with Sizzle's compiled 14183 * selector functions 14184 * @param {String|Function} selector A selector or a pre-compiled 14185 * selector function built with Sizzle.compile 14186 * @param {Element} context 14187 * @param {Array} [results] 14188 * @param {Array} [seed] A set of elements to match against 14189 */ 14190select = Sizzle.select = function( selector, context, results, seed ) { 14191 var i, tokens, token, type, find, 14192 compiled = typeof selector === "function" && selector, 14193 match = !seed && tokenize( ( selector = compiled.selector || selector ) ); 14194 14195 results = results || []; 14196 14197 // Try to minimize operations if there is only one selector in the list and no seed 14198 // (the latter of which guarantees us context) 14199 if ( match.length === 1 ) { 14200 14201 // Reduce context if the leading compound selector is an ID 14202 tokens = match[ 0 ] = match[ 0 ].slice( 0 ); 14203 if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && 14204 context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { 14205 14206 context = ( Expr.find[ "ID" ]( token.matches[ 0 ] 14207 .replace( runescape, funescape ), context ) || [] )[ 0 ]; 14208 if ( !context ) { 14209 return results; 14210 14211 // Precompiled matchers will still verify ancestry, so step up a level 14212 } else if ( compiled ) { 14213 context = context.parentNode; 14214 } 14215 14216 selector = selector.slice( tokens.shift().value.length ); 14217 } 14218 14219 // Fetch a seed set for right-to-left matching 14220 i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; 14221 while ( i-- ) { 14222 token = tokens[ i ]; 14223 14224 // Abort if we hit a combinator 14225 if ( Expr.relative[ ( type = token.type ) ] ) { 14226 break; 14227 } 14228 if ( ( find = Expr.find[ type ] ) ) { 14229 14230 // Search, expanding context for leading sibling combinators 14231 if ( ( seed = find( 14232 token.matches[ 0 ].replace( runescape, funescape ), 14233 rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || 14234 context 14235 ) ) ) { 14236 14237 // If seed is empty or no tokens remain, we can return early 14238 tokens.splice( i, 1 ); 14239 selector = seed.length && toSelector( tokens ); 14240 if ( !selector ) { 14241 push.apply( results, seed ); 14242 return results; 14243 } 14244 14245 break; 14246 } 14247 } 14248 } 14249 } 14250 14251 // Compile and execute a filtering function if one is not provided 14252 // Provide `match` to avoid retokenization if we modified the selector above 14253 ( compiled || compile( selector, match ) )( 14254 seed, 14255 context, 14256 !documentIsHTML, 14257 results, 14258 !context || rsibling.test( selector ) && testContext( context.parentNode ) || context 14259 ); 14260 return results; 14261}; 14262 14263// One-time assignments 14264 14265// Sort stability 14266support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; 14267 14268// Support: Chrome 14-35+ 14269// Always assume duplicates if they aren't passed to the comparison function 14270support.detectDuplicates = !!hasDuplicate; 14271 14272// Initialize against the default document 14273setDocument(); 14274 14275// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) 14276// Detached nodes confoundingly follow *each other* 14277support.sortDetached = assert( function( el ) { 14278 14279 // Should return 1, but returns 4 (following) 14280 return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; 14281} ); 14282 14283// Support: IE<8 14284// Prevent attribute/property "interpolation" 14285// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx 14286if ( !assert( function( el ) { 14287 el.innerHTML = "<a href='#'></a>"; 14288 return el.firstChild.getAttribute( "href" ) === "#"; 14289} ) ) { 14290 addHandle( "type|href|height|width", function( elem, name, isXML ) { 14291 if ( !isXML ) { 14292 return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); 14293 } 14294 } ); 14295} 14296 14297// Support: IE<9 14298// Use defaultValue in place of getAttribute("value") 14299if ( !support.attributes || !assert( function( el ) { 14300 el.innerHTML = "<input/>"; 14301 el.firstChild.setAttribute( "value", "" ); 14302 return el.firstChild.getAttribute( "value" ) === ""; 14303} ) ) { 14304 addHandle( "value", function( elem, _name, isXML ) { 14305 if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { 14306 return elem.defaultValue; 14307 } 14308 } ); 14309} 14310 14311// Support: IE<9 14312// Use getAttributeNode to fetch booleans when getAttribute lies 14313if ( !assert( function( el ) { 14314 return el.getAttribute( "disabled" ) == null; 14315} ) ) { 14316 addHandle( booleans, function( elem, name, isXML ) { 14317 var val; 14318 if ( !isXML ) { 14319 return elem[ name ] === true ? name.toLowerCase() : 14320 ( val = elem.getAttributeNode( name ) ) && val.specified ? 14321 val.value : 14322 null; 14323 } 14324 } ); 14325} 14326 14327return Sizzle; 14328 14329} )( window ); 14330 14331 14332 14333jQuery.find = Sizzle; 14334jQuery.expr = Sizzle.selectors; 14335 14336// Deprecated 14337jQuery.expr[ ":" ] = jQuery.expr.pseudos; 14338jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; 14339jQuery.text = Sizzle.getText; 14340jQuery.isXMLDoc = Sizzle.isXML; 14341jQuery.contains = Sizzle.contains; 14342jQuery.escapeSelector = Sizzle.escape; 14343 14344 14345 14346 14347var dir = function( elem, dir, until ) { 14348 var matched = [], 14349 truncate = until !== undefined; 14350 14351 while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { 14352 if ( elem.nodeType === 1 ) { 14353 if ( truncate && jQuery( elem ).is( until ) ) { 14354 break; 14355 } 14356 matched.push( elem ); 14357 } 14358 } 14359 return matched; 14360}; 14361 14362 14363var siblings = function( n, elem ) { 14364 var matched = []; 14365 14366 for ( ; n; n = n.nextSibling ) { 14367 if ( n.nodeType === 1 && n !== elem ) { 14368 matched.push( n ); 14369 } 14370 } 14371 14372 return matched; 14373}; 14374 14375 14376var rneedsContext = jQuery.expr.match.needsContext; 14377 14378 14379 14380function nodeName( elem, name ) { 14381 14382 return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); 14383 14384} 14385var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); 14386 14387 14388 14389// Implement the identical functionality for filter and not 14390function winnow( elements, qualifier, not ) { 14391 if ( isFunction( qualifier ) ) { 14392 return jQuery.grep( elements, function( elem, i ) { 14393 return !!qualifier.call( elem, i, elem ) !== not; 14394 } ); 14395 } 14396 14397 // Single element 14398 if ( qualifier.nodeType ) { 14399 return jQuery.grep( elements, function( elem ) { 14400 return ( elem === qualifier ) !== not; 14401 } ); 14402 } 14403 14404 // Arraylike of elements (jQuery, arguments, Array) 14405 if ( typeof qualifier !== "string" ) { 14406 return jQuery.grep( elements, function( elem ) { 14407 return ( indexOf.call( qualifier, elem ) > -1 ) !== not; 14408 } ); 14409 } 14410 14411 // Filtered directly for both simple and complex selectors 14412 return jQuery.filter( qualifier, elements, not ); 14413} 14414 14415jQuery.filter = function( expr, elems, not ) { 14416 var elem = elems[ 0 ]; 14417 14418 if ( not ) { 14419 expr = ":not(" + expr + ")"; 14420 } 14421 14422 if ( elems.length === 1 && elem.nodeType === 1 ) { 14423 return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; 14424 } 14425 14426 return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { 14427 return elem.nodeType === 1; 14428 } ) ); 14429}; 14430 14431jQuery.fn.extend( { 14432 find: function( selector ) { 14433 var i, ret, 14434 len = this.length, 14435 self = this; 14436 14437 if ( typeof selector !== "string" ) {
vendor: 4,670 bytes, lines 14438-14623
14438 return this.pushStack( jQuery( selector ).filter( function() { 14439 for ( i = 0; i < len; i++ ) { 14440 if ( jQuery.contains( self[ i ], this ) ) { 14441 return true; 14442 } 14443 } 14444 } ) ); 14445 } 14446 14447 ret = this.pushStack( [] ); 14448 14449 for ( i = 0; i < len; i++ ) { 14450 jQuery.find( selector, self[ i ], ret ); 14451 } 14452 14453 return len > 1 ? jQuery.uniqueSort( ret ) : ret; 14454 }, 14455 filter: function( selector ) { 14456 return this.pushStack( winnow( this, selector || [], false ) ); 14457 }, 14458 not: function( selector ) { 14459 return this.pushStack( winnow( this, selector || [], true ) ); 14460 }, 14461 is: function( selector ) { 14462 return !!winnow( 14463 this, 14464 14465 // If this is a positional/relative selector, check membership in the returned set 14466 // so $("p:first").is("p:last") won't return true for a doc with two "p". 14467 typeof selector === "string" && rneedsContext.test( selector ) ? 14468 jQuery( selector ) : 14469 selector || [], 14470 false 14471 ).length; 14472 } 14473} ); 14474 14475 14476// Initialize a jQuery object 14477 14478 14479// A central reference to the root jQuery(document) 14480var rootjQuery, 14481 14482 // A simple way to check for HTML strings 14483 // Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521) 14484 // Strict HTML recognition (trac-11290: must start with <) 14485 // Shortcut simple #id case for speed 14486 rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, 14487 14488 init = jQuery.fn.init = function( selector, context, root ) { 14489 var match, elem; 14490 14491 // HANDLE: $(""), $(null), $(undefined), $(false) 14492 if ( !selector ) { 14493 return this; 14494 } 14495 14496 // Method init() accepts an alternate rootjQuery 14497 // so migrate can support jQuery.sub (gh-2101) 14498 root = root || rootjQuery; 14499 14500 // Handle HTML strings 14501 if ( typeof selector === "string" ) { 14502 if ( selector[ 0 ] === "<" && 14503 selector[ selector.length - 1 ] === ">" && 14504 selector.length >= 3 ) { 14505 14506 // Assume that strings that start and end with <> are HTML and skip the regex check 14507 match = [ null, selector, null ]; 14508 14509 } else { 14510 match = rquickExpr.exec( selector ); 14511 } 14512 14513 // Match html or make sure no context is specified for #id 14514 if ( match && ( match[ 1 ] || !context ) ) { 14515 14516 // HANDLE: $(html) -> $(array) 14517 if ( match[ 1 ] ) { 14518 context = context instanceof jQuery ? context[ 0 ] : context; 14519 14520 // Option to run scripts is true for back-compat 14521 // Intentionally let the error be thrown if parseHTML is not present 14522 jQuery.merge( this, jQuery.parseHTML( 14523 match[ 1 ], 14524 context && context.nodeType ? context.ownerDocument || context : document, 14525 true 14526 ) ); 14527 14528 // HANDLE: $(html, props) 14529 if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { 14530 for ( match in context ) { 14531 14532 // Properties of context are called as methods if possible 14533 if ( isFunction( this[ match ] ) ) { 14534 this[ match ]( context[ match ] ); 14535 14536 // ...and otherwise set as attributes 14537 } else { 14538 this.attr( match, context[ match ] ); 14539 } 14540 } 14541 } 14542 14543 return this; 14544 14545 // HANDLE: $(#id) 14546 } else { 14547 elem = document.getElementById( match[ 2 ] ); 14548 14549 if ( elem ) { 14550 14551 // Inject the element directly into the jQuery object 14552 this[ 0 ] = elem; 14553 this.length = 1; 14554 } 14555 return this; 14556 } 14557 14558 // HANDLE: $(expr, $(...)) 14559 } else if ( !context || context.jquery ) { 14560 return ( context || root ).find( selector ); 14561 14562 // HANDLE: $(expr, context) 14563 // (which is just equivalent to: $(context).find(expr) 14564 } else { 14565 return this.constructor( context ).find( selector ); 14566 } 14567 14568 // HANDLE: $(DOMElement) 14569 } else if ( selector.nodeType ) { 14570 this[ 0 ] = selector; 14571 this.length = 1; 14572 return this; 14573 14574 // HANDLE: $(function) 14575 // Shortcut for document ready 14576 } else if ( isFunction( selector ) ) { 14577 return root.ready !== undefined ? 14578 root.ready( selector ) : 14579 14580 // Execute immediately if ready is not present 14581 selector( jQuery ); 14582 } 14583 14584 return jQuery.makeArray( selector, this ); 14585 }; 14586 14587// Give the init function the jQuery prototype for later instantiation 14588init.prototype = jQuery.fn; 14589 14590// Initialize central reference 14591rootjQuery = jQuery( document ); 14592 14593 14594var rparentsprev = /^(?:parents|prev(?:Until|All))/, 14595 14596 // Methods guaranteed to produce a unique set when starting from a unique set 14597 guaranteedUnique = { 14598 children: true, 14599 contents: true, 14600 next: true, 14601 prev: true 14602 }; 14603 14604jQuery.fn.extend( { 14605 has: function( target ) { 14606 var targets = jQuery( target, this ), 14607 l = targets.length; 14608 14609 return this.filter( function() { 14610 var i = 0; 14611 for ( ; i < l; i++ ) { 14612 if ( jQuery.contains( this, targets[ i ] ) ) { 14613 return true; 14614 } 14615 } 14616 } ); 14617 }, 14618 14619 closest: function( selectors, context ) { 14620 var cur, 14621 i = 0, 14622 l = this.length, 14623 matched = [],
14624 targets = typeof selectors !== "string" && jQuery( selectors ); 14625 14626 // Positional selectors never match, since there's no _selection_ context 14627 if ( !rneedsContext.test( selectors ) ) { 14628 for ( ; i < l; i++ ) { 14629 for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { 14630 14631 // Always skip document fragments 14632 if ( cur.nodeType < 11 && ( targets ? 14633 targets.index( cur ) > -1 : 14634 14635 // Don't pass non-elements to Sizzle
vendor: 14,565 bytes, lines 14635-15190
14635 14636 cur.nodeType === 1 && 14637 jQuery.find.matchesSelector( cur, selectors ) ) ) { 14638 14639 matched.push( cur ); 14640 break; 14641 } 14642 } 14643 } 14644 } 14645 14646 return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); 14647 }, 14648 14649 // Determine the position of an element within the set 14650 index: function( elem ) { 14651 14652 // No argument, return index in parent 14653 if ( !elem ) { 14654 return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; 14655 } 14656 14657 // Index in selector 14658 if ( typeof elem === "string" ) { 14659 return indexOf.call( jQuery( elem ), this[ 0 ] ); 14660 } 14661 14662 // Locate the position of the desired element 14663 return indexOf.call( this, 14664 14665 // If it receives a jQuery object, the first element is used 14666 elem.jquery ? elem[ 0 ] : elem 14667 ); 14668 }, 14669 14670 add: function( selector, context ) { 14671 return this.pushStack( 14672 jQuery.uniqueSort( 14673 jQuery.merge( this.get(), jQuery( selector, context ) ) 14674 ) 14675 ); 14676 }, 14677 14678 addBack: function( selector ) { 14679 return this.add( selector == null ? 14680 this.prevObject : this.prevObject.filter( selector ) 14681 ); 14682 } 14683} ); 14684 14685function sibling( cur, dir ) { 14686 while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} 14687 return cur; 14688} 14689 14690jQuery.each( { 14691 parent: function( elem ) { 14692 var parent = elem.parentNode; 14693 return parent && parent.nodeType !== 11 ? parent : null; 14694 }, 14695 parents: function( elem ) { 14696 return dir( elem, "parentNode" ); 14697 }, 14698 parentsUntil: function( elem, _i, until ) { 14699 return dir( elem, "parentNode", until ); 14700 }, 14701 next: function( elem ) { 14702 return sibling( elem, "nextSibling" ); 14703 }, 14704 prev: function( elem ) { 14705 return sibling( elem, "previousSibling" ); 14706 }, 14707 nextAll: function( elem ) { 14708 return dir( elem, "nextSibling" ); 14709 }, 14710 prevAll: function( elem ) { 14711 return dir( elem, "previousSibling" ); 14712 }, 14713 nextUntil: function( elem, _i, until ) { 14714 return dir( elem, "nextSibling", until ); 14715 }, 14716 prevUntil: function( elem, _i, until ) { 14717 return dir( elem, "previousSibling", until ); 14718 }, 14719 siblings: function( elem ) { 14720 return siblings( ( elem.parentNode || {} ).firstChild, elem ); 14721 }, 14722 children: function( elem ) { 14723 return siblings( elem.firstChild ); 14724 }, 14725 contents: function( elem ) { 14726 if ( elem.contentDocument != null && 14727 14728 // Support: IE 11+ 14729 // <object> elements with no `data` attribute has an object 14730 // `contentDocument` with a `null` prototype. 14731 getProto( elem.contentDocument ) ) { 14732 14733 return elem.contentDocument; 14734 } 14735 14736 // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only 14737 // Treat the template element as a regular one in browsers that 14738 // don't support it. 14739 if ( nodeName( elem, "template" ) ) { 14740 elem = elem.content || elem; 14741 } 14742 14743 return jQuery.merge( [], elem.childNodes ); 14744 } 14745}, function( name, fn ) { 14746 jQuery.fn[ name ] = function( until, selector ) { 14747 var matched = jQuery.map( this, fn, until ); 14748 14749 if ( name.slice( -5 ) !== "Until" ) { 14750 selector = until; 14751 } 14752 14753 if ( selector && typeof selector === "string" ) { 14754 matched = jQuery.filter( selector, matched ); 14755 } 14756 14757 if ( this.length > 1 ) { 14758 14759 // Remove duplicates 14760 if ( !guaranteedUnique[ name ] ) { 14761 jQuery.uniqueSort( matched ); 14762 } 14763 14764 // Reverse order for parents* and prev-derivatives 14765 if ( rparentsprev.test( name ) ) { 14766 matched.reverse(); 14767 } 14768 } 14769 14770 return this.pushStack( matched ); 14771 }; 14772} ); 14773var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); 14774 14775 14776 14777// Convert String-formatted options into Object-formatted ones 14778function createOptions( options ) { 14779 var object = {}; 14780 jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { 14781 object[ flag ] = true; 14782 } ); 14783 return object; 14784} 14785 14786/* 14787 * Create a callback list using the following parameters: 14788 * 14789 * options: an optional list of space-separated options that will change how 14790 * the callback list behaves or a more traditional option object 14791 * 14792 * By default a callback list will act like an event callback list and can be 14793 * "fired" multiple times. 14794 * 14795 * Possible options: 14796 * 14797 * once: will ensure the callback list can only be fired once (like a Deferred) 14798 * 14799 * memory: will keep track of previous values and will call any callback added 14800 * after the list has been fired right away with the latest "memorized" 14801 * values (like a Deferred) 14802 * 14803 * unique: will ensure a callback can only be added once (no duplicate in the list) 14804 * 14805 * stopOnFalse: interrupt callings when a callback returns false 14806 * 14807 */ 14808jQuery.Callbacks = function( options ) { 14809 14810 // Convert options from String-formatted to Object-formatted if needed 14811 // (we check in cache first) 14812 options = typeof options === "string" ? 14813 createOptions( options ) : 14814 jQuery.extend( {}, options ); 14815 14816 var // Flag to know if list is currently firing 14817 firing, 14818 14819 // Last fire value for non-forgettable lists 14820 memory, 14821 14822 // Flag to know if list was already fired 14823 fired, 14824 14825 // Flag to prevent firing 14826 locked, 14827 14828 // Actual callback list 14829 list = [], 14830 14831 // Queue of execution data for repeatable lists 14832 queue = [], 14833 14834 // Index of currently firing callback (modified by add/remove as needed) 14835 firingIndex = -1, 14836 14837 // Fire callbacks 14838 fire = function() { 14839 14840 // Enforce single-firing 14841 locked = locked || options.once; 14842 14843 // Execute callbacks for all pending executions, 14844 // respecting firingIndex overrides and runtime changes 14845 fired = firing = true; 14846 for ( ; queue.length; firingIndex = -1 ) { 14847 memory = queue.shift(); 14848 while ( ++firingIndex < list.length ) { 14849 14850 // Run callback and check for early termination 14851 if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && 14852 options.stopOnFalse ) { 14853 14854 // Jump to end and forget the data so .add doesn't re-fire 14855 firingIndex = list.length; 14856 memory = false; 14857 } 14858 } 14859 } 14860 14861 // Forget the data if we're done with it 14862 if ( !options.memory ) { 14863 memory = false; 14864 } 14865 14866 firing = false; 14867 14868 // Clean up if we're done firing for good 14869 if ( locked ) { 14870 14871 // Keep an empty list if we have data for future add calls 14872 if ( memory ) { 14873 list = []; 14874 14875 // Otherwise, this object is spent 14876 } else { 14877 list = ""; 14878 } 14879 } 14880 }, 14881 14882 // Actual Callbacks object 14883 self = { 14884 14885 // Add a callback or a collection of callbacks to the list 14886 add: function() { 14887 if ( list ) { 14888 14889 // If we have memory from a past run, we should fire after adding 14890 if ( memory && !firing ) { 14891 firingIndex = list.length - 1; 14892 queue.push( memory ); 14893 } 14894 14895 ( function add( args ) { 14896 jQuery.each( args, function( _, arg ) { 14897 if ( isFunction( arg ) ) { 14898 if ( !options.unique || !self.has( arg ) ) { 14899 list.push( arg ); 14900 } 14901 } else if ( arg && arg.length && toType( arg ) !== "string" ) { 14902 14903 // Inspect recursively 14904 add( arg ); 14905 } 14906 } ); 14907 } )( arguments ); 14908 14909 if ( memory && !firing ) { 14910 fire(); 14911 } 14912 } 14913 return this; 14914 }, 14915 14916 // Remove a callback from the list 14917 remove: function() { 14918 jQuery.each( arguments, function( _, arg ) { 14919 var index; 14920 while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { 14921 list.splice( index, 1 ); 14922 14923 // Handle firing indexes 14924 if ( index <= firingIndex ) { 14925 firingIndex--; 14926 } 14927 } 14928 } ); 14929 return this; 14930 }, 14931 14932 // Check if a given callback is in the list. 14933 // If no argument is given, return whether or not list has callbacks attached. 14934 has: function( fn ) { 14935 return fn ? 14936 jQuery.inArray( fn, list ) > -1 : 14937 list.length > 0; 14938 }, 14939 14940 // Remove all callbacks from the list 14941 empty: function() { 14942 if ( list ) { 14943 list = []; 14944 } 14945 return this; 14946 }, 14947 14948 // Disable .fire and .add 14949 // Abort any current/pending executions 14950 // Clear all callbacks and values 14951 disable: function() { 14952 locked = queue = []; 14953 list = memory = ""; 14954 return this; 14955 }, 14956 disabled: function() { 14957 return !list; 14958 }, 14959 14960 // Disable .fire 14961 // Also disable .add unless we have memory (since it would have no effect) 14962 // Abort any pending executions 14963 lock: function() { 14964 locked = queue = []; 14965 if ( !memory && !firing ) { 14966 list = memory = ""; 14967 } 14968 return this; 14969 }, 14970 locked: function() { 14971 return !!locked; 14972 }, 14973 14974 // Call all callbacks with the given context and arguments 14975 fireWith: function( context, args ) { 14976 if ( !locked ) { 14977 args = args || []; 14978 args = [ context, args.slice ? args.slice() : args ]; 14979 queue.push( args ); 14980 if ( !firing ) { 14981 fire(); 14982 } 14983 } 14984 return this; 14985 }, 14986 14987 // Call all the callbacks with the given arguments 14988 fire: function() { 14989 self.fireWith( this, arguments ); 14990 return this; 14991 }, 14992 14993 // To know if the callbacks have already been called at least once 14994 fired: function() { 14995 return !!fired; 14996 } 14997 }; 14998 14999 return self; 15000}; 15001 15002 15003function Identity( v ) { 15004 return v; 15005} 15006function Thrower( ex ) { 15007 throw ex; 15008} 15009 15010function adoptValue( value, resolve, reject, noValue ) { 15011 var method; 15012 15013 try { 15014 15015 // Check for promise aspect first to privilege synchronous behavior 15016 if ( value && isFunction( ( method = value.promise ) ) ) { 15017 method.call( value ).done( resolve ).fail( reject ); 15018 15019 // Other thenables 15020 } else if ( value && isFunction( ( method = value.then ) ) ) { 15021 method.call( value, resolve, reject ); 15022 15023 // Other non-thenables 15024 } else { 15025 15026 // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: 15027 // * false: [ value ].slice( 0 ) => resolve( value ) 15028 // * true: [ value ].slice( 1 ) => resolve() 15029 resolve.apply( undefined, [ value ].slice( noValue ) ); 15030 } 15031 15032 // For Promises/A+, convert exceptions into rejections 15033 // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in 15034 // Deferred#then to conditionally suppress rejection. 15035 } catch ( value ) { 15036 15037 // Support: Android 4.0 only 15038 // Strict mode functions invoked without .call/.apply get global-object context 15039 reject.apply( undefined, [ value ] ); 15040 } 15041} 15042 15043jQuery.extend( { 15044 15045 Deferred: function( func ) { 15046 var tuples = [ 15047 15048 // action, add listener, callbacks, 15049 // ... .then handlers, argument index, [final state] 15050 [ "notify", "progress", jQuery.Callbacks( "memory" ), 15051 jQuery.Callbacks( "memory" ), 2 ], 15052 [ "resolve", "done", jQuery.Callbacks( "once memory" ), 15053 jQuery.Callbacks( "once memory" ), 0, "resolved" ], 15054 [ "reject", "fail", jQuery.Callbacks( "once memory" ), 15055 jQuery.Callbacks( "once memory" ), 1, "rejected" ] 15056 ], 15057 state = "pending", 15058 promise = { 15059 state: function() { 15060 return state; 15061 }, 15062 always: function() { 15063 deferred.done( arguments ).fail( arguments ); 15064 return this; 15065 }, 15066 "catch": function( fn ) { 15067 return promise.then( null, fn ); 15068 }, 15069 15070 // Keep pipe for back-compat 15071 pipe: function( /* fnDone, fnFail, fnProgress */ ) { 15072 var fns = arguments; 15073 15074 return jQuery.Deferred( function( newDefer ) { 15075 jQuery.each( tuples, function( _i, tuple ) { 15076 15077 // Map tuples (progress, done, fail) to arguments (done, fail, progress) 15078 var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; 15079 15080 // deferred.progress(function() { bind to newDefer or newDefer.notify }) 15081 // deferred.done(function() { bind to newDefer or newDefer.resolve }) 15082 // deferred.fail(function() { bind to newDefer or newDefer.reject }) 15083 deferred[ tuple[ 1 ] ]( function() { 15084 var returned = fn && fn.apply( this, arguments ); 15085 if ( returned && isFunction( returned.promise ) ) { 15086 returned.promise() 15087 .progress( newDefer.notify ) 15088 .done( newDefer.resolve ) 15089 .fail( newDefer.reject ); 15090 } else { 15091 newDefer[ tuple[ 0 ] + "With" ]( 15092 this, 15093 fn ? [ returned ] : arguments 15094 ); 15095 } 15096 } ); 15097 } ); 15098 fns = null; 15099 } ).promise(); 15100 }, 15101 then: function( onFulfilled, onRejected, onProgress ) { 15102 var maxDepth = 0; 15103 function resolve( depth, deferred, handler, special ) { 15104 return function() { 15105 var that = this, 15106 args = arguments, 15107 mightThrow = function() { 15108 var returned, then; 15109 15110 // Support: Promises/A+ section 2.3.3.3.3 15111 // https://promisesaplus.com/#point-59 15112 // Ignore double-resolution attempts 15113 if ( depth < maxDepth ) { 15114 return; 15115 } 15116 15117 returned = handler.apply( that, args ); 15118 15119 // Support: Promises/A+ section 2.3.1 15120 // https://promisesaplus.com/#point-48 15121 if ( returned === deferred.promise() ) { 15122 throw new TypeError( "Thenable self-resolution" ); 15123 } 15124 15125 // Support: Promises/A+ sections 2.3.3.1, 3.5 15126 // https://promisesaplus.com/#point-54 15127 // https://promisesaplus.com/#point-75 15128 // Retrieve `then` only once 15129 then = returned && 15130 15131 // Support: Promises/A+ section 2.3.4 15132 // https://promisesaplus.com/#point-64 15133 // Only check objects and functions for thenability 15134 ( typeof returned === "object" || 15135 typeof returned === "function" ) && 15136 returned.then; 15137 15138 // Handle a returned thenable 15139 if ( isFunction( then ) ) { 15140 15141 // Special processors (notify) just wait for resolution 15142 if ( special ) { 15143 then.call( 15144 returned, 15145 resolve( maxDepth, deferred, Identity, special ), 15146 resolve( maxDepth, deferred, Thrower, special ) 15147 ); 15148 15149 // Normal processors (resolve) also hook into progress 15150 } else { 15151 15152 // ...and disregard older resolution values 15153 maxDepth++; 15154 15155 then.call( 15156 returned, 15157 resolve( maxDepth, deferred, Identity, special ), 15158 resolve( maxDepth, deferred, Thrower, special ), 15159 resolve( maxDepth, deferred, Identity, 15160 deferred.notifyWith ) 15161 ); 15162 } 15163 15164 // Handle all other returned values 15165 } else { 15166 15167 // Only substitute handlers pass on context 15168 // and multiple values (non-spec behavior) 15169 if ( handler !== Identity ) { 15170 that = undefined; 15171 args = [ returned ]; 15172 } 15173 15174 // Process the value(s) 15175 // Default process is resolve 15176 ( special || deferred.resolveWith )( that, args ); 15177 } 15178 }, 15179 15180 // Only normal processors (resolve) catch and reject exceptions 15181 process = special ? 15182 mightThrow : 15183 function() { 15184 try { 15185 mightThrow(); 15186 } catch ( e ) { 15187 15188 if ( jQuery.Deferred.exceptionHook ) { 15189 jQuery.Deferred.exceptionHook( e, 15190 process.
15190stackTrace ); 15191 } 15192 15193 // Support: Promises/A+ section 2.3.3.3.4.1 15194 // https://promisesaplus.com/#point-61 15195 // Ignore post-resolution exceptions 15196 if ( depth + 1 >= maxDepth ) { 15197 15198 // Only substitute handlers pass on context 15199 // and multiple values (non-spec behavior) 15200 if ( handler !== Thrower ) { 15201 that = undefined; 15202 args = [ e ]; 15203 } 15204 15205 deferred.rejectWith( that, args ); 15206 } 15207 } 15208 }; 15209
vendor: 9,373 bytes, lines 15210-15605
15210 // Support: Promises/A+ section 2.3.3.3.1 15211 // https://promisesaplus.com/#point-57 15212 // Re-resolve promises immediately to dodge false rejection from 15213 // subsequent errors 15214 if ( depth ) { 15215 process(); 15216 } else { 15217 15218 // Call an optional hook to record the stack, in case of exception 15219 // since it's otherwise lost when execution goes async 15220 if ( jQuery.Deferred.getStackHook ) { 15221 process.stackTrace = jQuery.Deferred.getStackHook(); 15222 } 15223 window.setTimeout( process ); 15224 } 15225 }; 15226 } 15227 15228 return jQuery.Deferred( function( newDefer ) { 15229 15230 // progress_handlers.add( ... ) 15231 tuples[ 0 ][ 3 ].add( 15232 resolve( 15233 0, 15234 newDefer, 15235 isFunction( onProgress ) ? 15236 onProgress : 15237 Identity, 15238 newDefer.notifyWith 15239 ) 15240 ); 15241 15242 // fulfilled_handlers.add( ... ) 15243 tuples[ 1 ][ 3 ].add( 15244 resolve( 15245 0, 15246 newDefer, 15247 isFunction( onFulfilled ) ? 15248 onFulfilled : 15249 Identity 15250 ) 15251 ); 15252 15253 // rejected_handlers.add( ... ) 15254 tuples[ 2 ][ 3 ].add( 15255 resolve( 15256 0, 15257 newDefer, 15258 isFunction( onRejected ) ? 15259 onRejected : 15260 Thrower 15261 ) 15262 ); 15263 } ).promise(); 15264 }, 15265 15266 // Get a promise for this deferred 15267 // If obj is provided, the promise aspect is added to the object 15268 promise: function( obj ) { 15269 return obj != null ? jQuery.extend( obj, promise ) : promise; 15270 } 15271 }, 15272 deferred = {}; 15273 15274 // Add list-specific methods 15275 jQuery.each( tuples, function( i, tuple ) { 15276 var list = tuple[ 2 ], 15277 stateString = tuple[ 5 ]; 15278 15279 // promise.progress = list.add 15280 // promise.done = list.add 15281 // promise.fail = list.add 15282 promise[ tuple[ 1 ] ] = list.add; 15283 15284 // Handle state 15285 if ( stateString ) { 15286 list.add( 15287 function() { 15288 15289 // state = "resolved" (i.e., fulfilled) 15290 // state = "rejected" 15291 state = stateString; 15292 }, 15293 15294 // rejected_callbacks.disable 15295 // fulfilled_callbacks.disable 15296 tuples[ 3 - i ][ 2 ].disable, 15297 15298 // rejected_handlers.disable 15299 // fulfilled_handlers.disable 15300 tuples[ 3 - i ][ 3 ].disable, 15301 15302 // progress_callbacks.lock 15303 tuples[ 0 ][ 2 ].lock, 15304 15305 // progress_handlers.lock 15306 tuples[ 0 ][ 3 ].lock 15307 ); 15308 } 15309 15310 // progress_handlers.fire 15311 // fulfilled_handlers.fire 15312 // rejected_handlers.fire 15313 list.add( tuple[ 3 ].fire ); 15314 15315 // deferred.notify = function() { deferred.notifyWith(...) } 15316 // deferred.resolve = function() { deferred.resolveWith(...) } 15317 // deferred.reject = function() { deferred.rejectWith(...) } 15318 deferred[ tuple[ 0 ] ] = function() { 15319 deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); 15320 return this; 15321 }; 15322 15323 // deferred.notifyWith = list.fireWith 15324 // deferred.resolveWith = list.fireWith 15325 // deferred.rejectWith = list.fireWith 15326 deferred[ tuple[ 0 ] + "With" ] = list.fireWith; 15327 } ); 15328 15329 // Make the deferred a promise 15330 promise.promise( deferred ); 15331 15332 // Call given func if any 15333 if ( func ) { 15334 func.call( deferred, deferred ); 15335 } 15336 15337 // All done! 15338 return deferred; 15339 }, 15340 15341 // Deferred helper 15342 when: function( singleValue ) { 15343 var 15344 15345 // count of uncompleted subordinates 15346 remaining = arguments.length, 15347 15348 // count of unprocessed arguments 15349 i = remaining, 15350 15351 // subordinate fulfillment data 15352 resolveContexts = Array( i ), 15353 resolveValues = slice.call( arguments ), 15354 15355 // the primary Deferred 15356 primary = jQuery.Deferred(), 15357 15358 // subordinate callback factory 15359 updateFunc = function( i ) { 15360 return function( value ) { 15361 resolveContexts[ i ] = this; 15362 resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; 15363 if ( !( --remaining ) ) { 15364 primary.resolveWith( resolveContexts, resolveValues ); 15365 } 15366 }; 15367 }; 15368 15369 // Single- and empty arguments are adopted like Promise.resolve 15370 if ( remaining <= 1 ) { 15371 adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, 15372 !remaining ); 15373 15374 // Use .then() to unwrap secondary thenables (cf. gh-3000) 15375 if ( primary.state() === "pending" || 15376 isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { 15377 15378 return primary.then(); 15379 } 15380 } 15381 15382 // Multiple arguments are aggregated like Promise.all array elements 15383 while ( i-- ) { 15384 adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); 15385 } 15386 15387 return primary.promise(); 15388 } 15389} ); 15390 15391 15392// These usually indicate a programmer mistake during development, 15393// warn about them ASAP rather than swallowing them by default. 15394var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; 15395 15396jQuery.Deferred.exceptionHook = function( error, stack ) { 15397 15398 // Support: IE 8 - 9 only 15399 // Console exists when dev tools are open, which can happen at any time 15400 if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { 15401 window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); 15402 } 15403}; 15404 15405 15406 15407 15408jQuery.readyException = function( error ) { 15409 window.setTimeout( function() { 15410 throw error; 15411 } ); 15412}; 15413 15414 15415 15416 15417// The deferred used on DOM ready 15418var readyList = jQuery.Deferred(); 15419 15420jQuery.fn.ready = function( fn ) { 15421 15422 readyList 15423 .then( fn ) 15424 15425 // Wrap jQuery.readyException in a function so that the lookup 15426 // happens at the time of error handling instead of callback 15427 // registration. 15428 .catch( function( error ) { 15429 jQuery.readyException( error ); 15430 } ); 15431 15432 return this; 15433}; 15434 15435jQuery.extend( { 15436 15437 // Is the DOM ready to be used? Set to true once it occurs. 15438 isReady: false, 15439 15440 // A counter to track how many items to wait for before 15441 // the ready event fires. See trac-6781 15442 readyWait: 1, 15443 15444 // Handle when the DOM is ready 15445 ready: function( wait ) { 15446 15447 // Abort if there are pending holds or we're already ready 15448 if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { 15449 return; 15450 } 15451 15452 // Remember that the DOM is ready 15453 jQuery.isReady = true; 15454 15455 // If a normal DOM Ready event fired, decrement, and wait if need be 15456 if ( wait !== true && --jQuery.readyWait > 0 ) { 15457 return; 15458 } 15459 15460 // If there are functions bound, to execute 15461 readyList.resolveWith( document, [ jQuery ] ); 15462 } 15463} ); 15464 15465jQuery.ready.then = readyList.then; 15466 15467// The ready event handler and self cleanup method 15468function completed() { 15469 document.removeEventListener( "DOMContentLoaded", completed ); 15470 window.removeEventListener( "load", completed ); 15471 jQuery.ready(); 15472} 15473 15474// Catch cases where $(document).ready() is called 15475// after the browser event has already occurred. 15476// Support: IE <=9 - 10 only 15477// Older IE sometimes signals "interactive" too soon 15478if ( document.readyState === "complete" || 15479 ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { 15480 15481 // Handle it asynchronously to allow scripts the opportunity to delay ready 15482 window.setTimeout( jQuery.ready ); 15483 15484} else { 15485 15486 // Use the handy event callback 15487 document.addEventListener( "DOMContentLoaded", completed ); 15488 15489 // A fallback to window.onload, that will always work 15490 window.addEventListener( "load", completed ); 15491} 15492 15493 15494 15495 15496// Multifunctional method to get and set values of a collection 15497// The value/s can optionally be executed if it's a function 15498var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { 15499 var i = 0, 15500 len = elems.length, 15501 bulk = key == null; 15502 15503 // Sets many values 15504 if ( toType( key ) === "object" ) { 15505 chainable = true; 15506 for ( i in key ) { 15507 access( elems, fn, i, key[ i ], true, emptyGet, raw ); 15508 } 15509 15510 // Sets one value 15511 } else if ( value !== undefined ) { 15512 chainable = true; 15513 15514 if ( !isFunction( value ) ) { 15515 raw = true; 15516 } 15517 15518 if ( bulk ) { 15519 15520 // Bulk operations run against the entire set 15521 if ( raw ) { 15522 fn.call( elems, value ); 15523 fn = null; 15524 15525 // ...except when executing function values 15526 } else { 15527 bulk = fn; 15528 fn = function( elem, _key, value ) { 15529 return bulk.call( jQuery( elem ), value ); 15530 }; 15531 } 15532 } 15533 15534 if ( fn ) { 15535 for ( ; i < len; i++ ) { 15536 fn( 15537 elems[ i ], key, raw ? 15538 value : 15539 value.call( elems[ i ], i, fn( elems[ i ], key ) ) 15540 ); 15541 } 15542 } 15543 } 15544 15545 if ( chainable ) { 15546 return elems; 15547 } 15548 15549 // Gets 15550 if ( bulk ) { 15551 return fn.call( elems ); 15552 } 15553 15554 return len ? fn( elems[ 0 ], key ) : emptyGet; 15555}; 15556 15557 15558// Matches dashed string for camelizing 15559var rmsPrefix = /^-ms-/, 15560 rdashAlpha = /-([a-z])/g; 15561 15562// Used by camelCase as callback to replace() 15563function fcamelCase( _all, letter ) { 15564 return letter.toUpperCase(); 15565} 15566 15567// Convert dashed to camelCase; used by the css and data modules 15568// Support: IE <=9 - 11, Edge 12 - 15 15569// Microsoft forgot to hump their vendor prefix (trac-9572) 15570function camelCase( string ) { 15571 return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); 15572} 15573var acceptData = function( owner ) { 15574 15575 // Accepts only: 15576 // - Node 15577 // - Node.ELEMENT_NODE 15578 // - Node.DOCUMENT_NODE 15579 // - Object 15580 // - Any 15581 return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); 15582}; 15583 15584 15585 15586 15587function Data() { 15588 this.expando = jQuery.expando + Data.uid++; 15589} 15590 15591Data.uid = 1; 15592 15593Data.prototype = { 15594 15595 cache: function( owner ) { 15596 15597 // Check if the owner object already has a cache 15598 var value = owner[ this.expando ]; 15599 15600 // If not, create one 15601 if ( !value ) { 15602 value = {}; 15603 15604 // We can accept data for non-element nodes in modern browsers, 15605 // but we should not, see trac-
vendor: 5,955 bytes, lines 15605-15844
156058335. 15606 // Always return an empty object. 15607 if ( acceptData( owner ) ) { 15608 15609 // If it is a node unlikely to be stringify-ed or looped over 15610 // use plain assignment 15611 if ( owner.nodeType ) { 15612 owner[ this.expando ] = value; 15613 15614 // Otherwise secure it in a non-enumerable property 15615 // configurable must be true to allow the property to be 15616 // deleted when data is removed 15617 } else { 15618 Object.defineProperty( owner, this.expando, { 15619 value: value, 15620 configurable: true 15621 } ); 15622 } 15623 } 15624 } 15625 15626 return value; 15627 }, 15628 set: function( owner, data, value ) { 15629 var prop, 15630 cache = this.cache( owner ); 15631 15632 // Handle: [ owner, key, value ] args 15633 // Always use camelCase key (gh-2257) 15634 if ( typeof data === "string" ) { 15635 cache[ camelCase( data ) ] = value; 15636 15637 // Handle: [ owner, { properties } ] args 15638 } else { 15639 15640 // Copy the properties one-by-one to the cache object 15641 for ( prop in data ) { 15642 cache[ camelCase( prop ) ] = data[ prop ]; 15643 } 15644 } 15645 return cache; 15646 }, 15647 get: function( owner, key ) { 15648 return key === undefined ? 15649 this.cache( owner ) : 15650 15651 // Always use camelCase key (gh-2257) 15652 owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; 15653 }, 15654 access: function( owner, key, value ) { 15655 15656 // In cases where either: 15657 // 15658 // 1. No key was specified 15659 // 2. A string key was specified, but no value provided 15660 // 15661 // Take the "read" path and allow the get method to determine 15662 // which value to return, respectively either: 15663 // 15664 // 1. The entire cache object 15665 // 2. The data stored at the key 15666 // 15667 if ( key === undefined || 15668 ( ( key && typeof key === "string" ) && value === undefined ) ) { 15669 15670 return this.get( owner, key ); 15671 } 15672 15673 // When the key is not a string, or both a key and value 15674 // are specified, set or extend (existing objects) with either: 15675 // 15676 // 1. An object of properties 15677 // 2. A key and value 15678 // 15679 this.set( owner, key, value ); 15680 15681 // Since the "set" path can have two possible entry points 15682 // return the expected data based on which path was taken[*] 15683 return value !== undefined ? value : key; 15684 }, 15685 remove: function( owner, key ) { 15686 var i, 15687 cache = owner[ this.expando ]; 15688 15689 if ( cache === undefined ) { 15690 return; 15691 } 15692 15693 if ( key !== undefined ) { 15694 15695 // Support array or space separated string of keys 15696 if ( Array.isArray( key ) ) { 15697 15698 // If key is an array of keys... 15699 // We always set camelCase keys, so remove that. 15700 key = key.map( camelCase ); 15701 } else { 15702 key = camelCase( key ); 15703 15704 // If a key with the spaces exists, use it. 15705 // Otherwise, create an array by matching non-whitespace 15706 key = key in cache ? 15707 [ key ] : 15708 ( key.match( rnothtmlwhite ) || [] ); 15709 } 15710 15711 i = key.length; 15712 15713 while ( i-- ) { 15714 delete cache[ key[ i ] ]; 15715 } 15716 } 15717 15718 // Remove the expando if there's no more data 15719 if ( key === undefined || jQuery.isEmptyObject( cache ) ) { 15720 15721 // Support: Chrome <=35 - 45 15722 // Webkit & Blink performance suffers when deleting properties 15723 // from DOM nodes, so set to undefined instead 15724 // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) 15725 if ( owner.nodeType ) { 15726 owner[ this.expando ] = undefined; 15727 } else { 15728 delete owner[ this.expando ]; 15729 } 15730 } 15731 }, 15732 hasData: function( owner ) { 15733 var cache = owner[ this.expando ]; 15734 return cache !== undefined && !jQuery.isEmptyObject( cache ); 15735 } 15736}; 15737var dataPriv = new Data(); 15738 15739var dataUser = new Data(); 15740 15741 15742 15743// Implementation Summary 15744// 15745// 1. Enforce API surface and semantic compatibility with 1.9.x branch 15746// 2. Improve the module's maintainability by reducing the storage 15747// paths to a single mechanism. 15748// 3. Use the same single mechanism to support "private" and "user" data. 15749// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) 15750// 5. Avoid exposing implementation details on user objects (eg. expando properties) 15751// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 15752 15753var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, 15754 rmultiDash = /[A-Z]/g; 15755 15756function getData( data ) { 15757 if ( data === "true" ) { 15758 return true; 15759 } 15760 15761 if ( data === "false" ) { 15762 return false; 15763 } 15764 15765 if ( data === "null" ) { 15766 return null; 15767 } 15768 15769 // Only convert to a number if it doesn't change the string 15770 if ( data === +data + "" ) { 15771 return +data; 15772 } 15773 15774 if ( rbrace.test( data ) ) { 15775 return JSON.parse( data ); 15776 } 15777 15778 return data; 15779} 15780 15781function dataAttr( elem, key, data ) { 15782 var name; 15783 15784 // If nothing was found internally, try to fetch any 15785 // data from the HTML5 data-* attribute 15786 if ( data === undefined && elem.nodeType === 1 ) { 15787 name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); 15788 data = elem.getAttribute( name ); 15789 15790 if ( typeof data === "string" ) { 15791 try { 15792 data = getData( data ); 15793 } catch ( e ) {} 15794 15795 // Make sure we set the data so it isn't changed later 15796 dataUser.set( elem, key, data ); 15797 } else { 15798 data = undefined; 15799 } 15800 } 15801 return data; 15802} 15803 15804jQuery.extend( { 15805 hasData: function( elem ) { 15806 return dataUser.hasData( elem ) || dataPriv.hasData( elem ); 15807 }, 15808 15809 data: function( elem, name, data ) { 15810 return dataUser.access( elem, name, data ); 15811 }, 15812 15813 removeData: function( elem, name ) { 15814 dataUser.remove( elem, name ); 15815 }, 15816 15817 // TODO: Now that all calls to _data and _removeData have been replaced 15818 // with direct calls to dataPriv methods, these can be deprecated. 15819 _data: function( elem, name, data ) { 15820 return dataPriv.access( elem, name, data ); 15821 }, 15822 15823 _removeData: function( elem, name ) { 15824 dataPriv.remove( elem, name ); 15825 } 15826} ); 15827 15828jQuery.fn.extend( { 15829 data: function( key, value ) { 15830 var i, name, data, 15831 elem = this[ 0 ], 15832 attrs = elem && elem.attributes; 15833 15834 // Gets all values 15835 if ( key === undefined ) { 15836 if ( this.length ) { 15837 data = dataUser.get( elem ); 15838 15839 if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { 15840 i = attrs.length; 15841 while ( i-- ) { 15842 15843 // Support: IE 11 only 15844 // The attrs elements can be null (
vendor: 15,187 bytes, lines 15844-16456
15844trac-14894) 15845 if ( attrs[ i ] ) { 15846 name = attrs[ i ].name; 15847 if ( name.indexOf( "data-" ) === 0 ) { 15848 name = camelCase( name.slice( 5 ) ); 15849 dataAttr( elem, name, data[ name ] ); 15850 } 15851 } 15852 } 15853 dataPriv.set( elem, "hasDataAttrs", true ); 15854 } 15855 } 15856 15857 return data; 15858 } 15859 15860 // Sets multiple values 15861 if ( typeof key === "object" ) { 15862 return this.each( function() { 15863 dataUser.set( this, key ); 15864 } ); 15865 } 15866 15867 return access( this, function( value ) { 15868 var data; 15869 15870 // The calling jQuery object (element matches) is not empty 15871 // (and therefore has an element appears at this[ 0 ]) and the 15872 // `value` parameter was not undefined. An empty jQuery object 15873 // will result in `undefined` for elem = this[ 0 ] which will 15874 // throw an exception if an attempt to read a data cache is made. 15875 if ( elem && value === undefined ) { 15876 15877 // Attempt to get data from the cache 15878 // The key will always be camelCased in Data 15879 data = dataUser.get( elem, key ); 15880 if ( data !== undefined ) { 15881 return data; 15882 } 15883 15884 // Attempt to "discover" the data in 15885 // HTML5 custom data-* attrs 15886 data = dataAttr( elem, key ); 15887 if ( data !== undefined ) { 15888 return data; 15889 } 15890 15891 // We tried really hard, but the data doesn't exist. 15892 return; 15893 } 15894 15895 // Set the data... 15896 this.each( function() { 15897 15898 // We always store the camelCased key 15899 dataUser.set( this, key, value ); 15900 } ); 15901 }, null, value, arguments.length > 1, null, true ); 15902 }, 15903 15904 removeData: function( key ) { 15905 return this.each( function() { 15906 dataUser.remove( this, key ); 15907 } ); 15908 } 15909} ); 15910 15911 15912jQuery.extend( { 15913 queue: function( elem, type, data ) { 15914 var queue; 15915 15916 if ( elem ) { 15917 type = ( type || "fx" ) + "queue"; 15918 queue = dataPriv.get( elem, type ); 15919 15920 // Speed up dequeue by getting out quickly if this is just a lookup 15921 if ( data ) { 15922 if ( !queue || Array.isArray( data ) ) { 15923 queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); 15924 } else { 15925 queue.push( data ); 15926 } 15927 } 15928 return queue || []; 15929 } 15930 }, 15931 15932 dequeue: function( elem, type ) { 15933 type = type || "fx"; 15934 15935 var queue = jQuery.queue( elem, type ), 15936 startLength = queue.length, 15937 fn = queue.shift(), 15938 hooks = jQuery._queueHooks( elem, type ), 15939 next = function() { 15940 jQuery.dequeue( elem, type ); 15941 }; 15942 15943 // If the fx queue is dequeued, always remove the progress sentinel 15944 if ( fn === "inprogress" ) { 15945 fn = queue.shift(); 15946 startLength--; 15947 } 15948 15949 if ( fn ) { 15950 15951 // Add a progress sentinel to prevent the fx queue from being 15952 // automatically dequeued 15953 if ( type === "fx" ) { 15954 queue.unshift( "inprogress" ); 15955 } 15956 15957 // Clear up the last queue stop function 15958 delete hooks.stop; 15959 fn.call( elem, next, hooks ); 15960 } 15961 15962 if ( !startLength && hooks ) { 15963 hooks.empty.fire(); 15964 } 15965 }, 15966 15967 // Not public - generate a queueHooks object, or return the current one 15968 _queueHooks: function( elem, type ) { 15969 var key = type + "queueHooks"; 15970 return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { 15971 empty: jQuery.Callbacks( "once memory" ).add( function() { 15972 dataPriv.remove( elem, [ type + "queue", key ] ); 15973 } ) 15974 } ); 15975 } 15976} ); 15977 15978jQuery.fn.extend( { 15979 queue: function( type, data ) { 15980 var setter = 2; 15981 15982 if ( typeof type !== "string" ) { 15983 data = type; 15984 type = "fx"; 15985 setter--; 15986 } 15987 15988 if ( arguments.length < setter ) { 15989 return jQuery.queue( this[ 0 ], type ); 15990 } 15991 15992 return data === undefined ? 15993 this : 15994 this.each( function() { 15995 var queue = jQuery.queue( this, type, data ); 15996 15997 // Ensure a hooks for this queue 15998 jQuery._queueHooks( this, type ); 15999 16000 if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { 16001 jQuery.dequeue( this, type ); 16002 } 16003 } ); 16004 }, 16005 dequeue: function( type ) { 16006 return this.each( function() { 16007 jQuery.dequeue( this, type ); 16008 } ); 16009 }, 16010 clearQueue: function( type ) { 16011 return this.queue( type || "fx", [] ); 16012 }, 16013 16014 // Get a promise resolved when queues of a certain type 16015 // are emptied (fx is the type by default) 16016 promise: function( type, obj ) { 16017 var tmp, 16018 count = 1, 16019 defer = jQuery.Deferred(), 16020 elements = this, 16021 i = this.length, 16022 resolve = function() { 16023 if ( !( --count ) ) { 16024 defer.resolveWith( elements, [ elements ] ); 16025 } 16026 }; 16027 16028 if ( typeof type !== "string" ) { 16029 obj = type; 16030 type = undefined; 16031 } 16032 type = type || "fx"; 16033 16034 while ( i-- ) { 16035 tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); 16036 if ( tmp && tmp.empty ) { 16037 count++; 16038 tmp.empty.add( resolve ); 16039 } 16040 } 16041 resolve(); 16042 return defer.promise( obj ); 16043 } 16044} ); 16045var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; 16046 16047var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); 16048 16049 16050var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; 16051 16052var documentElement = document.documentElement; 16053 16054 16055 16056 var isAttached = function( elem ) { 16057 return jQuery.contains( elem.ownerDocument, elem ); 16058 }, 16059 composed = { composed: true }; 16060 16061 // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only 16062 // Check attachment across shadow DOM boundaries when possible (gh-3504) 16063 // Support: iOS 10.0-10.2 only 16064 // Early iOS 10 versions support `attachShadow` but not `getRootNode`, 16065 // leading to errors. We need to check for `getRootNode`. 16066 if ( documentElement.getRootNode ) { 16067 isAttached = function( elem ) { 16068 return jQuery.contains( elem.ownerDocument, elem ) || 16069 elem.getRootNode( composed ) === elem.ownerDocument; 16070 }; 16071 } 16072var isHiddenWithinTree = function( elem, el ) { 16073 16074 // isHiddenWithinTree might be called from jQuery#filter function; 16075 // in that case, element will be second argument 16076 elem = el || elem; 16077 16078 // Inline style trumps all 16079 return elem.style.display === "none" || 16080 elem.style.display === "" && 16081 16082 // Otherwise, check computed style 16083 // Support: Firefox <=43 - 45 16084 // Disconnected elements can have computed display: none, so first confirm that elem is 16085 // in the document. 16086 isAttached( elem ) && 16087 16088 jQuery.css( elem, "display" ) === "none"; 16089 }; 16090 16091 16092 16093function adjustCSS( elem, prop, valueParts, tween ) { 16094 var adjusted, scale, 16095 maxIterations = 20, 16096 currentValue = tween ? 16097 function() { 16098 return tween.cur(); 16099 } : 16100 function() { 16101 return jQuery.css( elem, prop, "" ); 16102 }, 16103 initial = currentValue(), 16104 unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), 16105 16106 // Starting value computation is required for potential unit mismatches 16107 initialInUnit = elem.nodeType && 16108 ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && 16109 rcssNum.exec( jQuery.css( elem, prop ) ); 16110 16111 if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { 16112 16113 // Support: Firefox <=54 16114 // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) 16115 initial = initial / 2; 16116 16117 // Trust units reported by jQuery.css 16118 unit = unit || initialInUnit[ 3 ]; 16119 16120 // Iteratively approximate from a nonzero starting point 16121 initialInUnit = +initial || 1; 16122 16123 while ( maxIterations-- ) { 16124 16125 // Evaluate and update our best guess (doubling guesses that zero out). 16126 // Finish if the scale equals or crosses 1 (making the old*new product non-positive). 16127 jQuery.style( elem, prop, initialInUnit + unit ); 16128 if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { 16129 maxIterations = 0; 16130 } 16131 initialInUnit = initialInUnit / scale; 16132 16133 } 16134 16135 initialInUnit = initialInUnit * 2; 16136 jQuery.style( elem, prop, initialInUnit + unit ); 16137 16138 // Make sure we update the tween properties later on 16139 valueParts = valueParts || []; 16140 } 16141 16142 if ( valueParts ) { 16143 initialInUnit = +initialInUnit || +initial || 0; 16144 16145 // Apply relative offset (+=/-=) if specified 16146 adjusted = valueParts[ 1 ] ? 16147 initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : 16148 +valueParts[ 2 ]; 16149 if ( tween ) { 16150 tween.unit = unit; 16151 tween.start = initialInUnit; 16152 tween.end = adjusted; 16153 } 16154 } 16155 return adjusted; 16156} 16157 16158 16159var defaultDisplayMap = {}; 16160 16161function getDefaultDisplay( elem ) { 16162 var temp, 16163 doc = elem.ownerDocument, 16164 nodeName = elem.nodeName, 16165 display = defaultDisplayMap[ nodeName ]; 16166 16167 if ( display ) { 16168 return display; 16169 } 16170 16171 temp = doc.body.appendChild( doc.createElement( nodeName ) ); 16172 display = jQuery.css( temp, "display" ); 16173 16174 temp.parentNode.removeChild( temp ); 16175 16176 if ( display === "none" ) { 16177 display = "block"; 16178 } 16179 defaultDisplayMap[ nodeName ] = display; 16180 16181 return display; 16182} 16183 16184function showHide( elements, show ) { 16185 var display, elem, 16186 values = [], 16187 index = 0, 16188 length = elements.length; 16189 16190 // Determine new display value for elements that need to change 16191 for ( ; index < length; index++ ) { 16192 elem = elements[ index ]; 16193 if ( !elem.style ) { 16194 continue; 16195 } 16196 16197 display = elem.style.display; 16198 if ( show ) { 16199 16200 // Since we force visibility upon cascade-hidden elements, an immediate (and slow) 16201 // check is required in this first loop unless we have a nonempty display value (either 16202 // inline or about-to-be-restored) 16203 if ( display === "none" ) { 16204 values[ index ] = dataPriv.get( elem, "display" ) || null; 16205 if ( !values[ index ] ) { 16206 elem.style.display = ""; 16207 } 16208 } 16209 if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { 16210 values[ index ] = getDefaultDisplay( elem ); 16211 } 16212 } else { 16213 if ( display !== "none" ) { 16214 values[ index ] = "none"; 16215 16216 // Remember what we're overwriting 16217 dataPriv.set( elem, "display", display ); 16218 } 16219 } 16220 } 16221 16222 // Set the display of the elements in a second loop to avoid constant reflow 16223 for ( index = 0; index < length; index++ ) { 16224 if ( values[ index ] != null ) { 16225 elements[ index ].style.display = values[ index ]; 16226 } 16227 } 16228 16229 return elements; 16230} 16231 16232jQuery.fn.extend( { 16233 show: function() { 16234 return showHide( this, true ); 16235 }, 16236 hide: function() { 16237 return showHide( this ); 16238 }, 16239 toggle: function( state ) { 16240 if ( typeof state === "boolean" ) { 16241 return state ? this.show() : this.hide(); 16242 } 16243 16244 return this.each( function() { 16245 if ( isHiddenWithinTree( this ) ) { 16246 jQuery( this ).show(); 16247 } else { 16248 jQuery( this ).hide(); 16249 } 16250 } ); 16251 } 16252} ); 16253var rcheckableType = ( /^(?:checkbox|radio)$/i ); 16254 16255var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); 16256 16257var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); 16258 16259 16260 16261( function() { 16262 var fragment = document.createDocumentFragment(), 16263 div = fragment.appendChild( document.createElement( "div" ) ), 16264 input = document.createElement( "input" ); 16265 16266 // Support: Android 4.0 - 4.3 only 16267 // Check state lost if the name is set (trac-11217) 16268 // Support: Windows Web Apps (WWA) 16269 // `name` and `type` must use .setAttribute for WWA (trac-14901) 16270 input.setAttribute( "type", "radio" ); 16271 input.setAttribute( "checked", "checked" ); 16272 input.setAttribute( "name", "t" ); 16273 16274 div.appendChild( input ); 16275 16276 // Support: Android <=4.1 only 16277 // Older WebKit doesn't clone checked state correctly in fragments 16278 support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; 16279 16280 // Support: IE <=11 only 16281 // Make sure textarea (and checkbox) defaultValue is properly cloned 16282 div.innerHTML = "<textarea>x</textarea>"; 16283 support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; 16284 16285 // Support: IE <=9 only 16286 // IE <=9 replaces <option> tags with their contents when inserted outside of 16287 // the select element. 16288 div.innerHTML = "<option></option>"; 16289 support.option = !!div.lastChild; 16290} )(); 16291 16292 16293// We have to close these tags to support XHTML (trac-13200) 16294var wrapMap = { 16295 16296 // XHTML parsers do not magically insert elements in the 16297 // same way that tag soup parsers do. So we cannot shorten 16298 // this by omitting <tbody> or other required elements. 16299 thead: [ 1, "<table>", "</table>" ], 16300 col: [ 2, "<table><colgroup>", "</colgroup></table>" ], 16301 tr: [ 2, "<table><tbody>", "</tbody></table>" ], 16302 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], 16303 16304 _default: [ 0, "", "" ] 16305}; 16306 16307wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; 16308wrapMap.th = wrapMap.td; 16309 16310// Support: IE <=9 only 16311if ( !support.option ) { 16312 wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ]; 16313} 16314 16315 16316function getAll( context, tag ) { 16317 16318 // Support: IE <=9 - 11 only 16319 // Use typeof to avoid zero-argument method invocation on host objects (trac-15151) 16320 var ret; 16321 16322 if ( typeof context.getElementsByTagName !== "undefined" ) { 16323 ret = context.getElementsByTagName( tag || "*" ); 16324 16325 } else if ( typeof context.querySelectorAll !== "undefined" ) { 16326 ret = context.querySelectorAll( tag || "*" ); 16327 16328 } else { 16329 ret = []; 16330 } 16331 16332 if ( tag === undefined || tag && nodeName( context, tag ) ) { 16333 return jQuery.merge( [ context ], ret ); 16334 } 16335 16336 return ret; 16337} 16338 16339 16340// Mark scripts as having already been evaluated 16341function setGlobalEval( elems, refElements ) { 16342 var i = 0, 16343 l = elems.length; 16344 16345 for ( ; i < l; i++ ) { 16346 dataPriv.set( 16347 elems[ i ], 16348 "globalEval", 16349 !refElements || dataPriv.get( refElements[ i ], "globalEval" ) 16350 ); 16351 } 16352} 16353 16354 16355var rhtml = /<|&#?\w+;/; 16356 16357function buildFragment( elems, context, scripts, selection, ignored ) { 16358 var elem, tmp, tag, wrap, attached, j, 16359 fragment = context.createDocumentFragment(), 16360 nodes = [], 16361 i = 0, 16362 l = elems.length; 16363 16364 for ( ; i < l; i++ ) { 16365 elem = elems[ i ]; 16366 16367 if ( elem || elem === 0 ) { 16368 16369 // Add nodes directly 16370 if ( toType( elem ) === "object" ) { 16371 16372 // Support: Android <=4.0 only, PhantomJS 1 only 16373 // push.apply(_, arraylike) throws on ancient WebKit 16374 jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); 16375 16376 // Convert non-html into a text node 16377 } else if ( !rhtml.test( elem ) ) { 16378 nodes.push( context.createTextNode( elem ) ); 16379 16380 // Convert html into DOM nodes 16381 } else { 16382 tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); 16383 16384 // Deserialize a standard representation 16385 tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); 16386 wrap = wrapMap[ tag ] || wrapMap._default; 16387 tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; 16388 16389 // Descend through wrappers to the right content 16390 j = wrap[ 0 ]; 16391 while ( j-- ) { 16392 tmp = tmp.lastChild; 16393 } 16394 16395 // Support: Android <=4.0 only, PhantomJS 1 only 16396 // push.apply(_, arraylike) throws on ancient WebKit 16397 jQuery.merge( nodes, tmp.childNodes ); 16398 16399 // Remember the top-level container 16400 tmp = fragment.firstChild; 16401 16402 // Ensure the created nodes are orphaned (trac-12392) 16403 tmp.textContent = ""; 16404 } 16405 } 16406 } 16407 16408 // Remove wrapper from fragment 16409 fragment.textContent = ""; 16410 16411 i = 0; 16412 while ( ( elem = nodes[ i++ ] ) ) { 16413 16414 // Skip elements already in the context collection (trac-4087) 16415 if ( selection && jQuery.inArray( elem, selection ) > -1 ) { 16416 if ( ignored ) { 16417 ignored.push( elem ); 16418 } 16419 continue; 16420 } 16421 16422 attached = isAttached( elem ); 16423 16424 // Append to fragment 16425 tmp = getAll( fragment.appendChild( elem ), "script" ); 16426 16427 // Preserve script evaluation history 16428 if ( attached ) { 16429 setGlobalEval( tmp ); 16430 } 16431 16432 // Capture executables 16433 if ( scripts ) { 16434 j = 0; 16435 while ( ( elem = tmp[ j++ ] ) ) { 16436 if ( rscriptType.test( elem.type || "" ) ) { 16437 scripts.push( elem ); 16438 } 16439 } 16440 } 16441 } 16442 16443 return fragment; 16444} 16445 16446 16447var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; 16448 16449function returnTrue() { 16450 return true; 16451} 16452 16453function returnFalse() { 16454 return false; 16455} 16456
16457// Support: IE <=9 - 11+ 16458// focus() and blur() are asynchronous, except when they are no-op. 16459// So expect focus to be synchronous when the element is already active, 16460// and blur to be synchronous when the element is not already active. 16461// (focus and blur are always synchronous in other supported browsers, 16462// this just defines when we can count on it). 16463function expectSync( elem, type ) { 16464 return ( elem === safeActiveElement() ) === ( type === "focus" ); 16465} 16466 16467// Support: IE <=9 only 16468// Accessing document.activeElement can throw unexpectedly 16469// https://bugs.jquery.com/ticket/13393 16470function safeActiveElement() { 16471 try { 16472 return document.activeElement; 16473 } catch ( err ) { }
vendor: 12,476 bytes, lines 16473-16913
16473 16474} 16475 16476function on( elem, types, selector, data, fn, one ) { 16477 var origFn, type; 16478 16479 // Types can be a map of types/handlers 16480 if ( typeof types === "object" ) { 16481 16482 // ( types-Object, selector, data ) 16483 if ( typeof selector !== "string" ) { 16484 16485 // ( types-Object, data ) 16486 data = data || selector; 16487 selector = undefined; 16488 } 16489 for ( type in types ) { 16490 on( elem, type, selector, data, types[ type ], one ); 16491 } 16492 return elem; 16493 } 16494 16495 if ( data == null && fn == null ) { 16496 16497 // ( types, fn ) 16498 fn = selector; 16499 data = selector = undefined; 16500 } else if ( fn == null ) { 16501 if ( typeof selector === "string" ) { 16502 16503 // ( types, selector, fn ) 16504 fn = data; 16505 data = undefined; 16506 } else { 16507 16508 // ( types, data, fn ) 16509 fn = data; 16510 data = selector; 16511 selector = undefined; 16512 } 16513 } 16514 if ( fn === false ) { 16515 fn = returnFalse; 16516 } else if ( !fn ) { 16517 return elem; 16518 } 16519 16520 if ( one === 1 ) { 16521 origFn = fn; 16522 fn = function( event ) { 16523 16524 // Can use an empty set, since event contains the info 16525 jQuery().off( event ); 16526 return origFn.apply( this, arguments ); 16527 }; 16528 16529 // Use same guid so caller can remove using origFn 16530 fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); 16531 } 16532 return elem.each( function() { 16533 jQuery.event.add( this, types, fn, data, selector ); 16534 } ); 16535} 16536 16537/* 16538 * Helper functions for managing events -- not part of the public interface. 16539 * Props to Dean Edwards' addEvent library for many of the ideas. 16540 */ 16541jQuery.event = { 16542 16543 global: {}, 16544 16545 add: function( elem, types, handler, data, selector ) { 16546 16547 var handleObjIn, eventHandle, tmp, 16548 events, t, handleObj, 16549 special, handlers, type, namespaces, origType, 16550 elemData = dataPriv.get( elem ); 16551 16552 // Only attach events to objects that accept data 16553 if ( !acceptData( elem ) ) { 16554 return; 16555 } 16556 16557 // Caller can pass in an object of custom data in lieu of the handler 16558 if ( handler.handler ) { 16559 handleObjIn = handler; 16560 handler = handleObjIn.handler; 16561 selector = handleObjIn.selector; 16562 } 16563 16564 // Ensure that invalid selectors throw exceptions at attach time 16565 // Evaluate against documentElement in case elem is a non-element node (e.g., document) 16566 if ( selector ) { 16567 jQuery.find.matchesSelector( documentElement, selector ); 16568 } 16569 16570 // Make sure that the handler has a unique ID, used to find/remove it later 16571 if ( !handler.guid ) { 16572 handler.guid = jQuery.guid++; 16573 } 16574 16575 // Init the element's event structure and main handler, if this is the first 16576 if ( !( events = elemData.events ) ) { 16577 events = elemData.events = Object.create( null ); 16578 } 16579 if ( !( eventHandle = elemData.handle ) ) { 16580 eventHandle = elemData.handle = function( e ) { 16581 16582 // Discard the second event of a jQuery.event.trigger() and 16583 // when an event is called after a page has unloaded 16584 return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? 16585 jQuery.event.dispatch.apply( elem, arguments ) : undefined; 16586 }; 16587 } 16588 16589 // Handle multiple events separated by a space 16590 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 16591 t = types.length; 16592 while ( t-- ) { 16593 tmp = rtypenamespace.exec( types[ t ] ) || []; 16594 type = origType = tmp[ 1 ]; 16595 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 16596 16597 // There *must* be a type, no attaching namespace-only handlers 16598 if ( !type ) { 16599 continue; 16600 } 16601 16602 // If event changes its type, use the special event handlers for the changed type 16603 special = jQuery.event.special[ type ] || {}; 16604 16605 // If selector defined, determine special event api type, otherwise given type 16606 type = ( selector ? special.delegateType : special.bindType ) || type; 16607 16608 // Update special based on newly reset type 16609 special = jQuery.event.special[ type ] || {}; 16610 16611 // handleObj is passed to all event handlers 16612 handleObj = jQuery.extend( { 16613 type: type, 16614 origType: origType, 16615 data: data, 16616 handler: handler, 16617 guid: handler.guid, 16618 selector: selector, 16619 needsContext: selector && jQuery.expr.match.needsContext.test( selector ), 16620 namespace: namespaces.join( "." ) 16621 }, handleObjIn ); 16622 16623 // Init the event handler queue if we're the first 16624 if ( !( handlers = events[ type ] ) ) { 16625 handlers = events[ type ] = []; 16626 handlers.delegateCount = 0; 16627 16628 // Only use addEventListener if the special events handler returns false 16629 if ( !special.setup || 16630 special.setup.call( elem, data, namespaces, eventHandle ) === false ) { 16631 16632 if ( elem.addEventListener ) { 16633 elem.addEventListener( type, eventHandle ); 16634 } 16635 } 16636 } 16637 16638 if ( special.add ) { 16639 special.add.call( elem, handleObj ); 16640 16641 if ( !handleObj.handler.guid ) { 16642 handleObj.handler.guid = handler.guid; 16643 } 16644 } 16645 16646 // Add to the element's handler list, delegates in front 16647 if ( selector ) { 16648 handlers.splice( handlers.delegateCount++, 0, handleObj ); 16649 } else { 16650 handlers.push( handleObj ); 16651 } 16652 16653 // Keep track of which events have ever been used, for event optimization 16654 jQuery.event.global[ type ] = true; 16655 } 16656 16657 }, 16658 16659 // Detach an event or set of events from an element 16660 remove: function( elem, types, handler, selector, mappedTypes ) { 16661 16662 var j, origCount, tmp, 16663 events, t, handleObj, 16664 special, handlers, type, namespaces, origType, 16665 elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); 16666 16667 if ( !elemData || !( events = elemData.events ) ) { 16668 return; 16669 } 16670 16671 // Once for each type.namespace in types; type may be omitted 16672 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 16673 t = types.length; 16674 while ( t-- ) { 16675 tmp = rtypenamespace.exec( types[ t ] ) || []; 16676 type = origType = tmp[ 1 ]; 16677 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 16678 16679 // Unbind all events (on this namespace, if provided) for the element 16680 if ( !type ) { 16681 for ( type in events ) { 16682 jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); 16683 } 16684 continue; 16685 } 16686 16687 special = jQuery.event.special[ type ] || {}; 16688 type = ( selector ? special.delegateType : special.bindType ) || type; 16689 handlers = events[ type ] || []; 16690 tmp = tmp[ 2 ] && 16691 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); 16692 16693 // Remove matching events 16694 origCount = j = handlers.length; 16695 while ( j-- ) { 16696 handleObj = handlers[ j ]; 16697 16698 if ( ( mappedTypes || origType === handleObj.origType ) && 16699 ( !handler || handler.guid === handleObj.guid ) && 16700 ( !tmp || tmp.test( handleObj.namespace ) ) && 16701 ( !selector || selector === handleObj.selector || 16702 selector === "**" && handleObj.selector ) ) { 16703 handlers.splice( j, 1 ); 16704 16705 if ( handleObj.selector ) { 16706 handlers.delegateCount--; 16707 } 16708 if ( special.remove ) { 16709 special.remove.call( elem, handleObj ); 16710 } 16711 } 16712 } 16713 16714 // Remove generic event handler if we removed something and no more handlers exist 16715 // (avoids potential for endless recursion during removal of special event handlers) 16716 if ( origCount && !handlers.length ) { 16717 if ( !special.teardown || 16718 special.teardown.call( elem, namespaces, elemData.handle ) === false ) { 16719 16720 jQuery.removeEvent( elem, type, elemData.handle ); 16721 } 16722 16723 delete events[ type ]; 16724 } 16725 } 16726 16727 // Remove data and the expando if it's no longer used 16728 if ( jQuery.isEmptyObject( events ) ) { 16729 dataPriv.remove( elem, "handle events" ); 16730 } 16731 }, 16732 16733 dispatch: function( nativeEvent ) { 16734 16735 var i, j, ret, matched, handleObj, handlerQueue, 16736 args = new Array( arguments.length ), 16737 16738 // Make a writable jQuery.Event from the native event object 16739 event = jQuery.event.fix( nativeEvent ), 16740 16741 handlers = ( 16742 dataPriv.get( this, "events" ) || Object.create( null ) 16743 )[ event.type ] || [], 16744 special = jQuery.event.special[ event.type ] || {}; 16745 16746 // Use the fix-ed jQuery.Event rather than the (read-only) native event 16747 args[ 0 ] = event; 16748 16749 for ( i = 1; i < arguments.length; i++ ) { 16750 args[ i ] = arguments[ i ]; 16751 } 16752 16753 event.delegateTarget = this; 16754 16755 // Call the preDispatch hook for the mapped type, and let it bail if desired 16756 if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { 16757 return; 16758 } 16759 16760 // Determine handlers 16761 handlerQueue = jQuery.event.handlers.call( this, event, handlers ); 16762 16763 // Run delegates first; they may want to stop propagation beneath us 16764 i = 0; 16765 while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { 16766 event.currentTarget = matched.elem; 16767 16768 j = 0; 16769 while ( ( handleObj = matched.handlers[ j++ ] ) && 16770 !event.isImmediatePropagationStopped() ) { 16771 16772 // If the event is namespaced, then each handler is only invoked if it is 16773 // specially universal or its namespaces are a superset of the event's. 16774 if ( !event.rnamespace || handleObj.namespace === false || 16775 event.rnamespace.test( handleObj.namespace ) ) { 16776 16777 event.handleObj = handleObj; 16778 event.data = handleObj.data; 16779 16780 ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || 16781 handleObj.handler ).apply( matched.elem, args ); 16782 16783 if ( ret !== undefined ) { 16784 if ( ( event.result = ret ) === false ) { 16785 event.preventDefault(); 16786 event.stopPropagation(); 16787 } 16788 } 16789 } 16790 } 16791 } 16792 16793 // Call the postDispatch hook for the mapped type 16794 if ( special.postDispatch ) { 16795 special.postDispatch.call( this, event ); 16796 } 16797 16798 return event.result; 16799 }, 16800 16801 handlers: function( event, handlers ) { 16802 var i, handleObj, sel, matchedHandlers, matchedSelectors, 16803 handlerQueue = [], 16804 delegateCount = handlers.delegateCount, 16805 cur = event.target; 16806 16807 // Find delegate handlers 16808 if ( delegateCount && 16809 16810 // Support: IE <=9 16811 // Black-hole SVG <use> instance trees (trac-13180) 16812 cur.nodeType && 16813 16814 // Support: Firefox <=42 16815 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) 16816 // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click 16817 // Support: IE 11 only 16818 // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) 16819 !( event.type === "click" && event.button >= 1 ) ) { 16820 16821 for ( ; cur !== this; cur = cur.parentNode || this ) { 16822 16823 // Don't check non-elements (trac-13208) 16824 // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) 16825 if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { 16826 matchedHandlers = []; 16827 matchedSelectors = {}; 16828 for ( i = 0; i < delegateCount; i++ ) { 16829 handleObj = handlers[ i ]; 16830 16831 // Don't conflict with Object.prototype properties (trac-13203) 16832 sel = handleObj.selector + " "; 16833 16834 if ( matchedSelectors[ sel ] === undefined ) { 16835 matchedSelectors[ sel ] = handleObj.needsContext ? 16836 jQuery( sel, this ).index( cur ) > -1 : 16837 jQuery.find( sel, this, null, [ cur ] ).length; 16838 } 16839 if ( matchedSelectors[ sel ] ) { 16840 matchedHandlers.push( handleObj ); 16841 } 16842 } 16843 if ( matchedHandlers.length ) { 16844 handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); 16845 } 16846 } 16847 } 16848 } 16849 16850 // Add the remaining (directly-bound) handlers 16851 cur = this; 16852 if ( delegateCount < handlers.length ) { 16853 handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); 16854 } 16855 16856 return handlerQueue; 16857 }, 16858 16859 addProp: function( name, hook ) { 16860 Object.defineProperty( jQuery.Event.prototype, name, { 16861 enumerable: true, 16862 configurable: true, 16863 16864 get: isFunction( hook ) ? 16865 function() { 16866 if ( this.originalEvent ) { 16867 return hook( this.originalEvent ); 16868 } 16869 } : 16870 function() { 16871 if ( this.originalEvent ) { 16872 return this.originalEvent[ name ]; 16873 } 16874 }, 16875 16876 set: function( value ) { 16877 Object.defineProperty( this, name, { 16878 enumerable: true, 16879 configurable: true, 16880 writable: true, 16881 value: value 16882 } ); 16883 } 16884 } ); 16885 }, 16886 16887 fix: function( originalEvent ) { 16888 return originalEvent[ jQuery.expando ] ? 16889 originalEvent : 16890 new jQuery.Event( originalEvent ); 16891 }, 16892 16893 special: { 16894 load: { 16895 16896 // Prevent triggered image.load events from bubbling to window.load 16897 noBubble: true 16898 }, 16899 click: { 16900 16901 // Utilize native event to ensure correct state for checkable inputs 16902 setup: function( data ) { 16903 16904 // For mutual compressibility with _default, replace `this` access with a local var. 16905 // `|| data` is dead code meant only to preserve the variable through minification. 16906 var el = this || data; 16907 16908 // Claim the first handler 16909 if ( rcheckableType.test( el.type ) && 16910 el.click && nodeName( el, "input" ) ) { 16911 16912 // dataPriv.set( el, "click", ... ) 16913 leverageNative( el, "click",
vendor: 2,758 bytes, lines 16913-16995
16913returnTrue ); 16914 } 16915 16916 // Return false to allow normal processing in the caller 16917 return false; 16918 }, 16919 trigger: function( data ) { 16920 16921 // For mutual compressibility with _default, replace `this` access with a local var. 16922 // `|| data` is dead code meant only to preserve the variable through minification. 16923 var el = this || data; 16924 16925 // Force setup before triggering a click 16926 if ( rcheckableType.test( el.type ) && 16927 el.click && nodeName( el, "input" ) ) { 16928 16929 leverageNative( el, "click" ); 16930 } 16931 16932 // Return non-false to allow normal event-path propagation 16933 return true; 16934 }, 16935 16936 // For cross-browser consistency, suppress native .click() on links 16937 // Also prevent it if we're currently inside a leveraged native-event stack 16938 _default: function( event ) { 16939 var target = event.target; 16940 return rcheckableType.test( target.type ) && 16941 target.click && nodeName( target, "input" ) && 16942 dataPriv.get( target, "click" ) || 16943 nodeName( target, "a" ); 16944 } 16945 }, 16946 16947 beforeunload: { 16948 postDispatch: function( event ) { 16949 16950 // Support: Firefox 20+ 16951 // Firefox doesn't alert if the returnValue field is not set. 16952 if ( event.result !== undefined && event.originalEvent ) { 16953 event.originalEvent.returnValue = event.result; 16954 } 16955 } 16956 } 16957 } 16958}; 16959 16960// Ensure the presence of an event listener that handles manually-triggered 16961// synthetic events by interrupting progress until reinvoked in response to 16962// *native* events that it fires directly, ensuring that state changes have 16963// already occurred before other listeners are invoked. 16964function leverageNative( el, type, expectSync ) { 16965 16966 // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add 16967 if ( !expectSync ) { 16968 if ( dataPriv.get( el, type ) === undefined ) { 16969 jQuery.event.add( el, type, returnTrue ); 16970 } 16971 return; 16972 } 16973 16974 // Register the controller as a special universal handler for all event namespaces 16975 dataPriv.set( el, type, false ); 16976 jQuery.event.add( el, type, { 16977 namespace: false, 16978 handler: function( event ) { 16979 var notAsync, result, 16980 saved = dataPriv.get( this, type ); 16981 16982 if ( ( event.isTrigger & 1 ) && this[ type ] ) { 16983 16984 // Interrupt processing of the outer synthetic .trigger()ed event 16985 // Saved data should be false in such cases, but might be a leftover capture object 16986 // from an async native handler (gh-4350) 16987 if ( !saved.length ) { 16988 16989 // Store arguments for use when handling the inner native event 16990 // There will always be at least one argument (an event object), so this array 16991 // will not be confused with a leftover capture object. 16992 saved = slice.call( arguments ); 16993 dataPriv.set( this, type, saved ); 16994 16995 // Trigger the native event and capture its result
16996 // Support: IE <=9 - 11+ 16997 // focus() and blur() are asynchronous 16998 notAsync = expectSync( this, type ); 16999 this[ type ](); 17000 result = dataPriv.get( this, type ); 17001 if ( saved !== result || notAsync ) { 17002 dataPriv.set( this, type, false ); 17003 } else { 17004 result = {}; 17005 } 17006 if ( saved !== result ) { 17007 17008 // Cancel the outer synthetic event 17009 event.stopImmediatePropagation(); 17010 event.preventDefault(); 17011 17012 // Support: Chrome 86+ 17013 // In Chrome, if an element having a focusout handler is blurred by 17014 // clicking outside of it, it invokes the handler synchronously. If 17015 // that handler calls `.remove()` on the element, the data is cleared, 17016 // leaving `result` undefined. We need to guard against this. 17017 return result && result.value; 17018 } 17019 17020 // If this is an inner synthetic event for an event with a bubbling surrogate 17021 // (focus or blur), assume that the surrogate already propagated from triggering the 17022 // native event and prevent that from happening again here. 17023 // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the 17024 // bubbling surrogate propagates *after* the non-bubbling base), but that seems 17025 // less bad than duplication. 17026 } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { 17027 event.stopPropagation(); 17028 } 17029 17030 // If this is a native event triggered above, everything is now in order 17031 // Fire an inner synthetic event with the original arguments 17032 } else if ( saved.length ) { 17033 17034 // ...and capture the result 17035 dataPriv.set( this, type, { 17036 value: jQuery.event.trigger( 17037 17038 // Support: IE <=9 - 11+ 17039 // Extend with the prototype to reset the above stopImmediatePropagation() 17040 jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), 17041 saved.slice( 1 ), 17042 this 17043 ) 17044 } ); 17045 17046 // Abort handling of the native event 17047 event.stopImmediatePropagation(); 17048 } 17049 } 17050 } ); 17051} 17052 17053jQuery.removeEvent = function( elem, type, handle ) { 17054 17055 // This "if" is needed for plain objects 17056 if ( elem.removeEventListener ) { 17057 elem.removeEventListener( type, handle ); 17058 } 17059}; 17060 17061jQuery.Event = function( src, props ) { 17062 17063 // Allow instantiation without the 'new' keyword 17064 if ( !( this instanceof jQuery.Event ) ) { 17065 return new jQuery.Event( src, props ); 17066 } 17067 17068 // Event object 17069 if ( src && src.type ) { 17070 this.originalEvent = src; 17071 this.type = src.type; 17072 17073 // Events bubbling up the document may have been marked as prevented 17074 // by a handler lower down the tree; reflect the correct value. 17075 this.isDefaultPrevented = src.defaultPrevented || 17076 src.defaultPrevented === undefined && 17077 17078 // Support: Android <=2.3 only 17079 src.returnValue === false ? 17080 returnTrue : 17081 returnFalse; 17082 17083 // Create target properties 17084 // Support: Safari <=6 - 7 only 17085 // Target should not be a text node (trac-504, trac-13143) 17086 this.target = ( src.target && src.target.nodeType === 3 ) ? 17087 src.target.parentNode : 17088 src.target; 17089 17090 this.currentTarget = src.currentTarget; 17091 this.relatedTarget = src.relatedTarget; 17092 17093 // Event type 17094 } else { 17095 this.type = src; 17096 } 17097 17098 // Put explicitly provided properties onto the event object 17099 if ( props ) { 17100 jQuery.extend( this, props ); 17101 } 17102 17103 // Create a timestamp if incoming event doesn't have one 17104 this.timeStamp = src && src.timeStamp || Date.now(); 17105 17106 // Mark it as fixed 17107 this[ jQuery.expando ] = true; 17108}; 17109 17110// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding 17111// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html 17112jQuery.Event.prototype = { 17113 constructor: jQuery.Event, 17114 isDefaultPrevented: returnFalse, 17115 isPropagationStopped: returnFalse, 17116 isImmediatePropagationStopped: returnFalse, 17117 isSimulated: false, 17118 17119 preventDefault: function() { 17120 var e = this.originalEvent; 17121 17122 this.isDefaultPrevented = returnTrue; 17123 17124 if ( e && !this.isSimulated ) { 17125 e.preventDefault(); 17126 } 17127 }, 17128 stopPropagation: function() { 17129 var e = this.originalEvent; 17130 17131 this.isPropagationStopped = returnTrue; 17132 17133 if ( e && !this.isSimulated ) { 17134 e.stopPropagation(); 17135 } 17136 }, 17137 stopImmediatePropagation: function() { 17138 var e = this.originalEvent; 17139 17140 this.isImmediatePropagationStopped = returnTrue; 17141 17142 if ( e && !this.isSimulated ) { 17143 e.stopImmediatePropagation(); 17144 } 17145 17146 this.stopPropagation(); 17147 } 17148}; 17149 17150// Includes all common event props including KeyEvent and MouseEvent specific props 17151jQuery.each( { 17152 altKey: true, 17153 bubbles: true, 17154 cancelable: true, 17155 changedTouches: true, 17156 ctrlKey: true, 17157 detail: true, 17158 eventPhase: true, 17159 metaKey: true, 17160 pageX: true, 17161 pageY: true, 17162 shiftKey: true, 17163 view: true, 17164 "char": true, 17165 code: true, 17166 charCode: true, 17167 key: true, 17168 keyCode: true, 17169 button: true, 17170 buttons: true, 17171 clientX: true, 17172 clientY: true, 17173 offsetX: true, 17174 offsetY: true, 17175 pointerId: true, 17176 pointerType: true, 17177 screenX: true, 17178 screenY: true, 17179 targetTouches: true, 17180 toElement: true, 17181 touches: true, 17182 which: true 17183}, jQuery.event.addProp ); 17184 17185jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { 17186 jQuery.event.special[ type ] = { 17187 17188 // Utilize native event if possible so blur/focus sequence is correct 17189 setup: function() { 17190 17191 // Claim the first handler 17192 // dataPriv.set( this, "focus", ... ) 17193 // dataPriv.set( this, "blur", ... ) 17194 leverageNative( this, type, expectSync ); 17195 17196 // Return false to allow normal processing in the caller 17197 return false;
vendor: 8,761 bytes, lines 17198-17518
17198 }, 17199 trigger: function() { 17200 17201 // Force setup before trigger 17202 leverageNative( this, type ); 17203 17204 // Return non-false to allow normal event-path propagation 17205 return true; 17206 }, 17207 17208 // Suppress native focus or blur if we're currently inside 17209 // a leveraged native-event stack 17210 _default: function( event ) { 17211 return dataPriv.get( event.target, type ); 17212 }, 17213 17214 delegateType: delegateType 17215 }; 17216} ); 17217 17218// Create mouseenter/leave events using mouseover/out and event-time checks 17219// so that event delegation works in jQuery. 17220// Do the same for pointerenter/pointerleave and pointerover/pointerout 17221// 17222// Support: Safari 7 only 17223// Safari sends mouseenter too often; see: 17224// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 17225// for the description of the bug (it existed in older Chrome versions as well). 17226jQuery.each( { 17227 mouseenter: "mouseover", 17228 mouseleave: "mouseout", 17229 pointerenter: "pointerover", 17230 pointerleave: "pointerout" 17231}, function( orig, fix ) { 17232 jQuery.event.special[ orig ] = { 17233 delegateType: fix, 17234 bindType: fix, 17235 17236 handle: function( event ) { 17237 var ret, 17238 target = this, 17239 related = event.relatedTarget, 17240 handleObj = event.handleObj; 17241 17242 // For mouseenter/leave call the handler if related is outside the target. 17243 // NB: No relatedTarget if the mouse left/entered the browser window 17244 if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { 17245 event.type = handleObj.origType; 17246 ret = handleObj.handler.apply( this, arguments ); 17247 event.type = fix; 17248 } 17249 return ret; 17250 } 17251 }; 17252} ); 17253 17254jQuery.fn.extend( { 17255 17256 on: function( types, selector, data, fn ) { 17257 return on( this, types, selector, data, fn ); 17258 }, 17259 one: function( types, selector, data, fn ) { 17260 return on( this, types, selector, data, fn, 1 ); 17261 }, 17262 off: function( types, selector, fn ) { 17263 var handleObj, type; 17264 if ( types && types.preventDefault && types.handleObj ) { 17265 17266 // ( event ) dispatched jQuery.Event 17267 handleObj = types.handleObj; 17268 jQuery( types.delegateTarget ).off( 17269 handleObj.namespace ? 17270 handleObj.origType + "." + handleObj.namespace : 17271 handleObj.origType, 17272 handleObj.selector, 17273 handleObj.handler 17274 ); 17275 return this; 17276 } 17277 if ( typeof types === "object" ) { 17278 17279 // ( types-object [, selector] ) 17280 for ( type in types ) { 17281 this.off( type, selector, types[ type ] ); 17282 } 17283 return this; 17284 } 17285 if ( selector === false || typeof selector === "function" ) { 17286 17287 // ( types [, fn] ) 17288 fn = selector; 17289 selector = undefined; 17290 } 17291 if ( fn === false ) { 17292 fn = returnFalse; 17293 } 17294 return this.each( function() { 17295 jQuery.event.remove( this, types, fn, selector ); 17296 } ); 17297 } 17298} ); 17299 17300 17301var 17302 17303 // Support: IE <=10 - 11, Edge 12 - 13 only 17304 // In IE/Edge using regex groups here causes severe slowdowns. 17305 // See https://connect.microsoft.com/IE/feedback/details/1736512/ 17306 rnoInnerhtml = /<script|<style|<link/i, 17307 17308 // checked="checked" or checked 17309 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, 17310 17311 rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g; 17312 17313// Prefer a tbody over its parent table for containing new rows 17314function manipulationTarget( elem, content ) { 17315 if ( nodeName( elem, "table" ) && 17316 nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { 17317 17318 return jQuery( elem ).children( "tbody" )[ 0 ] || elem; 17319 } 17320 17321 return elem; 17322} 17323 17324// Replace/restore the type attribute of script elements for safe DOM manipulation 17325function disableScript( elem ) { 17326 elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; 17327 return elem; 17328} 17329function restoreScript( elem ) { 17330 if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { 17331 elem.type = elem.type.slice( 5 ); 17332 } else { 17333 elem.removeAttribute( "type" ); 17334 } 17335 17336 return elem; 17337} 17338 17339function cloneCopyEvent( src, dest ) { 17340 var i, l, type, pdataOld, udataOld, udataCur, events; 17341 17342 if ( dest.nodeType !== 1 ) { 17343 return; 17344 } 17345 17346 // 1. Copy private data: events, handlers, etc. 17347 if ( dataPriv.hasData( src ) ) { 17348 pdataOld = dataPriv.get( src ); 17349 events = pdataOld.events; 17350 17351 if ( events ) { 17352 dataPriv.remove( dest, "handle events" ); 17353 17354 for ( type in events ) { 17355 for ( i = 0, l = events[ type ].length; i < l; i++ ) { 17356 jQuery.event.add( dest, type, events[ type ][ i ] ); 17357 } 17358 } 17359 } 17360 } 17361 17362 // 2. Copy user data 17363 if ( dataUser.hasData( src ) ) { 17364 udataOld = dataUser.access( src ); 17365 udataCur = jQuery.extend( {}, udataOld ); 17366 17367 dataUser.set( dest, udataCur ); 17368 } 17369} 17370 17371// Fix IE bugs, see support tests 17372function fixInput( src, dest ) { 17373 var nodeName = dest.nodeName.toLowerCase(); 17374 17375 // Fails to persist the checked state of a cloned checkbox or radio button. 17376 if ( nodeName === "input" && rcheckableType.test( src.type ) ) { 17377 dest.checked = src.checked; 17378 17379 // Fails to return the selected option to the default selected state when cloning options 17380 } else if ( nodeName === "input" || nodeName === "textarea" ) { 17381 dest.defaultValue = src.defaultValue; 17382 } 17383} 17384 17385function domManip( collection, args, callback, ignored ) { 17386 17387 // Flatten any nested arrays 17388 args = flat( args ); 17389 17390 var fragment, first, scripts, hasScripts, node, doc, 17391 i = 0, 17392 l = collection.length, 17393 iNoClone = l - 1, 17394 value = args[ 0 ], 17395 valueIsFunction = isFunction( value ); 17396 17397 // We can't cloneNode fragments that contain checked, in WebKit 17398 if ( valueIsFunction || 17399 ( l > 1 && typeof value === "string" && 17400 !support.checkClone && rchecked.test( value ) ) ) { 17401 return collection.each( function( index ) { 17402 var self = collection.eq( index ); 17403 if ( valueIsFunction ) { 17404 args[ 0 ] = value.call( this, index, self.html() ); 17405 } 17406 domManip( self, args, callback, ignored ); 17407 } ); 17408 } 17409 17410 if ( l ) { 17411 fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); 17412 first = fragment.firstChild; 17413 17414 if ( fragment.childNodes.length === 1 ) { 17415 fragment = first; 17416 } 17417 17418 // Require either new content or an interest in ignored elements to invoke the callback 17419 if ( first || ignored ) { 17420 scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); 17421 hasScripts = scripts.length; 17422 17423 // Use the original fragment for the last item 17424 // instead of the first because it can end up 17425 // being emptied incorrectly in certain situations (trac-8070). 17426 for ( ; i < l; i++ ) { 17427 node = fragment; 17428 17429 if ( i !== iNoClone ) { 17430 node = jQuery.clone( node, true, true ); 17431 17432 // Keep references to cloned scripts for later restoration 17433 if ( hasScripts ) { 17434 17435 // Support: Android <=4.0 only, PhantomJS 1 only 17436 // push.apply(_, arraylike) throws on ancient WebKit 17437 jQuery.merge( scripts, getAll( node, "script" ) ); 17438 } 17439 } 17440 17441 callback.call( collection[ i ], node, i ); 17442 } 17443 17444 if ( hasScripts ) { 17445 doc = scripts[ scripts.length - 1 ].ownerDocument; 17446 17447 // Reenable scripts 17448 jQuery.map( scripts, restoreScript ); 17449 17450 // Evaluate executable scripts on first document insertion 17451 for ( i = 0; i < hasScripts; i++ ) { 17452 node = scripts[ i ]; 17453 if ( rscriptType.test( node.type || "" ) && 17454 !dataPriv.access( node, "globalEval" ) && 17455 jQuery.contains( doc, node ) ) { 17456 17457 if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { 17458 17459 // Optional AJAX dependency, but won't run scripts if not present 17460 if ( jQuery._evalUrl && !node.noModule ) { 17461 jQuery._evalUrl( node.src, { 17462 nonce: node.nonce || node.getAttribute( "nonce" ) 17463 }, doc ); 17464 } 17465 } else { 17466 17467 // Unwrap a CDATA section containing script contents. This shouldn't be 17468 // needed as in XML documents they're already not visible when 17469 // inspecting element contents and in HTML documents they have no 17470 // meaning but we're preserving that logic for backwards compatibility. 17471 // This will be removed completely in 4.0. See gh-4904. 17472 DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); 17473 } 17474 } 17475 } 17476 } 17477 } 17478 } 17479 17480 return collection; 17481} 17482 17483function remove( elem, selector, keepData ) { 17484 var node, 17485 nodes = selector ? jQuery.filter( selector, elem ) : elem, 17486 i = 0; 17487 17488 for ( ; ( node = nodes[ i ] ) != null; i++ ) { 17489 if ( !keepData && node.nodeType === 1 ) { 17490 jQuery.cleanData( getAll( node ) ); 17491 } 17492 17493 if ( node.parentNode ) { 17494 if ( keepData && isAttached( node ) ) { 17495 setGlobalEval( getAll( node, "script" ) ); 17496 } 17497 node.parentNode.removeChild( node ); 17498 } 17499 } 17500 17501 return elem; 17502} 17503 17504jQuery.extend( { 17505 htmlPrefilter: function( html ) { 17506 return html; 17507 }, 17508 17509 clone: function( elem, dataAndEvents, deepDataAndEvents ) { 17510 var i, l, srcElements, destElements, 17511 clone = elem.cloneNode( true ), 17512 inPage = isAttached( elem ); 17513 17514 // Fix IE cloning issues 17515 if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && 17516 !jQuery.isXMLDoc( elem ) ) { 17517 17518 // We eschew Sizzle here for performance reasons:
vendor: 6,686 bytes, lines 17518-17793
17518 https://jsperf.com/getall-vs-sizzle/2 17519 destElements = getAll( clone ); 17520 srcElements = getAll( elem ); 17521 17522 for ( i = 0, l = srcElements.length; i < l; i++ ) { 17523 fixInput( srcElements[ i ], destElements[ i ] ); 17524 } 17525 } 17526 17527 // Copy the events from the original to the clone 17528 if ( dataAndEvents ) { 17529 if ( deepDataAndEvents ) { 17530 srcElements = srcElements || getAll( elem ); 17531 destElements = destElements || getAll( clone ); 17532 17533 for ( i = 0, l = srcElements.length; i < l; i++ ) { 17534 cloneCopyEvent( srcElements[ i ], destElements[ i ] ); 17535 } 17536 } else { 17537 cloneCopyEvent( elem, clone ); 17538 } 17539 } 17540 17541 // Preserve script evaluation history 17542 destElements = getAll( clone, "script" ); 17543 if ( destElements.length > 0 ) { 17544 setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); 17545 } 17546 17547 // Return the cloned set 17548 return clone; 17549 }, 17550 17551 cleanData: function( elems ) { 17552 var data, elem, type, 17553 special = jQuery.event.special, 17554 i = 0; 17555 17556 for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { 17557 if ( acceptData( elem ) ) { 17558 if ( ( data = elem[ dataPriv.expando ] ) ) { 17559 if ( data.events ) { 17560 for ( type in data.events ) { 17561 if ( special[ type ] ) { 17562 jQuery.event.remove( elem, type ); 17563 17564 // This is a shortcut to avoid jQuery.event.remove's overhead 17565 } else { 17566 jQuery.removeEvent( elem, type, data.handle ); 17567 } 17568 } 17569 } 17570 17571 // Support: Chrome <=35 - 45+ 17572 // Assign undefined instead of using delete, see Data#remove 17573 elem[ dataPriv.expando ] = undefined; 17574 } 17575 if ( elem[ dataUser.expando ] ) { 17576 17577 // Support: Chrome <=35 - 45+ 17578 // Assign undefined instead of using delete, see Data#remove 17579 elem[ dataUser.expando ] = undefined; 17580 } 17581 } 17582 } 17583 } 17584} ); 17585 17586jQuery.fn.extend( { 17587 detach: function( selector ) { 17588 return remove( this, selector, true ); 17589 }, 17590 17591 remove: function( selector ) { 17592 return remove( this, selector ); 17593 }, 17594 17595 text: function( value ) { 17596 return access( this, function( value ) { 17597 return value === undefined ? 17598 jQuery.text( this ) : 17599 this.empty().each( function() { 17600 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 17601 this.textContent = value; 17602 } 17603 } ); 17604 }, null, value, arguments.length ); 17605 }, 17606 17607 append: function() { 17608 return domManip( this, arguments, function( elem ) { 17609 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 17610 var target = manipulationTarget( this, elem ); 17611 target.appendChild( elem ); 17612 } 17613 } ); 17614 }, 17615 17616 prepend: function() { 17617 return domManip( this, arguments, function( elem ) { 17618 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 17619 var target = manipulationTarget( this, elem ); 17620 target.insertBefore( elem, target.firstChild ); 17621 } 17622 } ); 17623 }, 17624 17625 before: function() { 17626 return domManip( this, arguments, function( elem ) { 17627 if ( this.parentNode ) { 17628 this.parentNode.insertBefore( elem, this ); 17629 } 17630 } ); 17631 }, 17632 17633 after: function() { 17634 return domManip( this, arguments, function( elem ) { 17635 if ( this.parentNode ) { 17636 this.parentNode.insertBefore( elem, this.nextSibling ); 17637 } 17638 } ); 17639 }, 17640 17641 empty: function() { 17642 var elem, 17643 i = 0; 17644 17645 for ( ; ( elem = this[ i ] ) != null; i++ ) { 17646 if ( elem.nodeType === 1 ) { 17647 17648 // Prevent memory leaks 17649 jQuery.cleanData( getAll( elem, false ) ); 17650 17651 // Remove any remaining nodes 17652 elem.textContent = ""; 17653 } 17654 } 17655 17656 return this; 17657 }, 17658 17659 clone: function( dataAndEvents, deepDataAndEvents ) { 17660 dataAndEvents = dataAndEvents == null ? false : dataAndEvents; 17661 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; 17662 17663 return this.map( function() { 17664 return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); 17665 } ); 17666 }, 17667 17668 html: function( value ) { 17669 return access( this, function( value ) { 17670 var elem = this[ 0 ] || {}, 17671 i = 0, 17672 l = this.length; 17673 17674 if ( value === undefined && elem.nodeType === 1 ) { 17675 return elem.innerHTML; 17676 } 17677 17678 // See if we can take a shortcut and just use innerHTML 17679 if ( typeof value === "string" && !rnoInnerhtml.test( value ) && 17680 !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { 17681 17682 value = jQuery.htmlPrefilter( value ); 17683 17684 try { 17685 for ( ; i < l; i++ ) { 17686 elem = this[ i ] || {}; 17687 17688 // Remove element nodes and prevent memory leaks 17689 if ( elem.nodeType === 1 ) { 17690 jQuery.cleanData( getAll( elem, false ) ); 17691 elem.innerHTML = value; 17692 } 17693 } 17694 17695 elem = 0; 17696 17697 // If using innerHTML throws an exception, use the fallback method 17698 } catch ( e ) {} 17699 } 17700 17701 if ( elem ) { 17702 this.empty().append( value ); 17703 } 17704 }, null, value, arguments.length ); 17705 }, 17706 17707 replaceWith: function() { 17708 var ignored = []; 17709 17710 // Make the changes, replacing each non-ignored context element with the new content 17711 return domManip( this, arguments, function( elem ) { 17712 var parent = this.parentNode; 17713 17714 if ( jQuery.inArray( this, ignored ) < 0 ) { 17715 jQuery.cleanData( getAll( this ) ); 17716 if ( parent ) { 17717 parent.replaceChild( elem, this ); 17718 } 17719 } 17720 17721 // Force callback invocation 17722 }, ignored ); 17723 } 17724} ); 17725 17726jQuery.each( { 17727 appendTo: "append", 17728 prependTo: "prepend", 17729 insertBefore: "before", 17730 insertAfter: "after", 17731 replaceAll: "replaceWith" 17732}, function( name, original ) { 17733 jQuery.fn[ name ] = function( selector ) { 17734 var elems, 17735 ret = [], 17736 insert = jQuery( selector ), 17737 last = insert.length - 1, 17738 i = 0; 17739 17740 for ( ; i <= last; i++ ) { 17741 elems = i === last ? this : this.clone( true ); 17742 jQuery( insert[ i ] )[ original ]( elems ); 17743 17744 // Support: Android <=4.0 only, PhantomJS 1 only 17745 // .get() because push.apply(_, arraylike) throws on ancient WebKit 17746 push.apply( ret, elems.get() ); 17747 } 17748 17749 return this.pushStack( ret ); 17750 }; 17751} ); 17752var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); 17753 17754var rcustomProp = /^--/; 17755 17756 17757var getStyles = function( elem ) { 17758 17759 // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150) 17760 // IE throws on elements created in popups 17761 // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" 17762 var view = elem.ownerDocument.defaultView; 17763 17764 if ( !view || !view.opener ) { 17765 view = window; 17766 } 17767 17768 return view.getComputedStyle( elem ); 17769 }; 17770 17771var swap = function( elem, options, callback ) { 17772 var ret, name, 17773 old = {}; 17774 17775 // Remember the old values, and insert the new ones 17776 for ( name in options ) { 17777 old[ name ] = elem.style[ name ]; 17778 elem.style[ name ] = options[ name ]; 17779 } 17780 17781 ret = callback.call( elem ); 17782 17783 // Revert the old values 17784 for ( name in options ) { 17785 elem.style[ name ] = old[ name ]; 17786 } 17787 17788 return ret; 17789}; 17790 17791 17792var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); 17793
17794var whitespace = "[\\x20\\t\\r\\n\\f]"; 17795 17796 17797var rtrimCSS = new RegExp( 17798 "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", 17799 "g" 17800); 17801 17802 17803 17804 17805( function() { 17806 17807 // Executing both pixelPosition & boxSizingReliable tests require only one layout 17808 // so they're executed at the same time to save the second computation. 17809 function computeStyleTests() { 17810 17811 // This is a singleton, we need to execute it only once 17812 if ( !div ) { 17813 return; 17814 } 17815 17816 container.style.cssText = "position:absolute;
vendor: 13,607 bytes, lines 17816-18270
17816left:-11111px;width:60px;" + 17817 "margin-top:1px;padding:0;border:0"; 17818 div.style.cssText = 17819 "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + 17820 "margin:auto;border:1px;padding:1px;" + 17821 "width:60%;top:1%"; 17822 documentElement.appendChild( container ).appendChild( div ); 17823 17824 var divStyle = window.getComputedStyle( div ); 17825 pixelPositionVal = divStyle.top !== "1%"; 17826 17827 // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 17828 reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; 17829 17830 // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 17831 // Some styles come back with percentage values, even though they shouldn't 17832 div.style.right = "60%"; 17833 pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; 17834 17835 // Support: IE 9 - 11 only 17836 // Detect misreporting of content dimensions for box-sizing:border-box elements 17837 boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; 17838 17839 // Support: IE 9 only 17840 // Detect overflow:scroll screwiness (gh-3699) 17841 // Support: Chrome <=64 17842 // Don't get tricked when zoom affects offsetWidth (gh-4029) 17843 div.style.position = "absolute"; 17844 scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; 17845 17846 documentElement.removeChild( container ); 17847 17848 // Nullify the div so it wouldn't be stored in the memory and 17849 // it will also be a sign that checks already performed 17850 div = null; 17851 } 17852 17853 function roundPixelMeasures( measure ) { 17854 return Math.round( parseFloat( measure ) ); 17855 } 17856 17857 var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, 17858 reliableTrDimensionsVal, reliableMarginLeftVal, 17859 container = document.createElement( "div" ), 17860 div = document.createElement( "div" ); 17861 17862 // Finish early in limited (non-browser) environments 17863 if ( !div.style ) { 17864 return; 17865 } 17866 17867 // Support: IE <=9 - 11 only 17868 // Style of cloned element affects source element cloned (trac-8908) 17869 div.style.backgroundClip = "content-box"; 17870 div.cloneNode( true ).style.backgroundClip = ""; 17871 support.clearCloneStyle = div.style.backgroundClip === "content-box"; 17872 17873 jQuery.extend( support, { 17874 boxSizingReliable: function() { 17875 computeStyleTests(); 17876 return boxSizingReliableVal; 17877 }, 17878 pixelBoxStyles: function() { 17879 computeStyleTests(); 17880 return pixelBoxStylesVal; 17881 }, 17882 pixelPosition: function() { 17883 computeStyleTests(); 17884 return pixelPositionVal; 17885 }, 17886 reliableMarginLeft: function() { 17887 computeStyleTests(); 17888 return reliableMarginLeftVal; 17889 }, 17890 scrollboxSize: function() { 17891 computeStyleTests(); 17892 return scrollboxSizeVal; 17893 }, 17894 17895 // Support: IE 9 - 11+, Edge 15 - 18+ 17896 // IE/Edge misreport `getComputedStyle` of table rows with width/height 17897 // set in CSS while `offset*` properties report correct values. 17898 // Behavior in IE 9 is more subtle than in newer versions & it passes 17899 // some versions of this test; make sure not to make it pass there! 17900 // 17901 // Support: Firefox 70+ 17902 // Only Firefox includes border widths 17903 // in computed dimensions. (gh-4529) 17904 reliableTrDimensions: function() { 17905 var table, tr, trChild, trStyle; 17906 if ( reliableTrDimensionsVal == null ) { 17907 table = document.createElement( "table" ); 17908 tr = document.createElement( "tr" ); 17909 trChild = document.createElement( "div" ); 17910 17911 table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; 17912 tr.style.cssText = "border:1px solid"; 17913 17914 // Support: Chrome 86+ 17915 // Height set through cssText does not get applied. 17916 // Computed height then comes back as 0. 17917 tr.style.height = "1px"; 17918 trChild.style.height = "9px"; 17919 17920 // Support: Android 8 Chrome 86+ 17921 // In our bodyBackground.html iframe, 17922 // display for all div elements is set to "inline", 17923 // which causes a problem only in Android 8 Chrome 86. 17924 // Ensuring the div is display: block 17925 // gets around this issue. 17926 trChild.style.display = "block"; 17927 17928 documentElement 17929 .appendChild( table ) 17930 .appendChild( tr ) 17931 .appendChild( trChild ); 17932 17933 trStyle = window.getComputedStyle( tr ); 17934 reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + 17935 parseInt( trStyle.borderTopWidth, 10 ) + 17936 parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; 17937 17938 documentElement.removeChild( table ); 17939 } 17940 return reliableTrDimensionsVal; 17941 } 17942 } ); 17943} )(); 17944 17945 17946function curCSS( elem, name, computed ) { 17947 var width, minWidth, maxWidth, ret, 17948 isCustomProp = rcustomProp.test( name ), 17949 17950 // Support: Firefox 51+ 17951 // Retrieving style before computed somehow 17952 // fixes an issue with getting wrong values 17953 // on detached elements 17954 style = elem.style; 17955 17956 computed = computed || getStyles( elem ); 17957 17958 // getPropertyValue is needed for: 17959 // .css('filter') (IE 9 only, trac-12537) 17960 // .css('--customProperty) (gh-3144) 17961 if ( computed ) { 17962 ret = computed.getPropertyValue( name ) || computed[ name ]; 17963 17964 // trim whitespace for custom property (issue gh-4926) 17965 if ( isCustomProp ) { 17966 17967 // rtrim treats U+000D CARRIAGE RETURN and U+000C FORM FEED 17968 // as whitespace while CSS does not, but this is not a problem 17969 // because CSS preprocessing replaces them with U+000A LINE FEED 17970 // (which *is* CSS whitespace) 17971 // https://www.w3.org/TR/css-syntax-3/#input-preprocessing 17972 ret = ret.replace( rtrimCSS, "$1" ); 17973 } 17974 17975 if ( ret === "" && !isAttached( elem ) ) { 17976 ret = jQuery.style( elem, name ); 17977 } 17978 17979 // A tribute to the "awesome hack by Dean Edwards" 17980 // Android Browser returns percentage for some values, 17981 // but width seems to be reliably pixels. 17982 // This is against the CSSOM draft spec: 17983 // https://drafts.csswg.org/cssom/#resolved-values 17984 if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { 17985 17986 // Remember the original values 17987 width = style.width; 17988 minWidth = style.minWidth; 17989 maxWidth = style.maxWidth; 17990 17991 // Put in the new values to get a computed value out 17992 style.minWidth = style.maxWidth = style.width = ret; 17993 ret = computed.width; 17994 17995 // Revert the changed values 17996 style.width = width; 17997 style.minWidth = minWidth; 17998 style.maxWidth = maxWidth; 17999 } 18000 } 18001 18002 return ret !== undefined ? 18003 18004 // Support: IE <=9 - 11 only 18005 // IE returns zIndex value as an integer. 18006 ret + "" : 18007 ret; 18008} 18009 18010 18011function addGetHookIf( conditionFn, hookFn ) { 18012 18013 // Define the hook, we'll check on the first run if it's really needed. 18014 return { 18015 get: function() { 18016 if ( conditionFn() ) { 18017 18018 // Hook not needed (or it's not possible to use it due 18019 // to missing dependency), remove it. 18020 delete this.get; 18021 return; 18022 } 18023 18024 // Hook needed; redefine it so that the support test is not executed again. 18025 return ( this.get = hookFn ).apply( this, arguments ); 18026 } 18027 }; 18028} 18029 18030 18031var cssPrefixes = [ "Webkit", "Moz", "ms" ], 18032 emptyStyle = document.createElement( "div" ).style, 18033 vendorProps = {}; 18034 18035// Return a vendor-prefixed property or undefined 18036function vendorPropName( name ) { 18037 18038 // Check for vendor prefixed names 18039 var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), 18040 i = cssPrefixes.length; 18041 18042 while ( i-- ) { 18043 name = cssPrefixes[ i ] + capName; 18044 if ( name in emptyStyle ) { 18045 return name; 18046 } 18047 } 18048} 18049 18050// Return a potentially-mapped jQuery.cssProps or vendor prefixed property 18051function finalPropName( name ) { 18052 var final = jQuery.cssProps[ name ] || vendorProps[ name ]; 18053 18054 if ( final ) { 18055 return final; 18056 } 18057 if ( name in emptyStyle ) { 18058 return name; 18059 } 18060 return vendorProps[ name ] = vendorPropName( name ) || name; 18061} 18062 18063 18064var 18065 18066 // Swappable if display is none or starts with table 18067 // except "table", "table-cell", or "table-caption" 18068 // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display 18069 rdisplayswap = /^(none|table(?!-c[ea]).+)/, 18070 cssShow = { position: "absolute", visibility: "hidden", display: "block" }, 18071 cssNormalTransform = { 18072 letterSpacing: "0", 18073 fontWeight: "400" 18074 }; 18075 18076function setPositiveNumber( _elem, value, subtract ) { 18077 18078 // Any relative (+/-) values have already been 18079 // normalized at this point 18080 var matches = rcssNum.exec( value ); 18081 return matches ? 18082 18083 // Guard against undefined "subtract", e.g., when used as in cssHooks 18084 Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : 18085 value; 18086} 18087 18088function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { 18089 var i = dimension === "width" ? 1 : 0, 18090 extra = 0, 18091 delta = 0; 18092 18093 // Adjustment may not be necessary 18094 if ( box === ( isBorderBox ? "border" : "content" ) ) { 18095 return 0; 18096 } 18097 18098 for ( ; i < 4; i += 2 ) { 18099 18100 // Both box models exclude margin 18101 if ( box === "margin" ) { 18102 delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); 18103 } 18104 18105 // If we get here with a content-box, we're seeking "padding" or "border" or "margin" 18106 if ( !isBorderBox ) { 18107 18108 // Add padding 18109 delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 18110 18111 // For "border" or "margin", add border 18112 if ( box !== "padding" ) { 18113 delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 18114 18115 // But still keep track of it otherwise 18116 } else { 18117 extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 18118 } 18119 18120 // If we get here with a border-box (content + padding + border), we're seeking "content" or 18121 // "padding" or "margin" 18122 } else { 18123 18124 // For "content", subtract padding 18125 if ( box === "content" ) { 18126 delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 18127 } 18128 18129 // For "content" or "padding", subtract border 18130 if ( box !== "margin" ) { 18131 delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 18132 } 18133 } 18134 } 18135 18136 // Account for positive content-box scroll gutter when requested by providing computedVal 18137 if ( !isBorderBox && computedVal >= 0 ) { 18138 18139 // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border 18140 // Assuming integer scroll gutter, subtract the rest and round down 18141 delta += Math.max( 0, Math.ceil( 18142 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - 18143 computedVal - 18144 delta - 18145 extra - 18146 0.5 18147 18148 // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter 18149 // Use an explicit zero to avoid NaN (gh-3964) 18150 ) ) || 0; 18151 } 18152 18153 return delta; 18154} 18155 18156function getWidthOrHeight( elem, dimension, extra ) { 18157 18158 // Start with computed style 18159 var styles = getStyles( elem ), 18160 18161 // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). 18162 // Fake content-box until we know it's needed to know the true value. 18163 boxSizingNeeded = !support.boxSizingReliable() || extra, 18164 isBorderBox = boxSizingNeeded && 18165 jQuery.css( elem, "boxSizing", false, styles ) === "border-box", 18166 valueIsBorderBox = isBorderBox, 18167 18168 val = curCSS( elem, dimension, styles ), 18169 offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); 18170 18171 // Support: Firefox <=54 18172 // Return a confounding non-pixel value or feign ignorance, as appropriate. 18173 if ( rnumnonpx.test( val ) ) { 18174 if ( !extra ) { 18175 return val; 18176 } 18177 val = "auto"; 18178 } 18179 18180 18181 // Support: IE 9 - 11 only 18182 // Use offsetWidth/offsetHeight for when box sizing is unreliable. 18183 // In those cases, the computed value can be trusted to be border-box. 18184 if ( ( !support.boxSizingReliable() && isBorderBox || 18185 18186 // Support: IE 10 - 11+, Edge 15 - 18+ 18187 // IE/Edge misreport `getComputedStyle` of table rows with width/height 18188 // set in CSS while `offset*` properties report correct values. 18189 // Interestingly, in some cases IE 9 doesn't suffer from this issue. 18190 !support.reliableTrDimensions() && nodeName( elem, "tr" ) || 18191 18192 // Fall back to offsetWidth/offsetHeight when value is "auto" 18193 // This happens for inline elements with no explicit setting (gh-3571) 18194 val === "auto" || 18195 18196 // Support: Android <=4.1 - 4.3 only 18197 // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) 18198 !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && 18199 18200 // Make sure the element is visible & connected 18201 elem.getClientRects().length ) { 18202 18203 isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; 18204 18205 // Where available, offsetWidth/offsetHeight approximate border box dimensions. 18206 // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the 18207 // retrieved value as a content box dimension. 18208 valueIsBorderBox = offsetProp in elem; 18209 if ( valueIsBorderBox ) { 18210 val = elem[ offsetProp ]; 18211 } 18212 } 18213 18214 // Normalize "" and auto 18215 val = parseFloat( val ) || 0; 18216 18217 // Adjust for the element's box model 18218 return ( val + 18219 boxModelAdjustment( 18220 elem, 18221 dimension, 18222 extra || ( isBorderBox ? "border" : "content" ), 18223 valueIsBorderBox, 18224 styles, 18225 18226 // Provide the current computed size to request scroll gutter calculation (gh-3589) 18227 val 18228 ) 18229 ) + "px"; 18230} 18231 18232jQuery.extend( { 18233 18234 // Add in style property hooks for overriding the default 18235 // behavior of getting and setting a style property 18236 cssHooks: { 18237 opacity: { 18238 get: function( elem, computed ) { 18239 if ( computed ) { 18240 18241 // We should always get a number back from opacity 18242 var ret = curCSS( elem, "opacity" ); 18243 return ret === "" ? "1" : ret; 18244 } 18245 } 18246 } 18247 }, 18248 18249 // Don't automatically add "px" to these possibly-unitless properties 18250 cssNumber: { 18251 "animationIterationCount": true, 18252 "columnCount": true, 18253 "fillOpacity": true, 18254 "flexGrow": true, 18255 "flexShrink": true, 18256 "fontWeight": true, 18257 "gridArea": true, 18258 "gridColumn": true, 18259 "gridColumnEnd": true, 18260 "gridColumnStart": true, 18261 "gridRow": true, 18262 "gridRowEnd": true, 18263 "gridRowStart": true, 18264 "lineHeight": true, 18265 "opacity": true, 18266 "order": true, 18267 "orphans": true, 18268 "widows": true, 18269 "zIndex": true, 18270 "zoom"
vendor: 42,949 bytes, lines 18270-19995
18270: true 18271 }, 18272 18273 // Add in properties whose names you wish to fix before 18274 // setting or getting the value 18275 cssProps: {}, 18276 18277 // Get and set the style property on a DOM Node 18278 style: function( elem, name, value, extra ) { 18279 18280 // Don't set styles on text and comment nodes 18281 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { 18282 return; 18283 } 18284 18285 // Make sure that we're working with the right name 18286 var ret, type, hooks, 18287 origName = camelCase( name ), 18288 isCustomProp = rcustomProp.test( name ), 18289 style = elem.style; 18290 18291 // Make sure that we're working with the right name. We don't 18292 // want to query the value if it is a CSS custom property 18293 // since they are user-defined. 18294 if ( !isCustomProp ) { 18295 name = finalPropName( origName ); 18296 } 18297 18298 // Gets hook for the prefixed version, then unprefixed version 18299 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 18300 18301 // Check if we're setting a value 18302 if ( value !== undefined ) { 18303 type = typeof value; 18304 18305 // Convert "+=" or "-=" to relative numbers (trac-7345) 18306 if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { 18307 value = adjustCSS( elem, name, ret ); 18308 18309 // Fixes bug trac-9237 18310 type = "number"; 18311 } 18312 18313 // Make sure that null and NaN values aren't set (trac-7116) 18314 if ( value == null || value !== value ) { 18315 return; 18316 } 18317 18318 // If a number was passed in, add the unit (except for certain CSS properties) 18319 // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append 18320 // "px" to a few hardcoded values. 18321 if ( type === "number" && !isCustomProp ) { 18322 value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); 18323 } 18324 18325 // background-* props affect original clone's values 18326 if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { 18327 style[ name ] = "inherit"; 18328 } 18329 18330 // If a hook was provided, use that value, otherwise just set the specified value 18331 if ( !hooks || !( "set" in hooks ) || 18332 ( value = hooks.set( elem, value, extra ) ) !== undefined ) { 18333 18334 if ( isCustomProp ) { 18335 style.setProperty( name, value ); 18336 } else { 18337 style[ name ] = value; 18338 } 18339 } 18340 18341 } else { 18342 18343 // If a hook was provided get the non-computed value from there 18344 if ( hooks && "get" in hooks && 18345 ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { 18346 18347 return ret; 18348 } 18349 18350 // Otherwise just get the value from the style object 18351 return style[ name ]; 18352 } 18353 }, 18354 18355 css: function( elem, name, extra, styles ) { 18356 var val, num, hooks, 18357 origName = camelCase( name ), 18358 isCustomProp = rcustomProp.test( name ); 18359 18360 // Make sure that we're working with the right name. We don't 18361 // want to modify the value if it is a CSS custom property 18362 // since they are user-defined. 18363 if ( !isCustomProp ) { 18364 name = finalPropName( origName ); 18365 } 18366 18367 // Try prefixed name followed by the unprefixed name 18368 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 18369 18370 // If a hook was provided get the computed value from there 18371 if ( hooks && "get" in hooks ) { 18372 val = hooks.get( elem, true, extra ); 18373 } 18374 18375 // Otherwise, if a way to get the computed value exists, use that 18376 if ( val === undefined ) { 18377 val = curCSS( elem, name, styles ); 18378 } 18379 18380 // Convert "normal" to computed value 18381 if ( val === "normal" && name in cssNormalTransform ) { 18382 val = cssNormalTransform[ name ]; 18383 } 18384 18385 // Make numeric if forced or a qualifier was provided and val looks numeric 18386 if ( extra === "" || extra ) { 18387 num = parseFloat( val ); 18388 return extra === true || isFinite( num ) ? num || 0 : val; 18389 } 18390 18391 return val; 18392 } 18393} ); 18394 18395jQuery.each( [ "height", "width" ], function( _i, dimension ) { 18396 jQuery.cssHooks[ dimension ] = { 18397 get: function( elem, computed, extra ) { 18398 if ( computed ) { 18399 18400 // Certain elements can have dimension info if we invisibly show them 18401 // but it must have a current display style that would benefit 18402 return rdisplayswap.test( jQuery.css( elem, "display" ) ) && 18403 18404 // Support: Safari 8+ 18405 // Table columns in Safari have non-zero offsetWidth & zero 18406 // getBoundingClientRect().width unless display is changed. 18407 // Support: IE <=11 only 18408 // Running getBoundingClientRect on a disconnected node 18409 // in IE throws an error. 18410 ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? 18411 swap( elem, cssShow, function() { 18412 return getWidthOrHeight( elem, dimension, extra ); 18413 } ) : 18414 getWidthOrHeight( elem, dimension, extra ); 18415 } 18416 }, 18417 18418 set: function( elem, value, extra ) { 18419 var matches, 18420 styles = getStyles( elem ), 18421 18422 // Only read styles.position if the test has a chance to fail 18423 // to avoid forcing a reflow. 18424 scrollboxSizeBuggy = !support.scrollboxSize() && 18425 styles.position === "absolute", 18426 18427 // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) 18428 boxSizingNeeded = scrollboxSizeBuggy || extra, 18429 isBorderBox = boxSizingNeeded && 18430 jQuery.css( elem, "boxSizing", false, styles ) === "border-box", 18431 subtract = extra ? 18432 boxModelAdjustment( 18433 elem, 18434 dimension, 18435 extra, 18436 isBorderBox, 18437 styles 18438 ) : 18439 0; 18440 18441 // Account for unreliable border-box dimensions by comparing offset* to computed and 18442 // faking a content-box to get border and padding (gh-3699) 18443 if ( isBorderBox && scrollboxSizeBuggy ) { 18444 subtract -= Math.ceil( 18445 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - 18446 parseFloat( styles[ dimension ] ) - 18447 boxModelAdjustment( elem, dimension, "border", false, styles ) - 18448 0.5 18449 ); 18450 } 18451 18452 // Convert to pixels if value adjustment is needed 18453 if ( subtract && ( matches = rcssNum.exec( value ) ) && 18454 ( matches[ 3 ] || "px" ) !== "px" ) { 18455 18456 elem.style[ dimension ] = value; 18457 value = jQuery.css( elem, dimension ); 18458 } 18459 18460 return setPositiveNumber( elem, value, subtract ); 18461 } 18462 }; 18463} ); 18464 18465jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, 18466 function( elem, computed ) { 18467 if ( computed ) { 18468 return ( parseFloat( curCSS( elem, "marginLeft" ) ) || 18469 elem.getBoundingClientRect().left - 18470 swap( elem, { marginLeft: 0 }, function() { 18471 return elem.getBoundingClientRect().left; 18472 } ) 18473 ) + "px"; 18474 } 18475 } 18476); 18477 18478// These hooks are used by animate to expand properties 18479jQuery.each( { 18480 margin: "", 18481 padding: "", 18482 border: "Width" 18483}, function( prefix, suffix ) { 18484 jQuery.cssHooks[ prefix + suffix ] = { 18485 expand: function( value ) { 18486 var i = 0, 18487 expanded = {}, 18488 18489 // Assumes a single number if not a string 18490 parts = typeof value === "string" ? value.split( " " ) : [ value ]; 18491 18492 for ( ; i < 4; i++ ) { 18493 expanded[ prefix + cssExpand[ i ] + suffix ] = 18494 parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; 18495 } 18496 18497 return expanded; 18498 } 18499 }; 18500 18501 if ( prefix !== "margin" ) { 18502 jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; 18503 } 18504} ); 18505 18506jQuery.fn.extend( { 18507 css: function( name, value ) { 18508 return access( this, function( elem, name, value ) { 18509 var styles, len, 18510 map = {}, 18511 i = 0; 18512 18513 if ( Array.isArray( name ) ) { 18514 styles = getStyles( elem ); 18515 len = name.length; 18516 18517 for ( ; i < len; i++ ) { 18518 map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); 18519 } 18520 18521 return map; 18522 } 18523 18524 return value !== undefined ? 18525 jQuery.style( elem, name, value ) : 18526 jQuery.css( elem, name ); 18527 }, name, value, arguments.length > 1 ); 18528 } 18529} ); 18530 18531 18532function Tween( elem, options, prop, end, easing ) { 18533 return new Tween.prototype.init( elem, options, prop, end, easing ); 18534} 18535jQuery.Tween = Tween; 18536 18537Tween.prototype = { 18538 constructor: Tween, 18539 init: function( elem, options, prop, end, easing, unit ) { 18540 this.elem = elem; 18541 this.prop = prop; 18542 this.easing = easing || jQuery.easing._default; 18543 this.options = options; 18544 this.start = this.now = this.cur(); 18545 this.end = end; 18546 this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); 18547 }, 18548 cur: function() { 18549 var hooks = Tween.propHooks[ this.prop ]; 18550 18551 return hooks && hooks.get ? 18552 hooks.get( this ) : 18553 Tween.propHooks._default.get( this ); 18554 }, 18555 run: function( percent ) { 18556 var eased, 18557 hooks = Tween.propHooks[ this.prop ]; 18558 18559 if ( this.options.duration ) { 18560 this.pos = eased = jQuery.easing[ this.easing ]( 18561 percent, this.options.duration * percent, 0, 1, this.options.duration 18562 ); 18563 } else { 18564 this.pos = eased = percent; 18565 } 18566 this.now = ( this.end - this.start ) * eased + this.start; 18567 18568 if ( this.options.step ) { 18569 this.options.step.call( this.elem, this.now, this ); 18570 } 18571 18572 if ( hooks && hooks.set ) { 18573 hooks.set( this ); 18574 } else { 18575 Tween.propHooks._default.set( this ); 18576 } 18577 return this; 18578 } 18579}; 18580 18581Tween.prototype.init.prototype = Tween.prototype; 18582 18583Tween.propHooks = { 18584 _default: { 18585 get: function( tween ) { 18586 var result; 18587 18588 // Use a property on the element directly when it is not a DOM element, 18589 // or when there is no matching style property that exists. 18590 if ( tween.elem.nodeType !== 1 || 18591 tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { 18592 return tween.elem[ tween.prop ]; 18593 } 18594 18595 // Passing an empty string as a 3rd parameter to .css will automatically 18596 // attempt a parseFloat and fallback to a string if the parse fails. 18597 // Simple values such as "10px" are parsed to Float; 18598 // complex values such as "rotate(1rad)" are returned as-is. 18599 result = jQuery.css( tween.elem, tween.prop, "" ); 18600 18601 // Empty strings, null, undefined and "auto" are converted to 0. 18602 return !result || result === "auto" ? 0 : result; 18603 }, 18604 set: function( tween ) { 18605 18606 // Use step hook for back compat. 18607 // Use cssHook if its there. 18608 // Use .style if available and use plain properties where available. 18609 if ( jQuery.fx.step[ tween.prop ] ) { 18610 jQuery.fx.step[ tween.prop ]( tween ); 18611 } else if ( tween.elem.nodeType === 1 && ( 18612 jQuery.cssHooks[ tween.prop ] || 18613 tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { 18614 jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); 18615 } else { 18616 tween.elem[ tween.prop ] = tween.now; 18617 } 18618 } 18619 } 18620}; 18621 18622// Support: IE <=9 only 18623// Panic based approach to setting things on disconnected nodes 18624Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { 18625 set: function( tween ) { 18626 if ( tween.elem.nodeType && tween.elem.parentNode ) { 18627 tween.elem[ tween.prop ] = tween.now; 18628 } 18629 } 18630}; 18631 18632jQuery.easing = { 18633 linear: function( p ) { 18634 return p; 18635 }, 18636 swing: function( p ) { 18637 return 0.5 - Math.cos( p * Math.PI ) / 2; 18638 }, 18639 _default: "swing" 18640}; 18641 18642jQuery.fx = Tween.prototype.init; 18643 18644// Back compat <1.8 extension point 18645jQuery.fx.step = {}; 18646 18647 18648 18649 18650var 18651 fxNow, inProgress, 18652 rfxtypes = /^(?:toggle|show|hide)$/, 18653 rrun = /queueHooks$/; 18654 18655function schedule() { 18656 if ( inProgress ) { 18657 if ( document.hidden === false && window.requestAnimationFrame ) { 18658 window.requestAnimationFrame( schedule ); 18659 } else { 18660 window.setTimeout( schedule, jQuery.fx.interval ); 18661 } 18662 18663 jQuery.fx.tick(); 18664 } 18665} 18666 18667// Animations created synchronously will run synchronously 18668function createFxNow() { 18669 window.setTimeout( function() { 18670 fxNow = undefined; 18671 } ); 18672 return ( fxNow = Date.now() ); 18673} 18674 18675// Generate parameters to create a standard animation 18676function genFx( type, includeWidth ) { 18677 var which, 18678 i = 0, 18679 attrs = { height: type }; 18680 18681 // If we include width, step value is 1 to do all cssExpand values, 18682 // otherwise step value is 2 to skip over Left and Right 18683 includeWidth = includeWidth ? 1 : 0; 18684 for ( ; i < 4; i += 2 - includeWidth ) { 18685 which = cssExpand[ i ]; 18686 attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; 18687 } 18688 18689 if ( includeWidth ) { 18690 attrs.opacity = attrs.width = type; 18691 } 18692 18693 return attrs; 18694} 18695 18696function createTween( value, prop, animation ) { 18697 var tween, 18698 collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), 18699 index = 0, 18700 length = collection.length; 18701 for ( ; index < length; index++ ) { 18702 if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { 18703 18704 // We're done with this property 18705 return tween; 18706 } 18707 } 18708} 18709 18710function defaultPrefilter( elem, props, opts ) { 18711 var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, 18712 isBox = "width" in props || "height" in props, 18713 anim = this, 18714 orig = {}, 18715 style = elem.style, 18716 hidden = elem.nodeType && isHiddenWithinTree( elem ), 18717 dataShow = dataPriv.get( elem, "fxshow" ); 18718 18719 // Queue-skipping animations hijack the fx hooks 18720 if ( !opts.queue ) { 18721 hooks = jQuery._queueHooks( elem, "fx" ); 18722 if ( hooks.unqueued == null ) { 18723 hooks.unqueued = 0; 18724 oldfire = hooks.empty.fire; 18725 hooks.empty.fire = function() { 18726 if ( !hooks.unqueued ) { 18727 oldfire(); 18728 } 18729 }; 18730 } 18731 hooks.unqueued++; 18732 18733 anim.always( function() { 18734 18735 // Ensure the complete handler is called before this completes 18736 anim.always( function() { 18737 hooks.unqueued--; 18738 if ( !jQuery.queue( elem, "fx" ).length ) { 18739 hooks.empty.fire(); 18740 } 18741 } ); 18742 } ); 18743 } 18744 18745 // Detect show/hide animations 18746 for ( prop in props ) { 18747 value = props[ prop ]; 18748 if ( rfxtypes.test( value ) ) { 18749 delete props[ prop ]; 18750 toggle = toggle || value === "toggle"; 18751 if ( value === ( hidden ? "hide" : "show" ) ) { 18752 18753 // Pretend to be hidden if this is a "show" and 18754 // there is still data from a stopped show/hide 18755 if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { 18756 hidden = true; 18757 18758 // Ignore all other no-op show/hide data 18759 } else { 18760 continue; 18761 } 18762 } 18763 orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); 18764 } 18765 } 18766 18767 // Bail out if this is a no-op like .hide().hide() 18768 propTween = !jQuery.isEmptyObject( props ); 18769 if ( !propTween && jQuery.isEmptyObject( orig ) ) { 18770 return; 18771 } 18772 18773 // Restrict "overflow" and "display" styles during box animations 18774 if ( isBox && elem.nodeType === 1 ) { 18775 18776 // Support: IE <=9 - 11, Edge 12 - 15 18777 // Record all 3 overflow attributes because IE does not infer the shorthand 18778 // from identically-valued overflowX and overflowY and Edge just mirrors 18779 // the overflowX value there. 18780 opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; 18781 18782 // Identify a display type, preferring old show/hide data over the CSS cascade 18783 restoreDisplay = dataShow && dataShow.display; 18784 if ( restoreDisplay == null ) { 18785 restoreDisplay = dataPriv.get( elem, "display" ); 18786 } 18787 display = jQuery.css( elem, "display" ); 18788 if ( display === "none" ) { 18789 if ( restoreDisplay ) { 18790 display = restoreDisplay; 18791 } else { 18792 18793 // Get nonempty value(s) by temporarily forcing visibility 18794 showHide( [ elem ], true ); 18795 restoreDisplay = elem.style.display || restoreDisplay; 18796 display = jQuery.css( elem, "display" ); 18797 showHide( [ elem ] ); 18798 } 18799 } 18800 18801 // Animate inline elements as inline-block 18802 if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { 18803 if ( jQuery.css( elem, "float" ) === "none" ) { 18804 18805 // Restore the original display value at the end of pure show/hide animations 18806 if ( !propTween ) { 18807 anim.done( function() { 18808 style.display = restoreDisplay; 18809 } ); 18810 if ( restoreDisplay == null ) { 18811 display = style.display; 18812 restoreDisplay = display === "none" ? "" : display; 18813 } 18814 } 18815 style.display = "inline-block"; 18816 } 18817 } 18818 } 18819 18820 if ( opts.overflow ) { 18821 style.overflow = "hidden"; 18822 anim.always( function() { 18823 style.overflow = opts.overflow[ 0 ]; 18824 style.overflowX = opts.overflow[ 1 ]; 18825 style.overflowY = opts.overflow[ 2 ]; 18826 } ); 18827 } 18828 18829 // Implement show/hide animations 18830 propTween = false; 18831 for ( prop in orig ) { 18832 18833 // General show/hide setup for this element animation 18834 if ( !propTween ) { 18835 if ( dataShow ) { 18836 if ( "hidden" in dataShow ) { 18837 hidden = dataShow.hidden; 18838 } 18839 } else { 18840 dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); 18841 } 18842 18843 // Store hidden/visible for toggle so `.stop().toggle()` "reverses" 18844 if ( toggle ) { 18845 dataShow.hidden = !hidden; 18846 } 18847 18848 // Show elements before animating them 18849 if ( hidden ) { 18850 showHide( [ elem ], true ); 18851 } 18852 18853 /* eslint-disable no-loop-func */ 18854 18855 anim.done( function() { 18856 18857 /* eslint-enable no-loop-func */ 18858 18859 // The final step of a "hide" animation is actually hiding the element 18860 if ( !hidden ) { 18861 showHide( [ elem ] ); 18862 } 18863 dataPriv.remove( elem, "fxshow" ); 18864 for ( prop in orig ) { 18865 jQuery.style( elem, prop, orig[ prop ] ); 18866 } 18867 } ); 18868 } 18869 18870 // Per-property setup 18871 propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); 18872 if ( !( prop in dataShow ) ) { 18873 dataShow[ prop ] = propTween.start; 18874 if ( hidden ) { 18875 propTween.end = propTween.start; 18876 propTween.start = 0; 18877 } 18878 } 18879 } 18880} 18881 18882function propFilter( props, specialEasing ) { 18883 var index, name, easing, value, hooks; 18884 18885 // camelCase, specialEasing and expand cssHook pass 18886 for ( index in props ) { 18887 name = camelCase( index ); 18888 easing = specialEasing[ name ]; 18889 value = props[ index ]; 18890 if ( Array.isArray( value ) ) { 18891 easing = value[ 1 ]; 18892 value = props[ index ] = value[ 0 ]; 18893 } 18894 18895 if ( index !== name ) { 18896 props[ name ] = value; 18897 delete props[ index ]; 18898 } 18899 18900 hooks = jQuery.cssHooks[ name ]; 18901 if ( hooks && "expand" in hooks ) { 18902 value = hooks.expand( value ); 18903 delete props[ name ]; 18904 18905 // Not quite $.extend, this won't overwrite existing keys. 18906 // Reusing 'index' because we have the correct "name" 18907 for ( index in value ) { 18908 if ( !( index in props ) ) { 18909 props[ index ] = value[ index ]; 18910 specialEasing[ index ] = easing; 18911 } 18912 } 18913 } else { 18914 specialEasing[ name ] = easing; 18915 } 18916 } 18917} 18918 18919function Animation( elem, properties, options ) { 18920 var result, 18921 stopped, 18922 index = 0, 18923 length = Animation.prefilters.length, 18924 deferred = jQuery.Deferred().always( function() { 18925 18926 // Don't match elem in the :animated selector 18927 delete tick.elem; 18928 } ), 18929 tick = function() { 18930 if ( stopped ) { 18931 return false; 18932 } 18933 var currentTime = fxNow || createFxNow(), 18934 remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), 18935 18936 // Support: Android 2.3 only 18937 // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497) 18938 temp = remaining / animation.duration || 0, 18939 percent = 1 - temp, 18940 index = 0, 18941 length = animation.tweens.length; 18942 18943 for ( ; index < length; index++ ) { 18944 animation.tweens[ index ].run( percent ); 18945 } 18946 18947 deferred.notifyWith( elem, [ animation, percent, remaining ] ); 18948 18949 // If there's more to do, yield 18950 if ( percent < 1 && length ) { 18951 return remaining; 18952 } 18953 18954 // If this was an empty animation, synthesize a final progress notification 18955 if ( !length ) { 18956 deferred.notifyWith( elem, [ animation, 1, 0 ] ); 18957 } 18958 18959 // Resolve the animation and report its conclusion 18960 deferred.resolveWith( elem, [ animation ] ); 18961 return false; 18962 }, 18963 animation = deferred.promise( { 18964 elem: elem, 18965 props: jQuery.extend( {}, properties ), 18966 opts: jQuery.extend( true, { 18967 specialEasing: {}, 18968 easing: jQuery.easing._default 18969 }, options ), 18970 originalProperties: properties, 18971 originalOptions: options, 18972 startTime: fxNow || createFxNow(), 18973 duration: options.duration, 18974 tweens: [], 18975 createTween: function( prop, end ) { 18976 var tween = jQuery.Tween( elem, animation.opts, prop, end, 18977 animation.opts.specialEasing[ prop ] || animation.opts.easing ); 18978 animation.tweens.push( tween ); 18979 return tween; 18980 }, 18981 stop: function( gotoEnd ) { 18982 var index = 0, 18983 18984 // If we are going to the end, we want to run all the tweens 18985 // otherwise we skip this part 18986 length = gotoEnd ? animation.tweens.length : 0; 18987 if ( stopped ) { 18988 return this; 18989 } 18990 stopped = true; 18991 for ( ; index < length; index++ ) { 18992 animation.tweens[ index ].run( 1 ); 18993 } 18994 18995 // Resolve when we played the last frame; otherwise, reject 18996 if ( gotoEnd ) { 18997 deferred.notifyWith( elem, [ animation, 1, 0 ] ); 18998 deferred.resolveWith( elem, [ animation, gotoEnd ] ); 18999 } else { 19000 deferred.rejectWith( elem, [ animation, gotoEnd ] ); 19001 } 19002 return this; 19003 } 19004 } ), 19005 props = animation.props; 19006 19007 propFilter( props, animation.opts.specialEasing ); 19008 19009 for ( ; index < length; index++ ) { 19010 result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); 19011 if ( result ) { 19012 if ( isFunction( result.stop ) ) { 19013 jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = 19014 result.stop.bind( result ); 19015 } 19016 return result; 19017 } 19018 } 19019 19020 jQuery.map( props, createTween, animation ); 19021 19022 if ( isFunction( animation.opts.start ) ) { 19023 animation.opts.start.call( elem, animation ); 19024 } 19025 19026 // Attach callbacks from options 19027 animation 19028 .progress( animation.opts.progress ) 19029 .done( animation.opts.done, animation.opts.complete ) 19030 .fail( animation.opts.fail ) 19031 .always( animation.opts.always ); 19032 19033 jQuery.fx.timer( 19034 jQuery.extend( tick, { 19035 elem: elem, 19036 anim: animation, 19037 queue: animation.opts.queue 19038 } ) 19039 ); 19040 19041 return animation; 19042} 19043 19044jQuery.Animation = jQuery.extend( Animation, { 19045 19046 tweeners: { 19047 "*": [ function( prop, value ) { 19048 var tween = this.createTween( prop, value ); 19049 adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); 19050 return tween; 19051 } ] 19052 }, 19053 19054 tweener: function( props, callback ) { 19055 if ( isFunction( props ) ) { 19056 callback = props; 19057 props = [ "*" ]; 19058 } else { 19059 props = props.match( rnothtmlwhite ); 19060 } 19061 19062 var prop, 19063 index = 0, 19064 length = props.length; 19065 19066 for ( ; index < length; index++ ) { 19067 prop = props[ index ]; 19068 Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; 19069 Animation.tweeners[ prop ].unshift( callback ); 19070 } 19071 }, 19072 19073 prefilters: [ defaultPrefilter ], 19074 19075 prefilter: function( callback, prepend ) { 19076 if ( prepend ) { 19077 Animation.prefilters.unshift( callback ); 19078 } else { 19079 Animation.prefilters.push( callback ); 19080 } 19081 } 19082} ); 19083 19084jQuery.speed = function( speed, easing, fn ) { 19085 var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { 19086 complete: fn || !fn && easing || 19087 isFunction( speed ) && speed, 19088 duration: speed, 19089 easing: fn && easing || easing && !isFunction( easing ) && easing 19090 }; 19091 19092 // Go to the end state if fx are off 19093 if ( jQuery.fx.off ) { 19094 opt.duration = 0; 19095 19096 } else { 19097 if ( typeof opt.duration !== "number" ) { 19098 if ( opt.duration in jQuery.fx.speeds ) { 19099 opt.duration = jQuery.fx.speeds[ opt.duration ]; 19100 19101 } else { 19102 opt.duration = jQuery.fx.speeds._default; 19103 } 19104 } 19105 } 19106 19107 // Normalize opt.queue - true/undefined/null -> "fx" 19108 if ( opt.queue == null || opt.queue === true ) { 19109 opt.queue = "fx"; 19110 } 19111 19112 // Queueing 19113 opt.old = opt.complete; 19114 19115 opt.complete = function() { 19116 if ( isFunction( opt.old ) ) { 19117 opt.old.call( this ); 19118 } 19119 19120 if ( opt.queue ) { 19121 jQuery.dequeue( this, opt.queue ); 19122 } 19123 }; 19124 19125 return opt; 19126}; 19127 19128jQuery.fn.extend( { 19129 fadeTo: function( speed, to, easing, callback ) { 19130 19131 // Show any hidden elements after setting opacity to 0 19132 return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() 19133 19134 // Animate to the value specified 19135 .end().animate( { opacity: to }, speed, easing, callback ); 19136 }, 19137 animate: function( prop, speed, easing, callback ) { 19138 var empty = jQuery.isEmptyObject( prop ), 19139 optall = jQuery.speed( speed, easing, callback ), 19140 doAnimation = function() { 19141 19142 // Operate on a copy of prop so per-property easing won't be lost 19143 var anim = Animation( this, jQuery.extend( {}, prop ), optall ); 19144 19145 // Empty animations, or finishing resolves immediately 19146 if ( empty || dataPriv.get( this, "finish" ) ) { 19147 anim.stop( true ); 19148 } 19149 }; 19150 19151 doAnimation.finish = doAnimation; 19152 19153 return empty || optall.queue === false ? 19154 this.each( doAnimation ) : 19155 this.queue( optall.queue, doAnimation ); 19156 }, 19157 stop: function( type, clearQueue, gotoEnd ) { 19158 var stopQueue = function( hooks ) { 19159 var stop = hooks.stop; 19160 delete hooks.stop; 19161 stop( gotoEnd ); 19162 }; 19163 19164 if ( typeof type !== "string" ) { 19165 gotoEnd = clearQueue; 19166 clearQueue = type; 19167 type = undefined; 19168 } 19169 if ( clearQueue ) { 19170 this.queue( type || "fx", [] ); 19171 } 19172 19173 return this.each( function() { 19174 var dequeue = true, 19175 index = type != null && type + "queueHooks", 19176 timers = jQuery.timers, 19177 data = dataPriv.get( this ); 19178 19179 if ( index ) { 19180 if ( data[ index ] && data[ index ].stop ) { 19181 stopQueue( data[ index ] ); 19182 } 19183 } else { 19184 for ( index in data ) { 19185 if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { 19186 stopQueue( data[ index ] ); 19187 } 19188 } 19189 } 19190 19191 for ( index = timers.length; index--; ) { 19192 if ( timers[ index ].elem === this && 19193 ( type == null || timers[ index ].queue === type ) ) { 19194 19195 timers[ index ].anim.stop( gotoEnd ); 19196 dequeue = false; 19197 timers.splice( index, 1 ); 19198 } 19199 } 19200 19201 // Start the next in the queue if the last step wasn't forced. 19202 // Timers currently will call their complete callbacks, which 19203 // will dequeue but only if they were gotoEnd. 19204 if ( dequeue || !gotoEnd ) { 19205 jQuery.dequeue( this, type ); 19206 } 19207 } ); 19208 }, 19209 finish: function( type ) { 19210 if ( type !== false ) { 19211 type = type || "fx"; 19212 } 19213 return this.each( function() { 19214 var index, 19215 data = dataPriv.get( this ), 19216 queue = data[ type + "queue" ], 19217 hooks = data[ type + "queueHooks" ], 19218 timers = jQuery.timers, 19219 length = queue ? queue.length : 0; 19220 19221 // Enable finishing flag on private data 19222 data.finish = true; 19223 19224 // Empty the queue first 19225 jQuery.queue( this, type, [] ); 19226 19227 if ( hooks && hooks.stop ) { 19228 hooks.stop.call( this, true ); 19229 } 19230 19231 // Look for any active animations, and finish them 19232 for ( index = timers.length; index--; ) { 19233 if ( timers[ index ].elem === this && timers[ index ].queue === type ) { 19234 timers[ index ].anim.stop( true ); 19235 timers.splice( index, 1 ); 19236 } 19237 } 19238 19239 // Look for any animations in the old queue and finish them 19240 for ( index = 0; index < length; index++ ) { 19241 if ( queue[ index ] && queue[ index ].finish ) { 19242 queue[ index ].finish.call( this ); 19243 } 19244 } 19245 19246 // Turn off finishing flag 19247 delete data.finish; 19248 } ); 19249 } 19250} ); 19251 19252jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { 19253 var cssFn = jQuery.fn[ name ]; 19254 jQuery.fn[ name ] = function( speed, easing, callback ) { 19255 return speed == null || typeof speed === "boolean" ? 19256 cssFn.apply( this, arguments ) : 19257 this.animate( genFx( name, true ), speed, easing, callback ); 19258 }; 19259} ); 19260 19261// Generate shortcuts for custom animations 19262jQuery.each( { 19263 slideDown: genFx( "show" ), 19264 slideUp: genFx( "hide" ), 19265 slideToggle: genFx( "toggle" ), 19266 fadeIn: { opacity: "show" }, 19267 fadeOut: { opacity: "hide" }, 19268 fadeToggle: { opacity: "toggle" } 19269}, function( name, props ) { 19270 jQuery.fn[ name ] = function( speed, easing, callback ) { 19271 return this.animate( props, speed, easing, callback ); 19272 }; 19273} ); 19274 19275jQuery.timers = []; 19276jQuery.fx.tick = function() { 19277 var timer, 19278 i = 0, 19279 timers = jQuery.timers; 19280 19281 fxNow = Date.now(); 19282 19283 for ( ; i < timers.length; i++ ) { 19284 timer = timers[ i ]; 19285 19286 // Run the timer and safely remove it when done (allowing for external removal) 19287 if ( !timer() && timers[ i ] === timer ) { 19288 timers.splice( i--, 1 ); 19289 } 19290 } 19291 19292 if ( !timers.length ) { 19293 jQuery.fx.stop(); 19294 } 19295 fxNow = undefined; 19296}; 19297 19298jQuery.fx.timer = function( timer ) { 19299 jQuery.timers.push( timer ); 19300 jQuery.fx.start(); 19301}; 19302 19303jQuery.fx.interval = 13; 19304jQuery.fx.start = function() { 19305 if ( inProgress ) { 19306 return; 19307 } 19308 19309 inProgress = true; 19310 schedule(); 19311}; 19312 19313jQuery.fx.stop = function() { 19314 inProgress = null; 19315}; 19316 19317jQuery.fx.speeds = { 19318 slow: 600, 19319 fast: 200, 19320 19321 // Default speed 19322 _default: 400 19323}; 19324 19325 19326// Based off of the plugin by Clint Helfers, with permission. 19327jQuery.fn.delay = function( time, type ) { 19328 time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; 19329 type = type || "fx"; 19330 19331 return this.queue( type, function( next, hooks ) { 19332 var timeout = window.setTimeout( next, time ); 19333 hooks.stop = function() { 19334 window.clearTimeout( timeout ); 19335 }; 19336 } ); 19337}; 19338 19339 19340( function() { 19341 var input = document.createElement( "input" ), 19342 select = document.createElement( "select" ), 19343 opt = select.appendChild( document.createElement( "option" ) ); 19344 19345 input.type = "checkbox"; 19346 19347 // Support: Android <=4.3 only 19348 // Default value for a checkbox should be "on" 19349 support.checkOn = input.value !== ""; 19350 19351 // Support: IE <=11 only 19352 // Must access selectedIndex to make default options select 19353 support.optSelected = opt.selected; 19354 19355 // Support: IE <=11 only 19356 // An input loses its value after becoming a radio 19357 input = document.createElement( "input" ); 19358 input.value = "t"; 19359 input.type = "radio"; 19360 support.radioValue = input.value === "t"; 19361} )(); 19362 19363 19364var boolHook, 19365 attrHandle = jQuery.expr.attrHandle; 19366 19367jQuery.fn.extend( { 19368 attr: function( name, value ) { 19369 return access( this, jQuery.attr, name, value, arguments.length > 1 ); 19370 }, 19371 19372 removeAttr: function( name ) { 19373 return this.each( function() { 19374 jQuery.removeAttr( this, name ); 19375 } ); 19376 } 19377} ); 19378 19379jQuery.extend( { 19380 attr: function( elem, name, value ) { 19381 var ret, hooks, 19382 nType = elem.nodeType; 19383 19384 // Don't get/set attributes on text, comment and attribute nodes 19385 if ( nType === 3 || nType === 8 || nType === 2 ) { 19386 return; 19387 } 19388 19389 // Fallback to prop when attributes are not supported 19390 if ( typeof elem.getAttribute === "undefined" ) { 19391 return jQuery.prop( elem, name, value ); 19392 } 19393 19394 // Attribute hooks are determined by the lowercase version 19395 // Grab necessary hook if one is defined 19396 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 19397 hooks = jQuery.attrHooks[ name.toLowerCase() ] || 19398 ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); 19399 } 19400 19401 if ( value !== undefined ) { 19402 if ( value === null ) { 19403 jQuery.removeAttr( elem, name ); 19404 return; 19405 } 19406 19407 if ( hooks && "set" in hooks && 19408 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 19409 return ret; 19410 } 19411 19412 elem.setAttribute( name, value + "" ); 19413 return value; 19414 } 19415 19416 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 19417 return ret; 19418 } 19419 19420 ret = jQuery.find.attr( elem, name ); 19421 19422 // Non-existent attributes return null, we normalize to undefined 19423 return ret == null ? undefined : ret; 19424 }, 19425 19426 attrHooks: { 19427 type: { 19428 set: function( elem, value ) { 19429 if ( !support.radioValue && value === "radio" && 19430 nodeName( elem, "input" ) ) { 19431 var val = elem.value; 19432 elem.setAttribute( "type", value ); 19433 if ( val ) { 19434 elem.value = val; 19435 } 19436 return value; 19437 } 19438 } 19439 } 19440 }, 19441 19442 removeAttr: function( elem, value ) { 19443 var name, 19444 i = 0, 19445 19446 // Attribute names can contain non-HTML whitespace characters 19447 // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 19448 attrNames = value && value.match( rnothtmlwhite ); 19449 19450 if ( attrNames && elem.nodeType === 1 ) { 19451 while ( ( name = attrNames[ i++ ] ) ) { 19452 elem.removeAttribute( name ); 19453 } 19454 } 19455 } 19456} ); 19457 19458// Hooks for boolean attributes 19459boolHook = { 19460 set: function( elem, value, name ) { 19461 if ( value === false ) { 19462 19463 // Remove boolean attributes when set to false 19464 jQuery.removeAttr( elem, name ); 19465 } else { 19466 elem.setAttribute( name, name ); 19467 } 19468 return name; 19469 } 19470}; 19471 19472jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { 19473 var getter = attrHandle[ name ] || jQuery.find.attr; 19474 19475 attrHandle[ name ] = function( elem, name, isXML ) { 19476 var ret, handle, 19477 lowercaseName = name.toLowerCase(); 19478 19479 if ( !isXML ) { 19480 19481 // Avoid an infinite loop by temporarily removing this function from the getter 19482 handle = attrHandle[ lowercaseName ]; 19483 attrHandle[ lowercaseName ] = ret; 19484 ret = getter( elem, name, isXML ) != null ? 19485 lowercaseName : 19486 null; 19487 attrHandle[ lowercaseName ] = handle; 19488 } 19489 return ret; 19490 }; 19491} ); 19492 19493 19494 19495 19496var rfocusable = /^(?:input|select|textarea|button)$/i, 19497 rclickable = /^(?:a|area)$/i; 19498 19499jQuery.fn.extend( { 19500 prop: function( name, value ) { 19501 return access( this, jQuery.prop, name, value, arguments.length > 1 ); 19502 }, 19503 19504 removeProp: function( name ) { 19505 return this.each( function() { 19506 delete this[ jQuery.propFix[ name ] || name ]; 19507 } ); 19508 } 19509} ); 19510 19511jQuery.extend( { 19512 prop: function( elem, name, value ) { 19513 var ret, hooks, 19514 nType = elem.nodeType; 19515 19516 // Don't get/set properties on text, comment and attribute nodes 19517 if ( nType === 3 || nType === 8 || nType === 2 ) { 19518 return; 19519 } 19520 19521 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 19522 19523 // Fix name and attach hooks 19524 name = jQuery.propFix[ name ] || name; 19525 hooks = jQuery.propHooks[ name ]; 19526 } 19527 19528 if ( value !== undefined ) { 19529 if ( hooks && "set" in hooks && 19530 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 19531 return ret; 19532 } 19533 19534 return ( elem[ name ] = value ); 19535 } 19536 19537 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 19538 return ret; 19539 } 19540 19541 return elem[ name ]; 19542 }, 19543 19544 propHooks: { 19545 tabIndex: { 19546 get: function( elem ) { 19547 19548 // Support: IE <=9 - 11 only 19549 // elem.tabIndex doesn't always return the 19550 // correct value when it hasn't been explicitly set 19551 // Use proper attribute retrieval (trac-12072) 19552 var tabindex = jQuery.find.attr( elem, "tabindex" ); 19553 19554 if ( tabindex ) { 19555 return parseInt( tabindex, 10 ); 19556 } 19557 19558 if ( 19559 rfocusable.test( elem.nodeName ) || 19560 rclickable.test( elem.nodeName ) && 19561 elem.href 19562 ) { 19563 return 0; 19564 } 19565 19566 return -1; 19567 } 19568 } 19569 }, 19570 19571 propFix: { 19572 "for": "htmlFor", 19573 "class": "className" 19574 } 19575} ); 19576 19577// Support: IE <=11 only 19578// Accessing the selectedIndex property 19579// forces the browser to respect setting selected 19580// on the option 19581// The getter ensures a default option is selected 19582// when in an optgroup 19583// eslint rule "no-unused-expressions" is disabled for this code 19584// since it considers such accessions noop 19585if ( !support.optSelected ) { 19586 jQuery.propHooks.selected = { 19587 get: function( elem ) { 19588 19589 /* eslint no-unused-expressions: "off" */ 19590 19591 var parent = elem.parentNode; 19592 if ( parent && parent.parentNode ) { 19593 parent.parentNode.selectedIndex; 19594 } 19595 return null; 19596 }, 19597 set: function( elem ) { 19598 19599 /* eslint no-unused-expressions: "off" */ 19600 19601 var parent = elem.parentNode; 19602 if ( parent ) { 19603 parent.selectedIndex; 19604 19605 if ( parent.parentNode ) { 19606 parent.parentNode.selectedIndex; 19607 } 19608 } 19609 } 19610 }; 19611} 19612 19613jQuery.each( [ 19614 "tabIndex", 19615 "readOnly", 19616 "maxLength", 19617 "cellSpacing", 19618 "cellPadding", 19619 "rowSpan", 19620 "colSpan", 19621 "useMap", 19622 "frameBorder", 19623 "contentEditable" 19624], function() { 19625 jQuery.propFix[ this.toLowerCase() ] = this; 19626} ); 19627 19628 19629 19630 19631 // Strip and collapse whitespace according to HTML spec 19632 // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace 19633 function stripAndCollapse( value ) { 19634 var tokens = value.match( rnothtmlwhite ) || []; 19635 return tokens.join( " " ); 19636 } 19637 19638 19639function getClass( elem ) { 19640 return elem.getAttribute && elem.getAttribute( "class" ) || ""; 19641} 19642 19643function classesToArray( value ) { 19644 if ( Array.isArray( value ) ) { 19645 return value; 19646 } 19647 if ( typeof value === "string" ) { 19648 return value.match( rnothtmlwhite ) || []; 19649 } 19650 return []; 19651} 19652 19653jQuery.fn.extend( { 19654 addClass: function( value ) { 19655 var classNames, cur, curValue, className, i, finalValue; 19656 19657 if ( isFunction( value ) ) { 19658 return this.each( function( j ) { 19659 jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); 19660 } ); 19661 } 19662 19663 classNames = classesToArray( value ); 19664 19665 if ( classNames.length ) { 19666 return this.each( function() { 19667 curValue = getClass( this ); 19668 cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); 19669 19670 if ( cur ) { 19671 for ( i = 0; i < classNames.length; i++ ) { 19672 className = classNames[ i ]; 19673 if ( cur.indexOf( " " + className + " " ) < 0 ) { 19674 cur += className + " "; 19675 } 19676 } 19677 19678 // Only assign if different to avoid unneeded rendering. 19679 finalValue = stripAndCollapse( cur ); 19680 if ( curValue !== finalValue ) { 19681 this.setAttribute( "class", finalValue ); 19682 } 19683 } 19684 } ); 19685 } 19686 19687 return this; 19688 }, 19689 19690 removeClass: function( value ) { 19691 var classNames, cur, curValue, className, i, finalValue; 19692 19693 if ( isFunction( value ) ) { 19694 return this.each( function( j ) { 19695 jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); 19696 } ); 19697 } 19698 19699 if ( !arguments.length ) { 19700 return this.attr( "class", "" ); 19701 } 19702 19703 classNames = classesToArray( value ); 19704 19705 if ( classNames.length ) { 19706 return this.each( function() { 19707 curValue = getClass( this ); 19708 19709 // This expression is here for better compressibility (see addClass) 19710 cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); 19711 19712 if ( cur ) { 19713 for ( i = 0; i < classNames.length; i++ ) { 19714 className = classNames[ i ]; 19715 19716 // Remove *all* instances 19717 while ( cur.indexOf( " " + className + " " ) > -1 ) { 19718 cur = cur.replace( " " + className + " ", " " ); 19719 } 19720 } 19721 19722 // Only assign if different to avoid unneeded rendering. 19723 finalValue = stripAndCollapse( cur ); 19724 if ( curValue !== finalValue ) { 19725 this.setAttribute( "class", finalValue ); 19726 } 19727 } 19728 } ); 19729 } 19730 19731 return this; 19732 }, 19733 19734 toggleClass: function( value, stateVal ) { 19735 var classNames, className, i, self, 19736 type = typeof value, 19737 isValidValue = type === "string" || Array.isArray( value ); 19738 19739 if ( isFunction( value ) ) { 19740 return this.each( function( i ) { 19741 jQuery( this ).toggleClass( 19742 value.call( this, i, getClass( this ), stateVal ), 19743 stateVal 19744 ); 19745 } ); 19746 } 19747 19748 if ( typeof stateVal === "boolean" && isValidValue ) { 19749 return stateVal ? this.addClass( value ) : this.removeClass( value ); 19750 } 19751 19752 classNames = classesToArray( value ); 19753 19754 return this.each( function() { 19755 if ( isValidValue ) { 19756 19757 // Toggle individual class names 19758 self = jQuery( this ); 19759 19760 for ( i = 0; i < classNames.length; i++ ) { 19761 className = classNames[ i ]; 19762 19763 // Check each className given, space separated list 19764 if ( self.hasClass( className ) ) { 19765 self.removeClass( className ); 19766 } else { 19767 self.addClass( className ); 19768 } 19769 } 19770 19771 // Toggle whole class name 19772 } else if ( value === undefined || type === "boolean" ) { 19773 className = getClass( this ); 19774 if ( className ) { 19775 19776 // Store className if set 19777 dataPriv.set( this, "__className__", className ); 19778 } 19779 19780 // If the element has a class name or if we're passed `false`, 19781 // then remove the whole classname (if there was one, the above saved it). 19782 // Otherwise bring back whatever was previously saved (if anything), 19783 // falling back to the empty string if nothing was stored. 19784 if ( this.setAttribute ) { 19785 this.setAttribute( "class", 19786 className || value === false ? 19787 "" : 19788 dataPriv.get( this, "__className__" ) || "" 19789 ); 19790 } 19791 } 19792 } ); 19793 }, 19794 19795 hasClass: function( selector ) { 19796 var className, elem, 19797 i = 0; 19798 19799 className = " " + selector + " "; 19800 while ( ( elem = this[ i++ ] ) ) { 19801 if ( elem.nodeType === 1 && 19802 ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { 19803 return true; 19804 } 19805 } 19806 19807 return false; 19808 } 19809} ); 19810 19811 19812 19813 19814var rreturn = /\r/g; 19815 19816jQuery.fn.extend( { 19817 val: function( value ) { 19818 var hooks, ret, valueIsFunction, 19819 elem = this[ 0 ]; 19820 19821 if ( !arguments.length ) { 19822 if ( elem ) { 19823 hooks = jQuery.valHooks[ elem.type ] || 19824 jQuery.valHooks[ elem.nodeName.toLowerCase() ]; 19825 19826 if ( hooks && 19827 "get" in hooks && 19828 ( ret = hooks.get( elem, "value" ) ) !== undefined 19829 ) { 19830 return ret; 19831 } 19832 19833 ret = elem.value; 19834 19835 // Handle most common string cases 19836 if ( typeof ret === "string" ) { 19837 return ret.replace( rreturn, "" ); 19838 } 19839 19840 // Handle cases where value is null/undef or number 19841 return ret == null ? "" : ret; 19842 } 19843 19844 return; 19845 } 19846 19847 valueIsFunction = isFunction( value ); 19848 19849 return this.each( function( i ) { 19850 var val; 19851 19852 if ( this.nodeType !== 1 ) { 19853 return; 19854 } 19855 19856 if ( valueIsFunction ) { 19857 val = value.call( this, i, jQuery( this ).val() ); 19858 } else { 19859 val = value; 19860 } 19861 19862 // Treat null/undefined as ""; convert numbers to string 19863 if ( val == null ) { 19864 val = ""; 19865 19866 } else if ( typeof val === "number" ) { 19867 val += ""; 19868 19869 } else if ( Array.isArray( val ) ) { 19870 val = jQuery.map( val, function( value ) { 19871 return value == null ? "" : value + ""; 19872 } ); 19873 } 19874 19875 hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; 19876 19877 // If set returns undefined, fall back to normal setting 19878 if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { 19879 this.value = val; 19880 } 19881 } ); 19882 } 19883} ); 19884 19885jQuery.extend( { 19886 valHooks: { 19887 option: { 19888 get: function( elem ) { 19889 19890 var val = jQuery.find.attr( elem, "value" ); 19891 return val != null ? 19892 val : 19893 19894 // Support: IE <=10 - 11 only 19895 // option.text throws exceptions (trac-14686, trac-14858) 19896 // Strip and collapse whitespace 19897 // https://html.spec.whatwg.org/#strip-and-collapse-whitespace 19898 stripAndCollapse( jQuery.text( elem ) ); 19899 } 19900 }, 19901 select: { 19902 get: function( elem ) { 19903 var value, option, i, 19904 options = elem.options, 19905 index = elem.selectedIndex, 19906 one = elem.type === "select-one", 19907 values = one ? null : [], 19908 max = one ? index + 1 : options.length; 19909 19910 if ( index < 0 ) { 19911 i = max; 19912 19913 } else { 19914 i = one ? index : 0; 19915 } 19916 19917 // Loop through all the selected options 19918 for ( ; i < max; i++ ) { 19919 option = options[ i ]; 19920 19921 // Support: IE <=9 only 19922 // IE8-9 doesn't update selected after form reset (trac-2551) 19923 if ( ( option.selected || i === index ) && 19924 19925 // Don't return options that are disabled or in a disabled optgroup 19926 !option.disabled && 19927 ( !option.parentNode.disabled || 19928 !nodeName( option.parentNode, "optgroup" ) ) ) { 19929 19930 // Get the specific value for the option 19931 value = jQuery( option ).val(); 19932 19933 // We don't need an array for one selects 19934 if ( one ) { 19935 return value; 19936 } 19937 19938 // Multi-Selects return an array 19939 values.push( value ); 19940 } 19941 } 19942 19943 return values; 19944 }, 19945 19946 set: function( elem, value ) { 19947 var optionSet, option, 19948 options = elem.options, 19949 values = jQuery.makeArray( value ), 19950 i = options.length; 19951 19952 while ( i-- ) { 19953 option = options[ i ]; 19954 19955 /* eslint-disable no-cond-assign */ 19956 19957 if ( option.selected = 19958 jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 19959 ) { 19960 optionSet = true; 19961 } 19962 19963 /* eslint-enable no-cond-assign */ 19964 } 19965 19966 // Force browsers to behave consistently when non-matching value is set 19967 if ( !optionSet ) { 19968 elem.selectedIndex = -1; 19969 } 19970 return values; 19971 } 19972 } 19973 } 19974} ); 19975 19976// Radios and checkboxes getter/setter 19977jQuery.each( [ "radio", "checkbox" ], function() { 19978 jQuery.valHooks[ this ] = { 19979 set: function( elem, value ) { 19980 if ( Array.isArray( value ) ) { 19981 return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); 19982 } 19983 } 19984 }; 19985 if ( !support.checkOn ) { 19986 jQuery.valHooks[ this ].get = function( elem ) { 19987 return elem.getAttribute( "value" ) === null ? "on" : elem.value; 19988 }; 19989 } 19990} ); 19991 19992 19993 19994 19995// Return jQuery for attributes-only inclusion
vendor: 1,452 bytes, lines 19996-20043
19996 19997 19998support.focusin = "onfocusin" in window; 19999 20000 20001var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, 20002 stopPropagationCallback = function( e ) { 20003 e.stopPropagation(); 20004 }; 20005 20006jQuery.extend( jQuery.event, { 20007 20008 trigger: function( event, data, elem, onlyHandlers ) { 20009 20010 var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, 20011 eventPath = [ elem || document ], 20012 type = hasOwn.call( event, "type" ) ? event.type : event, 20013 namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; 20014 20015 cur = lastElement = tmp = elem = elem || document; 20016 20017 // Don't do events on text and comment nodes 20018 if ( elem.nodeType === 3 || elem.nodeType === 8 ) { 20019 return; 20020 } 20021 20022 // focus/blur morphs to focusin/out; ensure we're not firing them right now 20023 if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { 20024 return; 20025 } 20026 20027 if ( type.indexOf( "." ) > -1 ) { 20028 20029 // Namespaced trigger; create a regexp to match event type in handle() 20030 namespaces = type.split( "." ); 20031 type = namespaces.shift(); 20032 namespaces.sort(); 20033 } 20034 ontype = type.indexOf( ":" ) < 0 && "on" + type; 20035 20036 // Caller can pass in a jQuery.Event object, Object, or just an event type string 20037 event = event[ jQuery.expando ] ? 20038 event : 20039 new jQuery.Event( type, typeof event === "object" && event ); 20040 20041 // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) 20042 event.isTrigger = onlyHandlers ? 2 : 3; 20043 event.namespace = namespaces.join( "." );
vendor: 4,098 bytes, lines 20044-20192
20044 event.rnamespace = event.namespace ? 20045 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : 20046 null; 20047 20048 // Clean up the event in case it is being reused 20049 event.result = undefined; 20050 if ( !event.target ) { 20051 event.target = elem; 20052 } 20053 20054 // Clone any incoming data and prepend the event, creating the handler arg list 20055 data = data == null ? 20056 [ event ] : 20057 jQuery.makeArray( data, [ event ] ); 20058 20059 // Allow special events to draw outside the lines 20060 special = jQuery.event.special[ type ] || {}; 20061 if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { 20062 return; 20063 } 20064 20065 // Determine event propagation path in advance, per W3C events spec (trac-9951) 20066 // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724) 20067 if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { 20068 20069 bubbleType = special.delegateType || type; 20070 if ( !rfocusMorph.test( bubbleType + type ) ) { 20071 cur = cur.parentNode; 20072 } 20073 for ( ; cur; cur = cur.parentNode ) { 20074 eventPath.push( cur ); 20075 tmp = cur; 20076 } 20077 20078 // Only add window if we got to document (e.g., not plain obj or detached DOM) 20079 if ( tmp === ( elem.ownerDocument || document ) ) { 20080 eventPath.push( tmp.defaultView || tmp.parentWindow || window ); 20081 } 20082 } 20083 20084 // Fire handlers on the event path 20085 i = 0; 20086 while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { 20087 lastElement = cur; 20088 event.type = i > 1 ? 20089 bubbleType : 20090 special.bindType || type; 20091 20092 // jQuery handler 20093 handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && 20094 dataPriv.get( cur, "handle" ); 20095 if ( handle ) { 20096 handle.apply( cur, data ); 20097 } 20098 20099 // Native handler 20100 handle = ontype && cur[ ontype ]; 20101 if ( handle && handle.apply && acceptData( cur ) ) { 20102 event.result = handle.apply( cur, data ); 20103 if ( event.result === false ) { 20104 event.preventDefault(); 20105 } 20106 } 20107 } 20108 event.type = type; 20109 20110 // If nobody prevented the default action, do it now 20111 if ( !onlyHandlers && !event.isDefaultPrevented() ) { 20112 20113 if ( ( !special._default || 20114 special._default.apply( eventPath.pop(), data ) === false ) && 20115 acceptData( elem ) ) { 20116 20117 // Call a native DOM method on the target with the same name as the event. 20118 // Don't do default actions on window, that's where global variables be (trac-6170) 20119 if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { 20120 20121 // Don't re-trigger an onFOO event when we call its FOO() method 20122 tmp = elem[ ontype ]; 20123 20124 if ( tmp ) { 20125 elem[ ontype ] = null; 20126 } 20127 20128 // Prevent re-triggering of the same event, since we already bubbled it above 20129 jQuery.event.triggered = type; 20130 20131 if ( event.isPropagationStopped() ) { 20132 lastElement.addEventListener( type, stopPropagationCallback ); 20133 } 20134 20135 elem[ type ](); 20136 20137 if ( event.isPropagationStopped() ) { 20138 lastElement.removeEventListener( type, stopPropagationCallback ); 20139 } 20140 20141 jQuery.event.triggered = undefined; 20142 20143 if ( tmp ) { 20144 elem[ ontype ] = tmp; 20145 } 20146 } 20147 } 20148 } 20149 20150 return event.result; 20151 }, 20152 20153 // Piggyback on a donor event to simulate a different one 20154 // Used only for `focus(in | out)` events 20155 simulate: function( type, elem, event ) { 20156 var e = jQuery.extend( 20157 new jQuery.Event(), 20158 event, 20159 { 20160 type: type, 20161 isSimulated: true 20162 } 20163 ); 20164 20165 jQuery.event.trigger( e, null, elem ); 20166 } 20167 20168} ); 20169 20170jQuery.fn.extend( { 20171 20172 trigger: function( type, data ) { 20173 return this.each( function() { 20174 jQuery.event.trigger( type, data, this ); 20175 } ); 20176 }, 20177 triggerHandler: function( type, data ) { 20178 var elem = this[ 0 ]; 20179 if ( elem ) { 20180 return jQuery.event.trigger( type, data, elem, true ); 20181 } 20182 } 20183} ); 20184 20185 20186// Support: Firefox <=44 20187// Firefox doesn't have focus(in | out) events 20188// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 20189// 20190// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 20191// focus(in | out) events fire after focus & blur events, 20192// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
20193// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 20194if ( !support.focusin ) { 20195 jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { 20196 20197 // Attach a single capturing handler on the document while someone wants focusin/focusout 20198 var handler = function( event ) { 20199 jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); 20200 }; 20201 20202 jQuery.event.special[ fix ] = { 20203 setup: function() { 20204 20205 // Handle: regular nodes (via `this.ownerDocument`), window 20206 // (via `this.document`) & document (via `this`). 20207 var doc = this.ownerDocument || this.document || this, 20208 attaches = dataPriv.access( doc, fix ); 20209 20210 if ( !attaches ) { 20211 doc.addEventListener( orig, handler, true ); 20212 } 20213 dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); 20214 }, 20215 teardown: function() { 20216 var doc = this.ownerDocument || this.document || this, 20217 attaches = dataPriv.access( doc, fix ) - 1; 20218 20219 if ( !attaches ) { 20220 doc.removeEventListener( orig, handler, true ); 20221 dataPriv.remove( doc, fix ); 20222 20223 } else { 20224 dataPriv.access( doc, fix, attaches ); 20225 } 20226 } 20227 }; 20228 } ); 20229} 20230var location = window.location; 20231 20232var nonce = { guid: Date.now() }; 20233 20234var rquery = ( /\?/ ); 20235 20236 20237 20238// Cross-browser xml parsing 20239jQuery.parseXML = function( data ) { 20240 var xml, parserErrorElem; 20241 if ( !data || typeof data !== "string" ) { 20242 return null; 20243 } 20244 20245 // Support: IE 9 - 11 only 20246 // IE throws on parseFromString with invalid input. 20247 try { 20248 xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); 20249 } catch ( e ) {} 20250 20251 parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; 20252 if ( !xml || parserErrorElem ) { 20253 jQuery.error( "Invalid XML: " + ( 20254 parserErrorElem ? 20255 jQuery.map( parserErrorElem.childNodes, function( el ) { 20256 return el.textContent; 20257 } ).join( "\n" ) : 20258 data 20259 ) ); 20260 } 20261 return xml; 20262}
vendor: 48,509 bytes, lines 20262-22109
20262; 20263 20264 20265var 20266 rbracket = /\[\]$/, 20267 rCRLF = /\r?\n/g, 20268 rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, 20269 rsubmittable = /^(?:input|select|textarea|keygen)/i; 20270 20271function buildParams( prefix, obj, traditional, add ) { 20272 var name; 20273 20274 if ( Array.isArray( obj ) ) { 20275 20276 // Serialize array item. 20277 jQuery.each( obj, function( i, v ) { 20278 if ( traditional || rbracket.test( prefix ) ) { 20279 20280 // Treat each array item as a scalar. 20281 add( prefix, v ); 20282 20283 } else { 20284 20285 // Item is non-scalar (array or object), encode its numeric index. 20286 buildParams( 20287 prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", 20288 v, 20289 traditional, 20290 add 20291 ); 20292 } 20293 } ); 20294 20295 } else if ( !traditional && toType( obj ) === "object" ) { 20296 20297 // Serialize object item. 20298 for ( name in obj ) { 20299 buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); 20300 } 20301 20302 } else { 20303 20304 // Serialize scalar item. 20305 add( prefix, obj ); 20306 } 20307} 20308 20309// Serialize an array of form elements or a set of 20310// key/values into a query string 20311jQuery.param = function( a, traditional ) { 20312 var prefix, 20313 s = [], 20314 add = function( key, valueOrFunction ) { 20315 20316 // If value is a function, invoke it and use its return value 20317 var value = isFunction( valueOrFunction ) ? 20318 valueOrFunction() : 20319 valueOrFunction; 20320 20321 s[ s.length ] = encodeURIComponent( key ) + "=" + 20322 encodeURIComponent( value == null ? "" : value ); 20323 }; 20324 20325 if ( a == null ) { 20326 return ""; 20327 } 20328 20329 // If an array was passed in, assume that it is an array of form elements. 20330 if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { 20331 20332 // Serialize the form elements 20333 jQuery.each( a, function() { 20334 add( this.name, this.value ); 20335 } ); 20336 20337 } else { 20338 20339 // If traditional, encode the "old" way (the way 1.3.2 or older 20340 // did it), otherwise encode params recursively. 20341 for ( prefix in a ) { 20342 buildParams( prefix, a[ prefix ], traditional, add ); 20343 } 20344 } 20345 20346 // Return the resulting serialization 20347 return s.join( "&" ); 20348}; 20349 20350jQuery.fn.extend( { 20351 serialize: function() { 20352 return jQuery.param( this.serializeArray() ); 20353 }, 20354 serializeArray: function() { 20355 return this.map( function() { 20356 20357 // Can add propHook for "elements" to filter or add form elements 20358 var elements = jQuery.prop( this, "elements" ); 20359 return elements ? jQuery.makeArray( elements ) : this; 20360 } ).filter( function() { 20361 var type = this.type; 20362 20363 // Use .is( ":disabled" ) so that fieldset[disabled] works 20364 return this.name && !jQuery( this ).is( ":disabled" ) && 20365 rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && 20366 ( this.checked || !rcheckableType.test( type ) ); 20367 } ).map( function( _i, elem ) { 20368 var val = jQuery( this ).val(); 20369 20370 if ( val == null ) { 20371 return null; 20372 } 20373 20374 if ( Array.isArray( val ) ) { 20375 return jQuery.map( val, function( val ) { 20376 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 20377 } ); 20378 } 20379 20380 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 20381 } ).get(); 20382 } 20383} ); 20384 20385 20386var 20387 r20 = /%20/g, 20388 rhash = /#.*$/, 20389 rantiCache = /([?&])_=[^&]*/, 20390 rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, 20391 20392 // trac-7653, trac-8125, trac-8152: local protocol detection 20393 rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, 20394 rnoContent = /^(?:GET|HEAD)$/, 20395 rprotocol = /^\/\//, 20396 20397 /* Prefilters 20398 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) 20399 * 2) These are called: 20400 * - BEFORE asking for a transport 20401 * - AFTER param serialization (s.data is a string if s.processData is true) 20402 * 3) key is the dataType 20403 * 4) the catchall symbol "*" can be used 20404 * 5) execution will start with transport dataType and THEN continue down to "*" if needed 20405 */ 20406 prefilters = {}, 20407 20408 /* Transports bindings 20409 * 1) key is the dataType 20410 * 2) the catchall symbol "*" can be used 20411 * 3) selection will start with transport dataType and THEN go to "*" if needed 20412 */ 20413 transports = {}, 20414 20415 // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression 20416 allTypes = "*/".concat( "*" ), 20417 20418 // Anchor tag for parsing the document origin 20419 originAnchor = document.createElement( "a" ); 20420 20421originAnchor.href = location.href; 20422 20423// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport 20424function addToPrefiltersOrTransports( structure ) { 20425 20426 // dataTypeExpression is optional and defaults to "*" 20427 return function( dataTypeExpression, func ) { 20428 20429 if ( typeof dataTypeExpression !== "string" ) { 20430 func = dataTypeExpression; 20431 dataTypeExpression = "*"; 20432 } 20433 20434 var dataType, 20435 i = 0, 20436 dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; 20437 20438 if ( isFunction( func ) ) { 20439 20440 // For each dataType in the dataTypeExpression 20441 while ( ( dataType = dataTypes[ i++ ] ) ) { 20442 20443 // Prepend if requested 20444 if ( dataType[ 0 ] === "+" ) { 20445 dataType = dataType.slice( 1 ) || "*"; 20446 ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); 20447 20448 // Otherwise append 20449 } else { 20450 ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); 20451 } 20452 } 20453 } 20454 }; 20455} 20456 20457// Base inspection function for prefilters and transports 20458function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { 20459 20460 var inspected = {}, 20461 seekingTransport = ( structure === transports ); 20462 20463 function inspect( dataType ) { 20464 var selected; 20465 inspected[ dataType ] = true; 20466 jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { 20467 var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); 20468 if ( typeof dataTypeOrTransport === "string" && 20469 !seekingTransport && !inspected[ dataTypeOrTransport ] ) { 20470 20471 options.dataTypes.unshift( dataTypeOrTransport ); 20472 inspect( dataTypeOrTransport ); 20473 return false; 20474 } else if ( seekingTransport ) { 20475 return !( selected = dataTypeOrTransport ); 20476 } 20477 } ); 20478 return selected; 20479 } 20480 20481 return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); 20482} 20483 20484// A special extend for ajax options 20485// that takes "flat" options (not to be deep extended) 20486// Fixes trac-9887 20487function ajaxExtend( target, src ) { 20488 var key, deep, 20489 flatOptions = jQuery.ajaxSettings.flatOptions || {}; 20490 20491 for ( key in src ) { 20492 if ( src[ key ] !== undefined ) { 20493 ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; 20494 } 20495 } 20496 if ( deep ) { 20497 jQuery.extend( true, target, deep ); 20498 } 20499 20500 return target; 20501} 20502 20503/* Handles responses to an ajax request: 20504 * - finds the right dataType (mediates between content-type and expected dataType) 20505 * - returns the corresponding response 20506 */ 20507function ajaxHandleResponses( s, jqXHR, responses ) { 20508 20509 var ct, type, finalDataType, firstDataType, 20510 contents = s.contents, 20511 dataTypes = s.dataTypes; 20512 20513 // Remove auto dataType and get content-type in the process 20514 while ( dataTypes[ 0 ] === "*" ) { 20515 dataTypes.shift(); 20516 if ( ct === undefined ) { 20517 ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); 20518 } 20519 } 20520 20521 // Check if we're dealing with a known content-type 20522 if ( ct ) { 20523 for ( type in contents ) { 20524 if ( contents[ type ] && contents[ type ].test( ct ) ) { 20525 dataTypes.unshift( type ); 20526 break; 20527 } 20528 } 20529 } 20530 20531 // Check to see if we have a response for the expected dataType 20532 if ( dataTypes[ 0 ] in responses ) { 20533 finalDataType = dataTypes[ 0 ]; 20534 } else { 20535 20536 // Try convertible dataTypes 20537 for ( type in responses ) { 20538 if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { 20539 finalDataType = type; 20540 break; 20541 } 20542 if ( !firstDataType ) { 20543 firstDataType = type; 20544 } 20545 } 20546 20547 // Or just use first one 20548 finalDataType = finalDataType || firstDataType; 20549 } 20550 20551 // If we found a dataType 20552 // We add the dataType to the list if needed 20553 // and return the corresponding response 20554 if ( finalDataType ) { 20555 if ( finalDataType !== dataTypes[ 0 ] ) { 20556 dataTypes.unshift( finalDataType ); 20557 } 20558 return responses[ finalDataType ]; 20559 } 20560} 20561 20562/* Chain conversions given the request and the original response 20563 * Also sets the responseXXX fields on the jqXHR instance 20564 */ 20565function ajaxConvert( s, response, jqXHR, isSuccess ) { 20566 var conv2, current, conv, tmp, prev, 20567 converters = {}, 20568 20569 // Work with a copy of dataTypes in case we need to modify it for conversion 20570 dataTypes = s.dataTypes.slice(); 20571 20572 // Create converters map with lowercased keys 20573 if ( dataTypes[ 1 ] ) { 20574 for ( conv in s.converters ) { 20575 converters[ conv.toLowerCase() ] = s.converters[ conv ]; 20576 } 20577 } 20578 20579 current = dataTypes.shift(); 20580 20581 // Convert to each sequential dataType 20582 while ( current ) { 20583 20584 if ( s.responseFields[ current ] ) { 20585 jqXHR[ s.responseFields[ current ] ] = response; 20586 } 20587 20588 // Apply the dataFilter if provided 20589 if ( !prev && isSuccess && s.dataFilter ) { 20590 response = s.dataFilter( response, s.dataType ); 20591 } 20592 20593 prev = current; 20594 current = dataTypes.shift(); 20595 20596 if ( current ) { 20597 20598 // There's only work to do if current dataType is non-auto 20599 if ( current === "*" ) { 20600 20601 current = prev; 20602 20603 // Convert response if prev dataType is non-auto and differs from current 20604 } else if ( prev !== "*" && prev !== current ) { 20605 20606 // Seek a direct converter 20607 conv = converters[ prev + " " + current ] || converters[ "* " + current ]; 20608 20609 // If none found, seek a pair 20610 if ( !conv ) { 20611 for ( conv2 in converters ) { 20612 20613 // If conv2 outputs current 20614 tmp = conv2.split( " " ); 20615 if ( tmp[ 1 ] === current ) { 20616 20617 // If prev can be converted to accepted input 20618 conv = converters[ prev + " " + tmp[ 0 ] ] || 20619 converters[ "* " + tmp[ 0 ] ]; 20620 if ( conv ) { 20621 20622 // Condense equivalence converters 20623 if ( conv === true ) { 20624 conv = converters[ conv2 ]; 20625 20626 // Otherwise, insert the intermediate dataType 20627 } else if ( converters[ conv2 ] !== true ) { 20628 current = tmp[ 0 ]; 20629 dataTypes.unshift( tmp[ 1 ] ); 20630 } 20631 break; 20632 } 20633 } 20634 } 20635 } 20636 20637 // Apply converter (if not an equivalence) 20638 if ( conv !== true ) { 20639 20640 // Unless errors are allowed to bubble, catch and return them 20641 if ( conv && s.throws ) { 20642 response = conv( response ); 20643 } else { 20644 try { 20645 response = conv( response ); 20646 } catch ( e ) { 20647 return { 20648 state: "parsererror", 20649 error: conv ? e : "No conversion from " + prev + " to " + current 20650 }; 20651 } 20652 } 20653 } 20654 } 20655 } 20656 } 20657 20658 return { state: "success", data: response }; 20659} 20660 20661jQuery.extend( { 20662 20663 // Counter for holding the number of active queries 20664 active: 0, 20665 20666 // Last-Modified header cache for next request 20667 lastModified: {}, 20668 etag: {}, 20669 20670 ajaxSettings: { 20671 url: location.href, 20672 type: "GET", 20673 isLocal: rlocalProtocol.test( location.protocol ), 20674 global: true, 20675 processData: true, 20676 async: true, 20677 contentType: "application/x-www-form-urlencoded; charset=UTF-8", 20678 20679 /* 20680 timeout: 0, 20681 data: null, 20682 dataType: null, 20683 username: null, 20684 password: null, 20685 cache: null, 20686 throws: false, 20687 traditional: false, 20688 headers: {}, 20689 */ 20690 20691 accepts: { 20692 "*": allTypes, 20693 text: "text/plain", 20694 html: "text/html", 20695 xml: "application/xml, text/xml", 20696 json: "application/json, text/javascript" 20697 }, 20698 20699 contents: { 20700 xml: /\bxml\b/, 20701 html: /\bhtml/, 20702 json: /\bjson\b/ 20703 }, 20704 20705 responseFields: { 20706 xml: "responseXML", 20707 text: "responseText", 20708 json: "responseJSON" 20709 }, 20710 20711 // Data converters 20712 // Keys separate source (or catchall "*") and destination types with a single space 20713 converters: { 20714 20715 // Convert anything to text 20716 "* text": String, 20717 20718 // Text to html (true = no transformation) 20719 "text html": true, 20720 20721 // Evaluate text as a json expression 20722 "text json": JSON.parse, 20723 20724 // Parse text as xml 20725 "text xml": jQuery.parseXML 20726 }, 20727 20728 // For options that shouldn't be deep extended: 20729 // you can add your own custom options here if 20730 // and when you create one that shouldn't be 20731 // deep extended (see ajaxExtend) 20732 flatOptions: { 20733 url: true, 20734 context: true 20735 } 20736 }, 20737 20738 // Creates a full fledged settings object into target 20739 // with both ajaxSettings and settings fields. 20740 // If target is omitted, writes into ajaxSettings. 20741 ajaxSetup: function( target, settings ) { 20742 return settings ? 20743 20744 // Building a settings object 20745 ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : 20746 20747 // Extending ajaxSettings 20748 ajaxExtend( jQuery.ajaxSettings, target ); 20749 }, 20750 20751 ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), 20752 ajaxTransport: addToPrefiltersOrTransports( transports ), 20753 20754 // Main method 20755 ajax: function( url, options ) { 20756 20757 // If url is an object, simulate pre-1.5 signature 20758 if ( typeof url === "object" ) { 20759 options = url; 20760 url = undefined; 20761 } 20762 20763 // Force options to be an object 20764 options = options || {}; 20765 20766 var transport, 20767 20768 // URL without anti-cache param 20769 cacheURL, 20770 20771 // Response headers 20772 responseHeadersString, 20773 responseHeaders, 20774 20775 // timeout handle 20776 timeoutTimer, 20777 20778 // Url cleanup var 20779 urlAnchor, 20780 20781 // Request state (becomes false upon send and true upon completion) 20782 completed, 20783 20784 // To know if global events are to be dispatched 20785 fireGlobals, 20786 20787 // Loop variable 20788 i, 20789 20790 // uncached part of the url 20791 uncached, 20792 20793 // Create the final options object 20794 s = jQuery.ajaxSetup( {}, options ), 20795 20796 // Callbacks context 20797 callbackContext = s.context || s, 20798 20799 // Context for global events is callbackContext if it is a DOM node or jQuery collection 20800 globalEventContext = s.context && 20801 ( callbackContext.nodeType || callbackContext.jquery ) ? 20802 jQuery( callbackContext ) : 20803 jQuery.event, 20804 20805 // Deferreds 20806 deferred = jQuery.Deferred(), 20807 completeDeferred = jQuery.Callbacks( "once memory" ), 20808 20809 // Status-dependent callbacks 20810 statusCode = s.statusCode || {}, 20811 20812 // Headers (they are sent all at once) 20813 requestHeaders = {}, 20814 requestHeadersNames = {}, 20815 20816 // Default abort message 20817 strAbort = "canceled", 20818 20819 // Fake xhr 20820 jqXHR = { 20821 readyState: 0, 20822 20823 // Builds headers hashtable if needed 20824 getResponseHeader: function( key ) { 20825 var match; 20826 if ( completed ) { 20827 if ( !responseHeaders ) { 20828 responseHeaders = {}; 20829 while ( ( match = rheaders.exec( responseHeadersString ) ) ) { 20830 responseHeaders[ match[ 1 ].toLowerCase() + " " ] = 20831 ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) 20832 .concat( match[ 2 ] ); 20833 } 20834 } 20835 match = responseHeaders[ key.toLowerCase() + " " ]; 20836 } 20837 return match == null ? null : match.join( ", " ); 20838 }, 20839 20840 // Raw string 20841 getAllResponseHeaders: function() { 20842 return completed ? responseHeadersString : null; 20843 }, 20844 20845 // Caches the header 20846 setRequestHeader: function( name, value ) { 20847 if ( completed == null ) { 20848 name = requestHeadersNames[ name.toLowerCase() ] = 20849 requestHeadersNames[ name.toLowerCase() ] || name; 20850 requestHeaders[ name ] = value; 20851 } 20852 return this; 20853 }, 20854 20855 // Overrides response content-type header 20856 overrideMimeType: function( type ) { 20857 if ( completed == null ) { 20858 s.mimeType = type; 20859 } 20860 return this; 20861 }, 20862 20863 // Status-dependent callbacks 20864 statusCode: function( map ) { 20865 var code; 20866 if ( map ) { 20867 if ( completed ) { 20868 20869 // Execute the appropriate callbacks 20870 jqXHR.always( map[ jqXHR.status ] ); 20871 } else { 20872 20873 // Lazy-add the new callbacks in a way that preserves old ones 20874 for ( code in map ) { 20875 statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; 20876 } 20877 } 20878 } 20879 return this; 20880 }, 20881 20882 // Cancel the request 20883 abort: function( statusText ) { 20884 var finalText = statusText || strAbort; 20885 if ( transport ) { 20886 transport.abort( finalText ); 20887 } 20888 done( 0, finalText ); 20889 return this; 20890 } 20891 }; 20892 20893 // Attach deferreds 20894 deferred.promise( jqXHR ); 20895 20896 // Add protocol if not provided (prefilters might expect it) 20897 // Handle falsy url in the settings object (trac-10093: consistency with old signature) 20898 // We also use the url parameter if available 20899 s.url = ( ( url || s.url || location.href ) + "" ) 20900 .replace( rprotocol, location.protocol + "//" ); 20901 20902 // Alias method option to type as per ticket trac-12004 20903 s.type = options.method || options.type || s.method || s.type; 20904 20905 // Extract dataTypes list 20906 s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; 20907 20908 // A cross-domain request is in order when the origin doesn't match the current origin. 20909 if ( s.crossDomain == null ) { 20910 urlAnchor = document.createElement( "a" ); 20911 20912 // Support: IE <=8 - 11, Edge 12 - 15 20913 // IE throws exception on accessing the href property if url is malformed, 20914 // e.g. http://example.com:80x/ 20915 try { 20916 urlAnchor.href = s.url; 20917 20918 // Support: IE <=8 - 11 only 20919 // Anchor's host property isn't correctly set when s.url is relative 20920 urlAnchor.href = urlAnchor.href; 20921 s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== 20922 urlAnchor.protocol + "//" + urlAnchor.host; 20923 } catch ( e ) { 20924 20925 // If there is an error parsing the URL, assume it is crossDomain, 20926 // it can be rejected by the transport if it is invalid 20927 s.crossDomain = true; 20928 } 20929 } 20930 20931 // Convert data if not already a string 20932 if ( s.data && s.processData && typeof s.data !== "string" ) { 20933 s.data = jQuery.param( s.data, s.traditional ); 20934 } 20935 20936 // Apply prefilters 20937 inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); 20938 20939 // If request was aborted inside a prefilter, stop there 20940 if ( completed ) { 20941 return jqXHR; 20942 } 20943 20944 // We can fire global events as of now if asked to 20945 // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118) 20946 fireGlobals = jQuery.event && s.global; 20947 20948 // Watch for a new set of requests 20949 if ( fireGlobals && jQuery.active++ === 0 ) { 20950 jQuery.event.trigger( "ajaxStart" ); 20951 } 20952 20953 // Uppercase the type 20954 s.type = s.type.toUpperCase(); 20955 20956 // Determine if request has content 20957 s.hasContent = !rnoContent.test( s.type ); 20958 20959 // Save the URL in case we're toying with the If-Modified-Since 20960 // and/or If-None-Match header later on 20961 // Remove hash to simplify url manipulation 20962 cacheURL = s.url.replace( rhash, "" ); 20963 20964 // More options handling for requests with no content 20965 if ( !s.hasContent ) { 20966 20967 // Remember the hash so we can put it back 20968 uncached = s.url.slice( cacheURL.length ); 20969 20970 // If data is available and should be processed, append data to url 20971 if ( s.data && ( s.processData || typeof s.data === "string" ) ) { 20972 cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; 20973 20974 // trac-9682: remove data so that it's not used in an eventual retry 20975 delete s.data; 20976 } 20977 20978 // Add or update anti-cache param if needed 20979 if ( s.cache === false ) { 20980 cacheURL = cacheURL.replace( rantiCache, "$1" ); 20981 uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + 20982 uncached; 20983 } 20984 20985 // Put hash and anti-cache on the URL that will be requested (gh-1732) 20986 s.url = cacheURL + uncached; 20987 20988 // Change '%20' to '+' if this is encoded form body content (gh-2658) 20989 } else if ( s.data && s.processData && 20990 ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { 20991 s.data = s.data.replace( r20, "+" ); 20992 } 20993 20994 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 20995 if ( s.ifModified ) { 20996 if ( jQuery.lastModified[ cacheURL ] ) { 20997 jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); 20998 } 20999 if ( jQuery.etag[ cacheURL ] ) { 21000 jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); 21001 } 21002 } 21003 21004 // Set the correct header, if data is being sent 21005 if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { 21006 jqXHR.setRequestHeader( "Content-Type", s.contentType ); 21007 } 21008 21009 // Set the Accepts header for the server, depending on the dataType 21010 jqXHR.setRequestHeader( 21011 "Accept", 21012 s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? 21013 s.accepts[ s.dataTypes[ 0 ] ] + 21014 ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : 21015 s.accepts[ "*" ] 21016 ); 21017 21018 // Check for headers option 21019 for ( i in s.headers ) { 21020 jqXHR.setRequestHeader( i, s.headers[ i ] ); 21021 } 21022 21023 // Allow custom headers/mimetypes and early abort 21024 if ( s.beforeSend && 21025 ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { 21026 21027 // Abort if not done already and return 21028 return jqXHR.abort(); 21029 } 21030 21031 // Aborting is no longer a cancellation 21032 strAbort = "abort"; 21033 21034 // Install callbacks on deferreds 21035 completeDeferred.add( s.complete ); 21036 jqXHR.done( s.success ); 21037 jqXHR.fail( s.error ); 21038 21039 // Get transport 21040 transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); 21041 21042 // If no transport, we auto-abort 21043 if ( !transport ) { 21044 done( -1, "No Transport" ); 21045 } else { 21046 jqXHR.readyState = 1; 21047 21048 // Send global event 21049 if ( fireGlobals ) { 21050 globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); 21051 } 21052 21053 // If request was aborted inside ajaxSend, stop there 21054 if ( completed ) { 21055 return jqXHR; 21056 } 21057 21058 // Timeout 21059 if ( s.async && s.timeout > 0 ) { 21060 timeoutTimer = window.setTimeout( function() { 21061 jqXHR.abort( "timeout" ); 21062 }, s.timeout ); 21063 } 21064 21065 try { 21066 completed = false; 21067 transport.send( requestHeaders, done ); 21068 } catch ( e ) { 21069 21070 // Rethrow post-completion exceptions 21071 if ( completed ) { 21072 throw e; 21073 } 21074 21075 // Propagate others as results 21076 done( -1, e ); 21077 } 21078 } 21079 21080 // Callback for when everything is done 21081 function done( status, nativeStatusText, responses, headers ) { 21082 var isSuccess, success, error, response, modified, 21083 statusText = nativeStatusText; 21084 21085 // Ignore repeat invocations 21086 if ( completed ) { 21087 return; 21088 } 21089 21090 completed = true; 21091 21092 // Clear timeout if it exists 21093 if ( timeoutTimer ) { 21094 window.clearTimeout( timeoutTimer ); 21095 } 21096 21097 // Dereference transport for early garbage collection 21098 // (no matter how long the jqXHR object will be used) 21099 transport = undefined; 21100 21101 // Cache response headers 21102 responseHeadersString = headers || ""; 21103 21104 // Set readyState 21105 jqXHR.readyState = status > 0 ? 4 : 0; 21106 21107 // Determine if successful 21108 isSuccess = status >= 200 && status < 300 || status === 304; 21109 21110 // Get response data 21111 if ( responses ) { 21112 response = ajaxHandleResponses( s, jqXHR, responses ); 21113 } 21114 21115 // Use a noop converter for missing script but not if jsonp 21116 if ( !isSuccess && 21117 jQuery.inArray( "script", s.dataTypes ) > -1 && 21118 jQuery.inArray( "json", s.dataTypes ) < 0 ) { 21119 s.converters[ "text script" ] = function() {}; 21120 } 21121 21122 // Convert no matter what (that way responseXXX fields are always set) 21123 response = ajaxConvert( s, response, jqXHR, isSuccess ); 21124 21125 // If successful, handle type chaining 21126 if ( isSuccess ) { 21127 21128 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 21129 if ( s.ifModified ) { 21130 modified = jqXHR.getResponseHeader( "Last-Modified" ); 21131 if ( modified ) { 21132 jQuery.lastModified[ cacheURL ] = modified; 21133 } 21134 modified = jqXHR.getResponseHeader( "etag" ); 21135 if ( modified ) { 21136 jQuery.etag[ cacheURL ] = modified; 21137 } 21138 } 21139 21140 // if no content 21141 if ( status === 204 || s.type === "HEAD" ) { 21142 statusText = "nocontent"; 21143 21144 // if not modified 21145 } else if ( status === 304 ) { 21146 statusText = "notmodified"; 21147 21148 // If we have data, let's convert it 21149 } else { 21150 statusText = response.state; 21151 success = response.data; 21152 error = response.error; 21153 isSuccess = !error; 21154 } 21155 } else { 21156 21157 // Extract error from statusText and normalize for non-aborts 21158 error = statusText; 21159 if ( status || !statusText ) { 21160 statusText = "error"; 21161 if ( status < 0 ) { 21162 status = 0; 21163 } 21164 } 21165 } 21166 21167 // Set data for the fake xhr object 21168 jqXHR.status = status; 21169 jqXHR.statusText = ( nativeStatusText || statusText ) + ""; 21170 21171 // Success/Error 21172 if ( isSuccess ) { 21173 deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); 21174 } else { 21175 deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); 21176 } 21177 21178 // Status-dependent callbacks 21179 jqXHR.statusCode( statusCode ); 21180 statusCode = undefined; 21181 21182 if ( fireGlobals ) { 21183 globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", 21184 [ jqXHR, s, isSuccess ? success : error ] ); 21185 } 21186 21187 // Complete 21188 completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); 21189 21190 if ( fireGlobals ) { 21191 globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); 21192 21193 // Handle the global AJAX counter 21194 if ( !( --jQuery.active ) ) { 21195 jQuery.event.trigger( "ajaxStop" ); 21196 } 21197 } 21198 } 21199 21200 return jqXHR; 21201 }, 21202 21203 getJSON: function( url, data, callback ) { 21204 return jQuery.get( url, data, callback, "json" ); 21205 }, 21206 21207 getScript: function( url, callback ) { 21208 return jQuery.get( url, undefined, callback, "script" ); 21209 } 21210} ); 21211 21212jQuery.each( [ "get", "post" ], function( _i, method ) { 21213 jQuery[ method ] = function( url, data, callback, type ) { 21214 21215 // Shift arguments if data argument was omitted 21216 if ( isFunction( data ) ) { 21217 type = type || callback; 21218 callback = data; 21219 data = undefined; 21220 } 21221 21222 // The url can be an options object (which then must have .url) 21223 return jQuery.ajax( jQuery.extend( { 21224 url: url, 21225 type: method, 21226 dataType: type, 21227 data: data, 21228 success: callback 21229 }, jQuery.isPlainObject( url ) && url ) ); 21230 }; 21231} ); 21232 21233jQuery.ajaxPrefilter( function( s ) { 21234 var i; 21235 for ( i in s.headers ) { 21236 if ( i.toLowerCase() === "content-type" ) { 21237 s.contentType = s.headers[ i ] || ""; 21238 } 21239 } 21240} ); 21241 21242 21243jQuery._evalUrl = function( url, options, doc ) { 21244 return jQuery.ajax( { 21245 url: url, 21246 21247 // Make this explicit, since user can override this through ajaxSetup (trac-11264) 21248 type: "GET", 21249 dataType: "script", 21250 cache: true, 21251 async: false, 21252 global: false, 21253 21254 // Only evaluate the response if it is successful (gh-4126) 21255 // dataFilter is not invoked for failure responses, so using it instead 21256 // of the default converter is kludgy but it works. 21257 converters: { 21258 "text script": function() {} 21259 }, 21260 dataFilter: function( response ) { 21261 jQuery.globalEval( response, options, doc ); 21262 } 21263 } ); 21264}; 21265 21266 21267jQuery.fn.extend( { 21268 wrapAll: function( html ) { 21269 var wrap; 21270 21271 if ( this[ 0 ] ) { 21272 if ( isFunction( html ) ) { 21273 html = html.call( this[ 0 ] ); 21274 } 21275 21276 // The elements to wrap the target around 21277 wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); 21278 21279 if ( this[ 0 ].parentNode ) { 21280 wrap.insertBefore( this[ 0 ] ); 21281 } 21282 21283 wrap.map( function() { 21284 var elem = this; 21285 21286 while ( elem.firstElementChild ) { 21287 elem = elem.firstElementChild; 21288 } 21289 21290 return elem; 21291 } ).append( this ); 21292 } 21293 21294 return this; 21295 }, 21296 21297 wrapInner: function( html ) { 21298 if ( isFunction( html ) ) { 21299 return this.each( function( i ) { 21300 jQuery( this ).wrapInner( html.call( this, i ) ); 21301 } ); 21302 } 21303 21304 return this.each( function() { 21305 var self = jQuery( this ), 21306 contents = self.contents(); 21307 21308 if ( contents.length ) { 21309 contents.wrapAll( html ); 21310 21311 } else { 21312 self.append( html ); 21313 } 21314 } ); 21315 }, 21316 21317 wrap: function( html ) { 21318 var htmlIsFunction = isFunction( html ); 21319 21320 return this.each( function( i ) { 21321 jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); 21322 } ); 21323 }, 21324 21325 unwrap: function( selector ) { 21326 this.parent( selector ).not( "body" ).each( function() { 21327 jQuery( this ).replaceWith( this.childNodes ); 21328 } ); 21329 return this; 21330 } 21331} ); 21332 21333 21334jQuery.expr.pseudos.hidden = function( elem ) { 21335 return !jQuery.expr.pseudos.visible( elem ); 21336}; 21337jQuery.expr.pseudos.visible = function( elem ) { 21338 return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); 21339}; 21340 21341 21342 21343 21344jQuery.ajaxSettings.xhr = function() { 21345 try { 21346 return new window.XMLHttpRequest(); 21347 } catch ( e ) {} 21348}; 21349 21350var xhrSuccessStatus = { 21351 21352 // File protocol always yields status code 0, assume 200 21353 0: 200, 21354 21355 // Support: IE <=9 only 21356 // trac-1450: sometimes IE returns 1223 when it should be 204 21357 1223: 204 21358 }, 21359 xhrSupported = jQuery.ajaxSettings.xhr(); 21360 21361support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); 21362support.ajax = xhrSupported = !!xhrSupported; 21363 21364jQuery.ajaxTransport( function( options ) { 21365 var callback, errorCallback; 21366 21367 // Cross domain only allowed if supported through XMLHttpRequest 21368 if ( support.cors || xhrSupported && !options.crossDomain ) { 21369 return { 21370 send: function( headers, complete ) { 21371 var i, 21372 xhr = options.xhr(); 21373 21374 xhr.open( 21375 options.type, 21376 options.url, 21377 options.async, 21378 options.username, 21379 options.password 21380 ); 21381 21382 // Apply custom fields if provided 21383 if ( options.xhrFields ) { 21384 for ( i in options.xhrFields ) { 21385 xhr[ i ] = options.xhrFields[ i ]; 21386 } 21387 } 21388 21389 // Override mime type if needed 21390 if ( options.mimeType && xhr.overrideMimeType ) { 21391 xhr.overrideMimeType( options.mimeType ); 21392 } 21393 21394 // X-Requested-With header 21395 // For cross-domain requests, seeing as conditions for a preflight are 21396 // akin to a jigsaw puzzle, we simply never set it to be sure. 21397 // (it can always be set on a per-request basis or even using ajaxSetup) 21398 // For same-domain requests, won't change header if already provided. 21399 if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { 21400 headers[ "X-Requested-With" ] = "XMLHttpRequest"; 21401 } 21402 21403 // Set headers 21404 for ( i in headers ) { 21405 xhr.setRequestHeader( i, headers[ i ] ); 21406 } 21407 21408 // Callback 21409 callback = function( type ) { 21410 return function() { 21411 if ( callback ) { 21412 callback = errorCallback = xhr.onload = 21413 xhr.onerror = xhr.onabort = xhr.ontimeout = 21414 xhr.onreadystatechange = null; 21415 21416 if ( type === "abort" ) { 21417 xhr.abort(); 21418 } else if ( type === "error" ) { 21419 21420 // Support: IE <=9 only 21421 // On a manual native abort, IE9 throws 21422 // errors on any property access that is not readyState 21423 if ( typeof xhr.status !== "number" ) { 21424 complete( 0, "error" ); 21425 } else { 21426 complete( 21427 21428 // File: protocol always yields status 0; see trac-8605, trac-14207 21429 xhr.status, 21430 xhr.statusText 21431 ); 21432 } 21433 } else { 21434 complete( 21435 xhrSuccessStatus[ xhr.status ] || xhr.status, 21436 xhr.statusText, 21437 21438 // Support: IE <=9 only 21439 // IE9 has no XHR2 but throws on binary (trac-11426) 21440 // For XHR2 non-text, let the caller handle it (gh-2498) 21441 ( xhr.responseType || "text" ) !== "text" || 21442 typeof xhr.responseText !== "string" ? 21443 { binary: xhr.response } : 21444 { text: xhr.responseText }, 21445 xhr.getAllResponseHeaders() 21446 ); 21447 } 21448 } 21449 }; 21450 }; 21451 21452 // Listen to events 21453 xhr.onload = callback(); 21454 errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); 21455 21456 // Support: IE 9 only 21457 // Use onreadystatechange to replace onabort 21458 // to handle uncaught aborts 21459 if ( xhr.onabort !== undefined ) { 21460 xhr.onabort = errorCallback; 21461 } else { 21462 xhr.onreadystatechange = function() { 21463 21464 // Check readyState before timeout as it changes 21465 if ( xhr.readyState === 4 ) { 21466 21467 // Allow onerror to be called first, 21468 // but that will not handle a native abort 21469 // Also, save errorCallback to a variable 21470 // as xhr.onerror cannot be accessed 21471 window.setTimeout( function() { 21472 if ( callback ) { 21473 errorCallback(); 21474 } 21475 } ); 21476 } 21477 }; 21478 } 21479 21480 // Create the abort callback 21481 callback = callback( "abort" ); 21482 21483 try { 21484 21485 // Do send the request (this may raise an exception) 21486 xhr.send( options.hasContent && options.data || null ); 21487 } catch ( e ) { 21488 21489 // trac-14683: Only rethrow if this hasn't been notified as an error yet 21490 if ( callback ) { 21491 throw e; 21492 } 21493 } 21494 }, 21495 21496 abort: function() { 21497 if ( callback ) { 21498 callback(); 21499 } 21500 } 21501 }; 21502 } 21503} ); 21504 21505 21506 21507 21508// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) 21509jQuery.ajaxPrefilter( function( s ) { 21510 if ( s.crossDomain ) { 21511 s.contents.script = false; 21512 } 21513} ); 21514 21515// Install script dataType 21516jQuery.ajaxSetup( { 21517 accepts: { 21518 script: "text/javascript, application/javascript, " + 21519 "application/ecmascript, application/x-ecmascript" 21520 }, 21521 contents: { 21522 script: /\b(?:java|ecma)script\b/ 21523 }, 21524 converters: { 21525 "text script": function( text ) { 21526 jQuery.globalEval( text ); 21527 return text; 21528 } 21529 } 21530} ); 21531 21532// Handle cache's special case and crossDomain 21533jQuery.ajaxPrefilter( "script", function( s ) { 21534 if ( s.cache === undefined ) { 21535 s.cache = false; 21536 } 21537 if ( s.crossDomain ) { 21538 s.type = "GET"; 21539 } 21540} ); 21541 21542// Bind script tag hack transport 21543jQuery.ajaxTransport( "script", function( s ) { 21544 21545 // This transport only deals with cross domain or forced-by-attrs requests 21546 if ( s.crossDomain || s.scriptAttrs ) { 21547 var script, callback; 21548 return { 21549 send: function( _, complete ) { 21550 script = jQuery( "<script>" ) 21551 .attr( s.scriptAttrs || {} ) 21552 .prop( { charset: s.scriptCharset, src: s.url } ) 21553 .on( "load error", callback = function( evt ) { 21554 script.remove(); 21555 callback = null; 21556 if ( evt ) { 21557 complete( evt.type === "error" ? 404 : 200, evt.type ); 21558 } 21559 } ); 21560 21561 // Use native DOM manipulation to avoid our domManip AJAX trickery 21562 document.head.appendChild( script[ 0 ] ); 21563 }, 21564 abort: function() { 21565 if ( callback ) { 21566 callback(); 21567 } 21568 } 21569 }; 21570 } 21571} ); 21572 21573 21574 21575 21576var oldCallbacks = [], 21577 rjsonp = /(=)\?(?=&|$)|\?\?/; 21578 21579// Default jsonp settings 21580jQuery.ajaxSetup( { 21581 jsonp: "callback", 21582 jsonpCallback: function() { 21583 var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) ); 21584 this[ callback ] = true; 21585 return callback; 21586 } 21587} ); 21588 21589// Detect, normalize options and install callbacks for jsonp requests 21590jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { 21591 21592 var callbackName, overwritten, responseContainer, 21593 jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? 21594 "url" : 21595 typeof s.data === "string" && 21596 ( s.contentType || "" ) 21597 .indexOf( "application/x-www-form-urlencoded" ) === 0 && 21598 rjsonp.test( s.data ) && "data" 21599 ); 21600 21601 // Handle iff the expected data type is "jsonp" or we have a parameter to set 21602 if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { 21603 21604 // Get callback name, remembering preexisting value associated with it 21605 callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ? 21606 s.jsonpCallback() : 21607 s.jsonpCallback; 21608 21609 // Insert callback into url or form data 21610 if ( jsonProp ) { 21611 s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); 21612 } else if ( s.jsonp !== false ) { 21613 s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; 21614 } 21615 21616 // Use data converter to retrieve json after script execution 21617 s.converters[ "script json" ] = function() { 21618 if ( !responseContainer ) { 21619 jQuery.error( callbackName + " was not called" ); 21620 } 21621 return responseContainer[ 0 ]; 21622 }; 21623 21624 // Force json dataType 21625 s.dataTypes[ 0 ] = "json"; 21626 21627 // Install callback 21628 overwritten = window[ callbackName ]; 21629 window[ callbackName ] = function() { 21630 responseContainer = arguments; 21631 }; 21632 21633 // Clean-up function (fires after converters) 21634 jqXHR.always( function() { 21635 21636 // If previous value didn't exist - remove it 21637 if ( overwritten === undefined ) { 21638 jQuery( window ).removeProp( callbackName ); 21639 21640 // Otherwise restore preexisting value 21641 } else { 21642 window[ callbackName ] = overwritten; 21643 } 21644 21645 // Save back as free 21646 if ( s[ callbackName ] ) { 21647 21648 // Make sure that re-using the options doesn't screw things around 21649 s.jsonpCallback = originalSettings.jsonpCallback; 21650 21651 // Save the callback name for future use 21652 oldCallbacks.push( callbackName ); 21653 } 21654 21655 // Call if it was a function and we have a response 21656 if ( responseContainer && isFunction( overwritten ) ) { 21657 overwritten( responseContainer[ 0 ] ); 21658 } 21659 21660 responseContainer = overwritten = undefined; 21661 } ); 21662 21663 // Delegate to script 21664 return "script"; 21665 } 21666} ); 21667 21668 21669 21670 21671// Support: Safari 8 only 21672// In Safari 8 documents created via document.implementation.createHTMLDocument 21673// collapse sibling forms: the second one becomes a child of the first one. 21674// Because of that, this security measure has to be disabled in Safari 8. 21675// https://bugs.webkit.org/show_bug.cgi?id=137337 21676support.createHTMLDocument = ( function() { 21677 var body = document.implementation.createHTMLDocument( "" ).body; 21678 body.innerHTML = "<form></form><form></form>"; 21679 return body.childNodes.length === 2; 21680} )(); 21681 21682 21683// Argument "data" should be string of html 21684// context (optional): If specified, the fragment will be created in this context, 21685// defaults to document 21686// keepScripts (optional): If true, will include scripts passed in the html string 21687jQuery.parseHTML = function( data, context, keepScripts ) { 21688 if ( typeof data !== "string" ) { 21689 return []; 21690 } 21691 if ( typeof context === "boolean" ) { 21692 keepScripts = context; 21693 context = false; 21694 } 21695 21696 var base, parsed, scripts; 21697 21698 if ( !context ) { 21699 21700 // Stop scripts or inline event handlers from being executed immediately 21701 // by using document.implementation 21702 if ( support.createHTMLDocument ) { 21703 context = document.implementation.createHTMLDocument( "" ); 21704 21705 // Set the base href for the created document 21706 // so any parsed elements with URLs 21707 // are based on the document's URL (gh-2965) 21708 base = context.createElement( "base" ); 21709 base.href = document.location.href; 21710 context.head.appendChild( base ); 21711 } else { 21712 context = document; 21713 } 21714 } 21715 21716 parsed = rsingleTag.exec( data ); 21717 scripts = !keepScripts && []; 21718 21719 // Single tag 21720 if ( parsed ) { 21721 return [ context.createElement( parsed[ 1 ] ) ]; 21722 } 21723 21724 parsed = buildFragment( [ data ], context, scripts ); 21725 21726 if ( scripts && scripts.length ) { 21727 jQuery( scripts ).remove(); 21728 } 21729 21730 return jQuery.merge( [], parsed.childNodes ); 21731}; 21732 21733 21734/** 21735 * Load a url into a page 21736 */ 21737jQuery.fn.load = function( url, params, callback ) { 21738 var selector, type, response, 21739 self = this, 21740 off = url.indexOf( " " ); 21741 21742 if ( off > -1 ) { 21743 selector = stripAndCollapse( url.slice( off ) ); 21744 url = url.slice( 0, off ); 21745 } 21746 21747 // If it's a function 21748 if ( isFunction( params ) ) { 21749 21750 // We assume that it's the callback 21751 callback = params; 21752 params = undefined; 21753 21754 // Otherwise, build a param string 21755 } else if ( params && typeof params === "object" ) { 21756 type = "POST"; 21757 } 21758 21759 // If we have elements to modify, make the request 21760 if ( self.length > 0 ) { 21761 jQuery.ajax( { 21762 url: url, 21763 21764 // If "type" variable is undefined, then "GET" method will be used. 21765 // Make value of this field explicit since 21766 // user can override it through ajaxSetup method 21767 type: type || "GET", 21768 dataType: "html", 21769 data: params 21770 } ).done( function( responseText ) { 21771 21772 // Save response for use in complete callback 21773 response = arguments; 21774 21775 self.html( selector ? 21776 21777 // If a selector was specified, locate the right elements in a dummy div 21778 // Exclude scripts to avoid IE 'Permission Denied' errors 21779 jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) : 21780 21781 // Otherwise use the full result 21782 responseText ); 21783 21784 // If the request succeeds, this function gets "data", "status", "jqXHR" 21785 // but they are ignored because response was set above. 21786 // If it fails, this function gets "jqXHR", "status", "error" 21787 } ).always( callback && function( jqXHR, status ) { 21788 self.each( function() { 21789 callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); 21790 } ); 21791 } ); 21792 } 21793 21794 return this; 21795}; 21796 21797 21798 21799 21800jQuery.expr.pseudos.animated = function( elem ) { 21801 return jQuery.grep( jQuery.timers, function( fn ) { 21802 return elem === fn.elem; 21803 } ).length; 21804}; 21805 21806 21807 21808 21809jQuery.offset = { 21810 setOffset: function( elem, options, i ) { 21811 var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, 21812 position = jQuery.css( elem, "position" ), 21813 curElem = jQuery( elem ), 21814 props = {}; 21815 21816 // Set position first, in-case top/left are set even on static elem 21817 if ( position === "static" ) { 21818 elem.style.position = "relative"; 21819 } 21820 21821 curOffset = curElem.offset(); 21822 curCSSTop = jQuery.css( elem, "top" ); 21823 curCSSLeft = jQuery.css( elem, "left" ); 21824 calculatePosition = ( position === "absolute" || position === "fixed" ) && 21825 ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1; 21826 21827 // Need to be able to calculate position if either 21828 // top or left is auto and position is either absolute or fixed 21829 if ( calculatePosition ) { 21830 curPosition = curElem.position(); 21831 curTop = curPosition.top; 21832 curLeft = curPosition.left; 21833 21834 } else { 21835 curTop = parseFloat( curCSSTop ) || 0; 21836 curLeft = parseFloat( curCSSLeft ) || 0; 21837 } 21838 21839 if ( isFunction( options ) ) { 21840 21841 // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) 21842 options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); 21843 } 21844 21845 if ( options.top != null ) { 21846 props.top = ( options.top - curOffset.top ) + curTop; 21847 } 21848 if ( options.left != null ) { 21849 props.left = ( options.left - curOffset.left ) + curLeft; 21850 } 21851 21852 if ( "using" in options ) { 21853 options.using.call( elem, props ); 21854 21855 } else { 21856 curElem.css( props ); 21857 } 21858 } 21859}; 21860 21861jQuery.fn.extend( { 21862 21863 // offset() relates an element's border box to the document origin 21864 offset: function( options ) { 21865 21866 // Preserve chaining for setter 21867 if ( arguments.length ) { 21868 return options === undefined ? 21869 this : 21870 this.each( function( i ) { 21871 jQuery.offset.setOffset( this, options, i ); 21872 } ); 21873 } 21874 21875 var rect, win, 21876 elem = this[ 0 ]; 21877 21878 if ( !elem ) { 21879 return; 21880 } 21881 21882 // Return zeros for disconnected and hidden (display: none) elements (gh-2310) 21883 // Support: IE <=11 only 21884 // Running getBoundingClientRect on a 21885 // disconnected node in IE throws an error 21886 if ( !elem.getClientRects().length ) { 21887 return { top: 0, left: 0 }; 21888 } 21889 21890 // Get document-relative position by adding viewport scroll to viewport-relative gBCR 21891 rect = elem.getBoundingClientRect(); 21892 win = elem.ownerDocument.defaultView; 21893 return { 21894 top: rect.top + win.pageYOffset, 21895 left: rect.left + win.pageXOffset 21896 }; 21897 }, 21898 21899 // position() relates an element's margin box to its offset parent's padding box 21900 // This corresponds to the behavior of CSS absolute positioning 21901 position: function() { 21902 if ( !this[ 0 ] ) { 21903 return; 21904 } 21905 21906 var offsetParent, offset, doc, 21907 elem = this[ 0 ], 21908 parentOffset = { top: 0, left: 0 }; 21909 21910 // position:fixed elements are offset from the viewport, which itself always has zero offset 21911 if ( jQuery.css( elem, "position" ) === "fixed" ) { 21912 21913 // Assume position:fixed implies availability of getBoundingClientRect 21914 offset = elem.getBoundingClientRect(); 21915 21916 } else { 21917 offset = this.offset(); 21918 21919 // Account for the *real* offset parent, which can be the document or its root element 21920 // when a statically positioned element is identified 21921 doc = elem.ownerDocument; 21922 offsetParent = elem.offsetParent || doc.documentElement; 21923 while ( offsetParent && 21924 ( offsetParent === doc.body || offsetParent === doc.documentElement ) && 21925 jQuery.css( offsetParent, "position" ) === "static" ) { 21926 21927 offsetParent = offsetParent.parentNode; 21928 } 21929 if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) { 21930 21931 // Incorporate borders into its offset, since they are outside its content origin 21932 parentOffset = jQuery( offsetParent ).offset(); 21933 parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true ); 21934 parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true ); 21935 } 21936 } 21937 21938 // Subtract parent offsets and element margins 21939 return { 21940 top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), 21941 left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) 21942 }; 21943 }, 21944 21945 // This method will return documentElement in the following cases: 21946 // 1) For the element inside the iframe without offsetParent, this method will return 21947 // documentElement of the parent window 21948 // 2) For the hidden or detached element 21949 // 3) For body or html element, i.e. in case of the html node - it will return itself 21950 // 21951 // but those exceptions were never presented as a real life use-cases 21952 // and might be considered as more preferable results. 21953 // 21954 // This logic, however, is not guaranteed and can change at any point in the future 21955 offsetParent: function() { 21956 return this.map( function() { 21957 var offsetParent = this.offsetParent; 21958 21959 while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) { 21960 offsetParent = offsetParent.offsetParent; 21961 } 21962 21963 return offsetParent || documentElement; 21964 } ); 21965 } 21966} ); 21967 21968// Create scrollLeft and scrollTop methods 21969jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { 21970 var top = "pageYOffset" === prop; 21971 21972 jQuery.fn[ method ] = function( val ) { 21973 return access( this, function( elem, method, val ) { 21974 21975 // Coalesce documents and windows 21976 var win; 21977 if ( isWindow( elem ) ) { 21978 win = elem; 21979 } else if ( elem.nodeType === 9 ) { 21980 win = elem.defaultView; 21981 } 21982 21983 if ( val === undefined ) { 21984 return win ? win[ prop ] : elem[ method ]; 21985 } 21986 21987 if ( win ) { 21988 win.scrollTo( 21989 !top ? val : win.pageXOffset, 21990 top ? val : win.pageYOffset 21991 ); 21992 21993 } else { 21994 elem[ method ] = val; 21995 } 21996 }, method, val, arguments.length ); 21997 }; 21998} ); 21999 22000// Support: Safari <=7 - 9.1, Chrome <=37 - 49 22001// Add the top/left cssHooks using jQuery.fn.position 22002// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 22003// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347 22004// getComputedStyle returns percent when specified for top/left/bottom/right; 22005// rather than make the css module depend on the offset module, just check for it here 22006jQuery.each( [ "top", "left" ], function( _i, prop ) { 22007 jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, 22008 function( elem, computed ) { 22009 if ( computed ) { 22010 computed = curCSS( elem, prop ); 22011 22012 // If curCSS returns percentage, fallback to offset 22013 return rnumnonpx.test( computed ) ? 22014 jQuery( elem ).position()[ prop ] + "px" : 22015 computed; 22016 } 22017 } 22018 ); 22019} ); 22020 22021 22022// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods 22023jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { 22024 jQuery.each( { 22025 padding: "inner" + name, 22026 content: type, 22027 "": "outer" + name 22028 }, function( defaultExtra, funcName ) { 22029 22030 // Margin is only for outerHeight, outerWidth 22031 jQuery.fn[ funcName ] = function( margin, value ) { 22032 var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), 22033 extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); 22034 22035 return access( this, function( elem, type, value ) { 22036 var doc; 22037 22038 if ( isWindow( elem ) ) { 22039 22040 // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729) 22041 return funcName.indexOf( "outer" ) === 0 ? 22042 elem[ "inner" + name ] : 22043 elem.document.documentElement[ "client" + name ]; 22044 } 22045 22046 // Get document width or height 22047 if ( elem.nodeType === 9 ) { 22048 doc = elem.documentElement; 22049 22050 // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], 22051 // whichever is greatest 22052 return Math.max( 22053 elem.body[ "scroll" + name ], doc[ "scroll" + name ], 22054 elem.body[ "offset" + name ], doc[ "offset" + name ], 22055 doc[ "client" + name ] 22056 ); 22057 } 22058 22059 return value === undefined ? 22060 22061 // Get width or height on the element, requesting but not forcing parseFloat 22062 jQuery.css( elem, type, extra ) : 22063 22064 // Set width or height on the element 22065 jQuery.style( elem, type, value, extra ); 22066 }, type, chainable ? margin : undefined, chainable ); 22067 }; 22068 } ); 22069} ); 22070 22071 22072jQuery.each( [ 22073 "ajaxStart", 22074 "ajaxStop", 22075 "ajaxComplete", 22076 "ajaxError", 22077 "ajaxSuccess", 22078 "ajaxSend" 22079], function( _i, type ) { 22080 jQuery.fn[ type ] = function( fn ) { 22081 return this.on( type, fn ); 22082 }; 22083} ); 22084 22085 22086 22087 22088jQuery.fn.extend( { 22089 22090 bind: function( types, data, fn ) { 22091 return this.on( types, null, data, fn ); 22092 }, 22093 unbind: function( types, fn ) { 22094 return this.off( types, null, fn ); 22095 }, 22096 22097 delegate: function( selector, types, data, fn ) { 22098 return this.on( types, selector, data, fn ); 22099 }, 22100 undelegate: function( selector, types, fn ) { 22101 22102 // ( namespace ) or ( selector, types [, fn] ) 22103 return arguments.length === 1 ? 22104 this.off( selector, "**" ) : 22105 this.off( types, selector || "**", fn ); 22106 }, 22107 22108 hover: function( fnOver, fnOut ) { 22109 return this
vendor: 2,565 bytes, lines 22109-22201
22109.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); 22110 } 22111} ); 22112 22113jQuery.each( 22114 ( "blur focus focusin focusout resize scroll click dblclick " + 22115 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + 22116 "change select submit keydown keypress keyup contextmenu" ).split( " " ), 22117 function( _i, name ) { 22118 22119 // Handle event binding 22120 jQuery.fn[ name ] = function( data, fn ) { 22121 return arguments.length > 0 ? 22122 this.on( name, null, data, fn ) : 22123 this.trigger( name ); 22124 }; 22125 } 22126); 22127 22128 22129 22130 22131// Support: Android <=4.0 only 22132// Make sure we trim BOM and NBSP 22133// Require that the "whitespace run" starts from a non-whitespace 22134// to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position. 22135var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g; 22136 22137// Bind a function to a context, optionally partially applying any 22138// arguments. 22139// jQuery.proxy is deprecated to promote standards (specifically Function#bind) 22140// However, it is not slated for removal any time soon 22141jQuery.proxy = function( fn, context ) { 22142 var tmp, args, proxy; 22143 22144 if ( typeof context === "string" ) { 22145 tmp = fn[ context ]; 22146 context = fn; 22147 fn = tmp; 22148 } 22149 22150 // Quick check to determine if target is callable, in the spec 22151 // this throws a TypeError, but we will just return undefined. 22152 if ( !isFunction( fn ) ) { 22153 return undefined; 22154 } 22155 22156 // Simulated bind 22157 args = slice.call( arguments, 2 ); 22158 proxy = function() { 22159 return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); 22160 }; 22161 22162 // Set the guid of unique handler to the same of original handler, so it can be removed 22163 proxy.guid = fn.guid = fn.guid || jQuery.guid++; 22164 22165 return proxy; 22166}; 22167 22168jQuery.holdReady = function( hold ) { 22169 if ( hold ) { 22170 jQuery.readyWait++; 22171 } else { 22172 jQuery.ready( true ); 22173 } 22174}; 22175jQuery.isArray = Array.isArray; 22176jQuery.parseJSON = JSON.parse; 22177jQuery.nodeName = nodeName; 22178jQuery.isFunction = isFunction; 22179jQuery.isWindow = isWindow; 22180jQuery.camelCase = camelCase; 22181jQuery.type = toType; 22182 22183jQuery.now = Date.now; 22184 22185jQuery.isNumeric = function( obj ) { 22186 22187 // As of jQuery 3.0, isNumeric is limited to 22188 // strings and numbers (primitives or objects) 22189 // that can be coerced to finite numbers (gh-2662) 22190 var type = jQuery.type( obj ); 22191 return ( type === "number" || type === "string" ) && 22192 22193 // parseFloat NaNs numeric-cast false positives ("") 22194 // ...but misinterprets leading-number strings, particularly hex literals ("0x...") 22195 // subtraction forces infinities to NaN 22196 !isNaN( obj - parseFloat( obj ) ); 22197}; 22198 22199jQuery.trim = function( text ) { 22200 return text == null ? 22201 "" :
22202 ( text + "" ).replace( rtrim, "$1" ); 22203}; 22204 22205 22206 22207// Register as a named AMD module, since jQuery can be concatenated with other 22208// files that may use define, but not via a proper concatenation script that 22209// understands anonymous AMD modules. A named AMD is safest and most robust 22210// way to register. Lowercase jquery is used because AMD module names are 22211// derived from file names, and jQuery is normally delivered in a lowercase 22212// file name. Do this after creating the global so that if an AMD module wants 22213// to call noConflict to hide this version of jQuery, it will work. 22214 22215// Note that for maximum portability, libraries that are not jQuery should 22216// declare themselves as anonymous modules, and avoid setting a global if an 22217// AMD loader is present. jQuery is a special case. For more information, see 22218// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon 22219 22220if ( typeof define === "function" && define.amd ) { 22221 define( "jquery", [], function() { 22222 return jQuery; 22223 } ); 22224} 22225 22226 22227 22228 22229var 22230 22231 // Map over jQuery in case of overwrite 22232 _jQuery = window.jQuery, 22233 22234 // Map over the $ in case of overwrite 22235 _$ = window.$; 22236 22237jQuery.noConflict = function( deep ) { 22238 if ( window.$ === jQuery ) { 22239 window.$ = _$; 22240 } 22241 22242 if ( deep && window.jQuery === jQuery ) { 22243 window.jQuery = _jQuery; 22244 } 22245 22246 return jQuery; 22247}; 22248 22249// Expose jQuery and $ identifiers, even in AMD 22250// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557) 22251// and CommonJS for browser emulators (trac-13566) 22252if ( typeof noGlobal === "undefined" ) { 22253 window.jQuery = window.$ = jQuery; 22254} 22255 22256 22257 22258 22259return jQuery; 22260} ); 22261 22262},{}],39:[function(require,module,exports){ 22263/*! 22264 * Masonry v4.2.2 22265 * Cascading grid layout library 22266 * https://masonry.desandro.com 22267 * MIT License 22268 * by David DeSandro 22269 */ 22270 22271( function( window, factory ) { 22272 // universal module definition 22273 /* jshint strict: false */ /*globals define, module, require */ 22274 if ( typeof define == 'function' && define.amd ) { 22275 // AMD 22276 define( [ 22277 'outlayer/outlayer', 22278 'get-size/get-size' 22279 ], 22280 factory ); 22281 } else if ( typeof module == 'object' && module.exports ) { 22282 // CommonJS 22283 module.exports = factory( 22284 require('outlayer'), 22285 require('get-size') 22286 ); 22287 } else { 22288 // browser global 22289 window.Masonry = factory( 22290 window.Outlayer, 22291 window.getSize 22292 ); 22293 } 22294 22295}( window, function factory( Outlayer, getSize ) { 22296 22297'use strict'; 22298 22299// -------------------------- masonryDefinition -------------------------- // 22300 22301 // create an Outlayer layout class 22302 var Masonry = Outlayer.create('masonry'); 22303 // isFitWidth -> fitWidth
vendor: 6,829 bytes, lines 22304-22513
22304 Masonry.compatOptions.fitWidth = 'isFitWidth'; 22305 22306 var proto = Masonry.prototype; 22307 22308 proto._resetLayout = function() { 22309 this.getSize(); 22310 this._getMeasurement( 'columnWidth', 'outerWidth' ); 22311 this._getMeasurement( 'gutter', 'outerWidth' ); 22312 this.measureColumns(); 22313 22314 // reset column Y 22315 this.colYs = []; 22316 for ( var i=0; i < this.cols; i++ ) { 22317 this.colYs.push( 0 ); 22318 } 22319 22320 this.maxY = 0; 22321 this.horizontalColIndex = 0; 22322 }; 22323 22324 proto.measureColumns = function() { 22325 this.getContainerWidth(); 22326 // if columnWidth is 0, default to outerWidth of first item 22327 if ( !this.columnWidth ) { 22328 var firstItem = this.items[0]; 22329 var firstItemElem = firstItem && firstItem.element; 22330 // columnWidth fall back to item of first element 22331 this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth || 22332 // if first elem has no width, default to size of container 22333 this.containerWidth; 22334 } 22335 22336 var columnWidth = this.columnWidth += this.gutter; 22337 22338 // calculate columns 22339 var containerWidth = this.containerWidth + this.gutter; 22340 var cols = containerWidth / columnWidth; 22341 // fix rounding errors, typically with gutters 22342 var excess = columnWidth - containerWidth % columnWidth; 22343 // if overshoot is less than a pixel, round up, otherwise floor it 22344 var mathMethod = excess && excess < 1 ? 'round' : 'floor'; 22345 cols = Math[ mathMethod ]( cols ); 22346 this.cols = Math.max( cols, 1 ); 22347 }; 22348 22349 proto.getContainerWidth = function() { 22350 // container is parent if fit width 22351 var isFitWidth = this._getOption('fitWidth'); 22352 var container = isFitWidth ? this.element.parentNode : this.element; 22353 // check that this.size and size are there 22354 // IE8 triggers resize on body size change, so they might not be 22355 var size = getSize( container ); 22356 this.containerWidth = size && size.innerWidth; 22357 }; 22358 22359 proto._getItemLayoutPosition = function( item ) { 22360 item.getSize(); 22361 // how many columns does this brick span 22362 var remainder = item.size.outerWidth % this.columnWidth; 22363 var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil'; 22364 // round if off by 1 pixel, otherwise use ceil 22365 var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth ); 22366 colSpan = Math.min( colSpan, this.cols ); 22367 // use horizontal or top column position 22368 var colPosMethod = this.options.horizontalOrder ? 22369 '_getHorizontalColPosition' : '_getTopColPosition'; 22370 var colPosition = this[ colPosMethod ]( colSpan, item ); 22371 // position the brick 22372 var position = { 22373 x: this.columnWidth * colPosition.col, 22374 y: colPosition.y 22375 }; 22376 // apply setHeight to necessary columns 22377 var setHeight = colPosition.y + item.size.outerHeight; 22378 var setMax = colSpan + colPosition.col; 22379 for ( var i = colPosition.col; i < setMax; i++ ) { 22380 this.colYs[i] = setHeight; 22381 } 22382 22383 return position; 22384 }; 22385 22386 proto._getTopColPosition = function( colSpan ) { 22387 var colGroup = this._getTopColGroup( colSpan ); 22388 // get the minimum Y value from the columns 22389 var minimumY = Math.min.apply( Math, colGroup ); 22390 22391 return { 22392 col: colGroup.indexOf( minimumY ), 22393 y: minimumY, 22394 }; 22395 }; 22396 22397 /** 22398 * @param {Number} colSpan - number of columns the element spans 22399 * @returns {Array} colGroup 22400 */ 22401 proto._getTopColGroup = function( colSpan ) { 22402 if ( colSpan < 2 ) { 22403 // if brick spans only one column, use all the column Ys 22404 return this.colYs; 22405 } 22406 22407 var colGroup = []; 22408 // how many different places could this brick fit horizontally 22409 var groupCount = this.cols + 1 - colSpan; 22410 // for each group potential horizontal position 22411 for ( var i = 0; i < groupCount; i++ ) { 22412 colGroup[i] = this._getColGroupY( i, colSpan ); 22413 } 22414 return colGroup; 22415 }; 22416 22417 proto._getColGroupY = function( col, colSpan ) { 22418 if ( colSpan < 2 ) { 22419 return this.colYs[ col ]; 22420 } 22421 // make an array of colY values for that one group 22422 var groupColYs = this.colYs.slice( col, col + colSpan ); 22423 // and get the max value of the array 22424 return Math.max.apply( Math, groupColYs ); 22425 }; 22426 22427 // get column position based on horizontal index. #873 22428 proto._getHorizontalColPosition = function( colSpan, item ) { 22429 var col = this.horizontalColIndex % this.cols; 22430 var isOver = colSpan > 1 && col + colSpan > this.cols; 22431 // shift to next row if item can't fit on current row 22432 col = isOver ? 0 : col; 22433 // don't let zero-size items take up space 22434 var hasSize = item.size.outerWidth && item.size.outerHeight; 22435 this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex; 22436 22437 return { 22438 col: col, 22439 y: this._getColGroupY( col, colSpan ), 22440 }; 22441 }; 22442 22443 proto._manageStamp = function( stamp ) { 22444 var stampSize = getSize( stamp ); 22445 var offset = this._getElementOffset( stamp ); 22446 // get the columns that this stamp affects 22447 var isOriginLeft = this._getOption('originLeft'); 22448 var firstX = isOriginLeft ? offset.left : offset.right; 22449 var lastX = firstX + stampSize.outerWidth; 22450 var firstCol = Math.floor( firstX / this.columnWidth ); 22451 firstCol = Math.max( 0, firstCol ); 22452 var lastCol = Math.floor( lastX / this.columnWidth ); 22453 // lastCol should not go over if multiple of columnWidth #425 22454 lastCol -= lastX % this.columnWidth ? 0 : 1; 22455 lastCol = Math.min( this.cols - 1, lastCol ); 22456 // set colYs to bottom of the stamp 22457 22458 var isOriginTop = this._getOption('originTop'); 22459 var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) + 22460 stampSize.outerHeight; 22461 for ( var i = firstCol; i <= lastCol; i++ ) { 22462 this.colYs[i] = Math.max( stampMaxY, this.colYs[i] ); 22463 } 22464 }; 22465 22466 proto._getContainerSize = function() { 22467 this.maxY = Math.max.apply( Math, this.colYs ); 22468 var size = { 22469 height: this.maxY 22470 }; 22471 22472 if ( this._getOption('fitWidth') ) { 22473 size.width = this._getContainerFitWidth(); 22474 } 22475 22476 return size; 22477 }; 22478 22479 proto._getContainerFitWidth = function() { 22480 var unusedCols = 0; 22481 // count unused columns 22482 var i = this.cols; 22483 while ( --i ) { 22484 if ( this.colYs[i] !== 0 ) { 22485 break; 22486 } 22487 unusedCols++; 22488 } 22489 // fit container to columns that have been used 22490 return ( this.cols - unusedCols ) * this.columnWidth - this.gutter; 22491 }; 22492 22493 proto.needsResizeLayout = function() { 22494 var previousWidth = this.containerWidth; 22495 this.getContainerWidth(); 22496 return previousWidth != this.containerWidth; 22497 }; 22498 22499 return Masonry; 22500 22501})); 22502 22503},{"get-size":31,"outlayer":41}],40:[function(require,module,exports){ 22504/** 22505 * Outlayer Item 22506 */ 22507 22508( function( window, factory ) { 22509 // universal module definition 22510 /* jshint strict: false */ /* globals define, module, require */ 22511 if ( typeof define == 'function' && define.amd ) { 22512 // AMD - RequireJS 22513 define(
vendor: 14,302 bytes, lines 22513-23058
22513[ 22514 'ev-emitter/ev-emitter', 22515 'get-size/get-size' 22516 ], 22517 factory 22518 ); 22519 } else if ( typeof module == 'object' && module.exports ) { 22520 // CommonJS - Browserify, Webpack 22521 module.exports = factory( 22522 require('ev-emitter'), 22523 require('get-size') 22524 ); 22525 } else { 22526 // browser global 22527 window.Outlayer = {}; 22528 window.Outlayer.Item = factory( 22529 window.EvEmitter, 22530 window.getSize 22531 ); 22532 } 22533 22534}( window, function factory( EvEmitter, getSize ) { 22535'use strict'; 22536 22537// ----- helpers ----- // 22538 22539function isEmptyObj( obj ) { 22540 for ( var prop in obj ) { 22541 return false; 22542 } 22543 prop = null; 22544 return true; 22545} 22546 22547// -------------------------- CSS3 support -------------------------- // 22548 22549 22550var docElemStyle = document.documentElement.style; 22551 22552var transitionProperty = typeof docElemStyle.transition == 'string' ? 22553 'transition' : 'WebkitTransition'; 22554var transformProperty = typeof docElemStyle.transform == 'string' ? 22555 'transform' : 'WebkitTransform'; 22556 22557var transitionEndEvent = { 22558 WebkitTransition: 'webkitTransitionEnd', 22559 transition: 'transitionend' 22560}[ transitionProperty ]; 22561 22562// cache all vendor properties that could have vendor prefix 22563var vendorProperties = { 22564 transform: transformProperty, 22565 transition: transitionProperty, 22566 transitionDuration: transitionProperty + 'Duration', 22567 transitionProperty: transitionProperty + 'Property', 22568 transitionDelay: transitionProperty + 'Delay' 22569}; 22570 22571// -------------------------- Item -------------------------- // 22572 22573function Item( element, layout ) { 22574 if ( !element ) { 22575 return; 22576 } 22577 22578 this.element = element; 22579 // parent layout class, i.e. Masonry, Isotope, or Packery 22580 this.layout = layout; 22581 this.position = { 22582 x: 0, 22583 y: 0 22584 }; 22585 22586 this._create(); 22587} 22588 22589// inherit EvEmitter 22590var proto = Item.prototype = Object.create( EvEmitter.prototype ); 22591proto.constructor = Item; 22592 22593proto._create = function() { 22594 // transition objects 22595 this._transn = { 22596 ingProperties: {}, 22597 clean: {}, 22598 onEnd: {} 22599 }; 22600 22601 this.css({ 22602 position: 'absolute' 22603 }); 22604}; 22605 22606// trigger specified handler for event type 22607proto.handleEvent = function( event ) { 22608 var method = 'on' + event.type; 22609 if ( this[ method ] ) { 22610 this[ method ]( event ); 22611 } 22612}; 22613 22614proto.getSize = function() { 22615 this.size = getSize( this.element ); 22616}; 22617 22618/** 22619 * apply CSS styles to element 22620 * @param {Object} style 22621 */ 22622proto.css = function( style ) { 22623 var elemStyle = this.element.style; 22624 22625 for ( var prop in style ) { 22626 // use vendor property if available 22627 var supportedProp = vendorProperties[ prop ] || prop; 22628 elemStyle[ supportedProp ] = style[ prop ]; 22629 } 22630}; 22631 22632 // measure position, and sets it 22633proto.getPosition = function() { 22634 var style = getComputedStyle( this.element ); 22635 var isOriginLeft = this.layout._getOption('originLeft'); 22636 var isOriginTop = this.layout._getOption('originTop'); 22637 var xValue = style[ isOriginLeft ? 'left' : 'right' ]; 22638 var yValue = style[ isOriginTop ? 'top' : 'bottom' ]; 22639 var x = parseFloat( xValue ); 22640 var y = parseFloat( yValue ); 22641 // convert percent to pixels 22642 var layoutSize = this.layout.size; 22643 if ( xValue.indexOf('%') != -1 ) { 22644 x = ( x / 100 ) * layoutSize.width; 22645 } 22646 if ( yValue.indexOf('%') != -1 ) { 22647 y = ( y / 100 ) * layoutSize.height; 22648 } 22649 // clean up 'auto' or other non-integer values 22650 x = isNaN( x ) ? 0 : x; 22651 y = isNaN( y ) ? 0 : y; 22652 // remove padding from measurement 22653 x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight; 22654 y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom; 22655 22656 this.position.x = x; 22657 this.position.y = y; 22658}; 22659 22660// set settled position, apply padding 22661proto.layoutPosition = function() { 22662 var layoutSize = this.layout.size; 22663 var style = {}; 22664 var isOriginLeft = this.layout._getOption('originLeft'); 22665 var isOriginTop = this.layout._getOption('originTop'); 22666 22667 // x 22668 var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight'; 22669 var xProperty = isOriginLeft ? 'left' : 'right'; 22670 var xResetProperty = isOriginLeft ? 'right' : 'left'; 22671 22672 var x = this.position.x + layoutSize[ xPadding ]; 22673 // set in percentage or pixels 22674 style[ xProperty ] = this.getXValue( x ); 22675 // reset other property 22676 style[ xResetProperty ] = ''; 22677 22678 // y 22679 var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom'; 22680 var yProperty = isOriginTop ? 'top' : 'bottom'; 22681 var yResetProperty = isOriginTop ? 'bottom' : 'top'; 22682 22683 var y = this.position.y + layoutSize[ yPadding ]; 22684 // set in percentage or pixels 22685 style[ yProperty ] = this.getYValue( y ); 22686 // reset other property 22687 style[ yResetProperty ] = ''; 22688 22689 this.css( style ); 22690 this.emitEvent( 'layout', [ this ] ); 22691}; 22692 22693proto.getXValue = function( x ) { 22694 var isHorizontal = this.layout._getOption('horizontal'); 22695 return this.layout.options.percentPosition && !isHorizontal ? 22696 ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px'; 22697}; 22698 22699proto.getYValue = function( y ) { 22700 var isHorizontal = this.layout._getOption('horizontal'); 22701 return this.layout.options.percentPosition && isHorizontal ? 22702 ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px'; 22703}; 22704 22705proto._transitionTo = function( x, y ) { 22706 this.getPosition(); 22707 // get current x & y from top/left 22708 var curX = this.position.x; 22709 var curY = this.position.y; 22710 22711 var didNotMove = x == this.position.x && y == this.position.y; 22712 22713 // save end position 22714 this.setPosition( x, y ); 22715 22716 // if did not move and not transitioning, just go to layout 22717 if ( didNotMove && !this.isTransitioning ) { 22718 this.layoutPosition(); 22719 return; 22720 } 22721 22722 var transX = x - curX; 22723 var transY = y - curY; 22724 var transitionStyle = {}; 22725 transitionStyle.transform = this.getTranslate( transX, transY ); 22726 22727 this.transition({ 22728 to: transitionStyle, 22729 onTransitionEnd: { 22730 transform: this.layoutPosition 22731 }, 22732 isCleaning: true 22733 }); 22734}; 22735 22736proto.getTranslate = function( x, y ) { 22737 // flip cooridinates if origin on right or bottom 22738 var isOriginLeft = this.layout._getOption('originLeft'); 22739 var isOriginTop = this.layout._getOption('originTop'); 22740 x = isOriginLeft ? x : -x; 22741 y = isOriginTop ? y : -y; 22742 return 'translate3d(' + x + 'px, ' + y + 'px, 0)'; 22743}; 22744 22745// non transition + transform support 22746proto.goTo = function( x, y ) { 22747 this.setPosition( x, y ); 22748 this.layoutPosition(); 22749}; 22750 22751proto.moveTo = proto._transitionTo; 22752 22753proto.setPosition = function( x, y ) { 22754 this.position.x = parseFloat( x ); 22755 this.position.y = parseFloat( y ); 22756}; 22757 22758// ----- transition ----- // 22759 22760/** 22761 * @param {Object} style - CSS 22762 * @param {Function} onTransitionEnd 22763 */ 22764 22765// non transition, just trigger callback 22766proto._nonTransition = function( args ) { 22767 this.css( args.to ); 22768 if ( args.isCleaning ) { 22769 this._removeStyles( args.to ); 22770 } 22771 for ( var prop in args.onTransitionEnd ) { 22772 args.onTransitionEnd[ prop ].call( this ); 22773 } 22774}; 22775 22776/** 22777 * proper transition 22778 * @param {Object} args - arguments 22779 * @param {Object} to - style to transition to 22780 * @param {Object} from - style to start transition from 22781 * @param {Boolean} isCleaning - removes transition styles after transition 22782 * @param {Function} onTransitionEnd - callback 22783 */ 22784proto.transition = function( args ) { 22785 // redirect to nonTransition if no transition duration 22786 if ( !parseFloat( this.layout.options.transitionDuration ) ) { 22787 this._nonTransition( args ); 22788 return; 22789 } 22790 22791 var _transition = this._transn; 22792 // keep track of onTransitionEnd callback by css property 22793 for ( var prop in args.onTransitionEnd ) { 22794 _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ]; 22795 } 22796 // keep track of properties that are transitioning 22797 for ( prop in args.to ) { 22798 _transition.ingProperties[ prop ] = true; 22799 // keep track of properties to clean up when transition is done 22800 if ( args.isCleaning ) { 22801 _transition.clean[ prop ] = true; 22802 } 22803 } 22804 22805 // set from styles 22806 if ( args.from ) { 22807 this.css( args.from ); 22808 // force redraw. http://blog.alexmaccaw.com/css-transitions 22809 var h = this.element.offsetHeight; 22810 // hack for JSHint to hush about unused var 22811 h = null; 22812 } 22813 // enable transition 22814 this.enableTransition( args.to ); 22815 // set styles that are transitioning 22816 this.css( args.to ); 22817 22818 this.isTransitioning = true; 22819 22820}; 22821 22822// dash before all cap letters, including first for 22823// WebkitTransform => -webkit-transform 22824function toDashedAll( str ) { 22825 return str.replace( /([A-Z])/g, function( $1 ) { 22826 return '-' + $1.toLowerCase(); 22827 }); 22828} 22829 22830var transitionProps = 'opacity,' + toDashedAll( transformProperty ); 22831 22832proto.enableTransition = function(/* style */) { 22833 // HACK changing transitionProperty during a transition 22834 // will cause transition to jump 22835 if ( this.isTransitioning ) { 22836 return; 22837 } 22838 22839 // make `transition: foo, bar, baz` from style object 22840 // HACK un-comment this when enableTransition can work 22841 // while a transition is happening 22842 // var transitionValues = []; 22843 // for ( var prop in style ) { 22844 // // dash-ify camelCased properties like WebkitTransition 22845 // prop = vendorProperties[ prop ] || prop; 22846 // transitionValues.push( toDashedAll( prop ) ); 22847 // } 22848 // munge number to millisecond, to match stagger 22849 var duration = this.layout.options.transitionDuration; 22850 duration = typeof duration == 'number' ? duration + 'ms' : duration; 22851 // enable transition styles 22852 this.css({ 22853 transitionProperty: transitionProps, 22854 transitionDuration: duration, 22855 transitionDelay: this.staggerDelay || 0 22856 }); 22857 // listen for transition end event 22858 this.element.addEventListener( transitionEndEvent, this, false ); 22859}; 22860 22861// ----- events ----- // 22862 22863proto.onwebkitTransitionEnd = function( event ) { 22864 this.ontransitionend( event ); 22865}; 22866 22867proto.onotransitionend = function( event ) { 22868 this.ontransitionend( event ); 22869}; 22870 22871// properties that I munge to make my life easier 22872var dashedVendorProperties = { 22873 '-webkit-transform': 'transform' 22874}; 22875 22876proto.ontransitionend = function( event ) { 22877 // disregard bubbled events from children 22878 if ( event.target !== this.element ) { 22879 return; 22880 } 22881 var _transition = this._transn; 22882 // get property name of transitioned property, convert to prefix-free 22883 var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName; 22884 22885 // remove property that has completed transitioning 22886 delete _transition.ingProperties[ propertyName ]; 22887 // check if any properties are still transitioning 22888 if ( isEmptyObj( _transition.ingProperties ) ) { 22889 // all properties have completed transitioning 22890 this.disableTransition(); 22891 } 22892 // clean style 22893 if ( propertyName in _transition.clean ) { 22894 // clean up style 22895 this.element.style[ event.propertyName ] = ''; 22896 delete _transition.clean[ propertyName ]; 22897 } 22898 // trigger onTransitionEnd callback 22899 if ( propertyName in _transition.onEnd ) { 22900 var onTransitionEnd = _transition.onEnd[ propertyName ]; 22901 onTransitionEnd.call( this ); 22902 delete _transition.onEnd[ propertyName ]; 22903 } 22904 22905 this.emitEvent( 'transitionEnd', [ this ] ); 22906}; 22907 22908proto.disableTransition = function() { 22909 this.removeTransitionStyles(); 22910 this.element.removeEventListener( transitionEndEvent, this, false ); 22911 this.isTransitioning = false; 22912}; 22913 22914/** 22915 * removes style property from element 22916 * @param {Object} style 22917**/ 22918proto._removeStyles = function( style ) { 22919 // clean up transition styles 22920 var cleanStyle = {}; 22921 for ( var prop in style ) { 22922 cleanStyle[ prop ] = ''; 22923 } 22924 this.css( cleanStyle ); 22925}; 22926 22927var cleanTransitionStyle = { 22928 transitionProperty: '', 22929 transitionDuration: '', 22930 transitionDelay: '' 22931}; 22932 22933proto.removeTransitionStyles = function() { 22934 // remove transition 22935 this.css( cleanTransitionStyle ); 22936}; 22937 22938// ----- stagger ----- // 22939 22940proto.stagger = function( delay ) { 22941 delay = isNaN( delay ) ? 0 : delay; 22942 this.staggerDelay = delay + 'ms'; 22943}; 22944 22945// ----- show/hide/remove ----- // 22946 22947// remove element from DOM 22948proto.removeElem = function() { 22949 this.element.parentNode.removeChild( this.element ); 22950 // remove display: none 22951 this.css({ display: '' }); 22952 this.emitEvent( 'remove', [ this ] ); 22953}; 22954 22955proto.remove = function() { 22956 // just remove element if no transition support or no transition 22957 if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) { 22958 this.removeElem(); 22959 return; 22960 } 22961 22962 // start transition 22963 this.once( 'transitionEnd', function() { 22964 this.removeElem(); 22965 }); 22966 this.hide(); 22967}; 22968 22969proto.reveal = function() { 22970 delete this.isHidden; 22971 // remove display: none 22972 this.css({ display: '' }); 22973 22974 var options = this.layout.options; 22975 22976 var onTransitionEnd = {}; 22977 var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle'); 22978 onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd; 22979 22980 this.transition({ 22981 from: options.hiddenStyle, 22982 to: options.visibleStyle, 22983 isCleaning: true, 22984 onTransitionEnd: onTransitionEnd 22985 }); 22986}; 22987 22988proto.onRevealTransitionEnd = function() { 22989 // check if still visible 22990 // during transition, item may have been hidden 22991 if ( !this.isHidden ) { 22992 this.emitEvent('reveal'); 22993 } 22994}; 22995 22996/** 22997 * get style property use for hide/reveal transition end 22998 * @param {String} styleProperty - hiddenStyle/visibleStyle 22999 * @returns {String} 23000 */ 23001proto.getHideRevealTransitionEndProperty = function( styleProperty ) { 23002 var optionStyle = this.layout.options[ styleProperty ]; 23003 // use opacity 23004 if ( optionStyle.opacity ) { 23005 return 'opacity'; 23006 } 23007 // get first property 23008 for ( var prop in optionStyle ) { 23009 return prop; 23010 } 23011}; 23012 23013proto.hide = function() { 23014 // set flag 23015 this.isHidden = true; 23016 // remove display: none 23017 this.css({ display: '' }); 23018 23019 var options = this.layout.options; 23020 23021 var onTransitionEnd = {}; 23022 var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle'); 23023 onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd; 23024 23025 this.transition({ 23026 from: options.visibleStyle, 23027 to: options.hiddenStyle, 23028 // keep hidden stuff hidden 23029 isCleaning: true, 23030 onTransitionEnd: onTransitionEnd 23031 }); 23032}; 23033 23034proto.onHideTransitionEnd = function() { 23035 // check if still hidden 23036 // during transition, item may have been un-hidden 23037 if ( this.isHidden ) { 23038 this.css({ display: 'none' }); 23039 this.emitEvent('hide'); 23040 } 23041}; 23042 23043proto.destroy = function() { 23044 this.css({ 23045 position: '', 23046 left: '', 23047 right: '', 23048 top: '', 23049 bottom: '', 23050 transition: '', 23051 transform: '' 23052 }); 23053}; 23054 23055return Item; 23056 23057})); 23058
23059},{"ev-emitter":29,"get-size":31}],41:[function(require,module,exports){ 23060/*! 23061 * Outlayer v2.1.1 23062 * the brains and guts of a layout library 23063 * MIT license 23064 */ 23065 23066( function( window, factory ) { 23067 'use strict'; 23068 // universal module definition 23069 /* jshint strict: false */ /* globals define, module, require */ 23070 if ( typeof define == 'function' && define.amd ) { 23071 // AMD - RequireJS 23072 define(
vendor: 21,711 bytes, lines 23072-23999
23072[ 23073 'ev-emitter/ev-emitter', 23074 'get-size/get-size', 23075 'fizzy-ui-utils/utils', 23076 './item' 23077 ], 23078 function( EvEmitter, getSize, utils, Item ) { 23079 return factory( window, EvEmitter, getSize, utils, Item); 23080 } 23081 ); 23082 } else if ( typeof module == 'object' && module.exports ) { 23083 // CommonJS - Browserify, Webpack 23084 module.exports = factory( 23085 window, 23086 require('ev-emitter'), 23087 require('get-size'), 23088 require('fizzy-ui-utils'), 23089 require('./item') 23090 ); 23091 } else { 23092 // browser global 23093 window.Outlayer = factory( 23094 window, 23095 window.EvEmitter, 23096 window.getSize, 23097 window.fizzyUIUtils, 23098 window.Outlayer.Item 23099 ); 23100 } 23101 23102}( window, function factory( window, EvEmitter, getSize, utils, Item ) { 23103'use strict'; 23104 23105// ----- vars ----- // 23106 23107var console = window.console; 23108var jQuery = window.jQuery; 23109var noop = function() {}; 23110 23111// -------------------------- Outlayer -------------------------- // 23112 23113// globally unique identifiers 23114var GUID = 0; 23115// internal store of all Outlayer intances 23116var instances = {}; 23117 23118 23119/** 23120 * @param {Element, String} element 23121 * @param {Object} options 23122 * @constructor 23123 */ 23124function Outlayer( element, options ) { 23125 var queryElement = utils.getQueryElement( element ); 23126 if ( !queryElement ) { 23127 if ( console ) { 23128 console.error( 'Bad element for ' + this.constructor.namespace + 23129 ': ' + ( queryElement || element ) ); 23130 } 23131 return; 23132 } 23133 this.element = queryElement; 23134 // add jQuery 23135 if ( jQuery ) { 23136 this.$element = jQuery( this.element ); 23137 } 23138 23139 // options 23140 this.options = utils.extend( {}, this.constructor.defaults ); 23141 this.option( options ); 23142 23143 // add id for Outlayer.getFromElement 23144 var id = ++GUID; 23145 this.element.outlayerGUID = id; // expando 23146 instances[ id ] = this; // associate via id 23147 23148 // kick it off 23149 this._create(); 23150 23151 var isInitLayout = this._getOption('initLayout'); 23152 if ( isInitLayout ) { 23153 this.layout(); 23154 } 23155} 23156 23157// settings are for internal use only 23158Outlayer.namespace = 'outlayer'; 23159Outlayer.Item = Item; 23160 23161// default options 23162Outlayer.defaults = { 23163 containerStyle: { 23164 position: 'relative' 23165 }, 23166 initLayout: true, 23167 originLeft: true, 23168 originTop: true, 23169 resize: true, 23170 resizeContainer: true, 23171 // item options 23172 transitionDuration: '0.4s', 23173 hiddenStyle: { 23174 opacity: 0, 23175 transform: 'scale(0.001)' 23176 }, 23177 visibleStyle: { 23178 opacity: 1, 23179 transform: 'scale(1)' 23180 } 23181}; 23182 23183var proto = Outlayer.prototype; 23184// inherit EvEmitter 23185utils.extend( proto, EvEmitter.prototype ); 23186 23187/** 23188 * set options 23189 * @param {Object} opts 23190 */ 23191proto.option = function( opts ) { 23192 utils.extend( this.options, opts ); 23193}; 23194 23195/** 23196 * get backwards compatible option value, check old name 23197 */ 23198proto._getOption = function( option ) { 23199 var oldOption = this.constructor.compatOptions[ option ]; 23200 return oldOption && this.options[ oldOption ] !== undefined ? 23201 this.options[ oldOption ] : this.options[ option ]; 23202}; 23203 23204Outlayer.compatOptions = { 23205 // currentName: oldName 23206 initLayout: 'isInitLayout', 23207 horizontal: 'isHorizontal', 23208 layoutInstant: 'isLayoutInstant', 23209 originLeft: 'isOriginLeft', 23210 originTop: 'isOriginTop', 23211 resize: 'isResizeBound', 23212 resizeContainer: 'isResizingContainer' 23213}; 23214 23215proto._create = function() { 23216 // get items from children 23217 this.reloadItems(); 23218 // elements that affect layout, but are not laid out 23219 this.stamps = []; 23220 this.stamp( this.options.stamp ); 23221 // set container style 23222 utils.extend( this.element.style, this.options.containerStyle ); 23223 23224 // bind resize method 23225 var canBindResize = this._getOption('resize'); 23226 if ( canBindResize ) { 23227 this.bindResize(); 23228 } 23229}; 23230 23231// goes through all children again and gets bricks in proper order 23232proto.reloadItems = function() { 23233 // collection of item elements 23234 this.items = this._itemize( this.element.children ); 23235}; 23236 23237 23238/** 23239 * turn elements into Outlayer.Items to be used in layout 23240 * @param {Array or NodeList or HTMLElement} elems 23241 * @returns {Array} items - collection of new Outlayer Items 23242 */ 23243proto._itemize = function( elems ) { 23244 23245 var itemElems = this._filterFindItemElements( elems ); 23246 var Item = this.constructor.Item; 23247 23248 // create new Outlayer Items for collection 23249 var items = []; 23250 for ( var i=0; i < itemElems.length; i++ ) { 23251 var elem = itemElems[i]; 23252 var item = new Item( elem, this ); 23253 items.push( item ); 23254 } 23255 23256 return items; 23257}; 23258 23259/** 23260 * get item elements to be used in layout 23261 * @param {Array or NodeList or HTMLElement} elems 23262 * @returns {Array} items - item elements 23263 */ 23264proto._filterFindItemElements = function( elems ) { 23265 return utils.filterFindElements( elems, this.options.itemSelector ); 23266}; 23267 23268/** 23269 * getter method for getting item elements 23270 * @returns {Array} elems - collection of item elements 23271 */ 23272proto.getItemElements = function() { 23273 return this.items.map( function( item ) { 23274 return item.element; 23275 }); 23276}; 23277 23278// ----- init & layout ----- // 23279 23280/** 23281 * lays out all items 23282 */ 23283proto.layout = function() { 23284 this._resetLayout(); 23285 this._manageStamps(); 23286 23287 // don't animate first layout 23288 var layoutInstant = this._getOption('layoutInstant'); 23289 var isInstant = layoutInstant !== undefined ? 23290 layoutInstant : !this._isLayoutInited; 23291 this.layoutItems( this.items, isInstant ); 23292 23293 // flag for initalized 23294 this._isLayoutInited = true; 23295}; 23296 23297// _init is alias for layout 23298proto._init = proto.layout; 23299 23300/** 23301 * logic before any new layout 23302 */ 23303proto._resetLayout = function() { 23304 this.getSize(); 23305}; 23306 23307 23308proto.getSize = function() { 23309 this.size = getSize( this.element ); 23310}; 23311 23312/** 23313 * get measurement from option, for columnWidth, rowHeight, gutter 23314 * if option is String -> get element from selector string, & get size of element 23315 * if option is Element -> get size of element 23316 * else use option as a number 23317 * 23318 * @param {String} measurement 23319 * @param {String} size - width or height 23320 * @private 23321 */ 23322proto._getMeasurement = function( measurement, size ) { 23323 var option = this.options[ measurement ]; 23324 var elem; 23325 if ( !option ) { 23326 // default to 0 23327 this[ measurement ] = 0; 23328 } else { 23329 // use option as an element 23330 if ( typeof option == 'string' ) { 23331 elem = this.element.querySelector( option ); 23332 } else if ( option instanceof HTMLElement ) { 23333 elem = option; 23334 } 23335 // use size of element, if element 23336 this[ measurement ] = elem ? getSize( elem )[ size ] : option; 23337 } 23338}; 23339 23340/** 23341 * layout a collection of item elements 23342 * @api public 23343 */ 23344proto.layoutItems = function( items, isInstant ) { 23345 items = this._getItemsForLayout( items ); 23346 23347 this._layoutItems( items, isInstant ); 23348 23349 this._postLayout(); 23350}; 23351 23352/** 23353 * get the items to be laid out 23354 * you may want to skip over some items 23355 * @param {Array} items 23356 * @returns {Array} items 23357 */ 23358proto._getItemsForLayout = function( items ) { 23359 return items.filter( function( item ) { 23360 return !item.isIgnored; 23361 }); 23362}; 23363 23364/** 23365 * layout items 23366 * @param {Array} items 23367 * @param {Boolean} isInstant 23368 */ 23369proto._layoutItems = function( items, isInstant ) { 23370 this._emitCompleteOnItems( 'layout', items ); 23371 23372 if ( !items || !items.length ) { 23373 // no items, emit event with empty array 23374 return; 23375 } 23376 23377 var queue = []; 23378 23379 items.forEach( function( item ) { 23380 // get x/y object from method 23381 var position = this._getItemLayoutPosition( item ); 23382 // enqueue 23383 position.item = item; 23384 position.isInstant = isInstant || item.isLayoutInstant; 23385 queue.push( position ); 23386 }, this ); 23387 23388 this._processLayoutQueue( queue ); 23389}; 23390 23391/** 23392 * get item layout position 23393 * @param {Outlayer.Item} item 23394 * @returns {Object} x and y position 23395 */ 23396proto._getItemLayoutPosition = function( /* item */ ) { 23397 return { 23398 x: 0, 23399 y: 0 23400 }; 23401}; 23402 23403/** 23404 * iterate over array and position each item 23405 * Reason being - separating this logic prevents 'layout invalidation' 23406 * thx @paul_irish 23407 * @param {Array} queue 23408 */ 23409proto._processLayoutQueue = function( queue ) { 23410 this.updateStagger(); 23411 queue.forEach( function( obj, i ) { 23412 this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i ); 23413 }, this ); 23414}; 23415 23416// set stagger from option in milliseconds number 23417proto.updateStagger = function() { 23418 var stagger = this.options.stagger; 23419 if ( stagger === null || stagger === undefined ) { 23420 this.stagger = 0; 23421 return; 23422 } 23423 this.stagger = getMilliseconds( stagger ); 23424 return this.stagger; 23425}; 23426 23427/** 23428 * Sets position of item in DOM 23429 * @param {Outlayer.Item} item 23430 * @param {Number} x - horizontal position 23431 * @param {Number} y - vertical position 23432 * @param {Boolean} isInstant - disables transitions 23433 */ 23434proto._positionItem = function( item, x, y, isInstant, i ) { 23435 if ( isInstant ) { 23436 // if not transition, just set CSS 23437 item.goTo( x, y ); 23438 } else { 23439 item.stagger( i * this.stagger ); 23440 item.moveTo( x, y ); 23441 } 23442}; 23443 23444/** 23445 * Any logic you want to do after each layout, 23446 * i.e. size the container 23447 */ 23448proto._postLayout = function() { 23449 this.resizeContainer(); 23450}; 23451 23452proto.resizeContainer = function() { 23453 var isResizingContainer = this._getOption('resizeContainer'); 23454 if ( !isResizingContainer ) { 23455 return; 23456 } 23457 var size = this._getContainerSize(); 23458 if ( size ) { 23459 this._setContainerMeasure( size.width, true ); 23460 this._setContainerMeasure( size.height, false ); 23461 } 23462}; 23463 23464/** 23465 * Sets width or height of container if returned 23466 * @returns {Object} size 23467 * @param {Number} width 23468 * @param {Number} height 23469 */ 23470proto._getContainerSize = noop; 23471 23472/** 23473 * @param {Number} measure - size of width or height 23474 * @param {Boolean} isWidth 23475 */ 23476proto._setContainerMeasure = function( measure, isWidth ) { 23477 if ( measure === undefined ) { 23478 return; 23479 } 23480 23481 var elemSize = this.size; 23482 // add padding and border width if border box 23483 if ( elemSize.isBorderBox ) { 23484 measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight + 23485 elemSize.borderLeftWidth + elemSize.borderRightWidth : 23486 elemSize.paddingBottom + elemSize.paddingTop + 23487 elemSize.borderTopWidth + elemSize.borderBottomWidth; 23488 } 23489 23490 measure = Math.max( measure, 0 ); 23491 this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px'; 23492}; 23493 23494/** 23495 * emit eventComplete on a collection of items events 23496 * @param {String} eventName 23497 * @param {Array} items - Outlayer.Items 23498 */ 23499proto._emitCompleteOnItems = function( eventName, items ) { 23500 var _this = this; 23501 function onComplete() { 23502 _this.dispatchEvent( eventName + 'Complete', null, [ items ] ); 23503 } 23504 23505 var count = items.length; 23506 if ( !items || !count ) { 23507 onComplete(); 23508 return; 23509 } 23510 23511 var doneCount = 0; 23512 function tick() { 23513 doneCount++; 23514 if ( doneCount == count ) { 23515 onComplete(); 23516 } 23517 } 23518 23519 // bind callback 23520 items.forEach( function( item ) { 23521 item.once( eventName, tick ); 23522 }); 23523}; 23524 23525/** 23526 * emits events via EvEmitter and jQuery events 23527 * @param {String} type - name of event 23528 * @param {Event} event - original event 23529 * @param {Array} args - extra arguments 23530 */ 23531proto.dispatchEvent = function( type, event, args ) { 23532 // add original event to arguments 23533 var emitArgs = event ? [ event ].concat( args ) : args; 23534 this.emitEvent( type, emitArgs ); 23535 23536 if ( jQuery ) { 23537 // set this.$element 23538 this.$element = this.$element || jQuery( this.element ); 23539 if ( event ) { 23540 // create jQuery event 23541 var $event = jQuery.Event( event ); 23542 $event.type = type; 23543 this.$element.trigger( $event, args ); 23544 } else { 23545 // just trigger with type if no event available 23546 this.$element.trigger( type, args ); 23547 } 23548 } 23549}; 23550 23551// -------------------------- ignore & stamps -------------------------- // 23552 23553 23554/** 23555 * keep item in collection, but do not lay it out 23556 * ignored items do not get skipped in layout 23557 * @param {Element} elem 23558 */ 23559proto.ignore = function( elem ) { 23560 var item = this.getItem( elem ); 23561 if ( item ) { 23562 item.isIgnored = true; 23563 } 23564}; 23565 23566/** 23567 * return item to layout collection 23568 * @param {Element} elem 23569 */ 23570proto.unignore = function( elem ) { 23571 var item = this.getItem( elem ); 23572 if ( item ) { 23573 delete item.isIgnored; 23574 } 23575}; 23576 23577/** 23578 * adds elements to stamps 23579 * @param {NodeList, Array, Element, or String} elems 23580 */ 23581proto.stamp = function( elems ) { 23582 elems = this._find( elems ); 23583 if ( !elems ) { 23584 return; 23585 } 23586 23587 this.stamps = this.stamps.concat( elems ); 23588 // ignore 23589 elems.forEach( this.ignore, this ); 23590}; 23591 23592/** 23593 * removes elements to stamps 23594 * @param {NodeList, Array, or Element} elems 23595 */ 23596proto.unstamp = function( elems ) { 23597 elems = this._find( elems ); 23598 if ( !elems ){ 23599 return; 23600 } 23601 23602 elems.forEach( function( elem ) { 23603 // filter out removed stamp elements 23604 utils.removeFrom( this.stamps, elem ); 23605 this.unignore( elem ); 23606 }, this ); 23607}; 23608 23609/** 23610 * finds child elements 23611 * @param {NodeList, Array, Element, or String} elems 23612 * @returns {Array} elems 23613 */ 23614proto._find = function( elems ) { 23615 if ( !elems ) { 23616 return; 23617 } 23618 // if string, use argument as selector string 23619 if ( typeof elems == 'string' ) { 23620 elems = this.element.querySelectorAll( elems ); 23621 } 23622 elems = utils.makeArray( elems ); 23623 return elems; 23624}; 23625 23626proto._manageStamps = function() { 23627 if ( !this.stamps || !this.stamps.length ) { 23628 return; 23629 } 23630 23631 this._getBoundingRect(); 23632 23633 this.stamps.forEach( this._manageStamp, this ); 23634}; 23635 23636// update boundingLeft / Top 23637proto._getBoundingRect = function() { 23638 // get bounding rect for container element 23639 var boundingRect = this.element.getBoundingClientRect(); 23640 var size = this.size; 23641 this._boundingRect = { 23642 left: boundingRect.left + size.paddingLeft + size.borderLeftWidth, 23643 top: boundingRect.top + size.paddingTop + size.borderTopWidth, 23644 right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ), 23645 bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth ) 23646 }; 23647}; 23648 23649/** 23650 * @param {Element} stamp 23651**/ 23652proto._manageStamp = noop; 23653 23654/** 23655 * get x/y position of element relative to container element 23656 * @param {Element} elem 23657 * @returns {Object} offset - has left, top, right, bottom 23658 */ 23659proto._getElementOffset = function( elem ) { 23660 var boundingRect = elem.getBoundingClientRect(); 23661 var thisRect = this._boundingRect; 23662 var size = getSize( elem ); 23663 var offset = { 23664 left: boundingRect.left - thisRect.left - size.marginLeft, 23665 top: boundingRect.top - thisRect.top - size.marginTop, 23666 right: thisRect.right - boundingRect.right - size.marginRight, 23667 bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom 23668 }; 23669 return offset; 23670}; 23671 23672// -------------------------- resize -------------------------- // 23673 23674// enable event handlers for listeners 23675// i.e. resize -> onresize 23676proto.handleEvent = utils.handleEvent; 23677 23678/** 23679 * Bind layout to window resizing 23680 */ 23681proto.bindResize = function() { 23682 window.addEventListener( 'resize', this ); 23683 this.isResizeBound = true; 23684}; 23685 23686/** 23687 * Unbind layout to window resizing 23688 */ 23689proto.unbindResize = function() { 23690 window.removeEventListener( 'resize', this ); 23691 this.isResizeBound = false; 23692}; 23693 23694proto.onresize = function() { 23695 this.resize(); 23696}; 23697 23698utils.debounceMethod( Outlayer, 'onresize', 100 ); 23699 23700proto.resize = function() { 23701 // don't trigger if size did not change 23702 // or if resize was unbound. See #9 23703 if ( !this.isResizeBound || !this.needsResizeLayout() ) { 23704 return; 23705 } 23706 23707 this.layout(); 23708}; 23709 23710/** 23711 * check if layout is needed post layout 23712 * @returns Boolean 23713 */ 23714proto.needsResizeLayout = function() { 23715 var size = getSize( this.element ); 23716 // check that this.size and size are there 23717 // IE8 triggers resize on body size change, so they might not be 23718 var hasSizes = this.size && size; 23719 return hasSizes && size.innerWidth !== this.size.innerWidth; 23720}; 23721 23722// -------------------------- methods -------------------------- // 23723 23724/** 23725 * add items to Outlayer instance 23726 * @param {Array or NodeList or Element} elems 23727 * @returns {Array} items - Outlayer.Items 23728**/ 23729proto.addItems = function( elems ) { 23730 var items = this._itemize( elems ); 23731 // add items to collection 23732 if ( items.length ) { 23733 this.items = this.items.concat( items ); 23734 } 23735 return items; 23736}; 23737 23738/** 23739 * Layout newly-appended item elements 23740 * @param {Array or NodeList or Element} elems 23741 */ 23742proto.appended = function( elems ) { 23743 var items = this.addItems( elems ); 23744 if ( !items.length ) { 23745 return; 23746 } 23747 // layout and reveal just the new items 23748 this.layoutItems( items, true ); 23749 this.reveal( items ); 23750}; 23751 23752/** 23753 * Layout prepended elements 23754 * @param {Array or NodeList or Element} elems 23755 */ 23756proto.prepended = function( elems ) { 23757 var items = this._itemize( elems ); 23758 if ( !items.length ) { 23759 return; 23760 } 23761 // add items to beginning of collection 23762 var previousItems = this.items.slice(0); 23763 this.items = items.concat( previousItems ); 23764 // start new layout 23765 this._resetLayout(); 23766 this._manageStamps(); 23767 // layout new stuff without transition 23768 this.layoutItems( items, true ); 23769 this.reveal( items ); 23770 // layout previous items 23771 this.layoutItems( previousItems ); 23772}; 23773 23774/** 23775 * reveal a collection of items 23776 * @param {Array of Outlayer.Items} items 23777 */ 23778proto.reveal = function( items ) { 23779 this._emitCompleteOnItems( 'reveal', items ); 23780 if ( !items || !items.length ) { 23781 return; 23782 } 23783 var stagger = this.updateStagger(); 23784 items.forEach( function( item, i ) { 23785 item.stagger( i * stagger ); 23786 item.reveal(); 23787 }); 23788}; 23789 23790/** 23791 * hide a collection of items 23792 * @param {Array of Outlayer.Items} items 23793 */ 23794proto.hide = function( items ) { 23795 this._emitCompleteOnItems( 'hide', items ); 23796 if ( !items || !items.length ) { 23797 return; 23798 } 23799 var stagger = this.updateStagger(); 23800 items.forEach( function( item, i ) { 23801 item.stagger( i * stagger ); 23802 item.hide(); 23803 }); 23804}; 23805 23806/** 23807 * reveal item elements 23808 * @param {Array}, {Element}, {NodeList} items 23809 */ 23810proto.revealItemElements = function( elems ) { 23811 var items = this.getItems( elems ); 23812 this.reveal( items ); 23813}; 23814 23815/** 23816 * hide item elements 23817 * @param {Array}, {Element}, {NodeList} items 23818 */ 23819proto.hideItemElements = function( elems ) { 23820 var items = this.getItems( elems ); 23821 this.hide( items ); 23822}; 23823 23824/** 23825 * get Outlayer.Item, given an Element 23826 * @param {Element} elem 23827 * @param {Function} callback 23828 * @returns {Outlayer.Item} item 23829 */ 23830proto.getItem = function( elem ) { 23831 // loop through items to get the one that matches 23832 for ( var i=0; i < this.items.length; i++ ) { 23833 var item = this.items[i]; 23834 if ( item.element == elem ) { 23835 // return item 23836 return item; 23837 } 23838 } 23839}; 23840 23841/** 23842 * get collection of Outlayer.Items, given Elements 23843 * @param {Array} elems 23844 * @returns {Array} items - Outlayer.Items 23845 */ 23846proto.getItems = function( elems ) { 23847 elems = utils.makeArray( elems ); 23848 var items = []; 23849 elems.forEach( function( elem ) { 23850 var item = this.getItem( elem ); 23851 if ( item ) { 23852 items.push( item ); 23853 } 23854 }, this ); 23855 23856 return items; 23857}; 23858 23859/** 23860 * remove element(s) from instance and DOM 23861 * @param {Array or NodeList or Element} elems 23862 */ 23863proto.remove = function( elems ) { 23864 var removeItems = this.getItems( elems ); 23865 23866 this._emitCompleteOnItems( 'remove', removeItems ); 23867 23868 // bail if no items to remove 23869 if ( !removeItems || !removeItems.length ) { 23870 return; 23871 } 23872 23873 removeItems.forEach( function( item ) { 23874 item.remove(); 23875 // remove item from collection 23876 utils.removeFrom( this.items, item ); 23877 }, this ); 23878}; 23879 23880// ----- destroy ----- // 23881 23882// remove and disable Outlayer instance 23883proto.destroy = function() { 23884 // clean up dynamic styles 23885 var style = this.element.style; 23886 style.height = ''; 23887 style.position = ''; 23888 style.width = ''; 23889 // destroy items 23890 this.items.forEach( function( item ) { 23891 item.destroy(); 23892 }); 23893 23894 this.unbindResize(); 23895 23896 var id = this.element.outlayerGUID; 23897 delete instances[ id ]; // remove reference to instance by id 23898 delete this.element.outlayerGUID; 23899 // remove data for jQuery 23900 if ( jQuery ) { 23901 jQuery.removeData( this.element, this.constructor.namespace ); 23902 } 23903 23904}; 23905 23906// -------------------------- data -------------------------- // 23907 23908/** 23909 * get Outlayer instance from element 23910 * @param {Element} elem 23911 * @returns {Outlayer} 23912 */ 23913Outlayer.data = function( elem ) { 23914 elem = utils.getQueryElement( elem ); 23915 var id = elem && elem.outlayerGUID; 23916 return id && instances[ id ]; 23917}; 23918 23919 23920// -------------------------- create Outlayer class -------------------------- // 23921 23922/** 23923 * create a layout class 23924 * @param {String} namespace 23925 */ 23926Outlayer.create = function( namespace, options ) { 23927 // sub-class Outlayer 23928 var Layout = subclass( Outlayer ); 23929 // apply new options and compatOptions 23930 Layout.defaults = utils.extend( {}, Outlayer.defaults ); 23931 utils.extend( Layout.defaults, options ); 23932 Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions ); 23933 23934 Layout.namespace = namespace; 23935 23936 Layout.data = Outlayer.data; 23937 23938 // sub-class Item 23939 Layout.Item = subclass( Item ); 23940 23941 // -------------------------- declarative -------------------------- // 23942 23943 utils.htmlInit( Layout, namespace ); 23944 23945 // -------------------------- jQuery bridge -------------------------- // 23946 23947 // make into jQuery plugin 23948 if ( jQuery && jQuery.bridget ) { 23949 jQuery.bridget( namespace, Layout ); 23950 } 23951 23952 return Layout; 23953}; 23954 23955function subclass( Parent ) { 23956 function SubClass() { 23957 Parent.apply( this, arguments ); 23958 } 23959 23960 SubClass.prototype = Object.create( Parent.prototype ); 23961 SubClass.prototype.constructor = SubClass; 23962 23963 return SubClass; 23964} 23965 23966// ----- helpers ----- // 23967 23968// how many milliseconds are in each unit 23969var msUnits = { 23970 ms: 1, 23971 s: 1000 23972}; 23973 23974// munge time-like parameter into millisecond number 23975// '0.4s' -> 40 23976function getMilliseconds( time ) { 23977 if ( typeof time == 'number' ) { 23978 return time; 23979 } 23980 var matches = time.match( /(^\d*\.?\d*)(\w*)/ ); 23981 var num = matches && matches[1]; 23982 var unit = matches && matches[2]; 23983 if ( !num.length ) { 23984 return 0; 23985 } 23986 num = parseFloat( num ); 23987 var mult = msUnits[ unit ] || 1; 23988 return num * mult; 23989} 23990 23991// ----- fin ----- // 23992 23993// back in global 23994Outlayer.Item = Item; 23995 23996return Outlayer; 23997 23998})); 23999
24000},{"./item":40,"ev-emitter":29,"fizzy-ui-utils":30,"get-size":31}],42:[function(require,module,exports){ 24001(function (global){(function (){ 24002/**! 24003 * @fileOverview Kickass library to create and place poppers near their reference elements. 24004 * @version 1.16.1 24005 * @license 24006 * Copyright (c) 2016 Federico Zivolo and contributors 24007 * 24008 * Permission is hereby granted, free of charge, to any person obtaining a copy 24009 * of this software and associated documentation files (the "Software"), to deal 24010 * in the Software without restriction, including without limitation the rights 24011 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 24012 * copies of the Software, and to permit persons to whom the Software is 24013 * furnished to do so, subject to the following conditions: 24014 * 24015 * The above copyright notice and this permission notice shall be included in all 24016 * copies or substantial portions of the Software. 24017 * 24018 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24019 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24020 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 24021 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24022 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24023 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 24024 * SOFTWARE. 24025 */ 24026(function (global, factory) { 24027 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : 24028 typeof define === 'function' && define.amd ? define(factory) : 24029 (global.Popper = factory()); 24030}(this, (function () { 'use strict'; 24031 24032var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined'; 24033 24034var timeoutDuration = function () { 24035 var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox']; 24036 for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) { 24037 if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) { 24038 return 1; 24039 } 24040 } 24041 return 0; 24042}(); 24043 24044function microtaskDebounce(fn) { 24045 var called = false;
vendor: 3,141 bytes, lines 24046-24171
24046 return function () { 24047 if (called) { 24048 return; 24049 } 24050 called = true; 24051 window.Promise.resolve().then(function () { 24052 called = false; 24053 fn(); 24054 }); 24055 }; 24056} 24057 24058function taskDebounce(fn) { 24059 var scheduled = false; 24060 return function () { 24061 if (!scheduled) { 24062 scheduled = true; 24063 setTimeout(function () { 24064 scheduled = false; 24065 fn(); 24066 }, timeoutDuration); 24067 } 24068 }; 24069} 24070 24071var supportsMicroTasks = isBrowser && window.Promise; 24072 24073/** 24074* Create a debounced version of a method, that's asynchronously deferred 24075* but called in the minimum time possible. 24076* 24077* @method 24078* @memberof Popper.Utils 24079* @argument {Function} fn 24080* @returns {Function} 24081*/ 24082var debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce; 24083 24084/** 24085 * Check if the given variable is a function 24086 * @method 24087 * @memberof Popper.Utils 24088 * @argument {Any} functionToCheck - variable to check 24089 * @returns {Boolean} answer to: is a function? 24090 */ 24091function isFunction(functionToCheck) { 24092 var getType = {}; 24093 return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'; 24094} 24095 24096/** 24097 * Get CSS computed property of the given element 24098 * @method 24099 * @memberof Popper.Utils 24100 * @argument {Eement} element 24101 * @argument {String} property 24102 */ 24103function getStyleComputedProperty(element, property) { 24104 if (element.nodeType !== 1) { 24105 return []; 24106 } 24107 // NOTE: 1 DOM access here 24108 var window = element.ownerDocument.defaultView; 24109 var css = window.getComputedStyle(element, null); 24110 return property ? css[property] : css; 24111} 24112 24113/** 24114 * Returns the parentNode or the host of the element 24115 * @method 24116 * @memberof Popper.Utils 24117 * @argument {Element} element 24118 * @returns {Element} parent 24119 */ 24120function getParentNode(element) { 24121 if (element.nodeName === 'HTML') { 24122 return element; 24123 } 24124 return element.parentNode || element.host; 24125} 24126 24127/** 24128 * Returns the scrolling parent of the given element 24129 * @method 24130 * @memberof Popper.Utils 24131 * @argument {Element} element 24132 * @returns {Element} scroll parent 24133 */ 24134function getScrollParent(element) { 24135 // Return body, `getScroll` will take care to get the correct `scrollTop` from it 24136 if (!element) { 24137 return document.body; 24138 } 24139 24140 switch (element.nodeName) { 24141 case 'HTML': 24142 case 'BODY': 24143 return element.ownerDocument.body; 24144 case '#document': 24145 return element.body; 24146 } 24147 24148 // Firefox want us to check `-x` and `-y` variations as well 24149 24150 var _getStyleComputedProp = getStyleComputedProperty(element), 24151 overflow = _getStyleComputedProp.overflow, 24152 overflowX = _getStyleComputedProp.overflowX, 24153 overflowY = _getStyleComputedProp.overflowY; 24154 24155 if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) { 24156 return element; 24157 } 24158 24159 return getScrollParent(getParentNode(element)); 24160} 24161 24162/** 24163 * Returns the reference node of the reference object, or the reference object itself. 24164 * @method 24165 * @memberof Popper.Utils 24166 * @param {Element|Object} reference - the reference element (the popper will be relative to this) 24167 * @returns {Element} parent 24168 */ 24169function getReferenceNode(reference) { 24170 return reference && reference.referenceNode ? reference.referenceNode : reference; 24171}
vendor: 3,047 bytes, lines 24171-24277
24171 24172 24173var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode); 24174var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent); 24175 24176/** 24177 * Determines if the browser is Internet Explorer 24178 * @method 24179 * @memberof Popper.Utils 24180 * @param {Number} version to check 24181 * @returns {Boolean} isIE 24182 */ 24183function isIE(version) { 24184 if (version === 11) { 24185 return isIE11; 24186 } 24187 if (version === 10) { 24188 return isIE10; 24189 } 24190 return isIE11 || isIE10; 24191} 24192 24193/** 24194 * Returns the offset parent of the given element 24195 * @method 24196 * @memberof Popper.Utils 24197 * @argument {Element} element 24198 * @returns {Element} offset parent 24199 */ 24200function getOffsetParent(element) { 24201 if (!element) { 24202 return document.documentElement; 24203 } 24204 24205 var noOffsetParent = isIE(10) ? document.body : null; 24206 24207 // NOTE: 1 DOM access here 24208 var offsetParent = element.offsetParent || null; 24209 // Skip hidden elements which don't have an offsetParent 24210 while (offsetParent === noOffsetParent && element.nextElementSibling) { 24211 offsetParent = (element = element.nextElementSibling).offsetParent; 24212 } 24213 24214 var nodeName = offsetParent && offsetParent.nodeName; 24215 24216 if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') { 24217 return element ? element.ownerDocument.documentElement : document.documentElement; 24218 } 24219 24220 // .offsetParent will return the closest TH, TD or TABLE in case 24221 // no offsetParent is present, I hate this job... 24222 if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') { 24223 return getOffsetParent(offsetParent); 24224 } 24225 24226 return offsetParent; 24227} 24228 24229function isOffsetContainer(element) { 24230 var nodeName = element.nodeName; 24231 24232 if (nodeName === 'BODY') { 24233 return false; 24234 } 24235 return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element; 24236} 24237 24238/** 24239 * Finds the root node (document, shadowDOM root) of the given element 24240 * @method 24241 * @memberof Popper.Utils 24242 * @argument {Element} node 24243 * @returns {Element} root node 24244 */ 24245function getRoot(node) { 24246 if (node.parentNode !== null) { 24247 return getRoot(node.parentNode); 24248 } 24249 24250 return node; 24251} 24252 24253/** 24254 * Finds the offset parent common to the two provided nodes 24255 * @method 24256 * @memberof Popper.Utils 24257 * @argument {Element} element1 24258 * @argument {Element} element2 24259 * @returns {Element} common offset parent 24260 */ 24261function findCommonOffsetParent(element1, element2) { 24262 // This check is needed to avoid errors in case one of the elements isn't defined for any reason 24263 if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) { 24264 return document.documentElement; 24265 } 24266 24267 // Here we make sure to give as "start" the element that comes first in the DOM 24268 var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING; 24269 var start = order ? element1 : element2; 24270 var end = order ? element2 : element1; 24271 24272 // Get common ancestor container 24273 var range = document.createRange(); 24274 range.setStart(start, 0); 24275 range.setEnd(end, 0); 24276 var commonAncestorContainer = range.commonAncestorContainer; 24277
vendor: 5,354 bytes, lines 24278-24455
24278 // Both nodes are inside #document 24279 24280 if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) { 24281 if (isOffsetContainer(commonAncestorContainer)) { 24282 return commonAncestorContainer; 24283 } 24284 24285 return getOffsetParent(commonAncestorContainer); 24286 } 24287 24288 // one of the nodes is inside shadowDOM, find which one 24289 var element1root = getRoot(element1); 24290 if (element1root.host) { 24291 return findCommonOffsetParent(element1root.host, element2); 24292 } else { 24293 return findCommonOffsetParent(element1, getRoot(element2).host); 24294 } 24295} 24296 24297/** 24298 * Gets the scroll value of the given element in the given side (top and left) 24299 * @method 24300 * @memberof Popper.Utils 24301 * @argument {Element} element 24302 * @argument {String} side `top` or `left` 24303 * @returns {number} amount of scrolled pixels 24304 */ 24305function getScroll(element) { 24306 var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top'; 24307 24308 var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft'; 24309 var nodeName = element.nodeName; 24310 24311 if (nodeName === 'BODY' || nodeName === 'HTML') { 24312 var html = element.ownerDocument.documentElement; 24313 var scrollingElement = element.ownerDocument.scrollingElement || html; 24314 return scrollingElement[upperSide]; 24315 } 24316 24317 return element[upperSide]; 24318} 24319 24320/* 24321 * Sum or subtract the element scroll values (left and top) from a given rect object 24322 * @method 24323 * @memberof Popper.Utils 24324 * @param {Object} rect - Rect object you want to change 24325 * @param {HTMLElement} element - The element from the function reads the scroll values 24326 * @param {Boolean} subtract - set to true if you want to subtract the scroll values 24327 * @return {Object} rect - The modifier rect object 24328 */ 24329function includeScroll(rect, element) { 24330 var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; 24331 24332 var scrollTop = getScroll(element, 'top'); 24333 var scrollLeft = getScroll(element, 'left'); 24334 var modifier = subtract ? -1 : 1; 24335 rect.top += scrollTop * modifier; 24336 rect.bottom += scrollTop * modifier; 24337 rect.left += scrollLeft * modifier; 24338 rect.right += scrollLeft * modifier; 24339 return rect; 24340} 24341 24342/* 24343 * Helper to detect borders of a given element 24344 * @method 24345 * @memberof Popper.Utils 24346 * @param {CSSStyleDeclaration} styles 24347 * Result of `getStyleComputedProperty` on the given element 24348 * @param {String} axis - `x` or `y` 24349 * @return {number} borders - The borders size of the given axis 24350 */ 24351 24352function getBordersSize(styles, axis) { 24353 var sideA = axis === 'x' ? 'Left' : 'Top'; 24354 var sideB = sideA === 'Left' ? 'Right' : 'Bottom'; 24355 24356 return parseFloat(styles['border' + sideA + 'Width']) + parseFloat(styles['border' + sideB + 'Width']); 24357} 24358 24359function getSize(axis, body, html, computedStyle) { 24360 return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0); 24361} 24362 24363function getWindowSizes(document) { 24364 var body = document.body; 24365 var html = document.documentElement; 24366 var computedStyle = isIE(10) && getComputedStyle(html); 24367 24368 return { 24369 height: getSize('Height', body, html, computedStyle), 24370 width: getSize('Width', body, html, computedStyle) 24371 }; 24372} 24373 24374var classCallCheck = function (instance, Constructor) { 24375 if (!(instance instanceof Constructor)) { 24376 throw new TypeError("Cannot call a class as a function"); 24377 } 24378}; 24379 24380var createClass = function () { 24381 function defineProperties(target, props) { 24382 for (var i = 0; i < props.length; i++) { 24383 var descriptor = props[i]; 24384 descriptor.enumerable = descriptor.enumerable || false; 24385 descriptor.configurable = true; 24386 if ("value" in descriptor) descriptor.writable = true; 24387 Object.defineProperty(target, descriptor.key, descriptor); 24388 } 24389 } 24390 24391 return function (Constructor, protoProps, staticProps) { 24392 if (protoProps) defineProperties(Constructor.prototype, protoProps); 24393 if (staticProps) defineProperties(Constructor, staticProps); 24394 return Constructor; 24395 }; 24396}(); 24397 24398 24399 24400 24401 24402var defineProperty = function (obj, key, value) { 24403 if (key in obj) { 24404 Object.defineProperty(obj, key, { 24405 value: value, 24406 enumerable: true, 24407 configurable: true, 24408 writable: true 24409 }); 24410 } else { 24411 obj[key] = value; 24412 } 24413 24414 return obj; 24415}; 24416 24417var _extends = Object.assign || function (target) { 24418 for (var i = 1; i < arguments.length; i++) { 24419 var source = arguments[i]; 24420 24421 for (var key in source) { 24422 if (Object.prototype.hasOwnProperty.call(source, key)) { 24423 target[key] = source[key]; 24424 } 24425 } 24426 } 24427 24428 return target; 24429}; 24430 24431/** 24432 * Given element offsets, generate an output similar to getBoundingClientRect 24433 * @method 24434 * @memberof Popper.Utils 24435 * @argument {Object} offsets 24436 * @returns {Object} ClientRect like output 24437 */ 24438function getClientRect(offsets) { 24439 return _extends({}, offsets, { 24440 right: offsets.left + offsets.width, 24441 bottom: offsets.top + offsets.height 24442 }); 24443} 24444 24445/** 24446 * Get bounding client rect of given element 24447 * @method 24448 * @memberof Popper.Utils 24449 * @param {HTMLElement} element 24450 * @return {Object} client rect 24451 */ 24452function getBoundingClientRect(element) { 24453 var rect = {}; 24454 24455 // IE10 10 FIX: Please, don't ask, the element isn't
vendor: 4,625 bytes, lines 24456-24585
24456 // considered in DOM in some circumstances... 24457 // This isn't reproducible in IE10 compatibility mode of IE11 24458 try { 24459 if (isIE(10)) { 24460 rect = element.getBoundingClientRect(); 24461 var scrollTop = getScroll(element, 'top'); 24462 var scrollLeft = getScroll(element, 'left'); 24463 rect.top += scrollTop; 24464 rect.left += scrollLeft; 24465 rect.bottom += scrollTop; 24466 rect.right += scrollLeft; 24467 } else { 24468 rect = element.getBoundingClientRect(); 24469 } 24470 } catch (e) {} 24471 24472 var result = { 24473 left: rect.left, 24474 top: rect.top, 24475 width: rect.right - rect.left, 24476 height: rect.bottom - rect.top 24477 }; 24478 24479 // subtract scrollbar size from sizes 24480 var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {}; 24481 var width = sizes.width || element.clientWidth || result.width; 24482 var height = sizes.height || element.clientHeight || result.height; 24483 24484 var horizScrollbar = element.offsetWidth - width; 24485 var vertScrollbar = element.offsetHeight - height; 24486 24487 // if an hypothetical scrollbar is detected, we must be sure it's not a `border` 24488 // we make this check conditional for performance reasons 24489 if (horizScrollbar || vertScrollbar) { 24490 var styles = getStyleComputedProperty(element); 24491 horizScrollbar -= getBordersSize(styles, 'x'); 24492 vertScrollbar -= getBordersSize(styles, 'y'); 24493 24494 result.width -= horizScrollbar; 24495 result.height -= vertScrollbar; 24496 } 24497 24498 return getClientRect(result); 24499} 24500 24501function getOffsetRectRelativeToArbitraryNode(children, parent) { 24502 var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; 24503 24504 var isIE10 = isIE(10); 24505 var isHTML = parent.nodeName === 'HTML'; 24506 var childrenRect = getBoundingClientRect(children); 24507 var parentRect = getBoundingClientRect(parent); 24508 var scrollParent = getScrollParent(children); 24509 24510 var styles = getStyleComputedProperty(parent); 24511 var borderTopWidth = parseFloat(styles.borderTopWidth); 24512 var borderLeftWidth = parseFloat(styles.borderLeftWidth); 24513 24514 // In cases where the parent is fixed, we must ignore negative scroll in offset calc 24515 if (fixedPosition && isHTML) { 24516 parentRect.top = Math.max(parentRect.top, 0); 24517 parentRect.left = Math.max(parentRect.left, 0); 24518 } 24519 var offsets = getClientRect({ 24520 top: childrenRect.top - parentRect.top - borderTopWidth, 24521 left: childrenRect.left - parentRect.left - borderLeftWidth, 24522 width: childrenRect.width, 24523 height: childrenRect.height 24524 }); 24525 offsets.marginTop = 0; 24526 offsets.marginLeft = 0; 24527 24528 // Subtract margins of documentElement in case it's being used as parent 24529 // we do this only on HTML because it's the only element that behaves 24530 // differently when margins are applied to it. The margins are included in 24531 // the box of the documentElement, in the other cases not. 24532 if (!isIE10 && isHTML) { 24533 var marginTop = parseFloat(styles.marginTop); 24534 var marginLeft = parseFloat(styles.marginLeft); 24535 24536 offsets.top -= borderTopWidth - marginTop; 24537 offsets.bottom -= borderTopWidth - marginTop; 24538 offsets.left -= borderLeftWidth - marginLeft; 24539 offsets.right -= borderLeftWidth - marginLeft; 24540 24541 // Attach marginTop and marginLeft because in some circumstances we may need them 24542 offsets.marginTop = marginTop; 24543 offsets.marginLeft = marginLeft; 24544 } 24545 24546 if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') { 24547 offsets = includeScroll(offsets, parent); 24548 } 24549 24550 return offsets; 24551} 24552 24553function getViewportOffsetRectRelativeToArtbitraryNode(element) { 24554 var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; 24555 24556 var html = element.ownerDocument.documentElement; 24557 var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html); 24558 var width = Math.max(html.clientWidth, window.innerWidth || 0); 24559 var height = Math.max(html.clientHeight, window.innerHeight || 0); 24560 24561 var scrollTop = !excludeScroll ? getScroll(html) : 0; 24562 var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0; 24563 24564 var offset = { 24565 top: scrollTop - relativeOffset.top + relativeOffset.marginTop, 24566 left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft, 24567 width: width, 24568 height: height 24569 }; 24570 24571 return getClientRect(offset); 24572} 24573 24574/** 24575 * Check if the given element is fixed or is inside a fixed parent 24576 * @method 24577 * @memberof Popper.Utils 24578 * @argument {Element} element 24579 * @argument {Element} customContainer 24580 * @returns {Boolean} answer to "isFixed?" 24581 */ 24582function isFixed(element) { 24583 var nodeName = element.nodeName; 24584 if (nodeName === 'BODY' || nodeName === 'HTML') { 24585 return false;
vendor: 51,450 bytes, lines 24586-26084
24586 } 24587 if (getStyleComputedProperty(element, 'position') === 'fixed') { 24588 return true; 24589 } 24590 var parentNode = getParentNode(element); 24591 if (!parentNode) { 24592 return false; 24593 } 24594 return isFixed(parentNode); 24595} 24596 24597/** 24598 * Finds the first parent of an element that has a transformed property defined 24599 * @method 24600 * @memberof Popper.Utils 24601 * @argument {Element} element 24602 * @returns {Element} first transformed parent or documentElement 24603 */ 24604 24605function getFixedPositionOffsetParent(element) { 24606 // This check is needed to avoid errors in case one of the elements isn't defined for any reason 24607 if (!element || !element.parentElement || isIE()) { 24608 return document.documentElement; 24609 } 24610 var el = element.parentElement; 24611 while (el && getStyleComputedProperty(el, 'transform') === 'none') { 24612 el = el.parentElement; 24613 } 24614 return el || document.documentElement; 24615} 24616 24617/** 24618 * Computed the boundaries limits and return them 24619 * @method 24620 * @memberof Popper.Utils 24621 * @param {HTMLElement} popper 24622 * @param {HTMLElement} reference 24623 * @param {number} padding 24624 * @param {HTMLElement} boundariesElement - Element used to define the boundaries 24625 * @param {Boolean} fixedPosition - Is in fixed position mode 24626 * @returns {Object} Coordinates of the boundaries 24627 */ 24628function getBoundaries(popper, reference, padding, boundariesElement) { 24629 var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; 24630 24631 // NOTE: 1 DOM access here 24632 24633 var boundaries = { top: 0, left: 0 }; 24634 var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference)); 24635 24636 // Handle viewport case 24637 if (boundariesElement === 'viewport') { 24638 boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition); 24639 } else { 24640 // Handle other cases based on DOM element used as boundaries 24641 var boundariesNode = void 0; 24642 if (boundariesElement === 'scrollParent') { 24643 boundariesNode = getScrollParent(getParentNode(reference)); 24644 if (boundariesNode.nodeName === 'BODY') { 24645 boundariesNode = popper.ownerDocument.documentElement; 24646 } 24647 } else if (boundariesElement === 'window') { 24648 boundariesNode = popper.ownerDocument.documentElement; 24649 } else { 24650 boundariesNode = boundariesElement; 24651 } 24652 24653 var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition); 24654 24655 // In case of HTML, we need a different computation 24656 if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) { 24657 var _getWindowSizes = getWindowSizes(popper.ownerDocument), 24658 height = _getWindowSizes.height, 24659 width = _getWindowSizes.width; 24660 24661 boundaries.top += offsets.top - offsets.marginTop; 24662 boundaries.bottom = height + offsets.top; 24663 boundaries.left += offsets.left - offsets.marginLeft; 24664 boundaries.right = width + offsets.left; 24665 } else { 24666 // for all the other DOM elements, this one is good 24667 boundaries = offsets; 24668 } 24669 } 24670 24671 // Add paddings 24672 padding = padding || 0; 24673 var isPaddingNumber = typeof padding === 'number'; 24674 boundaries.left += isPaddingNumber ? padding : padding.left || 0; 24675 boundaries.top += isPaddingNumber ? padding : padding.top || 0; 24676 boundaries.right -= isPaddingNumber ? padding : padding.right || 0; 24677 boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0; 24678 24679 return boundaries; 24680} 24681 24682function getArea(_ref) { 24683 var width = _ref.width, 24684 height = _ref.height; 24685 24686 return width * height; 24687} 24688 24689/** 24690 * Utility used to transform the `auto` placement to the placement with more 24691 * available space. 24692 * @method 24693 * @memberof Popper.Utils 24694 * @argument {Object} data - The data object generated by update method 24695 * @argument {Object} options - Modifiers configuration and options 24696 * @returns {Object} The data object, properly modified 24697 */ 24698function computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) { 24699 var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; 24700 24701 if (placement.indexOf('auto') === -1) { 24702 return placement; 24703 } 24704 24705 var boundaries = getBoundaries(popper, reference, padding, boundariesElement); 24706 24707 var rects = { 24708 top: { 24709 width: boundaries.width, 24710 height: refRect.top - boundaries.top 24711 }, 24712 right: { 24713 width: boundaries.right - refRect.right, 24714 height: boundaries.height 24715 }, 24716 bottom: { 24717 width: boundaries.width, 24718 height: boundaries.bottom - refRect.bottom 24719 }, 24720 left: { 24721 width: refRect.left - boundaries.left, 24722 height: boundaries.height 24723 } 24724 }; 24725 24726 var sortedAreas = Object.keys(rects).map(function (key) { 24727 return _extends({ 24728 key: key 24729 }, rects[key], { 24730 area: getArea(rects[key]) 24731 }); 24732 }).sort(function (a, b) { 24733 return b.area - a.area; 24734 }); 24735 24736 var filteredAreas = sortedAreas.filter(function (_ref2) { 24737 var width = _ref2.width, 24738 height = _ref2.height; 24739 return width >= popper.clientWidth && height >= popper.clientHeight; 24740 }); 24741 24742 var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key; 24743 24744 var variation = placement.split('-')[1]; 24745 24746 return computedPlacement + (variation ? '-' + variation : ''); 24747} 24748 24749/** 24750 * Get offsets to the reference element 24751 * @method 24752 * @memberof Popper.Utils 24753 * @param {Object} state 24754 * @param {Element} popper - the popper element 24755 * @param {Element} reference - the reference element (the popper will be relative to this) 24756 * @param {Element} fixedPosition - is in fixed position mode 24757 * @returns {Object} An object containing the offsets which will be applied to the popper 24758 */ 24759function getReferenceOffsets(state, popper, reference) { 24760 var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; 24761 24762 var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference)); 24763 return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition); 24764} 24765 24766/** 24767 * Get the outer sizes of the given element (offset size + margins) 24768 * @method 24769 * @memberof Popper.Utils 24770 * @argument {Element} element 24771 * @returns {Object} object containing width and height properties 24772 */ 24773function getOuterSizes(element) { 24774 var window = element.ownerDocument.defaultView; 24775 var styles = window.getComputedStyle(element); 24776 var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0); 24777 var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0); 24778 var result = { 24779 width: element.offsetWidth + y, 24780 height: element.offsetHeight + x 24781 }; 24782 return result; 24783} 24784 24785/** 24786 * Get the opposite placement of the given one 24787 * @method 24788 * @memberof Popper.Utils 24789 * @argument {String} placement 24790 * @returns {String} flipped placement 24791 */ 24792function getOppositePlacement(placement) { 24793 var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' }; 24794 return placement.replace(/left|right|bottom|top/g, function (matched) { 24795 return hash[matched]; 24796 }); 24797} 24798 24799/** 24800 * Get offsets to the popper 24801 * @method 24802 * @memberof Popper.Utils 24803 * @param {Object} position - CSS position the Popper will get applied 24804 * @param {HTMLElement} popper - the popper element 24805 * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this) 24806 * @param {String} placement - one of the valid placement options 24807 * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper 24808 */ 24809function getPopperOffsets(popper, referenceOffsets, placement) { 24810 placement = placement.split('-')[0]; 24811 24812 // Get popper node sizes 24813 var popperRect = getOuterSizes(popper); 24814 24815 // Add position, width and height to our offsets object 24816 var popperOffsets = { 24817 width: popperRect.width, 24818 height: popperRect.height 24819 }; 24820 24821 // depending by the popper placement we have to compute its offsets slightly differently 24822 var isHoriz = ['right', 'left'].indexOf(placement) !== -1; 24823 var mainSide = isHoriz ? 'top' : 'left'; 24824 var secondarySide = isHoriz ? 'left' : 'top'; 24825 var measurement = isHoriz ? 'height' : 'width'; 24826 var secondaryMeasurement = !isHoriz ? 'height' : 'width'; 24827 24828 popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2; 24829 if (placement === secondarySide) { 24830 popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement]; 24831 } else { 24832 popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)]; 24833 } 24834 24835 return popperOffsets; 24836} 24837 24838/** 24839 * Mimics the `find` method of Array 24840 * @method 24841 * @memberof Popper.Utils 24842 * @argument {Array} arr 24843 * @argument prop 24844 * @argument value 24845 * @returns index or -1 24846 */ 24847function find(arr, check) { 24848 // use native find if supported 24849 if (Array.prototype.find) { 24850 return arr.find(check); 24851 } 24852 24853 // use `filter` to obtain the same behavior of `find` 24854 return arr.filter(check)[0]; 24855} 24856 24857/** 24858 * Return the index of the matching object 24859 * @method 24860 * @memberof Popper.Utils 24861 * @argument {Array} arr 24862 * @argument prop 24863 * @argument value 24864 * @returns index or -1 24865 */ 24866function findIndex(arr, prop, value) { 24867 // use native findIndex if supported 24868 if (Array.prototype.findIndex) { 24869 return arr.findIndex(function (cur) { 24870 return cur[prop] === value; 24871 }); 24872 } 24873 24874 // use `find` + `indexOf` if `findIndex` isn't supported 24875 var match = find(arr, function (obj) { 24876 return obj[prop] === value; 24877 }); 24878 return arr.indexOf(match); 24879} 24880 24881/** 24882 * Loop trough the list of modifiers and run them in order, 24883 * each of them will then edit the data object. 24884 * @method 24885 * @memberof Popper.Utils 24886 * @param {dataObject} data 24887 * @param {Array} modifiers 24888 * @param {String} ends - Optional modifier name used as stopper 24889 * @returns {dataObject} 24890 */ 24891function runModifiers(modifiers, data, ends) { 24892 var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends)); 24893 24894 modifiersToRun.forEach(function (modifier) { 24895 if (modifier['function']) { 24896 // eslint-disable-line dot-notation 24897 console.warn('`modifier.function` is deprecated, use `modifier.fn`!'); 24898 } 24899 var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation 24900 if (modifier.enabled && isFunction(fn)) { 24901 // Add properties to offsets to make them a complete clientRect object 24902 // we do this before each modifier to make sure the previous one doesn't 24903 // mess with these values 24904 data.offsets.popper = getClientRect(data.offsets.popper); 24905 data.offsets.reference = getClientRect(data.offsets.reference); 24906 24907 data = fn(data, modifier); 24908 } 24909 }); 24910 24911 return data; 24912} 24913 24914/** 24915 * Updates the position of the popper, computing the new offsets and applying 24916 * the new style.<br /> 24917 * Prefer `scheduleUpdate` over `update` because of performance reasons. 24918 * @method 24919 * @memberof Popper 24920 */ 24921function update() { 24922 // if popper is destroyed, don't perform any further update 24923 if (this.state.isDestroyed) { 24924 return; 24925 } 24926 24927 var data = { 24928 instance: this, 24929 styles: {}, 24930 arrowStyles: {}, 24931 attributes: {}, 24932 flipped: false, 24933 offsets: {} 24934 }; 24935 24936 // compute reference element offsets 24937 data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed); 24938 24939 // compute auto placement, store placement inside the data object, 24940 // modifiers will be able to edit `placement` if needed 24941 // and refer to originalPlacement to know the original value 24942 data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding); 24943 24944 // store the computed placement inside `originalPlacement` 24945 data.originalPlacement = data.placement; 24946 24947 data.positionFixed = this.options.positionFixed; 24948 24949 // compute the popper offsets 24950 data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement); 24951 24952 data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute'; 24953 24954 // run the modifiers 24955 data = runModifiers(this.modifiers, data); 24956 24957 // the first `update` will call `onCreate` callback 24958 // the other ones will call `onUpdate` callback 24959 if (!this.state.isCreated) { 24960 this.state.isCreated = true; 24961 this.options.onCreate(data); 24962 } else { 24963 this.options.onUpdate(data); 24964 } 24965} 24966 24967/** 24968 * Helper used to know if the given modifier is enabled. 24969 * @method 24970 * @memberof Popper.Utils 24971 * @returns {Boolean} 24972 */ 24973function isModifierEnabled(modifiers, modifierName) { 24974 return modifiers.some(function (_ref) { 24975 var name = _ref.name, 24976 enabled = _ref.enabled; 24977 return enabled && name === modifierName; 24978 }); 24979} 24980 24981/** 24982 * Get the prefixed supported property name 24983 * @method 24984 * @memberof Popper.Utils 24985 * @argument {String} property (camelCase) 24986 * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix) 24987 */ 24988function getSupportedPropertyName(property) { 24989 var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O']; 24990 var upperProp = property.charAt(0).toUpperCase() + property.slice(1); 24991 24992 for (var i = 0; i < prefixes.length; i++) { 24993 var prefix = prefixes[i]; 24994 var toCheck = prefix ? '' + prefix + upperProp : property; 24995 if (typeof document.body.style[toCheck] !== 'undefined') { 24996 return toCheck; 24997 } 24998 } 24999 return null; 25000} 25001 25002/** 25003 * Destroys the popper. 25004 * @method 25005 * @memberof Popper 25006 */ 25007function destroy() { 25008 this.state.isDestroyed = true; 25009 25010 // touch DOM only if `applyStyle` modifier is enabled 25011 if (isModifierEnabled(this.modifiers, 'applyStyle')) { 25012 this.popper.removeAttribute('x-placement'); 25013 this.popper.style.position = ''; 25014 this.popper.style.top = ''; 25015 this.popper.style.left = ''; 25016 this.popper.style.right = ''; 25017 this.popper.style.bottom = ''; 25018 this.popper.style.willChange = ''; 25019 this.popper.style[getSupportedPropertyName('transform')] = ''; 25020 } 25021 25022 this.disableEventListeners(); 25023 25024 // remove the popper if user explicitly asked for the deletion on destroy 25025 // do not use `remove` because IE11 doesn't support it 25026 if (this.options.removeOnDestroy) { 25027 this.popper.parentNode.removeChild(this.popper); 25028 } 25029 return this; 25030} 25031 25032/** 25033 * Get the window associated with the element 25034 * @argument {Element} element 25035 * @returns {Window} 25036 */ 25037function getWindow(element) { 25038 var ownerDocument = element.ownerDocument; 25039 return ownerDocument ? ownerDocument.defaultView : window; 25040} 25041 25042function attachToScrollParents(scrollParent, event, callback, scrollParents) { 25043 var isBody = scrollParent.nodeName === 'BODY'; 25044 var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent; 25045 target.addEventListener(event, callback, { passive: true }); 25046 25047 if (!isBody) { 25048 attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents); 25049 } 25050 scrollParents.push(target); 25051} 25052 25053/** 25054 * Setup needed event listeners used to update the popper position 25055 * @method 25056 * @memberof Popper.Utils 25057 * @private 25058 */ 25059function setupEventListeners(reference, options, state, updateBound) { 25060 // Resize event listener on window 25061 state.updateBound = updateBound; 25062 getWindow(reference).addEventListener('resize', state.updateBound, { passive: true }); 25063 25064 // Scroll event listener on scroll parents 25065 var scrollElement = getScrollParent(reference); 25066 attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents); 25067 state.scrollElement = scrollElement; 25068 state.eventsEnabled = true; 25069 25070 return state; 25071} 25072 25073/** 25074 * It will add resize/scroll events and start recalculating 25075 * position of the popper element when they are triggered. 25076 * @method 25077 * @memberof Popper 25078 */ 25079function enableEventListeners() { 25080 if (!this.state.eventsEnabled) { 25081 this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate); 25082 } 25083} 25084 25085/** 25086 * Remove event listeners used to update the popper position 25087 * @method 25088 * @memberof Popper.Utils 25089 * @private 25090 */ 25091function removeEventListeners(reference, state) { 25092 // Remove resize event listener on window 25093 getWindow(reference).removeEventListener('resize', state.updateBound); 25094 25095 // Remove scroll event listener on scroll parents 25096 state.scrollParents.forEach(function (target) { 25097 target.removeEventListener('scroll', state.updateBound); 25098 }); 25099 25100 // Reset state 25101 state.updateBound = null; 25102 state.scrollParents = []; 25103 state.scrollElement = null; 25104 state.eventsEnabled = false; 25105 return state; 25106} 25107 25108/** 25109 * It will remove resize/scroll events and won't recalculate popper position 25110 * when they are triggered. It also won't trigger `onUpdate` callback anymore, 25111 * unless you call `update` method manually. 25112 * @method 25113 * @memberof Popper 25114 */ 25115function disableEventListeners() { 25116 if (this.state.eventsEnabled) { 25117 cancelAnimationFrame(this.scheduleUpdate); 25118 this.state = removeEventListeners(this.reference, this.state); 25119 } 25120} 25121 25122/** 25123 * Tells if a given input is a number 25124 * @method 25125 * @memberof Popper.Utils 25126 * @param {*} input to check 25127 * @return {Boolean} 25128 */ 25129function isNumeric(n) { 25130 return n !== '' && !isNaN(parseFloat(n)) && isFinite(n); 25131} 25132 25133/** 25134 * Set the style to the given popper 25135 * @method 25136 * @memberof Popper.Utils 25137 * @argument {Element} element - Element to apply the style to 25138 * @argument {Object} styles 25139 * Object with a list of properties and values which will be applied to the element 25140 */ 25141function setStyles(element, styles) { 25142 Object.keys(styles).forEach(function (prop) { 25143 var unit = ''; 25144 // add unit if the value is numeric and is one of the following 25145 if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) { 25146 unit = 'px'; 25147 } 25148 element.style[prop] = styles[prop] + unit; 25149 }); 25150} 25151 25152/** 25153 * Set the attributes to the given popper 25154 * @method 25155 * @memberof Popper.Utils 25156 * @argument {Element} element - Element to apply the attributes to 25157 * @argument {Object} styles 25158 * Object with a list of properties and values which will be applied to the element 25159 */ 25160function setAttributes(element, attributes) { 25161 Object.keys(attributes).forEach(function (prop) { 25162 var value = attributes[prop]; 25163 if (value !== false) { 25164 element.setAttribute(prop, attributes[prop]); 25165 } else { 25166 element.removeAttribute(prop); 25167 } 25168 }); 25169} 25170 25171/** 25172 * @function 25173 * @memberof Modifiers 25174 * @argument {Object} data - The data object generated by `update` method 25175 * @argument {Object} data.styles - List of style properties - values to apply to popper element 25176 * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element 25177 * @argument {Object} options - Modifiers configuration and options 25178 * @returns {Object} The same data object 25179 */ 25180function applyStyle(data) { 25181 // any property present in `data.styles` will be applied to the popper, 25182 // in this way we can make the 3rd party modifiers add custom styles to it 25183 // Be aware, modifiers could override the properties defined in the previous 25184 // lines of this modifier! 25185 setStyles(data.instance.popper, data.styles); 25186 25187 // any property present in `data.attributes` will be applied to the popper, 25188 // they will be set as HTML attributes of the element 25189 setAttributes(data.instance.popper, data.attributes); 25190 25191 // if arrowElement is defined and arrowStyles has some properties 25192 if (data.arrowElement && Object.keys(data.arrowStyles).length) { 25193 setStyles(data.arrowElement, data.arrowStyles); 25194 } 25195 25196 return data; 25197} 25198 25199/** 25200 * Set the x-placement attribute before everything else because it could be used 25201 * to add margins to the popper margins needs to be calculated to get the 25202 * correct popper offsets. 25203 * @method 25204 * @memberof Popper.modifiers 25205 * @param {HTMLElement} reference - The reference element used to position the popper 25206 * @param {HTMLElement} popper - The HTML element used as popper 25207 * @param {Object} options - Popper.js options 25208 */ 25209function applyStyleOnLoad(reference, popper, options, modifierOptions, state) { 25210 // compute reference element offsets 25211 var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed); 25212 25213 // compute auto placement, store placement inside the data object, 25214 // modifiers will be able to edit `placement` if needed 25215 // and refer to originalPlacement to know the original value 25216 var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding); 25217 25218 popper.setAttribute('x-placement', placement); 25219 25220 // Apply `position` to popper before anything else because 25221 // without the position applied we can't guarantee correct computations 25222 setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' }); 25223 25224 return options; 25225} 25226 25227/** 25228 * @function 25229 * @memberof Popper.Utils 25230 * @argument {Object} data - The data object generated by `update` method 25231 * @argument {Boolean} shouldRound - If the offsets should be rounded at all 25232 * @returns {Object} The popper's position offsets rounded 25233 * 25234 * The tale of pixel-perfect positioning. It's still not 100% perfect, but as 25235 * good as it can be within reason. 25236 * Discussion here: https://github.com/FezVrasta/popper.js/pull/715 25237 * 25238 * Low DPI screens cause a popper to be blurry if not using full pixels (Safari 25239 * as well on High DPI screens). 25240 * 25241 * Firefox prefers no rounding for positioning and does not have blurriness on 25242 * high DPI screens. 25243 * 25244 * Only horizontal placement and left/right values need to be considered. 25245 */ 25246function getRoundedOffsets(data, shouldRound) { 25247 var _data$offsets = data.offsets, 25248 popper = _data$offsets.popper, 25249 reference = _data$offsets.reference; 25250 var round = Math.round, 25251 floor = Math.floor; 25252 25253 var noRound = function noRound(v) { 25254 return v; 25255 }; 25256 25257 var referenceWidth = round(reference.width); 25258 var popperWidth = round(popper.width); 25259 25260 var isVertical = ['left', 'right'].indexOf(data.placement) !== -1; 25261 var isVariation = data.placement.indexOf('-') !== -1; 25262 var sameWidthParity = referenceWidth % 2 === popperWidth % 2; 25263 var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1; 25264 25265 var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor; 25266 var verticalToInteger = !shouldRound ? noRound : round; 25267 25268 return { 25269 left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left), 25270 top: verticalToInteger(popper.top), 25271 bottom: verticalToInteger(popper.bottom), 25272 right: horizontalToInteger(popper.right) 25273 }; 25274} 25275 25276var isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent); 25277 25278/** 25279 * @function 25280 * @memberof Modifiers 25281 * @argument {Object} data - The data object generated by `update` method 25282 * @argument {Object} options - Modifiers configuration and options 25283 * @returns {Object} The data object, properly modified 25284 */ 25285function computeStyle(data, options) { 25286 var x = options.x, 25287 y = options.y; 25288 var popper = data.offsets.popper; 25289 25290 // Remove this legacy support in Popper.js v2 25291 25292 var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) { 25293 return modifier.name === 'applyStyle'; 25294 }).gpuAcceleration; 25295 if (legacyGpuAccelerationOption !== undefined) { 25296 console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!'); 25297 } 25298 var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration; 25299 25300 var offsetParent = getOffsetParent(data.instance.popper); 25301 var offsetParentRect = getBoundingClientRect(offsetParent); 25302 25303 // Styles 25304 var styles = { 25305 position: popper.position 25306 }; 25307 25308 var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox); 25309 25310 var sideA = x === 'bottom' ? 'top' : 'bottom'; 25311 var sideB = y === 'right' ? 'left' : 'right'; 25312 25313 // if gpuAcceleration is set to `true` and transform is supported, 25314 // we use `translate3d` to apply the position to the popper we 25315 // automatically use the supported prefixed version if needed 25316 var prefixedProperty = getSupportedPropertyName('transform'); 25317 25318 // now, let's make a step back and look at this code closely (wtf?) 25319 // If the content of the popper grows once it's been positioned, it 25320 // may happen that the popper gets misplaced because of the new content 25321 // overflowing its reference element 25322 // To avoid this problem, we provide two options (x and y), which allow 25323 // the consumer to define the offset origin. 25324 // If we position a popper on top of a reference element, we can set 25325 // `x` to `top` to make the popper grow towards its top instead of 25326 // its bottom. 25327 var left = void 0, 25328 top = void 0; 25329 if (sideA === 'bottom') { 25330 // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar) 25331 // and not the bottom of the html element 25332 if (offsetParent.nodeName === 'HTML') { 25333 top = -offsetParent.clientHeight + offsets.bottom; 25334 } else { 25335 top = -offsetParentRect.height + offsets.bottom; 25336 } 25337 } else { 25338 top = offsets.top; 25339 } 25340 if (sideB === 'right') { 25341 if (offsetParent.nodeName === 'HTML') { 25342 left = -offsetParent.clientWidth + offsets.right; 25343 } else { 25344 left = -offsetParentRect.width + offsets.right; 25345 } 25346 } else { 25347 left = offsets.left; 25348 } 25349 if (gpuAcceleration && prefixedProperty) { 25350 styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)'; 25351 styles[sideA] = 0; 25352 styles[sideB] = 0; 25353 styles.willChange = 'transform'; 25354 } else { 25355 // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties 25356 var invertTop = sideA === 'bottom' ? -1 : 1; 25357 var invertLeft = sideB === 'right' ? -1 : 1; 25358 styles[sideA] = top * invertTop; 25359 styles[sideB] = left * invertLeft; 25360 styles.willChange = sideA + ', ' + sideB; 25361 } 25362 25363 // Attributes 25364 var attributes = { 25365 'x-placement': data.placement 25366 }; 25367 25368 // Update `data` attributes, styles and arrowStyles 25369 data.attributes = _extends({}, attributes, data.attributes); 25370 data.styles = _extends({}, styles, data.styles); 25371 data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles); 25372 25373 return data; 25374} 25375 25376/** 25377 * Helper used to know if the given modifier depends from another one.<br /> 25378 * It checks if the needed modifier is listed and enabled. 25379 * @method 25380 * @memberof Popper.Utils 25381 * @param {Array} modifiers - list of modifiers 25382 * @param {String} requestingName - name of requesting modifier 25383 * @param {String} requestedName - name of requested modifier 25384 * @returns {Boolean} 25385 */ 25386function isModifierRequired(modifiers, requestingName, requestedName) { 25387 var requesting = find(modifiers, function (_ref) { 25388 var name = _ref.name; 25389 return name === requestingName; 25390 }); 25391 25392 var isRequired = !!requesting && modifiers.some(function (modifier) { 25393 return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order; 25394 }); 25395 25396 if (!isRequired) { 25397 var _requesting = '`' + requestingName + '`'; 25398 var requested = '`' + requestedName + '`'; 25399 console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!'); 25400 } 25401 return isRequired; 25402} 25403 25404/** 25405 * @function 25406 * @memberof Modifiers 25407 * @argument {Object} data - The data object generated by update method 25408 * @argument {Object} options - Modifiers configuration and options 25409 * @returns {Object} The data object, properly modified 25410 */ 25411function arrow(data, options) { 25412 var _data$offsets$arrow; 25413 25414 // arrow depends on keepTogether in order to work 25415 if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) { 25416 return data; 25417 } 25418 25419 var arrowElement = options.element; 25420 25421 // if arrowElement is a string, suppose it's a CSS selector 25422 if (typeof arrowElement === 'string') { 25423 arrowElement = data.instance.popper.querySelector(arrowElement); 25424 25425 // if arrowElement is not found, don't run the modifier 25426 if (!arrowElement) { 25427 return data; 25428 } 25429 } else { 25430 // if the arrowElement isn't a query selector we must check that the 25431 // provided DOM node is child of its popper node 25432 if (!data.instance.popper.contains(arrowElement)) { 25433 console.warn('WARNING: `arrow.element` must be child of its popper element!'); 25434 return data; 25435 } 25436 } 25437 25438 var placement = data.placement.split('-')[0]; 25439 var _data$offsets = data.offsets, 25440 popper = _data$offsets.popper, 25441 reference = _data$offsets.reference; 25442 25443 var isVertical = ['left', 'right'].indexOf(placement) !== -1; 25444 25445 var len = isVertical ? 'height' : 'width'; 25446 var sideCapitalized = isVertical ? 'Top' : 'Left'; 25447 var side = sideCapitalized.toLowerCase(); 25448 var altSide = isVertical ? 'left' : 'top'; 25449 var opSide = isVertical ? 'bottom' : 'right'; 25450 var arrowElementSize = getOuterSizes(arrowElement)[len]; 25451 25452 // 25453 // extends keepTogether behavior making sure the popper and its 25454 // reference have enough pixels in conjunction 25455 // 25456 25457 // top/left side 25458 if (reference[opSide] - arrowElementSize < popper[side]) { 25459 data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize); 25460 } 25461 // bottom/right side 25462 if (reference[side] + arrowElementSize > popper[opSide]) { 25463 data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide]; 25464 } 25465 data.offsets.popper = getClientRect(data.offsets.popper); 25466 25467 // compute center of the popper 25468 var center = reference[side] + reference[len] / 2 - arrowElementSize / 2; 25469 25470 // Compute the sideValue using the updated popper offsets 25471 // take popper margin in account because we don't have this info available 25472 var css = getStyleComputedProperty(data.instance.popper); 25473 var popperMarginSide = parseFloat(css['margin' + sideCapitalized]); 25474 var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width']); 25475 var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide; 25476 25477 // prevent arrowElement from being placed not contiguously to its popper 25478 sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0); 25479 25480 data.arrowElement = arrowElement; 25481 data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow); 25482 25483 return data; 25484} 25485 25486/** 25487 * Get the opposite placement variation of the given one 25488 * @method 25489 * @memberof Popper.Utils 25490 * @argument {String} placement variation 25491 * @returns {String} flipped placement variation 25492 */ 25493function getOppositeVariation(variation) { 25494 if (variation === 'end') { 25495 return 'start'; 25496 } else if (variation === 'start') { 25497 return 'end'; 25498 } 25499 return variation; 25500} 25501 25502/** 25503 * List of accepted placements to use as values of the `placement` option.<br /> 25504 * Valid placements are: 25505 * - `auto` 25506 * - `top` 25507 * - `right` 25508 * - `bottom` 25509 * - `left` 25510 * 25511 * Each placement can have a variation from this list: 25512 * - `-start` 25513 * - `-end` 25514 * 25515 * Variations are interpreted easily if you think of them as the left to right 25516 * written languages. Horizontally (`top` and `bottom`), `start` is left and `end` 25517 * is right.<br /> 25518 * Vertically (`left` and `right`), `start` is top and `end` is bottom. 25519 * 25520 * Some valid examples are: 25521 * - `top-end` (on top of reference, right aligned) 25522 * - `right-start` (on right of reference, top aligned) 25523 * - `bottom` (on bottom, centered) 25524 * - `auto-end` (on the side with more space available, alignment depends by placement) 25525 * 25526 * @static 25527 * @type {Array} 25528 * @enum {String} 25529 * @readonly 25530 * @method placements 25531 * @memberof Popper 25532 */ 25533var placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start']; 25534 25535// Get rid of `auto` `auto-start` and `auto-end` 25536var validPlacements = placements.slice(3); 25537 25538/** 25539 * Given an initial placement, returns all the subsequent placements 25540 * clockwise (or counter-clockwise). 25541 * 25542 * @method 25543 * @memberof Popper.Utils 25544 * @argument {String} placement - A valid placement (it accepts variations) 25545 * @argument {Boolean} counter - Set to true to walk the placements counterclockwise 25546 * @returns {Array} placements including their variations 25547 */ 25548function clockwise(placement) { 25549 var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; 25550 25551 var index = validPlacements.indexOf(placement); 25552 var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index)); 25553 return counter ? arr.reverse() : arr; 25554} 25555 25556var BEHAVIORS = { 25557 FLIP: 'flip', 25558 CLOCKWISE: 'clockwise', 25559 COUNTERCLOCKWISE: 'counterclockwise' 25560}; 25561 25562/** 25563 * @function 25564 * @memberof Modifiers 25565 * @argument {Object} data - The data object generated by update method 25566 * @argument {Object} options - Modifiers configuration and options 25567 * @returns {Object} The data object, properly modified 25568 */ 25569function flip(data, options) { 25570 // if `inner` modifier is enabled, we can't use the `flip` modifier 25571 if (isModifierEnabled(data.instance.modifiers, 'inner')) { 25572 return data; 25573 } 25574 25575 if (data.flipped && data.placement === data.originalPlacement) { 25576 // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides 25577 return data; 25578 } 25579 25580 var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed); 25581 25582 var placement = data.placement.split('-')[0]; 25583 var placementOpposite = getOppositePlacement(placement); 25584 var variation = data.placement.split('-')[1] || ''; 25585 25586 var flipOrder = []; 25587 25588 switch (options.behavior) { 25589 case BEHAVIORS.FLIP: 25590 flipOrder = [placement, placementOpposite]; 25591 break; 25592 case BEHAVIORS.CLOCKWISE: 25593 flipOrder = clockwise(placement); 25594 break; 25595 case BEHAVIORS.COUNTERCLOCKWISE: 25596 flipOrder = clockwise(placement, true); 25597 break; 25598 default: 25599 flipOrder = options.behavior; 25600 } 25601 25602 flipOrder.forEach(function (step, index) { 25603 if (placement !== step || flipOrder.length === index + 1) { 25604 return data; 25605 } 25606 25607 placement = data.placement.split('-')[0]; 25608 placementOpposite = getOppositePlacement(placement); 25609 25610 var popperOffsets = data.offsets.popper; 25611 var refOffsets = data.offsets.reference; 25612 25613 // using floor because the reference offsets may contain decimals we are not going to consider here 25614 var floor = Math.floor; 25615 var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom); 25616 25617 var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left); 25618 var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right); 25619 var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top); 25620 var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom); 25621 25622 var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom; 25623 25624 // flip the variation if required 25625 var isVertical = ['top', 'bottom'].indexOf(placement) !== -1; 25626 25627 // flips variation if reference element overflows boundaries 25628 var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom); 25629 25630 // flips variation if popper content overflows boundaries 25631 var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop); 25632 25633 var flippedVariation = flippedVariationByRef || flippedVariationByContent; 25634 25635 if (overlapsRef || overflowsBoundaries || flippedVariation) { 25636 // this boolean to detect any flip loop 25637 data.flipped = true; 25638 25639 if (overlapsRef || overflowsBoundaries) { 25640 placement = flipOrder[index + 1]; 25641 } 25642 25643 if (flippedVariation) { 25644 variation = getOppositeVariation(variation); 25645 } 25646 25647 data.placement = placement + (variation ? '-' + variation : ''); 25648 25649 // this object contains `position`, we want to preserve it along with 25650 // any additional property we may add in the future 25651 data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement)); 25652 25653 data = runModifiers(data.instance.modifiers, data, 'flip'); 25654 } 25655 }); 25656 return data; 25657} 25658 25659/** 25660 * @function 25661 * @memberof Modifiers 25662 * @argument {Object} data - The data object generated by update method 25663 * @argument {Object} options - Modifiers configuration and options 25664 * @returns {Object} The data object, properly modified 25665 */ 25666function keepTogether(data) { 25667 var _data$offsets = data.offsets, 25668 popper = _data$offsets.popper, 25669 reference = _data$offsets.reference; 25670 25671 var placement = data.placement.split('-')[0]; 25672 var floor = Math.floor; 25673 var isVertical = ['top', 'bottom'].indexOf(placement) !== -1; 25674 var side = isVertical ? 'right' : 'bottom'; 25675 var opSide = isVertical ? 'left' : 'top'; 25676 var measurement = isVertical ? 'width' : 'height'; 25677 25678 if (popper[side] < floor(reference[opSide])) { 25679 data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement]; 25680 } 25681 if (popper[opSide] > floor(reference[side])) { 25682 data.offsets.popper[opSide] = floor(reference[side]); 25683 } 25684 25685 return data; 25686} 25687 25688/** 25689 * Converts a string containing value + unit into a px value number 25690 * @function 25691 * @memberof {modifiers~offset} 25692 * @private 25693 * @argument {String} str - Value + unit string 25694 * @argument {String} measurement - `height` or `width` 25695 * @argument {Object} popperOffsets 25696 * @argument {Object} referenceOffsets 25697 * @returns {Number|String} 25698 * Value in pixels, or original string if no values were extracted 25699 */ 25700function toValue(str, measurement, popperOffsets, referenceOffsets) { 25701 // separate value from unit 25702 var split = str.match(/((?:\-|\+)?\d*\.?\d*)(.*)/); 25703 var value = +split[1]; 25704 var unit = split[2]; 25705 25706 // If it's not a number it's an operator, I guess 25707 if (!value) { 25708 return str; 25709 } 25710 25711 if (unit.indexOf('%') === 0) { 25712 var element = void 0; 25713 switch (unit) { 25714 case '%p': 25715 element = popperOffsets; 25716 break; 25717 case '%': 25718 case '%r': 25719 default: 25720 element = referenceOffsets; 25721 } 25722 25723 var rect = getClientRect(element); 25724 return rect[measurement] / 100 * value; 25725 } else if (unit === 'vh' || unit === 'vw') { 25726 // if is a vh or vw, we calculate the size based on the viewport 25727 var size = void 0; 25728 if (unit === 'vh') { 25729 size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0); 25730 } else { 25731 size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); 25732 } 25733 return size / 100 * value; 25734 } else { 25735 // if is an explicit pixel unit, we get rid of the unit and keep the value 25736 // if is an implicit unit, it's px, and we return just the value 25737 return value; 25738 } 25739} 25740 25741/** 25742 * Parse an `offset` string to extrapolate `x` and `y` numeric offsets. 25743 * @function 25744 * @memberof {modifiers~offset} 25745 * @private 25746 * @argument {String} offset 25747 * @argument {Object} popperOffsets 25748 * @argument {Object} referenceOffsets 25749 * @argument {String} basePlacement 25750 * @returns {Array} a two cells array with x and y offsets in numbers 25751 */ 25752function parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) { 25753 var offsets = [0, 0]; 25754 25755 // Use height if placement is left or right and index is 0 otherwise use width 25756 // in this way the first offset will use an axis and the second one 25757 // will use the other one 25758 var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1; 25759 25760 // Split the offset string to obtain a list of values and operands 25761 // The regex addresses values with the plus or minus sign in front (+10, -20, etc) 25762 var fragments = offset.split(/(\+|\-)/).map(function (frag) { 25763 return frag.trim(); 25764 }); 25765 25766 // Detect if the offset string contains a pair of values or a single one 25767 // they could be separated by comma or space 25768 var divider = fragments.indexOf(find(fragments, function (frag) { 25769 return frag.search(/,|\s/) !== -1; 25770 })); 25771 25772 if (fragments[divider] && fragments[divider].indexOf(',') === -1) { 25773 console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.'); 25774 } 25775 25776 // If divider is found, we divide the list of values and operands to divide 25777 // them by ofset X and Y. 25778 var splitRegex = /\s*,\s*|\s+/; 25779 var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments]; 25780 25781 // Convert the values with units to absolute pixels to allow our computations 25782 ops = ops.map(function (op, index) { 25783 // Most of the units rely on the orientation of the popper 25784 var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width'; 25785 var mergeWithPrevious = false; 25786 return op 25787 // This aggregates any `+` or `-` sign that aren't considered operators 25788 // e.g.: 10 + +5 => [10, +, +5] 25789 .reduce(function (a, b) { 25790 if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) { 25791 a[a.length - 1] = b; 25792 mergeWithPrevious = true; 25793 return a; 25794 } else if (mergeWithPrevious) { 25795 a[a.length - 1] += b; 25796 mergeWithPrevious = false; 25797 return a; 25798 } else { 25799 return a.concat(b); 25800 } 25801 }, []) 25802 // Here we convert the string values into number values (in px) 25803 .map(function (str) { 25804 return toValue(str, measurement, popperOffsets, referenceOffsets); 25805 }); 25806 }); 25807 25808 // Loop trough the offsets arrays and execute the operations 25809 ops.forEach(function (op, index) { 25810 op.forEach(function (frag, index2) { 25811 if (isNumeric(frag)) { 25812 offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1); 25813 } 25814 }); 25815 }); 25816 return offsets; 25817} 25818 25819/** 25820 * @function 25821 * @memberof Modifiers 25822 * @argument {Object} data - The data object generated by update method 25823 * @argument {Object} options - Modifiers configuration and options 25824 * @argument {Number|String} options.offset=0 25825 * The offset value as described in the modifier description 25826 * @returns {Object} The data object, properly modified 25827 */ 25828function offset(data, _ref) { 25829 var offset = _ref.offset; 25830 var placement = data.placement, 25831 _data$offsets = data.offsets, 25832 popper = _data$offsets.popper, 25833 reference = _data$offsets.reference; 25834 25835 var basePlacement = placement.split('-')[0]; 25836 25837 var offsets = void 0; 25838 if (isNumeric(+offset)) { 25839 offsets = [+offset, 0]; 25840 } else { 25841 offsets = parseOffset(offset, popper, reference, basePlacement); 25842 } 25843 25844 if (basePlacement === 'left') { 25845 popper.top += offsets[0]; 25846 popper.left -= offsets[1]; 25847 } else if (basePlacement === 'right') { 25848 popper.top += offsets[0]; 25849 popper.left += offsets[1]; 25850 } else if (basePlacement === 'top') { 25851 popper.left += offsets[0]; 25852 popper.top -= offsets[1]; 25853 } else if (basePlacement === 'bottom') { 25854 popper.left += offsets[0]; 25855 popper.top += offsets[1]; 25856 } 25857 25858 data.popper = popper; 25859 return data; 25860} 25861 25862/** 25863 * @function 25864 * @memberof Modifiers 25865 * @argument {Object} data - The data object generated by `update` method 25866 * @argument {Object} options - Modifiers configuration and options 25867 * @returns {Object} The data object, properly modified 25868 */ 25869function preventOverflow(data, options) { 25870 var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper); 25871 25872 // If offsetParent is the reference element, we really want to 25873 // go one step up and use the next offsetParent as reference to 25874 // avoid to make this modifier completely useless and look like broken 25875 if (data.instance.reference === boundariesElement) { 25876 boundariesElement = getOffsetParent(boundariesElement); 25877 } 25878 25879 // NOTE: DOM access here 25880 // resets the popper's position so that the document size can be calculated excluding 25881 // the size of the popper element itself 25882 var transformProp = getSupportedPropertyName('transform'); 25883 var popperStyles = data.instance.popper.style; // assignment to help minification 25884 var top = popperStyles.top, 25885 left = popperStyles.left, 25886 transform = popperStyles[transformProp]; 25887 25888 popperStyles.top = ''; 25889 popperStyles.left = ''; 25890 popperStyles[transformProp] = ''; 25891 25892 var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed); 25893 25894 // NOTE: DOM access here 25895 // restores the original style properties after the offsets have been computed 25896 popperStyles.top = top; 25897 popperStyles.left = left; 25898 popperStyles[transformProp] = transform; 25899 25900 options.boundaries = boundaries; 25901 25902 var order = options.priority; 25903 var popper = data.offsets.popper; 25904 25905 var check = { 25906 primary: function primary(placement) { 25907 var value = popper[placement]; 25908 if (popper[placement] < boundaries[placement] && !options.escapeWithReference) { 25909 value = Math.max(popper[placement], boundaries[placement]); 25910 } 25911 return defineProperty({}, placement, value); 25912 }, 25913 secondary: function secondary(placement) { 25914 var mainSide = placement === 'right' ? 'left' : 'top'; 25915 var value = popper[mainSide]; 25916 if (popper[placement] > boundaries[placement] && !options.escapeWithReference) { 25917 value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height)); 25918 } 25919 return defineProperty({}, mainSide, value); 25920 } 25921 }; 25922 25923 order.forEach(function (placement) { 25924 var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary'; 25925 popper = _extends({}, popper, check[side](placement)); 25926 }); 25927 25928 data.offsets.popper = popper; 25929 25930 return data; 25931} 25932 25933/** 25934 * @function 25935 * @memberof Modifiers 25936 * @argument {Object} data - The data object generated by `update` method 25937 * @argument {Object} options - Modifiers configuration and options 25938 * @returns {Object} The data object, properly modified 25939 */ 25940function shift(data) { 25941 var placement = data.placement; 25942 var basePlacement = placement.split('-')[0]; 25943 var shiftvariation = placement.split('-')[1]; 25944 25945 // if shift shiftvariation is specified, run the modifier 25946 if (shiftvariation) { 25947 var _data$offsets = data.offsets, 25948 reference = _data$offsets.reference, 25949 popper = _data$offsets.popper; 25950 25951 var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1; 25952 var side = isVertical ? 'left' : 'top'; 25953 var measurement = isVertical ? 'width' : 'height'; 25954 25955 var shiftOffsets = { 25956 start: defineProperty({}, side, reference[side]), 25957 end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement]) 25958 }; 25959 25960 data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]); 25961 } 25962 25963 return data; 25964} 25965 25966/** 25967 * @function 25968 * @memberof Modifiers 25969 * @argument {Object} data - The data object generated by update method 25970 * @argument {Object} options - Modifiers configuration and options 25971 * @returns {Object} The data object, properly modified 25972 */ 25973function hide(data) { 25974 if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) { 25975 return data; 25976 } 25977 25978 var refRect = data.offsets.reference; 25979 var bound = find(data.instance.modifiers, function (modifier) { 25980 return modifier.name === 'preventOverflow'; 25981 }).boundaries; 25982 25983 if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) { 25984 // Avoid unnecessary DOM access if visibility hasn't changed 25985 if (data.hide === true) { 25986 return data; 25987 } 25988 25989 data.hide = true; 25990 data.attributes['x-out-of-boundaries'] = ''; 25991 } else { 25992 // Avoid unnecessary DOM access if visibility hasn't changed 25993 if (data.hide === false) { 25994 return data; 25995 } 25996 25997 data.hide = false; 25998 data.attributes['x-out-of-boundaries'] = false; 25999 } 26000 26001 return data; 26002} 26003 26004/** 26005 * @function 26006 * @memberof Modifiers 26007 * @argument {Object} data - The data object generated by `update` method 26008 * @argument {Object} options - Modifiers configuration and options 26009 * @returns {Object} The data object, properly modified 26010 */ 26011function inner(data) { 26012 var placement = data.placement; 26013 var basePlacement = placement.split('-')[0]; 26014 var _data$offsets = data.offsets, 26015 popper = _data$offsets.popper, 26016 reference = _data$offsets.reference; 26017 26018 var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1; 26019 26020 var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1; 26021 26022 popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0); 26023 26024 data.placement = getOppositePlacement(placement); 26025 data.offsets.popper = getClientRect(popper); 26026 26027 return data; 26028} 26029 26030/** 26031 * Modifier function, each modifier can have a function of this type assigned 26032 * to its `fn` property.<br /> 26033 * These functions will be called on each update, this means that you must 26034 * make sure they are performant enough to avoid performance bottlenecks. 26035 * 26036 * @function ModifierFn 26037 * @argument {dataObject} data - The data object generated by `update` method 26038 * @argument {Object} options - Modifiers configuration and options 26039 * @returns {dataObject} The data object, properly modified 26040 */ 26041 26042/** 26043 * Modifiers are plugins used to alter the behavior of your poppers.<br /> 26044 * Popper.js uses a set of 9 modifiers to provide all the basic functionalities 26045 * needed by the library. 26046 * 26047 * Usually you don't want to override the `order`, `fn` and `onLoad` props. 26048 * All the other properties are configurations that could be tweaked. 26049 * @namespace modifiers 26050 */ 26051var modifiers = { 26052 /** 26053 * Modifier used to shift the popper on the start or end of its reference 26054 * element.<br /> 26055 * It will read the variation of the `placement` property.<br /> 26056 * It can be one either `-end` or `-start`. 26057 * @memberof modifiers 26058 * @inner 26059 */ 26060 shift: { 26061 /** @prop {number} order=100 - Index used to define the order of execution */ 26062 order: 100, 26063 /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ 26064 enabled: true, 26065 /** @prop {ModifierFn} */ 26066 fn: shift 26067 }, 26068 26069 /** 26070 * The `offset` modifier can shift your popper on both its axis. 26071 * 26072 * It accepts the following units: 26073 * - `px` or unit-less, interpreted as pixels 26074 * - `%` or `%r`, percentage relative to the length of the reference element 26075 * - `%p`, percentage relative to the length of the popper element 26076 * - `vw`, CSS viewport width unit 26077 * - `vh`, CSS viewport height unit 26078 * 26079 * For length is intended the main axis relative to the placement of the popper.<br /> 26080 * This means that if the placement is `top` or `bottom`, the length will be the 26081 * `width`. In case of `left` or `right`, it will be the `height`. 26082 * 26083 * You can provide a single value (as `Number` or `String`), or a pair of values 26084 * as `String` divided by a comma or one (or more) white space
vendor: 9,957 bytes, lines 26084-26356
26084s.<br /> 26085 * The latter is a deprecated method because it leads to confusion and will be 26086 * removed in v2.<br /> 26087 * Additionally, it accepts additions and subtractions between different units. 26088 * Note that multiplications and divisions aren't supported. 26089 * 26090 * Valid examples are: 26091 * ``` 26092 * 10 26093 * '10%' 26094 * '10, 10' 26095 * '10%, 10' 26096 * '10 + 10%' 26097 * '10 - 5vh + 3%' 26098 * '-10px + 5vh, 5px - 6%' 26099 * ``` 26100 * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap 26101 * > with their reference element, unfortunately, you will have to disable the `flip` modifier. 26102 * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373). 26103 * 26104 * @memberof modifiers 26105 * @inner 26106 */ 26107 offset: { 26108 /** @prop {number} order=200 - Index used to define the order of execution */ 26109 order: 200, 26110 /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ 26111 enabled: true, 26112 /** @prop {ModifierFn} */ 26113 fn: offset, 26114 /** @prop {Number|String} offset=0 26115 * The offset value as described in the modifier description 26116 */ 26117 offset: 0 26118 }, 26119 26120 /** 26121 * Modifier used to prevent the popper from being positioned outside the boundary. 26122 * 26123 * A scenario exists where the reference itself is not within the boundaries.<br /> 26124 * We can say it has "escaped the boundaries" â or just "escaped".<br /> 26125 * In this case we need to decide whether the popper should either: 26126 * 26127 * - detach from the reference and remain "trapped" in the boundaries, or 26128 * - if it should ignore the boundary and "escape with its reference" 26129 * 26130 * When `escapeWithReference` is set to`true` and reference is completely 26131 * outside its boundaries, the popper will overflow (or completely leave) 26132 * the boundaries in order to remain attached to the edge of the reference. 26133 * 26134 * @memberof modifiers 26135 * @inner 26136 */ 26137 preventOverflow: { 26138 /** @prop {number} order=300 - Index used to define the order of execution */ 26139 order: 300, 26140 /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ 26141 enabled: true, 26142 /** @prop {ModifierFn} */ 26143 fn: preventOverflow, 26144 /** 26145 * @prop {Array} [priority=['left','right','top','bottom']] 26146 * Popper will try to prevent overflow following these priorities by default, 26147 * then, it could overflow on the left and on top of the `boundariesElement` 26148 */ 26149 priority: ['left', 'right', 'top', 'bottom'], 26150 /** 26151 * @prop {number} padding=5 26152 * Amount of pixel used to define a minimum distance between the boundaries 26153 * and the popper. This makes sure the popper always has a little padding 26154 * between the edges of its container 26155 */ 26156 padding: 5, 26157 /** 26158 * @prop {String|HTMLElement} boundariesElement='scrollParent' 26159 * Boundaries used by the modifier. Can be `scrollParent`, `window`, 26160 * `viewport` or any DOM element. 26161 */ 26162 boundariesElement: 'scrollParent' 26163 }, 26164 26165 /** 26166 * Modifier used to make sure the reference and its popper stay near each other 26167 * without leaving any gap between the two. Especially useful when the arrow is 26168 * enabled and you want to ensure that it points to its reference element. 26169 * It cares only about the first axis. You can still have poppers with margin 26170 * between the popper and its reference element. 26171 * @memberof modifiers 26172 * @inner 26173 */ 26174 keepTogether: { 26175 /** @prop {number} order=400 - Index used to define the order of execution */ 26176 order: 400, 26177 /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ 26178 enabled: true, 26179 /** @prop {ModifierFn} */ 26180 fn: keepTogether 26181 }, 26182 26183 /** 26184 * This modifier is used to move the `arrowElement` of the popper to make 26185 * sure it is positioned between the reference element and its popper element. 26186 * It will read the outer size of the `arrowElement` node to detect how many 26187 * pixels of conjunction are needed. 26188 * 26189 * It has no effect if no `arrowElement` is provided. 26190 * @memberof modifiers 26191 * @inner 26192 */ 26193 arrow: { 26194 /** @prop {number} order=500 - Index used to define the order of execution */ 26195 order: 500, 26196 /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ 26197 enabled: true, 26198 /** @prop {ModifierFn} */ 26199 fn: arrow, 26200 /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */ 26201 element: '[x-arrow]' 26202 }, 26203 26204 /** 26205 * Modifier used to flip the popper's placement when it starts to overlap its 26206 * reference element. 26207 * 26208 * Requires the `preventOverflow` modifier before it in order to work. 26209 * 26210 * **NOTE:** this modifier will interrupt the current update cycle and will 26211 * restart it if it detects the need to flip the placement. 26212 * @memberof modifiers 26213 * @inner 26214 */ 26215 flip: { 26216 /** @prop {number} order=600 - Index used to define the order of execution */ 26217 order: 600, 26218 /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ 26219 enabled: true, 26220 /** @prop {ModifierFn} */ 26221 fn: flip, 26222 /** 26223 * @prop {String|Array} behavior='flip' 26224 * The behavior used to change the popper's placement. It can be one of 26225 * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid 26226 * placements (with optional variations) 26227 */ 26228 behavior: 'flip', 26229 /** 26230 * @prop {number} padding=5 26231 * The popper will flip if it hits the edges of the `boundariesElement` 26232 */ 26233 padding: 5, 26234 /** 26235 * @prop {String|HTMLElement} boundariesElement='viewport' 26236 * The element which will define the boundaries of the popper position. 26237 * The popper will never be placed outside of the defined boundaries 26238 * (except if `keepTogether` is enabled) 26239 */ 26240 boundariesElement: 'viewport', 26241 /** 26242 * @prop {Boolean} flipVariations=false 26243 * The popper will switch placement variation between `-start` and `-end` when 26244 * the reference element overlaps its boundaries. 26245 * 26246 * The original placement should have a set variation. 26247 */ 26248 flipVariations: false, 26249 /** 26250 * @prop {Boolean} flipVariationsByContent=false 26251 * The popper will switch placement variation between `-start` and `-end` when 26252 * the popper element overlaps its reference boundaries. 26253 * 26254 * The original placement should have a set variation. 26255 */ 26256 flipVariationsByContent: false 26257 }, 26258 26259 /** 26260 * Modifier used to make the popper flow toward the inner of the reference element. 26261 * By default, when this modifier is disabled, the popper will be placed outside 26262 * the reference element. 26263 * @memberof modifiers 26264 * @inner 26265 */ 26266 inner: { 26267 /** @prop {number} order=700 - Index used to define the order of execution */ 26268 order: 700, 26269 /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */ 26270 enabled: false, 26271 /** @prop {ModifierFn} */ 26272 fn: inner 26273 }, 26274 26275 /** 26276 * Modifier used to hide the popper when its reference element is outside of the 26277 * popper boundaries. It will set a `x-out-of-boundaries` attribute which can 26278 * be used to hide with a CSS selector the popper when its reference is 26279 * out of boundaries. 26280 * 26281 * Requires the `preventOverflow` modifier before it in order to work. 26282 * @memberof modifiers 26283 * @inner 26284 */ 26285 hide: { 26286 /** @prop {number} order=800 - Index used to define the order of execution */ 26287 order: 800, 26288 /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ 26289 enabled: true, 26290 /** @prop {ModifierFn} */ 26291 fn: hide 26292 }, 26293 26294 /** 26295 * Computes the style that will be applied to the popper element to gets 26296 * properly positioned. 26297 * 26298 * Note that this modifier will not touch the DOM, it just prepares the styles 26299 * so that `applyStyle` modifier can apply it. This separation is useful 26300 * in case you need to replace `applyStyle` with a custom implementation. 26301 * 26302 * This modifier has `850` as `order` value to maintain backward compatibility 26303 * with previous versions of Popper.js. Expect the modifiers ordering method 26304 * to change in future major versions of the library. 26305 * 26306 * @memberof modifiers 26307 * @inner 26308 */ 26309 computeStyle: { 26310 /** @prop {number} order=850 - Index used to define the order of execution */ 26311 order: 850, 26312 /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ 26313 enabled: true, 26314 /** @prop {ModifierFn} */ 26315 fn: computeStyle, 26316 /** 26317 * @prop {Boolean} gpuAcceleration=true 26318 * If true, it uses the CSS 3D transformation to position the popper. 26319 * Otherwise, it will use the `top` and `left` properties 26320 */ 26321 gpuAcceleration: true, 26322 /** 26323 * @prop {string} [x='bottom'] 26324 * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin. 26325 * Change this if your popper should grow in a direction different from `bottom` 26326 */ 26327 x: 'bottom', 26328 /** 26329 * @prop {string} [x='left'] 26330 * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin. 26331 * Change this if your popper should grow in a direction different from `right` 26332 */ 26333 y: 'right' 26334 }, 26335 26336 /** 26337 * Applies the computed styles to the popper element. 26338 * 26339 * All the DOM manipulations are limited to this modifier. This is useful in case 26340 * you want to integrate Popper.js inside a framework or view library and you 26341 * want to delegate all the DOM manipulations to it. 26342 * 26343 * Note that if you disable this modifier, you must make sure the popper element 26344 * has its position set to `absolute` before Popper.js can do its work! 26345 * 26346 * Just disable this modifier and define your own to achieve the desired effect. 26347 * 26348 * @memberof modifiers 26349 * @inner 26350 */ 26351 applyStyle: { 26352 /** @prop {number} order=900 - Index used to define the order of execution */ 26353 order: 900, 26354 /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ 26355 enabled: true, 26356 /** @prop {ModifierFn} */
vendor: 9,127 bytes, lines 26357-26621
26357 fn: applyStyle, 26358 /** @prop {Function} */ 26359 onLoad: applyStyleOnLoad, 26360 /** 26361 * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier 26362 * @prop {Boolean} gpuAcceleration=true 26363 * If true, it uses the CSS 3D transformation to position the popper. 26364 * Otherwise, it will use the `top` and `left` properties 26365 */ 26366 gpuAcceleration: undefined 26367 } 26368}; 26369 26370/** 26371 * The `dataObject` is an object containing all the information used by Popper.js. 26372 * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks. 26373 * @name dataObject 26374 * @property {Object} data.instance The Popper.js instance 26375 * @property {String} data.placement Placement applied to popper 26376 * @property {String} data.originalPlacement Placement originally defined on init 26377 * @property {Boolean} data.flipped True if popper has been flipped by flip modifier 26378 * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper 26379 * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier 26380 * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`) 26381 * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`) 26382 * @property {Object} data.boundaries Offsets of the popper boundaries 26383 * @property {Object} data.offsets The measurements of popper, reference and arrow elements 26384 * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values 26385 * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values 26386 * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0 26387 */ 26388 26389/** 26390 * Default options provided to Popper.js constructor.<br /> 26391 * These can be overridden using the `options` argument of Popper.js.<br /> 26392 * To override an option, simply pass an object with the same 26393 * structure of the `options` object, as the 3rd argument. For example: 26394 * ``` 26395 * new Popper(ref, pop, { 26396 * modifiers: { 26397 * preventOverflow: { enabled: false } 26398 * } 26399 * }) 26400 * ``` 26401 * @type {Object} 26402 * @static 26403 * @memberof Popper 26404 */ 26405var Defaults = { 26406 /** 26407 * Popper's placement. 26408 * @prop {Popper.placements} placement='bottom' 26409 */ 26410 placement: 'bottom', 26411 26412 /** 26413 * Set this to true if you want popper to position it self in 'fixed' mode 26414 * @prop {Boolean} positionFixed=false 26415 */ 26416 positionFixed: false, 26417 26418 /** 26419 * Whether events (resize, scroll) are initially enabled. 26420 * @prop {Boolean} eventsEnabled=true 26421 */ 26422 eventsEnabled: true, 26423 26424 /** 26425 * Set to true if you want to automatically remove the popper when 26426 * you call the `destroy` method. 26427 * @prop {Boolean} removeOnDestroy=false 26428 */ 26429 removeOnDestroy: false, 26430 26431 /** 26432 * Callback called when the popper is created.<br /> 26433 * By default, it is set to no-op.<br /> 26434 * Access Popper.js instance with `data.instance`. 26435 * @prop {onCreate} 26436 */ 26437 onCreate: function onCreate() {}, 26438 26439 /** 26440 * Callback called when the popper is updated. This callback is not called 26441 * on the initialization/creation of the popper, but only on subsequent 26442 * updates.<br /> 26443 * By default, it is set to no-op.<br /> 26444 * Access Popper.js instance with `data.instance`. 26445 * @prop {onUpdate} 26446 */ 26447 onUpdate: function onUpdate() {}, 26448 26449 /** 26450 * List of modifiers used to modify the offsets before they are applied to the popper. 26451 * They provide most of the functionalities of Popper.js. 26452 * @prop {modifiers} 26453 */ 26454 modifiers: modifiers 26455}; 26456 26457/** 26458 * @callback onCreate 26459 * @param {dataObject} data 26460 */ 26461 26462/** 26463 * @callback onUpdate 26464 * @param {dataObject} data 26465 */ 26466 26467// Utils 26468// Methods 26469var Popper = function () { 26470 /** 26471 * Creates a new Popper.js instance. 26472 * @class Popper 26473 * @param {Element|referenceObject} reference - The reference element used to position the popper 26474 * @param {Element} popper - The HTML / XML element used as the popper 26475 * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults) 26476 * @return {Object} instance - The generated Popper.js instance 26477 */ 26478 function Popper(reference, popper) { 26479 var _this = this; 26480 26481 var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; 26482 classCallCheck(this, Popper); 26483 26484 this.scheduleUpdate = function () { 26485 return requestAnimationFrame(_this.update); 26486 }; 26487 26488 // make update() debounced, so that it only runs at most once-per-tick 26489 this.update = debounce(this.update.bind(this)); 26490 26491 // with {} we create a new object with the options inside it 26492 this.options = _extends({}, Popper.Defaults, options); 26493 26494 // init state 26495 this.state = { 26496 isDestroyed: false, 26497 isCreated: false, 26498 scrollParents: [] 26499 }; 26500 26501 // get reference and popper elements (allow jQuery wrappers) 26502 this.reference = reference && reference.jquery ? reference[0] : reference; 26503 this.popper = popper && popper.jquery ? popper[0] : popper; 26504 26505 // Deep merge modifiers options 26506 this.options.modifiers = {}; 26507 Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) { 26508 _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {}); 26509 }); 26510 26511 // Refactoring modifiers' list (Object => Array) 26512 this.modifiers = Object.keys(this.options.modifiers).map(function (name) { 26513 return _extends({ 26514 name: name 26515 }, _this.options.modifiers[name]); 26516 }) 26517 // sort the modifiers by order 26518 .sort(function (a, b) { 26519 return a.order - b.order; 26520 }); 26521 26522 // modifiers have the ability to execute arbitrary code when Popper.js get inited 26523 // such code is executed in the same order of its modifier 26524 // they could add new properties to their options configuration 26525 // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`! 26526 this.modifiers.forEach(function (modifierOptions) { 26527 if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) { 26528 modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state); 26529 } 26530 }); 26531 26532 // fire the first update to position the popper in the right place 26533 this.update(); 26534 26535 var eventsEnabled = this.options.eventsEnabled; 26536 if (eventsEnabled) { 26537 // setup event listeners, they will take care of update the position in specific situations 26538 this.enableEventListeners(); 26539 } 26540 26541 this.state.eventsEnabled = eventsEnabled; 26542 } 26543 26544 // We can't use class properties because they don't get listed in the 26545 // class prototype and break stuff like Sinon stubs 26546 26547 26548 createClass(Popper, [{ 26549 key: 'update', 26550 value: function update$$1() { 26551 return update.call(this); 26552 } 26553 }, { 26554 key: 'destroy', 26555 value: function destroy$$1() { 26556 return destroy.call(this); 26557 } 26558 }, { 26559 key: 'enableEventListeners', 26560 value: function enableEventListeners$$1() { 26561 return enableEventListeners.call(this); 26562 } 26563 }, { 26564 key: 'disableEventListeners', 26565 value: function disableEventListeners$$1() { 26566 return disableEventListeners.call(this); 26567 } 26568 26569 /** 26570 * Schedules an update. It will run on the next UI update available. 26571 * @method scheduleUpdate 26572 * @memberof Popper 26573 */ 26574 26575 26576 /** 26577 * Collection of utilities useful when writing custom modifiers. 26578 * Starting from version 1.7, this method is available only if you 26579 * include `popper-utils.js` before `popper.js`. 26580 * 26581 * **DEPRECATION**: This way to access PopperUtils is deprecated 26582 * and will be removed in v2! Use the PopperUtils module directly instead. 26583 * Due to the high instability of the methods contained in Utils, we can't 26584 * guarantee them to follow semver. Use them at your own risk! 26585 * @static 26586 * @private 26587 * @type {Object} 26588 * @deprecated since version 1.8 26589 * @member Utils 26590 * @memberof Popper 26591 */ 26592 26593 }]); 26594 return Popper; 26595}(); 26596 26597/** 26598 * The `referenceObject` is an object that provides an interface compatible with Popper.js 26599 * and lets you use it as replacement of a real DOM node.<br /> 26600 * You can use this method to position a popper relatively to a set of coordinates 26601 * in case you don't have a DOM node to use as reference. 26602 * 26603 * ``` 26604 * new Popper(referenceObject, popperNode); 26605 * ``` 26606 * 26607 * NB: This feature isn't supported in Internet Explorer 10. 26608 * @name referenceObject 26609 * @property {Function} data.getBoundingClientRect 26610 * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method. 26611 * @property {number} data.clientWidth 26612 * An ES6 getter that will return the width of the virtual reference element. 26613 * @property {number} data.clientHeight 26614 * An ES6 getter that will return the height of the virtual reference element. 26615 */ 26616 26617 26618Popper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils; 26619Popper.placements = placements; 26620Popper.Defaults = Defaults; 26621
26622return Popper; 26623 26624}))); 26625 26626 26627}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) 26628},{}],43:[function(require,module,exports){
vendor: 7,610 bytes, lines 26629-26906
26629/* 26630 * jQuery Superfish Menu Plugin - v1.7.10 26631 * Copyright (c) 2018 Joel Birch 26632 * 26633 * Dual licensed under the MIT and GPL licenses: 26634 * http://www.opensource.org/licenses/mit-license.php 26635 * http://www.gnu.org/licenses/gpl.html 26636 */ 26637 26638;(function ($, w) { 26639 "use strict"; 26640 26641 var methods = (function () { 26642 // private properties and methods go here 26643 var c = { 26644 bcClass: 'sf-breadcrumb', 26645 menuClass: 'sf-js-enabled', 26646 anchorClass: 'sf-with-ul', 26647 menuArrowClass: 'sf-arrows' 26648 }, 26649 ios = (function () { 26650 var ios = /^(?![\w\W]*Windows Phone)[\w\W]*(iPhone|iPad|iPod)/i.test(navigator.userAgent); 26651 if (ios) { 26652 // tap anywhere on iOS to unfocus a submenu 26653 $('html').css('cursor', 'pointer').on('click', $.noop); 26654 } 26655 return ios; 26656 })(), 26657 wp7 = (function () { 26658 var style = document.documentElement.style; 26659 return ('behavior' in style && 'fill' in style && /iemobile/i.test(navigator.userAgent)); 26660 })(), 26661 unprefixedPointerEvents = (function () { 26662 return (!!w.PointerEvent); 26663 })(), 26664 toggleMenuClasses = function ($menu, o, add) { 26665 var classes = c.menuClass, 26666 method; 26667 if (o.cssArrows) { 26668 classes += ' ' + c.menuArrowClass; 26669 } 26670 method = (add) ? 'addClass' : 'removeClass'; 26671 $menu[method](classes); 26672 }, 26673 setPathToCurrent = function ($menu, o) { 26674 return $menu.find('li.' + o.pathClass).slice(0, o.pathLevels) 26675 .addClass(o.hoverClass + ' ' + c.bcClass) 26676 .filter(function () { 26677 return ($(this).children(o.popUpSelector).hide().show().length); 26678 }).removeClass(o.pathClass); 26679 }, 26680 toggleAnchorClass = function ($li, add) { 26681 var method = (add) ? 'addClass' : 'removeClass'; 26682 $li.children('a')[method](c.anchorClass); 26683 }, 26684 toggleTouchAction = function ($menu) { 26685 var msTouchAction = $menu.css('ms-touch-action'); 26686 var touchAction = $menu.css('touch-action'); 26687 touchAction = touchAction || msTouchAction; 26688 touchAction = (touchAction === 'pan-y') ? 'auto' : 'pan-y'; 26689 $menu.css({ 26690 'ms-touch-action': touchAction, 26691 'touch-action': touchAction 26692 }); 26693 }, 26694 getMenu = function ($el) { 26695 return $el.closest('.' + c.menuClass); 26696 }, 26697 getOptions = function ($el) { 26698 return getMenu($el).data('sfOptions'); 26699 }, 26700 over = function () { 26701 var $this = $(this), 26702 o = getOptions($this); 26703 clearTimeout(o.sfTimer); 26704 $this.siblings().superfish('hide').end().superfish('show'); 26705 }, 26706 close = function (o) { 26707 o.retainPath = ($.inArray(this[0], o.$path) > -1); 26708 this.superfish('hide'); 26709 26710 if (!this.parents('.' + o.hoverClass).length) { 26711 o.onIdle.call(getMenu(this)); 26712 if (o.$path.length) { 26713 $.proxy(over, o.$path)(); 26714 } 26715 } 26716 }, 26717 out = function () { 26718 var $this = $(this), 26719 o = getOptions($this); 26720 if (ios) { 26721 $.proxy(close, $this, o)(); 26722 } 26723 else { 26724 clearTimeout(o.sfTimer); 26725 o.sfTimer = setTimeout($.proxy(close, $this, o), o.delay); 26726 } 26727 }, 26728 touchHandler = function (e) { 26729 var $this = $(this), 26730 o = getOptions($this), 26731 $ul = $this.siblings(e.data.popUpSelector); 26732 26733 if (o.onHandleTouch.call($ul) === false) { 26734 return this; 26735 } 26736 26737 if ($ul.length > 0 && $ul.is(':hidden')) { 26738 $this.one('click.superfish', false); 26739 if (e.type === 'MSPointerDown' || e.type === 'pointerdown') { 26740 $this.trigger('focus'); 26741 } else { 26742 $.proxy(over, $this.parent('li'))(); 26743 } 26744 } 26745 }, 26746 applyHandlers = function ($menu, o) { 26747 var targets = 'li:has(' + o.popUpSelector + ')'; 26748 if ($.fn.hoverIntent && !o.disableHI) { 26749 $menu.hoverIntent(over, out, targets); 26750 } 26751 else { 26752 $menu 26753 .on('mouseenter.superfish', targets, over) 26754 .on('mouseleave.superfish', targets, out); 26755 } 26756 var touchevent = 'MSPointerDown.superfish'; 26757 if (unprefixedPointerEvents) { 26758 touchevent = 'pointerdown.superfish'; 26759 } 26760 if (!ios) { 26761 touchevent += ' touchend.superfish'; 26762 } 26763 if (wp7) { 26764 touchevent += ' mousedown.superfish'; 26765 } 26766 $menu 26767 .on('focusin.superfish', 'li', over) 26768 .on('focusout.superfish', 'li', out) 26769 .on(touchevent, 'a', o, touchHandler); 26770 }; 26771 26772 return { 26773 // public methods 26774 hide: function (instant) { 26775 if (this.length) { 26776 var $this = this, 26777 o = getOptions($this); 26778 if (!o) { 26779 return this; 26780 } 26781 var not = (o.retainPath === true) ? o.$path : '', 26782 $ul = $this.find('li.' + o.hoverClass).add(this).not(not).removeClass(o.hoverClass).children(o.popUpSelector), 26783 speed = o.speedOut; 26784 26785 if (instant) { 26786 $ul.show(); 26787 speed = 0; 26788 } 26789 o.retainPath = false; 26790 26791 if (o.onBeforeHide.call($ul) === false) { 26792 return this; 26793 } 26794 26795 $ul.stop(true, true).animate(o.animationOut, speed, function () { 26796 var $this = $(this); 26797 o.onHide.call($this); 26798 }); 26799 } 26800 return this; 26801 }, 26802 show: function () { 26803 var o = getOptions(this); 26804 if (!o) { 26805 return this; 26806 } 26807 var $this = this.addClass(o.hoverClass), 26808 $ul = $this.children(o.popUpSelector); 26809 26810 if (o.onBeforeShow.call($ul) === false) { 26811 return this; 26812 } 26813 26814 $ul.stop(true, true).animate(o.animation, o.speed, function () { 26815 o.onShow.call($ul); 26816 }); 26817 return this; 26818 }, 26819 destroy: function () { 26820 return this.each(function () { 26821 var $this = $(this), 26822 o = $this.data('sfOptions'), 26823 $hasPopUp; 26824 if (!o) { 26825 return false; 26826 } 26827 $hasPopUp = $this.find(o.popUpSelector).parent('li'); 26828 clearTimeout(o.sfTimer); 26829 toggleMenuClasses($this, o); 26830 toggleAnchorClass($hasPopUp); 26831 toggleTouchAction($this); 26832 // remove event handlers 26833 $this.off('.superfish').off('.hoverIntent'); 26834 // clear animation's inline display style 26835 $hasPopUp.children(o.popUpSelector).attr('style', function (i, style) { 26836 if (typeof style !== 'undefined') { 26837 return style.replace(/display[^;]+;?/g, ''); 26838 } 26839 }); 26840 // reset 'current' path classes 26841 o.$path.removeClass(o.hoverClass + ' ' + c.bcClass).addClass(o.pathClass); 26842 $this.find('.' + o.hoverClass).removeClass(o.hoverClass); 26843 o.onDestroy.call($this); 26844 $this.removeData('sfOptions'); 26845 }); 26846 }, 26847 init: function (op) { 26848 return this.each(function () { 26849 var $this = $(this); 26850 if ($this.data('sfOptions')) { 26851 return false; 26852 } 26853 var o = $.extend({}, $.fn.superfish.defaults, op), 26854 $hasPopUp = $this.find(o.popUpSelector).parent('li'); 26855 o.$path = setPathToCurrent($this, o); 26856 26857 $this.data('sfOptions', o); 26858 26859 toggleMenuClasses($this, o, true); 26860 toggleAnchorClass($hasPopUp, true); 26861 toggleTouchAction($this); 26862 applyHandlers($this, o); 26863 26864 $hasPopUp.not('.' + c.bcClass).superfish('hide', true); 26865 26866 o.onInit.call(this); 26867 }); 26868 } 26869 }; 26870 })(); 26871 26872 $.fn.superfish = function (method, args) { 26873 if (methods[method]) { 26874 return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); 26875 } 26876 else if (typeof method === 'object' || ! method) { 26877 return methods.init.apply(this, arguments); 26878 } 26879 else { 26880 return $.error('Method ' + method + ' does not exist on jQuery.fn.superfish'); 26881 } 26882 }; 26883 26884 $.fn.superfish.defaults = { 26885 popUpSelector: 'ul,.sf-mega', // within menu context 26886 hoverClass: 'sfHover', 26887 pathClass: 'overrideThisToUse', 26888 pathLevels: 1, 26889 delay: 800, 26890 animation: {opacity: 'show'}, 26891 animationOut: {opacity: 'hide'}, 26892 speed: 'normal', 26893 speedOut: 'fast', 26894 cssArrows: true, 26895 disableHI: false, 26896 onInit: $.noop, 26897 onBeforeShow: $.noop, 26898 onShow: $.noop, 26899 onBeforeHide: $.noop, 26900 onHide: $.noop, 26901 onIdle: $.noop, 26902 onDestroy: $.noop, 26903 onHandleTouch: $.noop 26904 }; 26905 26906})(jQuery, window);
26907 26908},{}],44:[function(require,module,exports){ 26909"use strict"; 26910 26911var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 26912Object.defineProperty(exports, "__esModule", { 26913 value: true 26914}); 26915exports.WcoBitvForm = void 0; 26916var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); 26917var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); 26918var WcoBitvForm = exports.WcoBitvForm = /*#__PURE__*/function () { 26919 function WcoBitvForm() { 26920 (0, _classCallCheck2["default"])(this, WcoBitvForm); 26921 } 26922 return (0, _createClass2["default"])(WcoBitvForm, [{ 26923 key: "initialize", 26924 value: function initialize() { 26925 // form validation 26926 var forms = document.querySelectorAll('form'); 26927 if (forms.length > 0) { 26928 forms.forEach(function (formItem) { 26929 var formFields = formItem.querySelectorAll('.form__group.has-error'); 26930 if (formFields.length > 0) { 26931 formFields.forEach(function (formField, index) { 26932 var errorTextElement = formField.querySelector('.alert.error'); 26933 var uniqueId = 'error-message-' + index; 26934 errorTextElement.id = uniqueId; 26935 var requiredField = formField.querySelector('[required="required"].error'); 26936 var inputSecurityCheck = formField.querySelector('input.security-check-input'); 26937 if (requiredField) { 26938 requiredField.setAttribute('aria-describedby', uniqueId); 26939 } 26940 if (inputSecurityCheck) { 26941 inputSecurityCheck.setAttribute('aria-describedby', uniqueId); 26942 } 26943 }); 26944 setTimeout(function () { 26945 var errorRequired = formFields[0].querySelector('[required="required"].error'); 26946 var errorSecurity = formFields[0].querySelector('input.security-check-input'); 26947 if (errorRequired) { 26948 errorRequired.focus(); 26949 } 26950 if (errorSecurity) { 26951 formFields[0].querySelector('.alert.error').setAttribute("tabindex", "-1"); 26952 formFields[0].querySelector(".alert.error").focus(); 26953 } 26954 }, 100); 26955 } 26956 }); 26957 } 26958 } 26959 }]); 26960}(); 26961 26962},{"@babel/runtime/helpers/classCallCheck":45,"@babel/runtime/helpers/createClass":46,"@babel/runtime/helpers/interopRequireDefault":47}],45:[function(require,module,exports){ 26963arguments[4][13][0].apply(exports,arguments) 26964},{"dup":13}],46:[function(require,module,exports){ 26965arguments[4][14][0].apply(exports,arguments) 26966},{"./toPropertyKey.js":49,"dup":14}],47:[function(require,module,exports){ 26967arguments[4][19][0].apply(exports,arguments) 26968},{"dup":19}],48:[function(require,module,exports){ 26969arguments[4][23][0].apply(exports,arguments) 26970},{"./typeof.js":50,"dup":23}],49:[function(require,module,exports){ 26971arguments[4][24][0].apply(exports,arguments) 26972},{"./toPrimitive.js":48,"./typeof.js":50,"dup":24}],50:[function(require,module,exports){ 26973arguments[4][25][0].apply(exports,arguments) 26974},{"dup":25}],51:[function(require,module,exports){ 26975"use strict"; 26976 26977var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 26978Object.defineProperty(exports, "__esModule", { 26979 value: true 26980}); 26981exports.WcoBmiCalculator = void 0; 26982var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); 26983var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); 26984var WcoBmiCalculator = exports.WcoBmiCalculator = /*#__PURE__*/function () { 26985 function WcoBmiCalculator() { 26986 (0, _classCallCheck2["default"])(this, WcoBmiCalculator); 26987 } 26988 return (0, _createClass2["default"])(WcoBmiCalculator, [{ 26989 key: "initialize", 26990 value: function initialize() { 26991 var $calculatorContainer = $('.tx-wco-bmi-calculator'); 26992 $calculatorContainer.find('.show-only-with-js').removeClass('show-only-with-js'); 26993 $calculatorContainer.find('.range-input-range input').on('input change', function () { 26994 var container = $(this).parents('.range-container'); 26995 var textInput = container.find('.range-input-field input'); 26996 textInput.val($(this).val()); 26997 textInput.trigger('change'); 26998 }); 26999 $calculatorContainer.find('.range-input-field input').on('change', function () { 27000 var container = $(this).parents('.range-container'); 27001 var rangeInput = container.find('.range-input-range input'); 27002 var currentVal = $(this).val(); 27003 currentVal = currentVal.replace(',', '.'); 27004 rangeInput.val(currentVal); 27005 }); 27006 $calculatorContainer.find('.range-input-range input').trigger('change'); 27007 $calculatorContainer.find('.hidden-gender-input').on('change', function () { 27008 var fieldset = $(this).closest('.gender-inputs');
27009 fieldset.find('.gender-error').hide(); 27010 }); 27011 $calculatorContainer.find('input[required]').on('invalid', function () { 27012 if (this.validity.valueMissing) { 27013 this.setCustomValidity('Bitte dieses Feld ausfüllen'); 27014 } else if (this.validity.stepMismatch || this.validity.badInput) { 27015 var value = parseFloat($(this).val().replace(',', '.')); 27016 var min = parseFloat($(this).attr('min')) || 0; 27017 var step = parseFloat($(this).attr('step') || 1); 27018 var next1 = Math.floor(Math.round((value - min) * 100) / (step * 100)) * step + min; 27019 var next2 = next1 + step; 27020 if (next1 < min) { 27021 next1 = min; 27022 next2 = min + step; 27023 } 27024 27025 // Browser usually rounds to some precision, let's keep it reasonable 27026 next1 = Math.round(next1 * 100) / 100; 27027 next2 = Math.round(next2 * 100) / 100; 27028 this.setCustomValidity('Bitte einen Wert ohne Kommastellen angeben. Die nächsten beiden Werte sind ' + next1.toString().replace('.', ',') + ' und ' + next2.toString().replace('.', ',')); 27029 } 27030 }); 27031 $calculatorContainer.find('input[required]').on('input change', function () { 27032 this.setCustomValidity(''); 27033 }); 27034 $calculatorContainer.find('.bmi-calculator-form').on('submit', function (event) { 27035 event.preventDefault(); // avoid to execute the actual submit of the form. 27036 27037 var form = $(this); 27038 var genderInputs = form.find('.hidden-gender-input'); 27039 var genderFieldset = form.find('.gender-inputs'); 27040 var genderError = genderFieldset.find('.gender-error'); 27041 if (!genderInputs.is(':checked')) { 27042 genderError.show(); 27043 genderFieldset.addClass('has-error'); 27044 genderInputs.first().focus(); 27045 return; 27046 } 27047 genderError.hide(); 27048 genderFieldset.removeClass('has-error'); 27049 if (!form[0].checkValidity()) { 27050 form[0].reportValidity(); 27051 return; 27052 } 27053 var url = form.attr('action'); 27054 $.ajax({ 27055 type: "POST", 27056 dataType: 'html', 27057 url: url, 27058 data: form.serialize(), 27059 // serializes the form's elements. 27060 success: function success(resultData) { 27061 var resultContainer = $calculatorContainer.find('.bmi-calculator-result'); 27062 resultContainer.html(resultData); 27063 resultContainer.focus(); 27064 }, 27065 error: function error(resultData) { 27066 var resultContainer = $calculatorContainer.find('.bmi-calculator-result'); 27067 resultContainer.html('Ein Fehler trat während der Berechnung auf.'); 27068 resultContainer.focus(); 27069 } 27070 }); 27071 }); 27072 } 27073 }]); 27074}(); 27075 27076},{"@babel/runtime/helpers/classCallCheck":52,"@babel/runtime/helpers/createClass":53,"@babel/runtime/helpers/interopRequireDefault":54}],52:[function(require,module,exports){ 27077arguments[4][13][0].apply(exports,arguments) 27078},{"dup":13}],53:[function(require,module,exports){ 27079arguments[4][14][0].apply(exports,arguments) 27080},{"./toPropertyKey.js":56,"dup":14}],54:[function(require,module,exports){ 27081arguments[4][19][0].apply(exports,arguments) 27082},{"dup":19}],55:[function(require,module,exports){ 27083arguments[4][23][0].apply(exports,arguments) 27084},{"./typeof.js":57,"dup":23}],56:[function(require,module,exports){ 27085arguments[4][24][0].apply(exports,arguments) 27086},{"./toPrimitive.js":55,"./typeof.js":57,"dup":24}],57:[function(require,module,exports){ 27087arguments[4][25][0].apply(exports,arguments) 27088},{"dup":25}],58:[function(require,module,exports){ 27089"use strict"; 27090 27091var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 27092Object.defineProperty(exports, "__esModule", { 27093 value: true 27094}); 27095exports.WcoBzgaMethodenfinder = void 0; 27096var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); 27097var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); 27098var _isotopeLayout = _interopRequireDefault(require("isotope-layout")); 27099var _nouislider = _interopRequireDefault(require("nouislider")); 27100var _wnumb = _interopRequireDefault(require("wnumb")); 27101window.$ = window.jQuery = require('jquery'); 27102var WcoBzgaMethodenfinder = exports.WcoBzgaMethodenfinder = /*#__PURE__*/function () { 27103 function WcoBzgaMethodenfinder() { 27104 (0, _classCallCheck2["default"])(this, WcoBzgaMethodenfinder); 27105 this.filters = []; 27106 } 27107 return (0, _createClass2["default"])(WcoBzgaMethodenfinder, [{ 27108 key: "initialize", 27109 value: function initialize() { 27110 var _this2 = this; 27111 var methodenfinderContainer = document.querySelector('.tx-wco-bzga-methodenfinder'); 27112 if (methodenfinderContainer === null) { 27113 return null; 27114 } 27115 var filters = {}; 27116 document.querySelectorAll('.wco-range-slider').forEach(function (rangeSlider) { 27117 // aria-label="Filter für das empfohlene Alter des Spiels in Jahren (von, bis)" 27118 var data = rangeSlider.dataset; 27119 var sliderPostfix = rangeSlider.getAttribute('data-postfix'); 27120 var handleAriaSuffix = sliderPostfix.replace(/<[^>]*>/g, ''); 27121 _nouislider["default"].create(rangeSlider, { 27122 start: [parseInt(data['min']), parseInt(data['max'])], 27123 step: parseInt(data['step']), 27124 connect: true, 27125 tooltips: [{ 27126 to: function to(value) { 27127 return _this2.getTooltipLabel(data, value, 'min'); 27128 } 27129 }, { 27130 to: function to(value) { 27131 return _this2.getTooltipLabel(data, value, 'max'); 27132 } 27133 }], 27134 ariaFormat: (0, _wnumb["default"])({ 27135 decimals: 0, 27136 suffix: handleAriaSuffix 27137 }), 27138 pips: { 27139 mode: 'count', 27140 values: 5, 27141 density: 0 27142 }, 27143 keyboardSupport: true, 27144 range: { 27145 'min': parseInt(data['from']), 27146 'max': parseInt(data['to']) 27147 } 27148 }); 27149 rangeSlider.noUiSlider.on('change', function (value, handle, unencoded) { 27150 rangeSlider.classList.add('wco-active-slider'); 27151 var filterstring = rangeSlider.getAttribute('id'); 27152 filterstring = filterstring.replace('wco-range-', ''); 27153 var filterLabel = $('.tx-wco-filterbuttons button[aria-controls="filter-' + filterstring + '"]').text(); 27154 var filterValue = filterLabel + parseInt(unencoded[0]) + ' - ' + _this2.getTooltipLabel(data, parseInt(unencoded[1]), 'max'); 27155 if ($(".wco-active-filter span:contains('" + filterLabel + "')").length > 0) { 27156 $(".wco-active-filter span:contains('" + filterLabel + "')").html(filterValue); 27157 } else { 27158 _this2.addToFilterInfo(filterValue); 27159 } 27160 $grid.arrange(); 27161 _this2.setFilteredElementsAmount($grid); 27162 }); 27163 }); 27164 var grid = document.querySelector('.tx-wco-methods'); 27165 27166 // ----- ISOTOPE ----- 27167 var $grid = new _isotopeLayout["default"](grid, { 27168 itemSelector: '.tx-wco-grid-item', 27169 percentPosition: true, 27170 masonry: { 27171 columnWidth: '.grid-sizer' 27172 }, 27173 filter: function filter(itemElement) { 27174 return _this2.getActiveFilter($(itemElement)); 27175 } 27176 }); 27177 $grid.on('arrangeComplete', function () { 27178 $.each($grid.getFilteredItemElements(), function (i, item) { 27179 var method = i % 2 ? 'removeClass' : 'addClass'; 27180 $(item.element)[method]('odd'); 27181 }); 27182 1; 27183 }); 27184 27185 // ----- SEARCH FIELD----- 27186 var $quicksearch = $('.tx-wco-quicksearch').keyup(this.debounce(function () { 27187 _this2.qsRegex = new RegExp($quicksearch.val(), 'gi'); 27188 $grid.arrange(); 27189 _this2.setFilteredElementsAmount($grid); 27190 })); 27191 27192 // ----- FILTER BUTTON ----- 27193 $('#filterdetails .btn').on('click', function (e) { 27194 $(e.currentTarget).toggleClass("is-checked"); 27195 _this2.manageButton($(e.currentTarget)); 27196 27197 // special case cause there are currently no outdoor methods 27198 if ($('button[data-filter=".location-1"]').hasClass('is-checked') || $('button[data-filter=".location-2"]').hasClass('is-checked')) { 27199 _this2.filters['location'].push('.location-0'); 27200 } else { 27201 _this2.filters['location'] = []; 27202 } 27203 $grid.arrange(); 27204 _this2.setFilteredElementsAmount($grid); 27205 }); 27206 27207 // ----- RESET BUTTON ----- 27208 $('.tx-wco-reset-filter').on('click', function () { 27209 $('#filterdetails button.is-checked').each(function (e) { 27210 $(this).click(); 27211 }); 27212 $(".tx-wco-filterbuttons button[aria-expanded='true']").each(function (e) { 27213 $(this).click(); 27214 }); 27215 document.querySelectorAll('.wco-range-slider').forEach(function (slider) { 27216 slider.classList.remove('wco-active-slider'); 27217 slider.noUiSlider.reset(); 27218 }); 27219 $('.tx-wco-quicksearch').val(''); 27220 _this2.qsRegex = new RegExp($quicksearch.val(), 'gi'); 27221 $grid.arrange(); 27222 _this2.setFilteredElementsAmount($grid); 27223 $('.wco-active-filter').html(' '); 27224 }); 27225 27226 // SVG CONVERT 27227 $(".tx-wco-method-front-img img").each(function () { 27228 var $img = jQuery(this); 27229 var attributes = $img.prop("attributes"); 27230 var imgURL = $img.attr("src"); 27231 $.get(imgURL, function (data) { 27232 var $svg = $(data).find('svg'); 27233 $svg = $svg.removeAttr('xmlns:a'); 27234 $.each(attributes, function () { 27235 $svg.attr(this.name, this.value); 27236 }); 27237 $img.replaceWith($svg); 27238 }); 27239 }); 27240 27241 //Tab Order 27242 var filterKeywords = ["topics", "location", "suitableage", "duration", "groupsize"]; 27243 filterKeywords.forEach(function (word) { 27244 return _this2.addFocusDirection(word); 27245 }); 27246 } 27247 }, { 27248 key: "manageButton", 27249 value: function manageButton($button) { 27250 var group = $button.parents('.button-group').attr('data-filter-group'); 27251 // create array for filter group, if not there yet 27252 var filterGroup = this.filters[group]; 27253 if (!filterGroup) { 27254 filterGroup = this.filters[group] = []; 27255 } 27256 var isAll = $button.hasClass('all'); 27257 // reset filter group if the all box was checked 27258 if (isAll) { 27259 delete this.filters[group]; 27260 if (!$button.hasClass('is-checked')) { 27261 $button.addClass('is-checked'); 27262 } 27263 } 27264 // index of 27265 var index = $.inArray($button.attr('data-filter'), filterGroup); 27266 if ($button.hasClass('is-checked')) { 27267 var selector = isAll ? 'button' : 'button.all'; 27268 $button.siblings(selector).removeClass('is-checked'); 27269 if (!isAll && index === -1) { 27270 // add filter to group 27271 this.filters[group].push($button.attr('data-filter')); 27272 } 27273 this.addToFilterInfo($button.text()); 27274 } else if (!isAll) { 27275 // remove filter from group 27276 this.filters[group].splice(index, 1); 27277 // if unchecked the last box, check the all 27278 if (!$button.siblings('.is-checked').length) { 27279 $button.siblings('button.all').attr('checked', 'checked'); 27280 } 27281 this.removeFromFilterInfo($button.text()); 27282 } 27283 } 27284 }, { 27285 key: "removeFromFilterInfo", 27286 value: function removeFromFilterInfo(buttonText) { 27287 $(".wco-active-filter span:contains('" + buttonText + "')").animate({ 27288 opacity: '0' 27289 }, 800, function () { 27290 $(".wco-active-filter span:contains('" + buttonText + "')").remove(); 27291 }); 27292 } 27293 }, { 27294 key: "addToFilterInfo", 27295 value: function addToFilterInfo(buttonText) { 27296 $('.wco-active-filter').html($('.wco-active-filter').html() + '<span>' + buttonText + '</span>'); 27297 $('.wco-active-filter span').animate({ 27298 opacity: '1' 27299 }); 27300 } 27301 }, { 27302 key: "getActiveFilter", 27303 value: function getActiveFilter($this) { 27304 var _this3 = this; 27305 var searchResult = this.qsRegex ? $this.text().match(this.qsRegex) : true; 27306 var buttonResult = this.getComboFilter().length > 0 ? $this.is(this.getComboFilter()) : true; 27307 var rangeResult = true; 27308 document.querySelectorAll('.wco-range-slider.wco-active-slider').forEach(function (slider) { 27309 if (rangeResult === true) { 27310 rangeResult = _this3.getActiveRangeFilter(slider.parentNode.dataset['filterGroup'], $this); 27311 } 27312 }); 27313 return buttonResult && searchResult && rangeResult; 27314 } 27315 }, { 27316 key: "getActiveRangeFilter", 27317 value: function getActiveRangeFilter($field, $this) { 27318 var ret = true; 27319 var slider = document.querySelector('.wco-range-' + $field); 27320 var range = slider.noUiSlider.get(true);
27321 var numberFrom = $this.find('.tx-wco-' + $field + '-from').text(); 27322 var numberTo = $this.find('.tx-wco-' + $field + '-to').text(); 27323 if ($field === "suitableage" || $field === "groupsize") { 27324 ret = numberFrom <= range[0] && numberTo >= range[1]; 27325 } 27326 if ($field === "duration") { 27327 if (range[1] === parseInt(slider.dataset['max'])) { 27328 ret = numberFrom >= range[0]; 27329 } else { 27330 ret = numberFrom >= range[0] && numberTo <= range[1]; 27331 } 27332 } 27333 return ret; 27334 } 27335 }, { 27336 key: "getComboFilter", 27337 value: function getComboFilter() { 27338 var combo = []; 27339 for (var prop in this.filters) { 27340 var group = this.filters[prop]; 27341 if (!group.length) { 27342 // no filters in group, carry on 27343 continue; 27344 } 27345 // add first group 27346 if (!combo.length) { 27347 combo = group.slice(0); 27348 continue; 27349 } 27350 // add additional groups 27351 var nextCombo = []; 27352 // split group into combo: [ A, B ] & [ 1, 2 ] => [ A1, A2, B1, B2 ] 27353 for (var i = 0; i < combo.length; i++) { 27354 for (var j = 0; j < group.length; j++) { 27355 var item = combo[i] + group[j]; 27356 nextCombo.push(item); 27357 } 27358 } 27359 combo = nextCombo; 27360 } 27361 return combo.join(', '); 27362 } 27363 27364 // debounce so filtering doesn't happen every millisecond 27365 }, { 27366 key: "debounce", 27367 value: function debounce(fn, threshold) { 27368 var timeout; 27369 threshold = threshold || 100; 27370 return function debounced() { 27371 clearTimeout(timeout); 27372 var args = arguments; 27373 var _this = this; 27374 function delayed() { 27375 fn.apply(_this, args); 27376 } 27377 timeout = setTimeout(delayed, threshold); 27378 }; 27379 } 27380 }, { 27381 key: "getTooltipLabel", 27382 value: function getTooltipLabel(data, value, type) { 27383 var label = data['postfix']; 27384 value = parseInt(value); 27385 if (data[type + 'Postfix'] && value === parseInt(data[type])) { 27386 label = data[type + 'Postfix'] + label; 27387 } 27388 return value + label; 27389 } 27390 }, { 27391 key: "setFilteredElementsAmount", 27392 value: function setFilteredElementsAmount($grid) { 27393 var elems = $grid.getFilteredItemElements(); 27394 if (elems.length == 0) { 27395 $('.wco-method-amount').html('<p id="wco-method-filter-none">Es wurden keine Spiele zu Ihrer Suche gefunden.<br/>Bitte passen Sie ihre Filtereinstellungen an.</p>'); 27396 } else if (elems.length == 1) { 27397 $('.wco-method-amount').html('<span id="wco-method-filter-amount">1</span> Spiel gefunden'); 27398 } else { 27399 var currentCount = $('#wco-method-filter-amount').html(); 27400 $('.wco-method-amount').html('<span id="wco-method-filter-amount">' + elems.length + '</span> Spiele gefunden'); 27401 $('#wco-method-filter-amount').each(function () { 27402 var $this = $(this); 27403 jQuery({ 27404 Counter: currentCount 27405 }).animate({ 27406 Counter: elems.length 27407 }, { 27408 duration: 800, 27409 easing: 'swing', 27410 step: function step() { 27411 $this.text(Math.round(this.Counter)); 27412 } 27413 }); 27414 }); 27415 } 27416 } 27417 }, { 27418 key: "addFocusDirection", 27419 value: function addFocusDirection(filterKeyword) { 27420 var btnFilter = document.querySelector(".btn-filter-" + filterKeyword); 27421 var filterKeywordsNextFocus = { 27422 topics: '.btn-filter-location', 27423 location: '.btn-filter-suitableage', 27424 suitableage: '.btn-filter-duration', 27425 duration: '.btn-filter-groupsize', 27426 groupsize: '.tx-wco-method-link' 27427 }; 27428 var nextBtnFilter = document.querySelector(filterKeywordsNextFocus[filterKeyword]); 27429 if (filterKeyword === "topics" || filterKeyword === "location") { 27430 var btnGroup = document.querySelector("#filter-" + filterKeyword + " .button-group"); 27431 var firstFilterTopic = btnGroup.firstChild; 27432 var lastFilterTopic = btnGroup.lastChild; 27433 btnFilter.addEventListener("focusout", function () { 27434 firstFilterTopic.focus(); 27435 }); 27436 lastFilterTopic.addEventListener("focusout", function () { 27437 nextBtnFilter.focus(); 27438 }); 27439 } else { 27440 var noUiHandels = Array.from(document.querySelectorAll("#filter-" + filterKeyword + " .wco-range-slider .noUi-base .noUi-handle")); 27441 btnFilter.addEventListener("focusout", function () { 27442 noUiHandels[0].focus(); 27443 }); 27444 noUiHandels[1].addEventListener("focusout", function () { 27445 nextBtnFilter.focus(); 27446 }); 27447 } 27448 } 27449 }]); 27450}(); 27451 27452},{"@babel/runtime/helpers/classCallCheck":59,"@babel/runtime/helpers/createClass":60,"@babel/runtime/helpers/interopRequireDefault":61,"isotope-layout":69,"jquery":75,"n
27452ouislider":77,"wnumb":80}],59:[function(require,module,exports){ 27453arguments[4][13][0].apply(exports,arguments) 27454},{"dup":13}],60:[function(require,module,exports){ 27455arguments[4][14][0].apply(exports,arguments) 27456},{"./toPropertyKey.js":63,"dup":14}],61:[function(require,module,exports){ 27457arguments[4][19][0].apply(exports,arguments) 27458},{"dup":19}],62:[function(require,module,exports){ 27459arguments[4][23][0].apply(exports,arguments) 27460},{"./typeof.js":64,"dup":23}],63:[function(require,module,exports){ 27461arguments[4][24][0].apply(exports,arguments) 27462},{"./toPrimitive.js":62,"./typeof.js":64,"dup":24}],64:[function(require,module,exports){ 27463arguments[4][25][0].apply(exports,arguments) 27464},{"dup":25}],65:[function(require,module,exports){ 27465arguments[4][27][0].apply(exports,arguments) 27466},{"dup":27}],66:[function(require,module,exports){ 27467arguments[4][29][0].apply(exports,arguments) 27468},{"dup":29}],67:[function(require,module,exports){ 27469arguments[4][30][0].apply(exports,arguments) 27470},{"desandro-matches-selector":65,"dup":30}],68:[function(require,module,exports){ 27471arguments[4][31][0].apply(exports,arguments) 27472},{"dup":31}],69:[function(require,module,exports){ 27473arguments[4][32][0].apply(exports,arguments) 27474},{"./item":70,"./layout-mode":71,"./layout-modes/fit-rows":72,"./layout-modes/masonry":73,"./layout-modes/vertical":74,"desandro-matches-selector":65,"dup":32,"fizzy-ui-utils":67,"get-size":68,"outlayer":79}],70:[function(require,module,exports){ 27475arguments[4][33][0].apply(exports,arguments) 27476},{"dup":33,"outlayer":79}],71:[function(require,module,exports){ 27477arguments[4][34][0].apply(exports,arguments) 27478},{"dup":34,"get-size":68,"outlayer":79}],72:[function(require,module,exports){ 27479arguments[4][35][0].apply(exports,arguments) 27480},{"../layout-mode":71,"dup":35}],73:[function(require,module,exports){ 27481arguments[4][36][0].apply(exports,arguments) 27482},{"../layout-mode":71,"dup":36,"masonry-layout":76}],74:[function(require,module,exports){ 27483arguments[4][37][0].apply(exports,arguments) 27484},{"../layout-mode":71,"dup":37}],75:[function(require,module,exports){
vendor: 285,314 bytes, lines 27485-38200
27485/*! 27486 * jQuery JavaScript Library v3.7.1 27487 * https://jquery.com/ 27488 * 27489 * Copyright OpenJS Foundation and other contributors 27490 * Released under the MIT license 27491 * https://jquery.org/license 27492 * 27493 * Date: 2023-08-28T13:37Z 27494 */ 27495( function( global, factory ) { 27496 27497 "use strict"; 27498 27499 if ( typeof module === "object" && typeof module.exports === "object" ) { 27500 27501 // For CommonJS and CommonJS-like environments where a proper `window` 27502 // is present, execute the factory and get jQuery. 27503 // For environments that do not have a `window` with a `document` 27504 // (such as Node.js), expose a factory as module.exports. 27505 // This accentuates the need for the creation of a real `window`. 27506 // e.g. var jQuery = require("jquery")(window); 27507 // See ticket trac-14549 for more info. 27508 module.exports = global.document ? 27509 factory( global, true ) : 27510 function( w ) { 27511 if ( !w.document ) { 27512 throw new Error( "jQuery requires a window with a document" ); 27513 } 27514 return factory( w ); 27515 }; 27516 } else { 27517 factory( global ); 27518 } 27519 27520// Pass this if window is not defined yet 27521} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { 27522 27523// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 27524// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode 27525// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common 27526// enough that all such attempts are guarded in a try block. 27527"use strict"; 27528 27529var arr = []; 27530 27531var getProto = Object.getPrototypeOf; 27532 27533var slice = arr.slice; 27534 27535var flat = arr.flat ? function( array ) { 27536 return arr.flat.call( array ); 27537} : function( array ) { 27538 return arr.concat.apply( [], array ); 27539}; 27540 27541 27542var push = arr.push; 27543 27544var indexOf = arr.indexOf; 27545 27546var class2type = {}; 27547 27548var toString = class2type.toString; 27549 27550var hasOwn = class2type.hasOwnProperty; 27551 27552var fnToString = hasOwn.toString; 27553 27554var ObjectFunctionString = fnToString.call( Object ); 27555 27556var support = {}; 27557 27558var isFunction = function isFunction( obj ) { 27559 27560 // Support: Chrome <=57, Firefox <=52 27561 // In some browsers, typeof returns "function" for HTML <object> elements 27562 // (i.e., `typeof document.createElement( "object" ) === "function"`). 27563 // We don't want to classify *any* DOM node as a function. 27564 // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 27565 // Plus for old WebKit, typeof returns "function" for HTML collections 27566 // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) 27567 return typeof obj === "function" && typeof obj.nodeType !== "number" && 27568 typeof obj.item !== "function"; 27569 }; 27570 27571 27572var isWindow = function isWindow( obj ) { 27573 return obj != null && obj === obj.window; 27574 }; 27575 27576 27577var document = window.document; 27578 27579 27580 27581 var preservedScriptAttributes = { 27582 type: true, 27583 src: true, 27584 nonce: true, 27585 noModule: true 27586 }; 27587 27588 function DOMEval( code, node, doc ) { 27589 doc = doc || document; 27590 27591 var i, val, 27592 script = doc.createElement( "script" ); 27593 27594 script.text = code; 27595 if ( node ) { 27596 for ( i in preservedScriptAttributes ) { 27597 27598 // Support: Firefox 64+, Edge 18+ 27599 // Some browsers don't support the "nonce" property on scripts. 27600 // On the other hand, just using `getAttribute` is not enough as 27601 // the `nonce` attribute is reset to an empty string whenever it 27602 // becomes browsing-context connected. 27603 // See https://github.com/whatwg/html/issues/2369 27604 // See https://html.spec.whatwg.org/#nonce-attributes 27605 // The `node.getAttribute` check was added for the sake of 27606 // `jQuery.globalEval` so that it can fake a nonce-containing node 27607 // via an object. 27608 val = node[ i ] || node.getAttribute && node.getAttribute( i ); 27609 if ( val ) { 27610 script.setAttribute( i, val ); 27611 } 27612 } 27613 } 27614 doc.head.appendChild( script ).parentNode.removeChild( script ); 27615 } 27616 27617 27618function toType( obj ) { 27619 if ( obj == null ) { 27620 return obj + ""; 27621 } 27622 27623 // Support: Android <=2.3 only (functionish RegExp) 27624 return typeof obj === "object" || typeof obj === "function" ? 27625 class2type[ toString.call( obj ) ] || "object" : 27626 typeof obj; 27627} 27628/* global Symbol */ 27629// Defining this global in .eslintrc.json would create a danger of using the global 27630// unguarded in another place, it seems safer to define global only for this module 27631 27632 27633 27634var version = "3.7.1", 27635 27636 rhtmlSuffix = /HTML$/i, 27637 27638 // Define a local copy of jQuery 27639 jQuery = function( selector, context ) { 27640 27641 // The jQuery object is actually just the init constructor 'enhanced' 27642 // Need init if jQuery is called (just allow error to be thrown if not included) 27643 return new jQuery.fn.init( selector, context ); 27644 }; 27645 27646jQuery.fn = jQuery.prototype = { 27647 27648 // The current version of jQuery being used 27649 jquery: version, 27650 27651 constructor: jQuery, 27652 27653 // The default length of a jQuery object is 0 27654 length: 0, 27655 27656 toArray: function() { 27657 return slice.call( this ); 27658 }, 27659 27660 // Get the Nth element in the matched element set OR 27661 // Get the whole matched element set as a clean array 27662 get: function( num ) { 27663 27664 // Return all the elements in a clean array 27665 if ( num == null ) { 27666 return slice.call( this ); 27667 } 27668 27669 // Return just the one element from the set 27670 return num < 0 ? this[ num + this.length ] : this[ num ]; 27671 }, 27672 27673 // Take an array of elements and push it onto the stack 27674 // (returning the new matched element set) 27675 pushStack: function( elems ) { 27676 27677 // Build a new jQuery matched element set 27678 var ret = jQuery.merge( this.constructor(), elems ); 27679 27680 // Add the old object onto the stack (as a reference) 27681 ret.prevObject = this; 27682 27683 // Return the newly-formed element set 27684 return ret; 27685 }, 27686 27687 // Execute a callback for every element in the matched set. 27688 each: function( callback ) { 27689 return jQuery.each( this, callback ); 27690 }, 27691 27692 map: function( callback ) { 27693 return this.pushStack( jQuery.map( this, function( elem, i ) { 27694 return callback.call( elem, i, elem ); 27695 } ) ); 27696 }, 27697 27698 slice: function() { 27699 return this.pushStack( slice.apply( this, arguments ) ); 27700 }, 27701 27702 first: function() { 27703 return this.eq( 0 ); 27704 }, 27705 27706 last: function() { 27707 return this.eq( -1 ); 27708 }, 27709 27710 even: function() { 27711 return this.pushStack( jQuery.grep( this, function( _elem, i ) { 27712 return ( i + 1 ) % 2; 27713 } ) ); 27714 }, 27715 27716 odd: function() { 27717 return this.pushStack( jQuery.grep( this, function( _elem, i ) { 27718 return i % 2; 27719 } ) ); 27720 }, 27721 27722 eq: function( i ) { 27723 var len = this.length, 27724 j = +i + ( i < 0 ? len : 0 ); 27725 return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); 27726 }, 27727 27728 end: function() { 27729 return this.prevObject || this.constructor(); 27730 }, 27731 27732 // For internal use only. 27733 // Behaves like an Array's method, not like a jQuery method. 27734 push: push, 27735 sort: arr.sort, 27736 splice: arr.splice 27737}; 27738 27739jQuery.extend = jQuery.fn.extend = function() { 27740 var options, name, src, copy, copyIsArray, clone, 27741 target = arguments[ 0 ] || {}, 27742 i = 1, 27743 length = arguments.length, 27744 deep = false; 27745 27746 // Handle a deep copy situation 27747 if ( typeof target === "boolean" ) { 27748 deep = target; 27749 27750 // Skip the boolean and the target 27751 target = arguments[ i ] || {}; 27752 i++; 27753 } 27754 27755 // Handle case when target is a string or something (possible in deep copy) 27756 if ( typeof target !== "object" && !isFunction( target ) ) { 27757 target = {}; 27758 } 27759 27760 // Extend jQuery itself if only one argument is passed 27761 if ( i === length ) { 27762 target = this; 27763 i--; 27764 } 27765 27766 for ( ; i < length; i++ ) { 27767 27768 // Only deal with non-null/undefined values 27769 if ( ( options = arguments[ i ] ) != null ) { 27770 27771 // Extend the base object 27772 for ( name in options ) { 27773 copy = options[ name ]; 27774 27775 // Prevent Object.prototype pollution 27776 // Prevent never-ending loop 27777 if ( name === "__proto__" || target === copy ) { 27778 continue; 27779 } 27780 27781 // Recurse if we're merging plain objects or arrays 27782 if ( deep && copy && ( jQuery.isPlainObject( copy ) || 27783 ( copyIsArray = Array.isArray( copy ) ) ) ) { 27784 src = target[ name ]; 27785 27786 // Ensure proper type for the source value 27787 if ( copyIsArray && !Array.isArray( src ) ) { 27788 clone = []; 27789 } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { 27790 clone = {}; 27791 } else { 27792 clone = src; 27793 } 27794 copyIsArray = false; 27795 27796 // Never move original objects, clone them 27797 target[ name ] = jQuery.extend( deep, clone, copy ); 27798 27799 // Don't bring in undefined values 27800 } else if ( copy !== undefined ) { 27801 target[ name ] = copy; 27802 } 27803 } 27804 } 27805 } 27806 27807 // Return the modified object 27808 return target; 27809}; 27810 27811jQuery.extend( { 27812 27813 // Unique for each copy of jQuery on the page 27814 expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), 27815 27816 // Assume jQuery is ready without the ready module 27817 isReady: true, 27818 27819 error: function( msg ) { 27820 throw new Error( msg ); 27821 }, 27822 27823 noop: function() {}, 27824 27825 isPlainObject: function( obj ) { 27826 var proto, Ctor; 27827 27828 // Detect obvious negatives 27829 // Use toString instead of jQuery.type to catch host objects 27830 if ( !obj || toString.call( obj ) !== "[object Object]" ) { 27831 return false; 27832 } 27833 27834 proto = getProto( obj ); 27835 27836 // Objects with no prototype (e.g., `Object.create( null )`) are plain 27837 if ( !proto ) { 27838 return true; 27839 } 27840 27841 // Objects with prototype are plain iff they were constructed by a global Object function 27842 Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; 27843 return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; 27844 }, 27845 27846 isEmptyObject: function( obj ) { 27847 var name; 27848 27849 for ( name in obj ) { 27850 return false; 27851 } 27852 return true; 27853 }, 27854 27855 // Evaluates a script in a provided context; falls back to the global one 27856 // if not specified. 27857 globalEval: function( code, options, doc ) { 27858 DOMEval( code, { nonce: options && options.nonce }, doc ); 27859 }, 27860 27861 each: function( obj, callback ) { 27862 var length, i = 0; 27863 27864 if ( isArrayLike( obj ) ) { 27865 length = obj.length; 27866 for ( ; i < length; i++ ) { 27867 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 27868 break; 27869 } 27870 } 27871 } else { 27872 for ( i in obj ) { 27873 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 27874 break; 27875 } 27876 } 27877 } 27878 27879 return obj; 27880 }, 27881 27882 27883 // Retrieve the text value of an array of DOM nodes 27884 text: function( elem ) { 27885 var node, 27886 ret = "", 27887 i = 0, 27888 nodeType = elem.nodeType; 27889 27890 if ( !nodeType ) { 27891 27892 // If no nodeType, this is expected to be an array 27893 while ( ( node = elem[ i++ ] ) ) { 27894 27895 // Do not traverse comment nodes 27896 ret += jQuery.text( node ); 27897 } 27898 } 27899 if ( nodeType === 1 || nodeType === 11 ) { 27900 return elem.textContent; 27901 } 27902 if ( nodeType === 9 ) { 27903 return elem.documentElement.textContent; 27904 } 27905 if ( nodeType === 3 || nodeType === 4 ) { 27906 return elem.nodeValue; 27907 } 27908 27909 // Do not include comment or processing instruction nodes 27910 27911 return ret; 27912 }, 27913 27914 // results is for internal usage only 27915 makeArray: function( arr, results ) { 27916 var ret = results || []; 27917 27918 if ( arr != null ) { 27919 if ( isArrayLike( Object( arr ) ) ) { 27920 jQuery.merge( ret, 27921 typeof arr === "string" ? 27922 [ arr ] : arr 27923 ); 27924 } else { 27925 push.call( ret, arr ); 27926 } 27927 } 27928 27929 return ret; 27930 }, 27931 27932 inArray: function( elem, arr, i ) { 27933 return arr == null ? -1 : indexOf.call( arr, elem, i ); 27934 }, 27935 27936 isXMLDoc: function( elem ) { 27937 var namespace = elem && elem.namespaceURI, 27938 docElem = elem && ( elem.ownerDocument || elem ).documentElement; 27939 27940 // Assume HTML when documentElement doesn't yet exist, such as inside 27941 // document fragments. 27942 return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" ); 27943 }, 27944 27945 // Support: Android <=4.0 only, PhantomJS 1 only 27946 // push.apply(_, arraylike) throws on ancient WebKit 27947 merge: function( first, second ) { 27948 var len = +second.length, 27949 j = 0, 27950 i = first.length; 27951 27952 for ( ; j < len; j++ ) { 27953 first[ i++ ] = second[ j ]; 27954 } 27955 27956 first.length = i; 27957 27958 return first; 27959 }, 27960 27961 grep: function( elems, callback, invert ) { 27962 var callbackInverse, 27963 matches = [], 27964 i = 0, 27965 length = elems.length, 27966 callbackExpect = !invert; 27967 27968 // Go through the array, only saving the items 27969 // that pass the validator function 27970 for ( ; i < length; i++ ) { 27971 callbackInverse = !callback( elems[ i ], i ); 27972 if ( callbackInverse !== callbackExpect ) { 27973 matches.push( elems[ i ] ); 27974 } 27975 } 27976 27977 return matches; 27978 }, 27979 27980 // arg is for internal usage only 27981 map: function( elems, callback, arg ) { 27982 var length, value, 27983 i = 0, 27984 ret = []; 27985 27986 // Go through the array, translating each of the items to their new values 27987 if ( isArrayLike( elems ) ) { 27988 length = elems.length; 27989 for ( ; i < length; i++ ) { 27990 value = callback( elems[ i ], i, arg ); 27991 27992 if ( value != null ) { 27993 ret.push( value ); 27994 } 27995 } 27996 27997 // Go through every key on the object, 27998 } else { 27999 for ( i in elems ) { 28000 value = callback( elems[ i ], i, arg ); 28001 28002 if ( value != null ) { 28003 ret.push( value ); 28004 } 28005 } 28006 } 28007 28008 // Flatten any nested arrays 28009 return flat( ret ); 28010 }, 28011 28012 // A global GUID counter for objects 28013 guid: 1, 28014 28015 // jQuery.support is not used in Core but other projects attach their 28016 // properties to it so it needs to exist. 28017 support: support 28018} ); 28019 28020if ( typeof Symbol === "function" ) { 28021 jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; 28022} 28023 28024// Populate the class2type map 28025jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), 28026 function( _i, name ) { 28027 class2type[ "[object " + name + "]" ] = name.toLowerCase(); 28028 } ); 28029 28030function isArrayLike( obj ) { 28031 28032 // Support: real iOS 8.2 only (not reproducible in simulator) 28033 // `in` check used to prevent JIT error (gh-2145) 28034 // hasOwn isn't used here due to false negatives 28035 // regarding Nodelist length in IE 28036 var length = !!obj && "length" in obj && obj.length, 28037 type = toType( obj ); 28038 28039 if ( isFunction( obj ) || isWindow( obj ) ) { 28040 return false; 28041 } 28042 28043 return type === "array" || length === 0 || 28044 typeof length === "number" && length > 0 && ( length - 1 ) in obj; 28045} 28046 28047 28048function nodeName( elem, name ) { 28049 28050 return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); 28051 28052} 28053var pop = arr.pop; 28054 28055 28056var sort = arr.sort; 28057 28058 28059var splice = arr.splice; 28060 28061 28062var whitespace = "[\\x20\\t\\r\\n\\f]"; 28063 28064 28065var rtrimCSS = new RegExp( 28066 "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", 28067 "g" 28068); 28069 28070 28071 28072 28073// Note: an element does not contain itself 28074jQuery.contains = function( a, b ) { 28075 var bup = b && b.parentNode; 28076 28077 return a === bup || !!( bup && bup.nodeType === 1 && ( 28078 28079 // Support: IE 9 - 11+ 28080 // IE doesn't have `contains` on SVG. 28081 a.contains ? 28082 a.contains( bup ) : 28083 a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 28084 ) ); 28085}; 28086 28087 28088 28089 28090// CSS string/identifier serialization 28091// https://drafts.csswg.org/cssom/#common-serializing-idioms 28092var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; 28093 28094function fcssescape( ch, asCodePoint ) { 28095 if ( asCodePoint ) { 28096 28097 // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER 28098 if ( ch === "\0" ) { 28099 return "\uFFFD"; 28100 } 28101 28102 // Control characters and (dependent upon position) numbers get escaped as code points 28103 return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; 28104 } 28105 28106 // Other potentially-special ASCII characters get backslash-escaped 28107 return "\\" + ch; 28108} 28109 28110jQuery.escapeSelector = function( sel ) { 28111 return ( sel + "" ).replace( rcssescape, fcssescape ); 28112}; 28113 28114 28115 28116 28117var preferredDoc = document, 28118 pushNative = push; 28119 28120( function() { 28121 28122var i, 28123 Expr, 28124 outermostContext, 28125 sortInput, 28126 hasDuplicate, 28127 push = pushNative, 28128 28129 // Local document vars 28130 document, 28131 documentElement, 28132 documentIsHTML, 28133 rbuggyQSA, 28134 matches, 28135 28136 // Instance-specific data 28137 expando = jQuery.expando, 28138 dirruns = 0, 28139 done = 0, 28140 classCache = createCache(), 28141 tokenCache = createCache(), 28142 compilerCache = createCache(), 28143 nonnativeSelectorCache = createCache(), 28144 sortOrder = function( a, b ) { 28145 if ( a === b ) { 28146 hasDuplicate = true; 28147 } 28148 return 0; 28149 }, 28150 28151 booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" + 28152 "loop|multiple|open|readonly|required|scoped", 28153 28154 // Regular expressions 28155 28156 // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram 28157 identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + 28158 "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", 28159 28160 // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors 28161 attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + 28162 28163 // Operator (capture 2) 28164 "*([*^$|!~]?=)" + whitespace + 28165 28166 // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" 28167 "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + 28168 whitespace + "*\\]", 28169 28170 pseudos = ":(" + identifier + ")(?:\\((" + 28171 28172 // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: 28173 // 1. quoted (capture 3; capture 4 or capture 5) 28174 "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + 28175 28176 // 2. simple (capture 6) 28177 "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + 28178 28179 // 3. anything else (capture 2) 28180 ".*" + 28181 ")\\)|)", 28182 28183 // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter 28184 rwhitespace = new RegExp( whitespace + "+", "g" ), 28185 28186 rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), 28187 rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + 28188 whitespace + "*" ), 28189 rdescend = new RegExp( whitespace + "|>" ), 28190 28191 rpseudo = new RegExp( pseudos ), 28192 ridentifier = new RegExp( "^" + identifier + "$" ), 28193 28194 matchExpr = { 28195 ID: new RegExp( "^#(" + identifier + ")" ), 28196 CLASS: new RegExp( "^\\.(" + identifier + ")" ), 28197 TAG: new RegExp( "^(" + identifier + "|[*])" ), 28198 ATTR: new RegExp( "^" + attributes ), 28199 PSEUDO: new RegExp( "^" + pseudos ), 28200 CHILD: new RegExp( 28201 "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + 28202 whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + 28203 whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), 28204 bool: new RegExp( "^(?:" + booleans + ")$", "i" ), 28205 28206 // For use in libraries implementing .is() 28207 // We use this for POS matching in `select` 28208 needsContext: new RegExp( "^" + whitespace + 28209 "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + 28210 "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) 28211 }, 28212 28213 rinputs = /^(?:input|select|textarea|button)$/i, 28214 rheader = /^h\d$/i, 28215 28216 // Easily-parseable/retrievable ID or TAG or CLASS selectors 28217 rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, 28218 28219 rsibling = /[+~]/, 28220 28221 // CSS escapes 28222 // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters 28223 runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + 28224 "?|\\\\([^\\r\\n\\f])", "g" ), 28225 funescape = function( escape, nonHex ) { 28226 var high = "0x" + escape.slice( 1 ) - 0x10000; 28227 28228 if ( nonHex ) { 28229 28230 // Strip the backslash prefix from a non-hex escape sequence 28231 return nonHex; 28232 } 28233 28234 // Replace a hexadecimal escape sequence with the encoded Unicode code point 28235 // Support: IE <=11+ 28236 // For values outside the Basic Multilingual Plane (BMP), manually construct a 28237 // surrogate pair 28238 return high < 0 ? 28239 String.fromCharCode( high + 0x10000 ) : 28240 String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); 28241 }, 28242 28243 // Used for iframes; see `setDocument`. 28244 // Support: IE 9 - 11+, Edge 12 - 18+ 28245 // Removing the function wrapper causes a "Permission Denied" 28246 // error in IE/Edge. 28247 unloadHandler = function() { 28248 setDocument(); 28249 }, 28250 28251 inDisabledFieldset = addCombinator( 28252 function( elem ) { 28253 return elem.disabled === true && nodeName( elem, "fieldset" ); 28254 }, 28255 { dir: "parentNode", next: "legend" } 28256 ); 28257 28258// Support: IE <=9 only 28259// Accessing document.activeElement can throw unexpectedly 28260// https://bugs.jquery.com/ticket/13393 28261function safeActiveElement() { 28262 try { 28263 return document.activeElement; 28264 } catch ( err ) { } 28265} 28266 28267// Optimize for push.apply( _, NodeList ) 28268try { 28269 push.apply( 28270 ( arr = slice.call( preferredDoc.childNodes ) ), 28271 preferredDoc.childNodes 28272 ); 28273 28274 // Support: Android <=4.0 28275 // Detect silently failing push.apply 28276 // eslint-disable-next-line no-unused-expressions 28277 arr[ preferredDoc.childNodes.length ].nodeType; 28278} catch ( e ) { 28279 push = { 28280 apply: function( target, els ) { 28281 pushNative.apply( target, slice.call( els ) ); 28282 }, 28283 call: function( target ) { 28284 pushNative.apply( target, slice.call( arguments, 1 ) ); 28285 } 28286 }; 28287} 28288 28289function find( selector, context, results, seed ) { 28290 var m, i, elem, nid, match, groups, newSelector, 28291 newContext = context && context.ownerDocument, 28292 28293 // nodeType defaults to 9, since context defaults to document 28294 nodeType = context ? context.nodeType : 9; 28295 28296 results = results || []; 28297 28298 // Return early from calls with invalid selector or context 28299 if ( typeof selector !== "string" || !selector || 28300 nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { 28301 28302 return results; 28303 } 28304 28305 // Try to shortcut find operations (as opposed to filters) in HTML documents 28306 if ( !seed ) { 28307 setDocument( context ); 28308 context = context || document; 28309 28310 if ( documentIsHTML ) { 28311 28312 // If the selector is sufficiently simple, try using a "get*By*" DOM method 28313 // (excepting DocumentFragment context, where the methods don't exist) 28314 if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { 28315 28316 // ID selector 28317 if ( ( m = match[ 1 ] ) ) { 28318 28319 // Document context 28320 if ( nodeType === 9 ) { 28321 if ( ( elem = context.getElementById( m ) ) ) { 28322 28323 // Support: IE 9 only 28324 // getElementById can match elements by name instead of ID 28325 if ( elem.id === m ) { 28326 push.call( results, elem ); 28327 return results; 28328 } 28329 } else { 28330 return results; 28331 } 28332 28333 // Element context 28334 } else { 28335 28336 // Support: IE 9 only 28337 // getElementById can match elements by name instead of ID 28338 if ( newContext && ( elem = newContext.getElementById( m ) ) && 28339 find.contains( context, elem ) && 28340 elem.id === m ) { 28341 28342 push.call( results, elem ); 28343 return results; 28344 } 28345 } 28346 28347 // Type selector 28348 } else if ( match[ 2 ] ) { 28349 push.apply( results, context.getElementsByTagName( selector ) ); 28350 return results; 28351 28352 // Class selector 28353 } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) { 28354 push.apply( results, context.getElementsByClassName( m ) ); 28355 return results; 28356 } 28357 } 28358 28359 // Take advantage of querySelectorAll 28360 if ( !nonnativeSelectorCache[ selector + " " ] && 28361 ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) { 28362 28363 newSelector = selector; 28364 newContext = context; 28365 28366 // qSA considers elements outside a scoping root when evaluating child or 28367 // descendant combinators, which is not what we want. 28368 // In such cases, we work around the behavior by prefixing every selector in the 28369 // list with an ID selector referencing the scope context. 28370 // The technique has to be used as well when a leading combinator is used 28371 // as such selectors are not recognized by querySelectorAll. 28372 // Thanks to Andrew Dupont for this technique. 28373 if ( nodeType === 1 && 28374 ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) { 28375 28376 // Expand context for sibling selectors 28377 newContext = rsibling.test( selector ) && testContext( context.parentNode ) || 28378 context; 28379 28380 // We can use :scope instead of the ID hack if the browser 28381 // supports it & if we're not changing the context. 28382 // Support: IE 11+, Edge 17 - 18+ 28383 // IE/Edge sometimes throw a "Permission denied" error when 28384 // strict-comparing two documents; shallow comparisons work. 28385 // eslint-disable-next-line eqeqeq 28386 if ( newContext != context || !support.scope ) { 28387 28388 // Capture the context ID, setting it first if necessary 28389 if ( ( nid = context.getAttribute( "id" ) ) ) { 28390 nid = jQuery.escapeSelector( nid ); 28391 } else { 28392 context.setAttribute( "id", ( nid = expando ) ); 28393 } 28394 } 28395 28396 // Prefix every selector in the list 28397 groups = tokenize( selector ); 28398 i = groups.length; 28399 while ( i-- ) { 28400 groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + 28401 toSelector( groups[ i ] ); 28402 } 28403 newSelector = groups.join( "," ); 28404 } 28405 28406 try { 28407 push.apply( results, 28408 newContext.querySelectorAll( newSelector ) 28409 ); 28410 return results; 28411 } catch ( qsaError ) { 28412 nonnativeSelectorCache( selector, true ); 28413 } finally { 28414 if ( nid === expando ) { 28415 context.removeAttribute( "id" ); 28416 } 28417 } 28418 } 28419 } 28420 } 28421 28422 // All others 28423 return select( selector.replace( rtrimCSS, "$1" ), context, results, seed ); 28424} 28425 28426/** 28427 * Create key-value caches of limited size 28428 * @returns {function(string, object)} Returns the Object data after storing it on itself with 28429 * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) 28430 * deleting the oldest entry 28431 */ 28432function createCache() { 28433 var keys = []; 28434 28435 function cache( key, value ) { 28436 28437 // Use (key + " ") to avoid collision with native prototype properties 28438 // (see https://github.com/jquery/sizzle/issues/157) 28439 if ( keys.push( key + " " ) > Expr.cacheLength ) { 28440 28441 // Only keep the most recent entries 28442 delete cache[ keys.shift() ]; 28443 } 28444 return ( cache[ key + " " ] = value ); 28445 } 28446 return cache; 28447} 28448 28449/** 28450 * Mark a function for special use by jQuery selector module 28451 * @param {Function} fn The function to mark 28452 */ 28453function markFunction( fn ) { 28454 fn[ expando ] = true; 28455 return fn; 28456} 28457 28458/** 28459 * Support testing using an element 28460 * @param {Function} fn Passed the created element and returns a boolean result 28461 */ 28462function assert( fn ) { 28463 var el = document.createElement( "fieldset" ); 28464 28465 try { 28466 return !!fn( el ); 28467 } catch ( e ) { 28468 return false; 28469 } finally { 28470 28471 // Remove from its parent by default 28472 if ( el.parentNode ) { 28473 el.parentNode.removeChild( el ); 28474 } 28475 28476 // release memory in IE 28477 el = null; 28478 } 28479} 28480 28481/** 28482 * Returns a function to use in pseudos for input types 28483 * @param {String} type 28484 */ 28485function createInputPseudo( type ) { 28486 return function( elem ) { 28487 return nodeName( elem, "input" ) && elem.type === type; 28488 }; 28489} 28490 28491/** 28492 * Returns a function to use in pseudos for buttons 28493 * @param {String} type 28494 */ 28495function createButtonPseudo( type ) { 28496 return function( elem ) { 28497 return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) && 28498 elem.type === type; 28499 }; 28500} 28501 28502/** 28503 * Returns a function to use in pseudos for :enabled/:disabled 28504 * @param {Boolean} disabled true for :disabled; false for :enabled 28505 */ 28506function createDisabledPseudo( disabled ) { 28507 28508 // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable 28509 return function( elem ) { 28510 28511 // Only certain elements can match :enabled or :disabled 28512 // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled 28513 // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled 28514 if ( "form" in elem ) { 28515 28516 // Check for inherited disabledness on relevant non-disabled elements: 28517 // * listed form-associated elements in a disabled fieldset 28518 // https://html.spec.whatwg.org/multipage/forms.html#category-listed 28519 // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled 28520 // * option elements in a disabled optgroup 28521 // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled 28522 // All such elements have a "form" property. 28523 if ( elem.parentNode && elem.disabled === false ) { 28524 28525 // Option elements defer to a parent optgroup if present 28526 if ( "label" in elem ) { 28527 if ( "label" in elem.parentNode ) { 28528 return elem.parentNode.disabled === disabled; 28529 } else { 28530 return elem.disabled === disabled; 28531 } 28532 } 28533 28534 // Support: IE 6 - 11+ 28535 // Use the isDisabled shortcut property to check for disabled fieldset ancestors 28536 return elem.isDisabled === disabled || 28537 28538 // Where there is no isDisabled, check manually 28539 elem.isDisabled !== !disabled && 28540 inDisabledFieldset( elem ) === disabled; 28541 } 28542 28543 return elem.disabled === disabled; 28544 28545 // Try to winnow out elements that can't be disabled before trusting the disabled property. 28546 // Some victims get caught in our net (label, legend, menu, track), but it shouldn't 28547 // even exist on them, let alone have a boolean value. 28548 } else if ( "label" in elem ) { 28549 return elem.disabled === disabled; 28550 } 28551 28552 // Remaining elements are neither :enabled nor :disabled 28553 return false; 28554 }; 28555} 28556 28557/** 28558 * Returns a function to use in pseudos for positionals 28559 * @param {Function} fn 28560 */ 28561function createPositionalPseudo( fn ) { 28562 return markFunction( function( argument ) { 28563 argument = +argument; 28564 return markFunction( function( seed, matches ) { 28565 var j, 28566 matchIndexes = fn( [], seed.length, argument ), 28567 i = matchIndexes.length; 28568 28569 // Match elements found at the specified indexes 28570 while ( i-- ) { 28571 if ( seed[ ( j = matchIndexes[ i ] ) ] ) { 28572 seed[ j ] = !( matches[ j ] = seed[ j ] ); 28573 } 28574 } 28575 } ); 28576 } ); 28577} 28578 28579/** 28580 * Checks a node for validity as a jQuery selector context 28581 * @param {Element|Object=} context 28582 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value 28583 */ 28584function testContext( context ) { 28585 return context && typeof context.getElementsByTagName !== "undefined" && context; 28586} 28587 28588/** 28589 * Sets document-related variables once based on the current document 28590 * @param {Element|Object} [node] An element or document object to use to set the document 28591 * @returns {Object} Returns the current document 28592 */ 28593function setDocument( node ) { 28594 var subWindow, 28595 doc = node ? node.ownerDocument || node : preferredDoc; 28596 28597 // Return early if doc is invalid or already selected 28598 // Support: IE 11+, Edge 17 - 18+ 28599 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 28600 // two documents; shallow comparisons work. 28601 // eslint-disable-next-line eqeqeq 28602 if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { 28603 return document; 28604 } 28605 28606 // Update global variables 28607 document = doc; 28608 documentElement = document.documentElement; 28609 documentIsHTML = !jQuery.isXMLDoc( document ); 28610 28611 // Support: iOS 7 only, IE 9 - 11+ 28612 // Older browsers didn't support unprefixed `matches`. 28613 matches = documentElement.matches || 28614 documentElement.webkitMatchesSelector || 28615 documentElement.msMatchesSelector; 28616 28617 // Support: IE 9 - 11+, Edge 12 - 18+ 28618 // Accessing iframe documents after unload throws "permission denied" errors 28619 // (see trac-13936). 28620 // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`, 28621 // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well. 28622 if ( documentElement.msMatchesSelector && 28623 28624 // Support: IE 11+, Edge 17 - 18+ 28625 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 28626 // two documents; shallow comparisons work. 28627 // eslint-disable-next-line eqeqeq 28628 preferredDoc != document && 28629 ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { 28630 28631 // Support: IE 9 - 11+, Edge 12 - 18+ 28632 subWindow.addEventListener( "unload", unloadHandler ); 28633 } 28634 28635 // Support: IE <10 28636 // Check if getElementById returns elements by name 28637 // The broken getElementById methods don't pick up programmatically-set names, 28638 // so use a roundabout getElementsByName test 28639 support.getById = assert( function( el ) { 28640 documentElement.appendChild( el ).id = jQuery.expando; 28641 return !document.getElementsByName || 28642 !document.getElementsByName( jQuery.expando ).length; 28643 } ); 28644 28645 // Support: IE 9 only 28646 // Check to see if it's possible to do matchesSelector 28647 // on a disconnected node. 28648 support.disconnectedMatch = assert( function( el ) { 28649 return matches.call( el, "*" ); 28650 } ); 28651 28652 // Support: IE 9 - 11+, Edge 12 - 18+ 28653 // IE/Edge don't support the :scope pseudo-class. 28654 support.scope = assert( function() { 28655 return document.querySelectorAll( ":scope" ); 28656 } ); 28657 28658 // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only 28659 // Make sure the `:has()` argument is parsed unforgivingly. 28660 // We include `*` in the test to detect buggy implementations that are 28661 // _selectively_ forgiving (specifically when the list includes at least 28662 // one valid selector). 28663 // Note that we treat complete lack of support for `:has()` as if it were 28664 // spec-compliant support, which is fine because use of `:has()` in such 28665 // environments will fail in the qSA path and fall back to jQuery traversal 28666 // anyway. 28667 support.cssHas = assert( function() { 28668 try { 28669 document.querySelector( ":has(*,:jqfake)" ); 28670 return false; 28671 } catch ( e ) { 28672 return true; 28673 } 28674 } ); 28675 28676 // ID filter and find 28677 if ( support.getById ) { 28678 Expr.filter.ID = function( id ) { 28679 var attrId = id.replace( runescape, funescape ); 28680 return function( elem ) { 28681 return elem.getAttribute( "id" ) === attrId; 28682 }; 28683 }; 28684 Expr.find.ID = function( id, context ) { 28685 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { 28686 var elem = context.getElementById( id ); 28687 return elem ? [ elem ] : []; 28688 } 28689 }; 28690 } else { 28691 Expr.filter.ID = function( id ) { 28692 var attrId = id.replace( runescape, funescape ); 28693 return function( elem ) { 28694 var node = typeof elem.getAttributeNode !== "undefined" && 28695 elem.getAttributeNode( "id" ); 28696 return node && node.value === attrId; 28697 }; 28698 }; 28699 28700 // Support: IE 6 - 7 only 28701 // getElementById is not reliable as a find shortcut 28702 Expr.find.ID = function( id, context ) { 28703 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { 28704 var node, i, elems, 28705 elem = context.getElementById( id ); 28706 28707 if ( elem ) { 28708 28709 // Verify the id attribute 28710 node = elem.getAttributeNode( "id" ); 28711 if ( node && node.value === id ) { 28712 return [ elem ]; 28713 } 28714 28715 // Fall back on getElementsByName 28716 elems = context.getElementsByName( id ); 28717 i = 0; 28718 while ( ( elem = elems[ i++ ] ) ) { 28719 node = elem.getAttributeNode( "id" ); 28720 if ( node && node.value === id ) { 28721 return [ elem ]; 28722 } 28723 } 28724 } 28725 28726 return []; 28727 } 28728 }; 28729 } 28730 28731 // Tag 28732 Expr.find.TAG = function( tag, context ) { 28733 if ( typeof context.getElementsByTagName !== "undefined" ) { 28734 return context.getElementsByTagName( tag ); 28735 28736 // DocumentFragment nodes don't have gEBTN 28737 } else { 28738 return context.querySelectorAll( tag ); 28739 } 28740 }; 28741 28742 // Class 28743 Expr.find.CLASS = function( className, context ) { 28744 if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { 28745 return context.getElementsByClassName( className ); 28746 } 28747 }; 28748 28749 /* QSA/matchesSelector 28750 ---------------------------------------------------------------------- */ 28751 28752 // QSA and matchesSelector support 28753 28754 rbuggyQSA = []; 28755 28756 // Build QSA regex 28757 // Regex strategy adopted from Diego Perini 28758 assert( function( el ) { 28759 28760 var input; 28761 28762 documentElement.appendChild( el ).innerHTML = 28763 "<a id='" + expando + "' href='' disabled='disabled'></a>" + 28764 "<select id='" + expando + "-\r\\' disabled='disabled'>" + 28765 "<option selected=''></option></select>"; 28766 28767 // Support: iOS <=7 - 8 only 28768 // Boolean attributes and "value" are not treated correctly in some XML documents 28769 if ( !el.querySelectorAll( "[selected]" ).length ) { 28770 rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); 28771 } 28772 28773 // Support: iOS <=7 - 8 only 28774 if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { 28775 rbuggyQSA.push( "~=" ); 28776 } 28777 28778 // Support: iOS 8 only 28779 // https://bugs.webkit.org/show_bug.cgi?id=136851 28780 // In-page `selector#id sibling-combinator selector` fails 28781 if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { 28782 rbuggyQSA.push( ".#.+[+~]" ); 28783 } 28784 28785 // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ 28786 // In some of the document kinds, these selectors wouldn't work natively. 28787 // This is probably OK but for backwards compatibility we want to maintain 28788 // handling them through jQuery traversal in jQuery 3.x. 28789 if ( !el.querySelectorAll( ":checked" ).length ) { 28790 rbuggyQSA.push( ":checked" ); 28791 } 28792 28793 // Support: Windows 8 Native Apps 28794 // The type and name attributes are restricted during .innerHTML assignment 28795 input = document.createElement( "input" ); 28796 input.setAttribute( "type", "hidden" ); 28797 el.appendChild( input ).setAttribute( "name", "D" ); 28798 28799 // Support: IE 9 - 11+ 28800 // IE's :disabled selector does not pick up the children of disabled fieldsets 28801 // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ 28802 // In some of the document kinds, these selectors wouldn't work natively. 28803 // This is probably OK but for backwards compatibility we want to maintain 28804 // handling them through jQuery traversal in jQuery 3.x. 28805 documentElement.appendChild( el ).disabled = true; 28806 if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { 28807 rbuggyQSA.push( ":enabled", ":disabled" ); 28808 } 28809 28810 // Support: IE 11+, Edge 15 - 18+ 28811 // IE 11/Edge don't find elements on a `[name='']` query in some cases. 28812 // Adding a temporary attribute to the document before the selection works 28813 // around the issue. 28814 // Interestingly, IE 10 & older don't seem to have the issue. 28815 input = document.createElement( "input" ); 28816 input.setAttribute( "name", "" ); 28817 el.appendChild( input ); 28818 if ( !el.querySelectorAll( "[name='']" ).length ) { 28819 rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + 28820 whitespace + "*(?:''|\"\")" ); 28821 } 28822 } ); 28823 28824 if ( !support.cssHas ) { 28825 28826 // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ 28827 // Our regular `try-catch` mechanism fails to detect natively-unsupported 28828 // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) 28829 // in browsers that parse the `:has()` argument as a forgiving selector list. 28830 // https://drafts.csswg.org/selectors/#relational now requires the argument 28831 // to be parsed unforgivingly, but browsers have not yet fully adjusted. 28832 rbuggyQSA.push( ":has" ); 28833 } 28834 28835 rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); 28836 28837 /* Sorting 28838 ---------------------------------------------------------------------- */ 28839 28840 // Document order sorting 28841 sortOrder = function( a, b ) { 28842 28843 // Flag for duplicate removal 28844 if ( a === b ) { 28845 hasDuplicate = true; 28846 return 0; 28847 } 28848 28849 // Sort on method existence if only one input has compareDocumentPosition 28850 var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; 28851 if ( compare ) { 28852 return compare; 28853 } 28854 28855 // Calculate position if both inputs belong to the same document 28856 // Support: IE 11+, Edge 17 - 18+ 28857 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 28858 // two documents; shallow comparisons work. 28859 // eslint-disable-next-line eqeqeq 28860 compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? 28861 a.compareDocumentPosition( b ) : 28862 28863 // Otherwise we know they are disconnected 28864 1; 28865 28866 // Disconnected nodes 28867 if ( compare & 1 || 28868 ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { 28869 28870 // Choose the first element that is related to our preferred document 28871 // Support: IE 11+, Edge 17 - 18+ 28872 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 28873 // two documents; shallow comparisons work. 28874 // eslint-disable-next-line eqeqeq 28875 if ( a === document || a.ownerDocument == preferredDoc && 28876 find.contains( preferredDoc, a ) ) { 28877 return -1; 28878 } 28879 28880 // Support: IE 11+, Edge 17 - 18+ 28881 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 28882 // two documents; shallow comparisons work. 28883 // eslint-disable-next-line eqeqeq 28884 if ( b === document || b.ownerDocument == preferredDoc && 28885 find.contains( preferredDoc, b ) ) { 28886 return 1; 28887 } 28888 28889 // Maintain original order 28890 return sortInput ? 28891 ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : 28892 0; 28893 } 28894 28895 return compare & 4 ? -1 : 1; 28896 }; 28897 28898 return document; 28899} 28900 28901find.matches = function( expr, elements ) { 28902 return find( expr, null, null, elements ); 28903}; 28904 28905find.matchesSelector = function( elem, expr ) { 28906 setDocument( elem ); 28907 28908 if ( documentIsHTML && 28909 !nonnativeSelectorCache[ expr + " " ] && 28910 ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { 28911 28912 try { 28913 var ret = matches.call( elem, expr ); 28914 28915 // IE 9's matchesSelector returns false on disconnected nodes 28916 if ( ret || support.disconnectedMatch || 28917 28918 // As well, disconnected nodes are said to be in a document 28919 // fragment in IE 9 28920 elem.document && elem.document.nodeType !== 11 ) { 28921 return ret; 28922 } 28923 } catch ( e ) { 28924 nonnativeSelectorCache( expr, true ); 28925 } 28926 } 28927 28928 return find( expr, document, null, [ elem ] ).length > 0; 28929}; 28930 28931find.contains = function( context, elem ) { 28932 28933 // Set document vars if needed 28934 // Support: IE 11+, Edge 17 - 18+ 28935 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 28936 // two documents; shallow comparisons work. 28937 // eslint-disable-next-line eqeqeq 28938 if ( ( context.ownerDocument || context ) != document ) { 28939 setDocument( context ); 28940 } 28941 return jQuery.contains( context, elem ); 28942}; 28943 28944 28945find.attr = function( elem, name ) { 28946 28947 // Set document vars if needed 28948 // Support: IE 11+, Edge 17 - 18+ 28949 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 28950 // two documents; shallow comparisons work. 28951 // eslint-disable-next-line eqeqeq 28952 if ( ( elem.ownerDocument || elem ) != document ) { 28953 setDocument( elem ); 28954 } 28955 28956 var fn = Expr.attrHandle[ name.toLowerCase() ], 28957 28958 // Don't get fooled by Object.prototype properties (see trac-13807) 28959 val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? 28960 fn( elem, name, !documentIsHTML ) : 28961 undefined; 28962 28963 if ( val !== undefined ) { 28964 return val; 28965 } 28966 28967 return elem.getAttribute( name ); 28968}; 28969 28970find.error = function( msg ) { 28971 throw new Error( "Syntax error, unrecognized expression: " + msg ); 28972}; 28973 28974/** 28975 * Document sorting and removing duplicates 28976 * @param {ArrayLike} results 28977 */ 28978jQuery.uniqueSort = function( results ) { 28979 var elem, 28980 duplicates = [], 28981 j = 0, 28982 i = 0; 28983 28984 // Unless we *know* we can detect duplicates, assume their presence 28985 // 28986 // Support: Android <=4.0+ 28987 // Testing for detecting duplicates is unpredictable so instead assume we can't 28988 // depend on duplicate detection in all browsers without a stable sort. 28989 hasDuplicate = !support.sortStable; 28990 sortInput = !support.sortStable && slice.call( results, 0 ); 28991 sort.call( results, sortOrder ); 28992 28993 if ( hasDuplicate ) { 28994 while ( ( elem = results[ i++ ] ) ) { 28995 if ( elem === results[ i ] ) { 28996 j = duplicates.push( i ); 28997 } 28998 } 28999 while ( j-- ) { 29000 splice.call( results, duplicates[ j ], 1 ); 29001 } 29002 } 29003 29004 // Clear input after sorting to release objects 29005 // See https://github.com/jquery/sizzle/pull/225 29006 sortInput = null; 29007 29008 return results; 29009}; 29010 29011jQuery.fn.uniqueSort = function() { 29012 return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); 29013}; 29014 29015Expr = jQuery.expr = { 29016 29017 // Can be adjusted by the user 29018 cacheLength: 50, 29019 29020 createPseudo: markFunction, 29021 29022 match: matchExpr, 29023 29024 attrHandle: {}, 29025 29026 find: {}, 29027 29028 relative: { 29029 ">": { dir: "parentNode", first: true }, 29030 " ": { dir: "parentNode" }, 29031 "+": { dir: "previousSibling", first: true }, 29032 "~": { dir: "previousSibling" } 29033 }, 29034 29035 preFilter: { 29036 ATTR: function( match ) { 29037 match[ 1 ] = match[ 1 ].replace( runescape, funescape ); 29038 29039 // Move the given value to match[3] whether quoted or unquoted 29040 match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" ) 29041 .replace( runescape, funescape ); 29042 29043 if ( match[ 2 ] === "~=" ) { 29044 match[ 3 ] = " " + match[ 3 ] + " "; 29045 } 29046 29047 return match.slice( 0, 4 ); 29048 }, 29049 29050 CHILD: function( match ) { 29051 29052 /* matches from matchExpr["CHILD"] 29053 1 type (only|nth|...) 29054 2 what (child|of-type) 29055 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 29056 4 xn-component of xn+y argument ([+-]?\d*n|) 29057 5 sign of xn-component 29058 6 x of xn-component 29059 7 sign of y-component 29060 8 y of y-component 29061 */ 29062 match[ 1 ] = match[ 1 ].toLowerCase(); 29063 29064 if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { 29065 29066 // nth-* requires argument 29067 if ( !match[ 3 ] ) { 29068 find.error( match[ 0 ] ); 29069 } 29070 29071 // numeric x and y parameters for Expr.filter.CHILD 29072 // remember that false/true cast respectively to 0/1 29073 match[ 4 ] = +( match[ 4 ] ? 29074 match[ 5 ] + ( match[ 6 ] || 1 ) : 29075 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) 29076 ); 29077 match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); 29078 29079 // other types prohibit arguments 29080 } else if ( match[ 3 ] ) { 29081 find.error( match[ 0 ] ); 29082 } 29083 29084 return match; 29085 }, 29086 29087 PSEUDO: function( match ) { 29088 var excess, 29089 unquoted = !match[ 6 ] && match[ 2 ]; 29090 29091 if ( matchExpr.CHILD.test( match[ 0 ] ) ) { 29092 return null; 29093 } 29094 29095 // Accept quoted arguments as-is 29096 if ( match[ 3 ] ) { 29097 match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; 29098 29099 // Strip excess characters from unquoted arguments 29100 } else if ( unquoted && rpseudo.test( unquoted ) && 29101 29102 // Get excess from tokenize (recursively) 29103 ( excess = tokenize( unquoted, true ) ) && 29104 29105 // advance to the next closing parenthesis 29106 ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { 29107 29108 // excess is a negative index 29109 match[ 0 ] = match[ 0 ].slice( 0, excess ); 29110 match[ 2 ] = unquoted.slice( 0, excess ); 29111 } 29112 29113 // Return only captures needed by the pseudo filter method (type and argument) 29114 return match.slice( 0, 3 ); 29115 } 29116 }, 29117 29118 filter: { 29119 29120 TAG: function( nodeNameSelector ) { 29121 var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); 29122 return nodeNameSelector === "*" ? 29123 function() { 29124 return true; 29125 } : 29126 function( elem ) { 29127 return nodeName( elem, expectedNodeName ); 29128 }; 29129 }, 29130 29131 CLASS: function( className ) { 29132 var pattern = classCache[ className + " " ]; 29133 29134 return pattern || 29135 ( pattern = new RegExp( "(^|" + whitespace + ")" + className + 29136 "(" + whitespace + "|$)" ) ) && 29137 classCache( className, function( elem ) { 29138 return pattern.test( 29139 typeof elem.className === "string" && elem.className || 29140 typeof elem.getAttribute !== "undefined" && 29141 elem.getAttribute( "class" ) || 29142 "" 29143 ); 29144 } ); 29145 }, 29146 29147 ATTR: function( name, operator, check ) { 29148 return function( elem ) { 29149 var result = find.attr( elem, name ); 29150 29151 if ( result == null ) { 29152 return operator === "!="; 29153 } 29154 if ( !operator ) { 29155 return true; 29156 } 29157 29158 result += ""; 29159 29160 if ( operator === "=" ) { 29161 return result === check; 29162 } 29163 if ( operator === "!=" ) { 29164 return result !== check; 29165 } 29166 if ( operator === "^=" ) { 29167 return check && result.indexOf( check ) === 0; 29168 } 29169 if ( operator === "*=" ) { 29170 return check && result.indexOf( check ) > -1; 29171 } 29172 if ( operator === "$=" ) { 29173 return check && result.slice( -check.length ) === check; 29174 } 29175 if ( operator === "~=" ) { 29176 return ( " " + result.replace( rwhitespace, " " ) + " " ) 29177 .indexOf( check ) > -1; 29178 } 29179 if ( operator === "|=" ) { 29180 return result === check || result.slice( 0, check.length + 1 ) === check + "-"; 29181 } 29182 29183 return false; 29184 }; 29185 }, 29186 29187 CHILD: function( type, what, _argument, first, last ) { 29188 var simple = type.slice( 0, 3 ) !== "nth", 29189 forward = type.slice( -4 ) !== "last", 29190 ofType = what === "of-type"; 29191 29192 return first === 1 && last === 0 ? 29193 29194 // Shortcut for :nth-*(n) 29195 function( elem ) { 29196 return !!elem.parentNode; 29197 } : 29198 29199 function( elem, _context, xml ) { 29200 var cache, outerCache, node, nodeIndex, start, 29201 dir = simple !== forward ? "nextSibling" : "previousSibling", 29202 parent = elem.parentNode, 29203 name = ofType && elem.nodeName.toLowerCase(), 29204 useCache = !xml && !ofType, 29205 diff = false; 29206 29207 if ( parent ) { 29208 29209 // :(first|last|only)-(child|of-type) 29210 if ( simple ) { 29211 while ( dir ) { 29212 node = elem; 29213 while ( ( node = node[ dir ] ) ) { 29214 if ( ofType ? 29215 nodeName( node, name ) : 29216 node.nodeType === 1 ) { 29217 29218 return false; 29219 } 29220 } 29221 29222 // Reverse direction for :only-* (if we haven't yet done so) 29223 start = dir = type === "only" && !start && "nextSibling"; 29224 } 29225 return true; 29226 } 29227 29228 start = [ forward ? parent.firstChild : parent.lastChild ]; 29229 29230 // non-xml :nth-child(...) stores cache data on `parent` 29231 if ( forward && useCache ) { 29232 29233 // Seek `elem` from a previously-cached index 29234 outerCache = parent[ expando ] || ( parent[ expando ] = {} ); 29235 cache = outerCache[ type ] || []; 29236 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 29237 diff = nodeIndex && cache[ 2 ]; 29238 node = nodeIndex && parent.childNodes[ nodeIndex ]; 29239 29240 while ( ( node = ++nodeIndex && node && node[ dir ] || 29241 29242 // Fallback to seeking `elem` from the start 29243 ( diff = nodeIndex = 0 ) || start.pop() ) ) { 29244 29245 // When found, cache indexes on `parent` and break 29246 if ( node.nodeType === 1 && ++diff && node === elem ) { 29247 outerCache[ type ] = [ dirruns, nodeIndex, diff ]; 29248 break; 29249 } 29250 } 29251 29252 } else { 29253 29254 // Use previously-cached element index if available 29255 if ( useCache ) { 29256 outerCache = elem[ expando ] || ( elem[ expando ] = {} ); 29257 cache = outerCache[ type ] || []; 29258 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 29259 diff = nodeIndex; 29260 } 29261 29262 // xml :nth-child(...) 29263 // or :nth-last-child(...) or :nth(-last)?-of-type(...) 29264 if ( diff === false ) { 29265 29266 // Use the same loop as above to seek `elem` from the start 29267 while ( ( node = ++nodeIndex && node && node[ dir ] || 29268 ( diff = nodeIndex = 0 ) || start.pop() ) ) { 29269 29270 if ( ( ofType ? 29271 nodeName( node, name ) : 29272 node.nodeType === 1 ) && 29273 ++diff ) { 29274 29275 // Cache the index of each encountered element 29276 if ( useCache ) { 29277 outerCache = node[ expando ] || 29278 ( node[ expando ] = {} ); 29279 outerCache[ type ] = [ dirruns, diff ]; 29280 } 29281 29282 if ( node === elem ) { 29283 break; 29284 } 29285 } 29286 } 29287 } 29288 } 29289 29290 // Incorporate the offset, then check against cycle size 29291 diff -= last; 29292 return diff === first || ( diff % first === 0 && diff / first >= 0 ); 29293 } 29294 }; 29295 }, 29296 29297 PSEUDO: function( pseudo, argument ) { 29298 29299 // pseudo-class names are case-insensitive 29300 // https://www.w3.org/TR/selectors/#pseudo-classes 29301 // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters 29302 // Remember that setFilters inherits from pseudos 29303 var args, 29304 fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || 29305 find.error( "unsupported pseudo: " + pseudo ); 29306 29307 // The user may use createPseudo to indicate that 29308 // arguments are needed to create the filter function 29309 // just as jQuery does 29310 if ( fn[ expando ] ) { 29311 return fn( argument ); 29312 } 29313 29314 // But maintain support for old signatures 29315 if ( fn.length > 1 ) { 29316 args = [ pseudo, pseudo, "", argument ]; 29317 return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? 29318 markFunction( function( seed, matches ) { 29319 var idx, 29320 matched = fn( seed, argument ), 29321 i = matched.length; 29322 while ( i-- ) { 29323 idx = indexOf.call( seed, matched[ i ] ); 29324 seed[ idx ] = !( matches[ idx ] = matched[ i ] ); 29325 } 29326 } ) : 29327 function( elem ) { 29328 return fn( elem, 0, args ); 29329 }; 29330 } 29331 29332 return fn; 29333 } 29334 }, 29335 29336 pseudos: { 29337 29338 // Potentially complex pseudos 29339 not: markFunction( function( selector ) { 29340 29341 // Trim the selector passed to compile 29342 // to avoid treating leading and trailing 29343 // spaces as combinators 29344 var input = [], 29345 results = [], 29346 matcher = compile( selector.replace( rtrimCSS, "$1" ) ); 29347 29348 return matcher[ expando ] ? 29349 markFunction( function( seed, matches, _context, xml ) { 29350 var elem, 29351 unmatched = matcher( seed, null, xml, [] ), 29352 i = seed.length; 29353 29354 // Match elements unmatched by `matcher` 29355 while ( i-- ) { 29356 if ( ( elem = unmatched[ i ] ) ) { 29357 seed[ i ] = !( matches[ i ] = elem ); 29358 } 29359 } 29360 } ) : 29361 function( elem, _context, xml ) { 29362 input[ 0 ] = elem; 29363 matcher( input, null, xml, results ); 29364 29365 // Don't keep the element 29366 // (see https://github.com/jquery/sizzle/issues/299) 29367 input[ 0 ] = null; 29368 return !results.pop(); 29369 }; 29370 } ), 29371 29372 has: markFunction( function( selector ) { 29373 return function( elem ) { 29374 return find( selector, elem ).length > 0; 29375 }; 29376 } ), 29377 29378 contains: markFunction( function( text ) { 29379 text = text.replace( runescape, funescape ); 29380 return function( elem ) { 29381 return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1; 29382 }; 29383 } ), 29384 29385 // "Whether an element is represented by a :lang() selector 29386 // is based solely on the element's language value 29387 // being equal to the identifier C, 29388 // or beginning with the identifier C immediately followed by "-". 29389 // The matching of C against the element's language value is performed case-insensitively. 29390 // The identifier C does not have to be a valid language name." 29391 // https://www.w3.org/TR/selectors/#lang-pseudo 29392 lang: markFunction( function( lang ) { 29393 29394 // lang value must be a valid identifier 29395 if ( !ridentifier.test( lang || "" ) ) { 29396 find.error( "unsupported lang: " + lang ); 29397 } 29398 lang = lang.replace( runescape, funescape ).toLowerCase(); 29399 return function( elem ) { 29400 var elemLang; 29401 do { 29402 if ( ( elemLang = documentIsHTML ? 29403 elem.lang : 29404 elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { 29405 29406 elemLang = elemLang.toLowerCase(); 29407 return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; 29408 } 29409 } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); 29410 return false; 29411 }; 29412 } ), 29413 29414 // Miscellaneous 29415 target: function( elem ) { 29416 var hash = window.location && window.location.hash; 29417 return hash && hash.slice( 1 ) === elem.id; 29418 }, 29419 29420 root: function( elem ) { 29421 return elem === documentElement; 29422 }, 29423 29424 focus: function( elem ) { 29425 return elem === safeActiveElement() && 29426 document.hasFocus() && 29427 !!( elem.type || elem.href || ~elem.tabIndex ); 29428 }, 29429 29430 // Boolean properties 29431 enabled: createDisabledPseudo( false ), 29432 disabled: createDisabledPseudo( true ), 29433 29434 checked: function( elem ) { 29435 29436 // In CSS3, :checked should return both checked and selected elements 29437 // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 29438 return ( nodeName( elem, "input" ) && !!elem.checked ) || 29439 ( nodeName( elem, "option" ) && !!elem.selected ); 29440 }, 29441 29442 selected: function( elem ) { 29443 29444 // Support: IE <=11+ 29445 // Accessing the selectedIndex property 29446 // forces the browser to treat the default option as 29447 // selected when in an optgroup. 29448 if ( elem.parentNode ) { 29449 // eslint-disable-next-line no-unused-expressions 29450 elem.parentNode.selectedIndex; 29451 } 29452 29453 return elem.selected === true; 29454 }, 29455 29456 // Contents 29457 empty: function( elem ) { 29458 29459 // https://www.w3.org/TR/selectors/#empty-pseudo 29460 // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), 29461 // but not by others (comment: 8; processing instruction: 7; etc.) 29462 // nodeType < 6 works because attributes (2) do not appear as children 29463 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 29464 if ( elem.nodeType < 6 ) { 29465 return false; 29466 } 29467 } 29468 return true; 29469 }, 29470 29471 parent: function( elem ) { 29472 return !Expr.pseudos.empty( elem ); 29473 }, 29474 29475 // Element/input types 29476 header: function( elem ) { 29477 return rheader.test( elem.nodeName ); 29478 }, 29479 29480 input: function( elem ) { 29481 return rinputs.test( elem.nodeName ); 29482 }, 29483 29484 button: function( elem ) { 29485 return nodeName( elem, "input" ) && elem.type === "button" || 29486 nodeName( elem, "button" ); 29487 }, 29488 29489 text: function( elem ) { 29490 var attr; 29491 return nodeName( elem, "input" ) && elem.type === "text" && 29492 29493 // Support: IE <10 only 29494 // New HTML5 attribute values (e.g., "search") appear 29495 // with elem.type === "text" 29496 ( ( attr = elem.getAttribute( "type" ) ) == null || 29497 attr.toLowerCase() === "text" ); 29498 }, 29499 29500 // Position-in-collection 29501 first: createPositionalPseudo( function() { 29502 return [ 0 ]; 29503 } ), 29504 29505 last: createPositionalPseudo( function( _matchIndexes, length ) { 29506 return [ length - 1 ]; 29507 } ), 29508 29509 eq: createPositionalPseudo( function( _matchIndexes, length, argument ) { 29510 return [ argument < 0 ? argument + length : argument ]; 29511 } ), 29512 29513 even: createPositionalPseudo( function( matchIndexes, length ) { 29514 var i = 0; 29515 for ( ; i < length; i += 2 ) { 29516 matchIndexes.push( i ); 29517 } 29518 return matchIndexes; 29519 } ), 29520 29521 odd: createPositionalPseudo( function( matchIndexes, length ) { 29522 var i = 1; 29523 for ( ; i < length; i += 2 ) { 29524 matchIndexes.push( i ); 29525 } 29526 return matchIndexes; 29527 } ), 29528 29529 lt: createPositionalPseudo( function( matchIndexes, length, argument ) { 29530 var i; 29531 29532 if ( argument < 0 ) { 29533 i = argument + length; 29534 } else if ( argument > length ) { 29535 i = length; 29536 } else { 29537 i = argument; 29538 } 29539 29540 for ( ; --i >= 0; ) { 29541 matchIndexes.push( i ); 29542 } 29543 return matchIndexes; 29544 } ), 29545 29546 gt: createPositionalPseudo( function( matchIndexes, length, argument ) { 29547 var i = argument < 0 ? argument + length : argument; 29548 for ( ; ++i < length; ) { 29549 matchIndexes.push( i ); 29550 } 29551 return matchIndexes; 29552 } ) 29553 } 29554}; 29555 29556Expr.pseudos.nth = Expr.pseudos.eq; 29557 29558// Add button/input type pseudos 29559for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { 29560 Expr.pseudos[ i ] = createInputPseudo( i ); 29561} 29562for ( i in { submit: true, reset: true } ) { 29563 Expr.pseudos[ i ] = createButtonPseudo( i ); 29564} 29565 29566// Easy API for creating new setFilters 29567function setFilters() {} 29568setFilters.prototype = Expr.filters = Expr.pseudos; 29569Expr.setFilters = new setFilters(); 29570 29571function tokenize( selector, parseOnly ) { 29572 var matched, match, tokens, type, 29573 soFar, groups, preFilters, 29574 cached = tokenCache[ selector + " " ]; 29575 29576 if ( cached ) { 29577 return parseOnly ? 0 : cached.slice( 0 ); 29578 } 29579 29580 soFar = selector; 29581 groups = []; 29582 preFilters = Expr.preFilter; 29583 29584 while ( soFar ) { 29585 29586 // Comma and first run 29587 if ( !matched || ( match = rcomma.exec( soFar ) ) ) { 29588 if ( match ) { 29589 29590 // Don't consume trailing commas as valid 29591 soFar = soFar.slice( match[ 0 ].length ) || soFar; 29592 } 29593 groups.push( ( tokens = [] ) ); 29594 } 29595 29596 matched = false; 29597 29598 // Combinators 29599 if ( ( match = rleadingCombinator.exec( soFar ) ) ) { 29600 matched = match.shift(); 29601 tokens.push( { 29602 value: matched, 29603 29604 // Cast descendant combinators to space 29605 type: match[ 0 ].replace( rtrimCSS, " " ) 29606 } ); 29607 soFar = soFar.slice( matched.length ); 29608 } 29609 29610 // Filters 29611 for ( type in Expr.filter ) { 29612 if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || 29613 ( match = preFilters[ type ]( match ) ) ) ) { 29614 matched = match.shift(); 29615 tokens.push( { 29616 value: matched, 29617 type: type, 29618 matches: match 29619 } ); 29620 soFar = soFar.slice( matched.length ); 29621 } 29622 } 29623 29624 if ( !matched ) { 29625 break; 29626 } 29627 } 29628 29629 // Return the length of the invalid excess 29630 // if we're just parsing 29631 // Otherwise, throw an error or return tokens 29632 if ( parseOnly ) { 29633 return soFar.length; 29634 } 29635 29636 return soFar ? 29637 find.error( selector ) : 29638 29639 // Cache the tokens 29640 tokenCache( selector, groups ).slice( 0 ); 29641} 29642 29643function toSelector( tokens ) { 29644 var i = 0, 29645 len = tokens.length, 29646 selector = ""; 29647 for ( ; i < len; i++ ) { 29648 selector += tokens[ i ].value; 29649 } 29650 return selector; 29651} 29652 29653function addCombinator( matcher, combinator, base ) { 29654 var dir = combinator.dir, 29655 skip = combinator.next, 29656 key = skip || dir, 29657 checkNonElements = base && key === "parentNode", 29658 doneName = done++; 29659 29660 return combinator.first ? 29661 29662 // Check against closest ancestor/preceding element 29663 function( elem, context, xml ) { 29664 while ( ( elem = elem[ dir ] ) ) { 29665 if ( elem.nodeType === 1 || checkNonElements ) { 29666 return matcher( elem, context, xml ); 29667 } 29668 } 29669 return false; 29670 } : 29671 29672 // Check against all ancestor/preceding elements 29673 function( elem, context, xml ) { 29674 var oldCache, outerCache, 29675 newCache = [ dirruns, doneName ]; 29676 29677 // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching 29678 if ( xml ) { 29679 while ( ( elem = elem[ dir ] ) ) { 29680 if ( elem.nodeType === 1 || checkNonElements ) { 29681 if ( matcher( elem, context, xml ) ) { 29682 return true; 29683 } 29684 } 29685 } 29686 } else { 29687 while ( ( elem = elem[ dir ] ) ) { 29688 if ( elem.nodeType === 1 || checkNonElements ) { 29689 outerCache = elem[ expando ] || ( elem[ expando ] = {} ); 29690 29691 if ( skip && nodeName( elem, skip ) ) { 29692 elem = elem[ dir ] || elem; 29693 } else if ( ( oldCache = outerCache[ key ] ) && 29694 oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { 29695 29696 // Assign to newCache so results back-propagate to previous elements 29697 return ( newCache[ 2 ] = oldCache[ 2 ] ); 29698 } else { 29699 29700 // Reuse newcache so results back-propagate to previous elements 29701 outerCache[ key ] = newCache; 29702 29703 // A match means we're done; a fail means we have to keep checking 29704 if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { 29705 return true; 29706 } 29707 } 29708 } 29709 } 29710 } 29711 return false; 29712 }; 29713} 29714 29715function elementMatcher( matchers ) { 29716 return matchers.length > 1 ? 29717 function( elem, context, xml ) { 29718 var i = matchers.length; 29719 while ( i-- ) { 29720 if ( !matchers[ i ]( elem, context, xml ) ) { 29721 return false; 29722 } 29723 } 29724 return true; 29725 } : 29726 matchers[ 0 ]; 29727} 29728 29729function multipleContexts( selector, contexts, results ) { 29730 var i = 0, 29731 len = contexts.length; 29732 for ( ; i < len; i++ ) { 29733 find( selector, contexts[ i ], results ); 29734 } 29735 return results; 29736} 29737 29738function condense( unmatched, map, filter, context, xml ) { 29739 var elem, 29740 newUnmatched = [], 29741 i = 0, 29742 len = unmatched.length, 29743 mapped = map != null; 29744 29745 for ( ; i < len; i++ ) { 29746 if ( ( elem = unmatched[ i ] ) ) { 29747 if ( !filter || filter( elem, context, xml ) ) { 29748 newUnmatched.push( elem ); 29749 if ( mapped ) { 29750 map.push( i ); 29751 } 29752 } 29753 } 29754 } 29755 29756 return newUnmatched; 29757} 29758 29759function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { 29760 if ( postFilter && !postFilter[ expando ] ) { 29761 postFilter = setMatcher( postFilter ); 29762 } 29763 if ( postFinder && !postFinder[ expando ] ) { 29764 postFinder = setMatcher( postFinder, postSelector ); 29765 } 29766 return markFunction( function( seed, results, context, xml ) { 29767 var temp, i, elem, matcherOut, 29768 preMap = [], 29769 postMap = [], 29770 preexisting = results.length, 29771 29772 // Get initial elements from seed or context 29773 elems = seed || 29774 multipleContexts( selector || "*", 29775 context.nodeType ? [ context ] : context, [] ), 29776 29777 // Prefilter to get matcher input, preserving a map for seed-results synchronization 29778 matcherIn = preFilter && ( seed || !selector ) ? 29779 condense( elems, preMap, preFilter, context, xml ) : 29780 elems; 29781 29782 if ( matcher ) { 29783 29784 // If we have a postFinder, or filtered seed, or non-seed postFilter 29785 // or preexisting results, 29786 matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ? 29787 29788 // ...intermediate processing is necessary 29789 [] : 29790 29791 // ...otherwise use results directly 29792 results; 29793 29794 // Find primary matches 29795 matcher( matcherIn, matcherOut, context, xml ); 29796 } else { 29797 matcherOut = matcherIn; 29798 } 29799 29800 // Apply postFilter 29801 if ( postFilter ) { 29802 temp = condense( matcherOut, postMap ); 29803 postFilter( temp, [], context, xml ); 29804 29805 // Un-match failing elements by moving them back to matcherIn 29806 i = temp.length; 29807 while ( i-- ) { 29808 if ( ( elem = temp[ i ] ) ) { 29809 matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); 29810 } 29811 } 29812 } 29813 29814 if ( seed ) { 29815 if ( postFinder || preFilter ) { 29816 if ( postFinder ) { 29817 29818 // Get the final matcherOut by condensing this intermediate into postFinder contexts 29819 temp = []; 29820 i = matcherOut.length; 29821 while ( i-- ) { 29822 if ( ( elem = matcherOut[ i ] ) ) { 29823 29824 // Restore matcherIn since elem is not yet a final match 29825 temp.push( ( matcherIn[ i ] = elem ) ); 29826 } 29827 } 29828 postFinder( null, ( matcherOut = [] ), temp, xml ); 29829 } 29830 29831 // Move matched elements from seed to results to keep them synchronized 29832 i = matcherOut.length; 29833 while ( i-- ) { 29834 if ( ( elem = matcherOut[ i ] ) && 29835 ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) { 29836 29837 seed[ temp ] = !( results[ temp ] = elem ); 29838 } 29839 } 29840 } 29841 29842 // Add elements to results, through postFinder if defined 29843 } else { 29844 matcherOut = condense( 29845 matcherOut === results ? 29846 matcherOut.splice( preexisting, matcherOut.length ) : 29847 matcherOut 29848 ); 29849 if ( postFinder ) { 29850 postFinder( null, results, matcherOut, xml ); 29851 } else { 29852 push.apply( results, matcherOut ); 29853 } 29854 } 29855 } ); 29856} 29857 29858function matcherFromTokens( tokens ) { 29859 var checkContext, matcher, j, 29860 len = tokens.length, 29861 leadingRelative = Expr.relative[ tokens[ 0 ].type ], 29862 implicitRelative = leadingRelative || Expr.relative[ " " ], 29863 i = leadingRelative ? 1 : 0, 29864 29865 // The foundational matcher ensures that elements are reachable from top-level context(s) 29866 matchContext = addCombinator( function( elem ) { 29867 return elem === checkContext; 29868 }, implicitRelative, true ), 29869 matchAnyContext = addCombinator( function( elem ) { 29870 return indexOf.call( checkContext, elem ) > -1; 29871 }, implicitRelative, true ), 29872 matchers = [ function( elem, context, xml ) { 29873 29874 // Support: IE 11+, Edge 17 - 18+ 29875 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 29876 // two documents; shallow comparisons work. 29877 // eslint-disable-next-line eqeqeq 29878 var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || ( 29879 ( checkContext = context ).nodeType ? 29880 matchContext( elem, context, xml ) : 29881 matchAnyContext( elem, context, xml ) ); 29882 29883 // Avoid hanging onto element 29884 // (see https://github.com/jquery/sizzle/issues/299) 29885 checkContext = null; 29886 return ret; 29887 } ]; 29888 29889 for ( ; i < len; i++ ) { 29890 if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { 29891 matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; 29892 } else { 29893 matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); 29894 29895 // Return special upon seeing a positional matcher 29896 if ( matcher[ expando ] ) { 29897 29898 // Find the next relative operator (if any) for proper handling 29899 j = ++i; 29900 for ( ; j < len; j++ ) { 29901 if ( Expr.relative[ tokens[ j ].type ] ) { 29902 break; 29903 } 29904 } 29905 return setMatcher( 29906 i > 1 && elementMatcher( matchers ), 29907 i > 1 && toSelector( 29908 29909 // If the preceding token was a descendant combinator, insert an implicit any-element `*` 29910 tokens.slice( 0, i - 1 ) 29911 .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) 29912 ).replace( rtrimCSS, "$1" ), 29913 matcher, 29914 i < j && matcherFromTokens( tokens.slice( i, j ) ), 29915 j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), 29916 j < len && toSelector( tokens ) 29917 ); 29918 } 29919 matchers.push( matcher ); 29920 } 29921 } 29922 29923 return elementMatcher( matchers ); 29924} 29925 29926function matcherFromGroupMatchers( elementMatchers, setMatchers ) { 29927 var bySet = setMatchers.length > 0, 29928 byElement = elementMatchers.length > 0, 29929 superMatcher = function( seed, context, xml, results, outermost ) { 29930 var elem, j, matcher, 29931 matchedCount = 0, 29932 i = "0", 29933 unmatched = seed && [], 29934 setMatched = [], 29935 contextBackup = outermostContext, 29936 29937 // We must always have either seed elements or outermost context 29938 elems = seed || byElement && Expr.find.TAG( "*", outermost ), 29939 29940 // Use integer dirruns iff this is the outermost matcher 29941 dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), 29942 len = elems.length; 29943 29944 if ( outermost ) { 29945 29946 // Support: IE 11+, Edge 17 - 18+ 29947 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 29948 // two documents; shallow comparisons work. 29949 // eslint-disable-next-line eqeqeq 29950 outermostContext = context == document || context || outermost; 29951 } 29952 29953 // Add elements passing elementMatchers directly to results 29954 // Support: iOS <=7 - 9 only 29955 // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching 29956 // elements by id. (see trac-14142) 29957 for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { 29958 if ( byElement && elem ) { 29959 j = 0; 29960 29961 // Support: IE 11+, Edge 17 - 18+ 29962 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 29963 // two documents; shallow comparisons work. 29964 // eslint-disable-next-line eqeqeq 29965 if ( !context && elem.ownerDocument != document ) { 29966 setDocument( elem ); 29967 xml = !documentIsHTML; 29968 } 29969 while ( ( matcher = elementMatchers[ j++ ] ) ) { 29970 if ( matcher( elem, context || document, xml ) ) { 29971 push.call( results, elem ); 29972 break; 29973 } 29974 } 29975 if ( outermost ) { 29976 dirruns = dirrunsUnique; 29977 } 29978 } 29979 29980 // Track unmatched elements for set filters 29981 if ( bySet ) { 29982 29983 // They will have gone through all possible matchers 29984 if ( ( elem = !matcher && elem ) ) { 29985 matchedCount--; 29986 } 29987 29988 // Lengthen the array for every element, matched or not 29989 if ( seed ) { 29990 unmatched.push( elem ); 29991 } 29992 } 29993 } 29994 29995 // `i` is now the count of elements visited above, and adding it to `matchedCount` 29996 // makes the latter nonnegative. 29997 matchedCount += i; 29998 29999 // Apply set filters to unmatched elements 30000 // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` 30001 // equals `i`), unless we didn't visit _any_ elements in the above loop because we have 30002 // no element matchers and no seed. 30003 // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that 30004 // case, which will result in a "00" `matchedCount` that differs from `i` but is also 30005 // numerically zero. 30006 if ( bySet && i !== matchedCount ) { 30007 j = 0; 30008 while ( ( matcher = setMatchers[ j++ ] ) ) { 30009 matcher( unmatched, setMatched, context, xml ); 30010 } 30011 30012 if ( seed ) { 30013 30014 // Reintegrate element matches to eliminate the need for sorting 30015 if ( matchedCount > 0 ) { 30016 while ( i-- ) { 30017 if ( !( unmatched[ i ] || setMatched[ i ] ) ) { 30018 setMatched[ i ] = pop.call( results ); 30019 } 30020 } 30021 } 30022 30023 // Discard index placeholder values to get only actual matches 30024 setMatched = condense( setMatched ); 30025 } 30026 30027 // Add matches to results 30028 push.apply( results, setMatched ); 30029 30030 // Seedless set matches succeeding multiple successful matchers stipulate sorting 30031 if ( outermost && !seed && setMatched.length > 0 && 30032 ( matchedCount + setMatchers.length ) > 1 ) { 30033 30034 jQuery.uniqueSort( results ); 30035 } 30036 } 30037 30038 // Override manipulation of globals by nested matchers 30039 if ( outermost ) { 30040 dirruns = dirrunsUnique; 30041 outermostContext = contextBackup; 30042 } 30043 30044 return unmatched; 30045 }; 30046 30047 return bySet ? 30048 markFunction( superMatcher ) : 30049 superMatcher; 30050} 30051 30052function compile( selector, match /* Internal Use Only */ ) { 30053 var i, 30054 setMatchers = [], 30055 elementMatchers = [], 30056 cached = compilerCache[ selector + " " ]; 30057 30058 if ( !cached ) { 30059 30060 // Generate a function of recursive functions that can be used to check each element 30061 if ( !match ) { 30062 match = tokenize( selector ); 30063 } 30064 i = match.length; 30065 while ( i-- ) { 30066 cached = matcherFromTokens( match[ i ] ); 30067 if ( cached[ expando ] ) { 30068 setMatchers.push( cached ); 30069 } else { 30070 elementMatchers.push( cached ); 30071 } 30072 } 30073 30074 // Cache the compiled function 30075 cached = compilerCache( selector, 30076 matcherFromGroupMatchers( elementMatchers, setMatchers ) ); 30077 30078 // Save selector and tokenization 30079 cached.selector = selector; 30080 } 30081 return cached; 30082} 30083 30084/** 30085 * A low-level selection function that works with jQuery's compiled 30086 * selector functions 30087 * @param {String|Function} selector A selector or a pre-compiled 30088 * selector function built with jQuery selector compile 30089 * @param {Element} context 30090 * @param {Array} [results] 30091 * @param {Array} [seed] A set of elements to match against 30092 */ 30093function select( selector, context, results, seed ) { 30094 var i, tokens, token, type, find, 30095 compiled = typeof selector === "function" && selector, 30096 match = !seed && tokenize( ( selector = compiled.selector || selector ) ); 30097 30098 results = results || []; 30099 30100 // Try to minimize operations if there is only one selector in the list and no seed 30101 // (the latter of which guarantees us context) 30102 if ( match.length === 1 ) { 30103 30104 // Reduce context if the leading compound selector is an ID 30105 tokens = match[ 0 ] = match[ 0 ].slice( 0 ); 30106 if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && 30107 context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { 30108 30109 context = ( Expr.find.ID( 30110 token.matches[ 0 ].replace( runescape, funescape ), 30111 context 30112 ) || [] )[ 0 ]; 30113 if ( !context ) { 30114 return results; 30115 30116 // Precompiled matchers will still verify ancestry, so step up a level 30117 } else if ( compiled ) { 30118 context = context.parentNode; 30119 } 30120 30121 selector = selector.slice( tokens.shift().value.length ); 30122 } 30123 30124 // Fetch a seed set for right-to-left matching 30125 i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length; 30126 while ( i-- ) { 30127 token = tokens[ i ]; 30128 30129 // Abort if we hit a combinator 30130 if ( Expr.relative[ ( type = token.type ) ] ) { 30131 break; 30132 } 30133 if ( ( find = Expr.find[ type ] ) ) { 30134 30135 // Search, expanding context for leading sibling combinators 30136 if ( ( seed = find( 30137 token.matches[ 0 ].replace( runescape, funescape ), 30138 rsibling.test( tokens[ 0 ].type ) && 30139 testContext( context.parentNode ) || context 30140 ) ) ) { 30141 30142 // If seed is empty or no tokens remain, we can return early 30143 tokens.splice( i, 1 ); 30144 selector = seed.length && toSelector( tokens ); 30145 if ( !selector ) { 30146 push.apply( results, seed ); 30147 return results; 30148 } 30149 30150 break; 30151 } 30152 } 30153 } 30154 } 30155 30156 // Compile and execute a filtering function if one is not provided 30157 // Provide `match` to avoid retokenization if we modified the selector above 30158 ( compiled || compile( selector, match ) )( 30159 seed, 30160 context, 30161 !documentIsHTML, 30162 results, 30163 !context || rsibling.test( selector ) && testContext( context.parentNode ) || context 30164 ); 30165 return results; 30166} 30167 30168// One-time assignments 30169 30170// Support: Android <=4.0 - 4.1+ 30171// Sort stability 30172support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; 30173 30174// Initialize against the default document 30175setDocument(); 30176 30177// Support: Android <=4.0 - 4.1+ 30178// Detached nodes confoundingly follow *each other* 30179support.sortDetached = assert( function( el ) { 30180 30181 // Should return 1, but returns 4 (following) 30182 return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; 30183} ); 30184 30185jQuery.find = find; 30186 30187// Deprecated 30188jQuery.expr[ ":" ] = jQuery.expr.pseudos; 30189jQuery.unique = jQuery.uniqueSort; 30190 30191// These have always been private, but they used to be documented as part of 30192// Sizzle so let's maintain them for now for backwards compatibility purposes. 30193find.compile = compile; 30194find.select = select; 30195find.setDocument = setDocument; 30196find.tokenize = tokenize; 30197 30198find.escape = jQuery.escapeSelector; 30199find.getText = jQuery.text; 30200find.isXML = jQuery.isXMLDoc; 30201find.selectors = jQuery.expr; 30202find.support = jQuery.support; 30203find.uniqueSort = jQuery.uniqueSort; 30204 30205 /* eslint-enable */ 30206 30207} )(); 30208 30209 30210var dir = function( elem, dir, until ) { 30211 var matched = [], 30212 truncate = until !== undefined; 30213 30214 while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { 30215 if ( elem.nodeType === 1 ) { 30216 if ( truncate && jQuery( elem ).is( until ) ) { 30217 break; 30218 } 30219 matched.push( elem ); 30220 } 30221 } 30222 return matched; 30223}; 30224 30225 30226var siblings = function( n, elem ) { 30227 var matched = []; 30228 30229 for ( ; n; n = n.nextSibling ) { 30230 if ( n.nodeType === 1 && n !== elem ) { 30231 matched.push( n ); 30232 } 30233 } 30234 30235 return matched; 30236}; 30237 30238 30239var rneedsContext = jQuery.expr.match.needsContext; 30240 30241var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); 30242 30243 30244 30245// Implement the identical functionality for filter and not 30246function winnow( elements, qualifier, not ) { 30247 if ( isFunction( qualifier ) ) { 30248 return jQuery.grep( elements, function( elem, i ) { 30249 return !!qualifier.call( elem, i, elem ) !== not; 30250 } ); 30251 } 30252 30253 // Single element 30254 if ( qualifier.nodeType ) { 30255 return jQuery.grep( elements, function( elem ) { 30256 return ( elem === qualifier ) !== not; 30257 } ); 30258 } 30259 30260 // Arraylike of elements (jQuery, arguments, Array) 30261 if ( typeof qualifier !== "string" ) { 30262 return jQuery.grep( elements, function( elem ) { 30263 return ( indexOf.call( qualifier, elem ) > -1 ) !== not; 30264 } ); 30265 } 30266 30267 // Filtered directly for both simple and complex selectors 30268 return jQuery.filter( qualifier, elements, not ); 30269} 30270 30271jQuery.filter = function( expr, elems, not ) { 30272 var elem = elems[ 0 ]; 30273 30274 if ( not ) { 30275 expr = ":not(" + expr + ")"; 30276 } 30277 30278 if ( elems.length === 1 && elem.nodeType === 1 ) { 30279 return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; 30280 } 30281 30282 return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { 30283 return elem.nodeType === 1; 30284 } ) ); 30285}; 30286 30287jQuery.fn.extend( { 30288 find: function( selector ) { 30289 var i, ret, 30290 len = this.length, 30291 self = this; 30292 30293 if ( typeof selector !== "string" ) { 30294 return this.pushStack( jQuery( selector ).filter( function() { 30295 for ( i = 0; i < len; i++ ) { 30296 if ( jQuery.contains( self[ i ], this ) ) { 30297 return true; 30298 } 30299 } 30300 } ) ); 30301 } 30302 30303 ret = this.pushStack( [] ); 30304 30305 for ( i = 0; i < len; i++ ) { 30306 jQuery.find( selector, self[ i ], ret ); 30307 } 30308 30309 return len > 1 ? jQuery.uniqueSort( ret ) : ret; 30310 }, 30311 filter: function( selector ) { 30312 return this.pushStack( winnow( this, selector || [], false ) ); 30313 }, 30314 not: function( selector ) { 30315 return this.pushStack( winnow( this, selector || [], true ) ); 30316 }, 30317 is: function( selector ) { 30318 return !!winnow( 30319 this, 30320 30321 // If this is a positional/relative selector, check membership in the returned set 30322 // so $("p:first").is("p:last") won't return true for a doc with two "p". 30323 typeof selector === "string" && rneedsContext.test( selector ) ? 30324 jQuery( selector ) : 30325 selector || [], 30326 false 30327 ).length; 30328 } 30329} ); 30330 30331 30332// Initialize a jQuery object 30333 30334 30335// A central reference to the root jQuery(document) 30336var rootjQuery, 30337 30338 // A simple way to check for HTML strings 30339 // Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521) 30340 // Strict HTML recognition (trac-11290: must start with <) 30341 // Shortcut simple #id case for speed 30342 rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, 30343 30344 init = jQuery.fn.init = function( selector, context, root ) { 30345 var match, elem; 30346 30347 // HANDLE: $(""), $(null), $(undefined), $(false) 30348 if ( !selector ) { 30349 return this; 30350 } 30351 30352 // Method init() accepts an alternate rootjQuery 30353 // so migrate can support jQuery.sub (gh-2101) 30354 root = root || rootjQuery; 30355 30356 // Handle HTML strings 30357 if ( typeof selector === "string" ) { 30358 if ( selector[ 0 ] === "<" && 30359 selector[ selector.length - 1 ] === ">" && 30360 selector.length >= 3 ) { 30361 30362 // Assume that strings that start and end with <> are HTML and skip the regex check 30363 match = [ null, selector, null ]; 30364 30365 } else { 30366 match = rquickExpr.exec( selector ); 30367 } 30368 30369 // Match html or make sure no context is specified for #id 30370 if ( match && ( match[ 1 ] || !context ) ) { 30371 30372 // HANDLE: $(html) -> $(array) 30373 if ( match[ 1 ] ) { 30374 context = context instanceof jQuery ? context[ 0 ] : context; 30375 30376 // Option to run scripts is true for back-compat 30377 // Intentionally let the error be thrown if parseHTML is not present 30378 jQuery.merge( this, jQuery.parseHTML( 30379 match[ 1 ], 30380 context && context.nodeType ? context.ownerDocument || context : document, 30381 true 30382 ) ); 30383 30384 // HANDLE: $(html, props) 30385 if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { 30386 for ( match in context ) { 30387 30388 // Properties of context are called as methods if possible 30389 if ( isFunction( this[ match ] ) ) { 30390 this[ match ]( context[ match ] ); 30391 30392 // ...and otherwise set as attributes 30393 } else { 30394 this.attr( match, context[ match ] ); 30395 } 30396 } 30397 } 30398 30399 return this; 30400 30401 // HANDLE: $(#id) 30402 } else { 30403 elem = document.getElementById( match[ 2 ] ); 30404 30405 if ( elem ) { 30406 30407 // Inject the element directly into the jQuery object 30408 this[ 0 ] = elem; 30409 this.length = 1; 30410 } 30411 return this; 30412 } 30413 30414 // HANDLE: $(expr, $(...)) 30415 } else if ( !context || context.jquery ) { 30416 return ( context || root ).find( selector ); 30417 30418 // HANDLE: $(expr, context) 30419 // (which is just equivalent to: $(context).find(expr) 30420 } else { 30421 return this.constructor( context ).find( selector ); 30422 } 30423 30424 // HANDLE: $(DOMElement) 30425 } else if ( selector.nodeType ) { 30426 this[ 0 ] = selector; 30427 this.length = 1; 30428 return this; 30429 30430 // HANDLE: $(function) 30431 // Shortcut for document ready 30432 } else if ( isFunction( selector ) ) { 30433 return root.ready !== undefined ? 30434 root.ready( selector ) : 30435 30436 // Execute immediately if ready is not present 30437 selector( jQuery ); 30438 } 30439 30440 return jQuery.makeArray( selector, this ); 30441 }; 30442 30443// Give the init function the jQuery prototype for later instantiation 30444init.prototype = jQuery.fn; 30445 30446// Initialize central reference 30447rootjQuery = jQuery( document ); 30448 30449 30450var rparentsprev = /^(?:parents|prev(?:Until|All))/, 30451 30452 // Methods guaranteed to produce a unique set when starting from a unique set 30453 guaranteedUnique = { 30454 children: true, 30455 contents: true, 30456 next: true, 30457 prev: true 30458 }; 30459 30460jQuery.fn.extend( { 30461 has: function( target ) { 30462 var targets = jQuery( target, this ), 30463 l = targets.length; 30464 30465 return this.filter( function() { 30466 var i = 0; 30467 for ( ; i < l; i++ ) { 30468 if ( jQuery.contains( this, targets[ i ] ) ) { 30469 return true; 30470 } 30471 } 30472 } ); 30473 }, 30474 30475 closest: function( selectors, context ) { 30476 var cur, 30477 i = 0, 30478 l = this.length, 30479 matched = [], 30480 targets = typeof selectors !== "string" && jQuery( selectors ); 30481 30482 // Positional selectors never match, since there's no _selection_ context 30483 if ( !rneedsContext.test( selectors ) ) { 30484 for ( ; i < l; i++ ) { 30485 for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { 30486 30487 // Always skip document fragments 30488 if ( cur.nodeType < 11 && ( targets ? 30489 targets.index( cur ) > -1 : 30490 30491 // Don't pass non-elements to jQuery#find 30492 cur.nodeType === 1 && 30493 jQuery.find.matchesSelector( cur, selectors ) ) ) { 30494 30495 matched.push( cur ); 30496 break; 30497 } 30498 } 30499 } 30500 } 30501 30502 return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); 30503 }, 30504 30505 // Determine the position of an element within the set 30506 index: function( elem ) { 30507 30508 // No argument, return index in parent 30509 if ( !elem ) { 30510 return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; 30511 } 30512 30513 // Index in selector 30514 if ( typeof elem === "string" ) { 30515 return indexOf.call( jQuery( elem ), this[ 0 ] ); 30516 } 30517 30518 // Locate the position of the desired element 30519 return indexOf.call( this, 30520 30521 // If it receives a jQuery object, the first element is used 30522 elem.jquery ? elem[ 0 ] : elem 30523 ); 30524 }, 30525 30526 add: function( selector, context ) { 30527 return this.pushStack( 30528 jQuery.uniqueSort( 30529 jQuery.merge( this.get(), jQuery( selector, context ) ) 30530 ) 30531 ); 30532 }, 30533 30534 addBack: function( selector ) { 30535 return this.add( selector == null ? 30536 this.prevObject : this.prevObject.filter( selector ) 30537 ); 30538 } 30539} ); 30540 30541function sibling( cur, dir ) { 30542 while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} 30543 return cur; 30544} 30545 30546jQuery.each( { 30547 parent: function( elem ) { 30548 var parent = elem.parentNode; 30549 return parent && parent.nodeType !== 11 ? parent : null; 30550 }, 30551 parents: function( elem ) { 30552 return dir( elem, "parentNode" ); 30553 }, 30554 parentsUntil: function( elem, _i, until ) { 30555 return dir( elem, "parentNode", until ); 30556 }, 30557 next: function( elem ) { 30558 return sibling( elem, "nextSibling" ); 30559 }, 30560 prev: function( elem ) { 30561 return sibling( elem, "previousSibling" ); 30562 }, 30563 nextAll: function( elem ) { 30564 return dir( elem, "nextSibling" ); 30565 }, 30566 prevAll: function( elem ) { 30567 return dir( elem, "previousSibling" ); 30568 }, 30569 nextUntil: function( elem, _i, until ) { 30570 return dir( elem, "nextSibling", until ); 30571 }, 30572 prevUntil: function( elem, _i, until ) { 30573 return dir( elem, "previousSibling", until ); 30574 }, 30575 siblings: function( elem ) { 30576 return siblings( ( elem.parentNode || {} ).firstChild, elem ); 30577 }, 30578 children: function( elem ) { 30579 return siblings( elem.firstChild ); 30580 }, 30581 contents: function( elem ) { 30582 if ( elem.contentDocument != null && 30583 30584 // Support: IE 11+ 30585 // <object> elements with no `data` attribute has an object 30586 // `contentDocument` with a `null` prototype. 30587 getProto( elem.contentDocument ) ) { 30588 30589 return elem.contentDocument; 30590 } 30591 30592 // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only 30593 // Treat the template element as a regular one in browsers that 30594 // don't support it. 30595 if ( nodeName( elem, "template" ) ) { 30596 elem = elem.content || elem; 30597 } 30598 30599 return jQuery.merge( [], elem.childNodes ); 30600 } 30601}, function( name, fn ) { 30602 jQuery.fn[ name ] = function( until, selector ) { 30603 var matched = jQuery.map( this, fn, until ); 30604 30605 if ( name.slice( -5 ) !== "Until" ) { 30606 selector = until; 30607 } 30608 30609 if ( selector && typeof selector === "string" ) { 30610 matched = jQuery.filter( selector, matched ); 30611 } 30612 30613 if ( this.length > 1 ) { 30614 30615 // Remove duplicates 30616 if ( !guaranteedUnique[ name ] ) { 30617 jQuery.uniqueSort( matched ); 30618 } 30619 30620 // Reverse order for parents* and prev-derivatives 30621 if ( rparentsprev.test( name ) ) { 30622 matched.reverse(); 30623 } 30624 } 30625 30626 return this.pushStack( matched ); 30627 }; 30628} ); 30629var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); 30630 30631 30632 30633// Convert String-formatted options into Object-formatted ones 30634function createOptions( options ) { 30635 var object = {}; 30636 jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { 30637 object[ flag ] = true; 30638 } ); 30639 return object; 30640} 30641 30642/* 30643 * Create a callback list using the following parameters: 30644 * 30645 * options: an optional list of space-separated options that will change how 30646 * the callback list behaves or a more traditional option object 30647 * 30648 * By default a callback list will act like an event callback list and can be 30649 * "fired" multiple times. 30650 * 30651 * Possible options: 30652 * 30653 * once: will ensure the callback list can only be fired once (like a Deferred) 30654 * 30655 * memory: will keep track of previous values and will call any callback added 30656 * after the list has been fired right away with the latest "memorized" 30657 * values (like a Deferred) 30658 * 30659 * unique: will ensure a callback can only be added once (no duplicate in the list) 30660 * 30661 * stopOnFalse: interrupt callings when a callback returns false 30662 * 30663 */ 30664jQuery.Callbacks = function( options ) { 30665 30666 // Convert options from String-formatted to Object-formatted if needed 30667 // (we check in cache first) 30668 options = typeof options === "string" ? 30669 createOptions( options ) : 30670 jQuery.extend( {}, options ); 30671 30672 var // Flag to know if list is currently firing 30673 firing, 30674 30675 // Last fire value for non-forgettable lists 30676 memory, 30677 30678 // Flag to know if list was already fired 30679 fired, 30680 30681 // Flag to prevent firing 30682 locked, 30683 30684 // Actual callback list 30685 list = [], 30686 30687 // Queue of execution data for repeatable lists 30688 queue = [], 30689 30690 // Index of currently firing callback (modified by add/remove as needed) 30691 firingIndex = -1, 30692 30693 // Fire callbacks 30694 fire = function() { 30695 30696 // Enforce single-firing 30697 locked = locked || options.once; 30698 30699 // Execute callbacks for all pending executions, 30700 // respecting firingIndex overrides and runtime changes 30701 fired = firing = true; 30702 for ( ; queue.length; firingIndex = -1 ) { 30703 memory = queue.shift(); 30704 while ( ++firingIndex < list.length ) { 30705 30706 // Run callback and check for early termination 30707 if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && 30708 options.stopOnFalse ) { 30709 30710 // Jump to end and forget the data so .add doesn't re-fire 30711 firingIndex = list.length; 30712 memory = false; 30713 } 30714 } 30715 } 30716 30717 // Forget the data if we're done with it 30718 if ( !options.memory ) { 30719 memory = false; 30720 } 30721 30722 firing = false; 30723 30724 // Clean up if we're done firing for good 30725 if ( locked ) { 30726 30727 // Keep an empty list if we have data for future add calls 30728 if ( memory ) { 30729 list = []; 30730 30731 // Otherwise, this object is spent 30732 } else { 30733 list = ""; 30734 } 30735 } 30736 }, 30737 30738 // Actual Callbacks object 30739 self = { 30740 30741 // Add a callback or a collection of callbacks to the list 30742 add: function() { 30743 if ( list ) { 30744 30745 // If we have memory from a past run, we should fire after adding 30746 if ( memory && !firing ) { 30747 firingIndex = list.length - 1; 30748 queue.push( memory ); 30749 } 30750 30751 ( function add( args ) { 30752 jQuery.each( args, function( _, arg ) { 30753 if ( isFunction( arg ) ) { 30754 if ( !options.unique || !self.has( arg ) ) { 30755 list.push( arg ); 30756 } 30757 } else if ( arg && arg.length && toType( arg ) !== "string" ) { 30758 30759 // Inspect recursively 30760 add( arg ); 30761 } 30762 } ); 30763 } )( arguments ); 30764 30765 if ( memory && !firing ) { 30766 fire(); 30767 } 30768 } 30769 return this; 30770 }, 30771 30772 // Remove a callback from the list 30773 remove: function() { 30774 jQuery.each( arguments, function( _, arg ) { 30775 var index; 30776 while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { 30777 list.splice( index, 1 ); 30778 30779 // Handle firing indexes 30780 if ( index <= firingIndex ) { 30781 firingIndex--; 30782 } 30783 } 30784 } ); 30785 return this; 30786 }, 30787 30788 // Check if a given callback is in the list. 30789 // If no argument is given, return whether or not list has callbacks attached. 30790 has: function( fn ) { 30791 return fn ? 30792 jQuery.inArray( fn, list ) > -1 : 30793 list.length > 0; 30794 }, 30795 30796 // Remove all callbacks from the list 30797 empty: function() { 30798 if ( list ) { 30799 list = []; 30800 } 30801 return this; 30802 }, 30803 30804 // Disable .fire and .add 30805 // Abort any current/pending executions 30806 // Clear all callbacks and values 30807 disable: function() { 30808 locked = queue = []; 30809 list = memory = ""; 30810 return this; 30811 }, 30812 disabled: function() { 30813 return !list; 30814 }, 30815 30816 // Disable .fire 30817 // Also disable .add unless we have memory (since it would have no effect) 30818 // Abort any pending executions 30819 lock: function() { 30820 locked = queue = []; 30821 if ( !memory && !firing ) { 30822 list = memory = ""; 30823 } 30824 return this; 30825 }, 30826 locked: function() { 30827 return !!locked; 30828 }, 30829 30830 // Call all callbacks with the given context and arguments 30831 fireWith: function( context, args ) { 30832 if ( !locked ) { 30833 args = args || []; 30834 args = [ context, args.slice ? args.slice() : args ]; 30835 queue.push( args ); 30836 if ( !firing ) { 30837 fire(); 30838 } 30839 } 30840 return this; 30841 }, 30842 30843 // Call all the callbacks with the given arguments 30844 fire: function() { 30845 self.fireWith( this, arguments ); 30846 return this; 30847 }, 30848 30849 // To know if the callbacks have already been called at least once 30850 fired: function() { 30851 return !!fired; 30852 } 30853 }; 30854 30855 return self; 30856}; 30857 30858 30859function Identity( v ) { 30860 return v; 30861} 30862function Thrower( ex ) { 30863 throw ex; 30864} 30865 30866function adoptValue( value, resolve, reject, noValue ) { 30867 var method; 30868 30869 try { 30870 30871 // Check for promise aspect first to privilege synchronous behavior 30872 if ( value && isFunction( ( method = value.promise ) ) ) { 30873 method.call( value ).done( resolve ).fail( reject ); 30874 30875 // Other thenables 30876 } else if ( value && isFunction( ( method = value.then ) ) ) { 30877 method.call( value, resolve, reject ); 30878 30879 // Other non-thenables 30880 } else { 30881 30882 // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: 30883 // * false: [ value ].slice( 0 ) => resolve( value ) 30884 // * true: [ value ].slice( 1 ) => resolve() 30885 resolve.apply( undefined, [ value ].slice( noValue ) ); 30886 } 30887 30888 // For Promises/A+, convert exceptions into rejections 30889 // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in 30890 // Deferred#then to conditionally suppress rejection. 30891 } catch ( value ) { 30892 30893 // Support: Android 4.0 only 30894 // Strict mode functions invoked without .call/.apply get global-object context 30895 reject.apply( undefined, [ value ] ); 30896 } 30897} 30898 30899jQuery.extend( { 30900 30901 Deferred: function( func ) { 30902 var tuples = [ 30903 30904 // action, add listener, callbacks, 30905 // ... .then handlers, argument index, [final state] 30906 [ "notify", "progress", jQuery.Callbacks( "memory" ), 30907 jQuery.Callbacks( "memory" ), 2 ], 30908 [ "resolve", "done", jQuery.Callbacks( "once memory" ), 30909 jQuery.Callbacks( "once memory" ), 0, "resolved" ], 30910 [ "reject", "fail", jQuery.Callbacks( "once memory" ), 30911 jQuery.Callbacks( "once memory" ), 1, "rejected" ] 30912 ], 30913 state = "pending", 30914 promise = { 30915 state: function() { 30916 return state; 30917 }, 30918 always: function() { 30919 deferred.done( arguments ).fail( arguments ); 30920 return this; 30921 }, 30922 "catch": function( fn ) { 30923 return promise.then( null, fn ); 30924 }, 30925 30926 // Keep pipe for back-compat 30927 pipe: function( /* fnDone, fnFail, fnProgress */ ) { 30928 var fns = arguments; 30929 30930 return jQuery.Deferred( function( newDefer ) { 30931 jQuery.each( tuples, function( _i, tuple ) { 30932 30933 // Map tuples (progress, done, fail) to arguments (done, fail, progress) 30934 var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; 30935 30936 // deferred.progress(function() { bind to newDefer or newDefer.notify }) 30937 // deferred.done(function() { bind to newDefer or newDefer.resolve }) 30938 // deferred.fail(function() { bind to newDefer or newDefer.reject }) 30939 deferred[ tuple[ 1 ] ]( function() { 30940 var returned = fn && fn.apply( this, arguments ); 30941 if ( returned && isFunction( returned.promise ) ) { 30942 returned.promise() 30943 .progress( newDefer.notify ) 30944 .done( newDefer.resolve ) 30945 .fail( newDefer.reject ); 30946 } else { 30947 newDefer[ tuple[ 0 ] + "With" ]( 30948 this, 30949 fn ? [ returned ] : arguments 30950 ); 30951 } 30952 } ); 30953 } ); 30954 fns = null; 30955 } ).promise(); 30956 }, 30957 then: function( onFulfilled, onRejected, onProgress ) { 30958 var maxDepth = 0; 30959 function resolve( depth, deferred, handler, special ) { 30960 return function() { 30961 var that = this, 30962 args = arguments, 30963 mightThrow = function() { 30964 var returned, then; 30965 30966 // Support: Promises/A+ section 2.3.3.3.3 30967 // https://promisesaplus.com/#point-59 30968 // Ignore double-resolution attempts 30969 if ( depth < maxDepth ) { 30970 return; 30971 } 30972 30973 returned = handler.apply( that, args ); 30974 30975 // Support: Promises/A+ section 2.3.1 30976 // https://promisesaplus.com/#point-48 30977 if ( returned === deferred.promise() ) { 30978 throw new TypeError( "Thenable self-resolution" ); 30979 } 30980 30981 // Support: Promises/A+ sections 2.3.3.1, 3.5 30982 // https://promisesaplus.com/#point-54 30983 // https://promisesaplus.com/#point-75 30984 // Retrieve `then` only once 30985 then = returned && 30986 30987 // Support: Promises/A+ section 2.3.4 30988 // https://promisesaplus.com/#point-64 30989 // Only check objects and functions for thenability 30990 ( typeof returned === "object" || 30991 typeof returned === "function" ) && 30992 returned.then; 30993 30994 // Handle a returned thenable 30995 if ( isFunction( then ) ) { 30996 30997 // Special processors (notify) just wait for resolution 30998 if ( special ) { 30999 then.call( 31000 returned, 31001 resolve( maxDepth, deferred, Identity, special ), 31002 resolve( maxDepth, deferred, Thrower, special ) 31003 ); 31004 31005 // Normal processors (resolve) also hook into progress 31006 } else { 31007 31008 // ...and disregard older resolution values 31009 maxDepth++; 31010 31011 then.call( 31012 returned, 31013 resolve( maxDepth, deferred, Identity, special ), 31014 resolve( maxDepth, deferred, Thrower, special ), 31015 resolve( maxDepth, deferred, Identity, 31016 deferred.notifyWith ) 31017 ); 31018 } 31019 31020 // Handle all other returned values 31021 } else { 31022 31023 // Only substitute handlers pass on context 31024 // and multiple values (non-spec behavior) 31025 if ( handler !== Identity ) { 31026 that = undefined; 31027 args = [ returned ]; 31028 } 31029 31030 // Process the value(s) 31031 // Default process is resolve 31032 ( special || deferred.resolveWith )( that, args ); 31033 } 31034 }, 31035 31036 // Only normal processors (resolve) catch and reject exceptions 31037 process = special ? 31038 mightThrow : 31039 function() { 31040 try { 31041 mightThrow(); 31042 } catch ( e ) { 31043 31044 if ( jQuery.Deferred.exceptionHook ) { 31045 jQuery.Deferred.exceptionHook( e, 31046 process.error ); 31047 } 31048 31049 // Support: Promises/A+ section 2.3.3.3.4.1 31050 // https://promisesaplus.com/#point-61 31051 // Ignore post-resolution exceptions 31052 if ( depth + 1 >= maxDepth ) { 31053 31054 // Only substitute handlers pass on context 31055 // and multiple values (non-spec behavior) 31056 if ( handler !== Thrower ) { 31057 that = undefined; 31058 args = [ e ]; 31059 } 31060 31061 deferred.rejectWith( that, args ); 31062 } 31063 } 31064 }; 31065 31066 // Support: Promises/A+ section 2.3.3.3.1 31067 // https://promisesaplus.com/#point-57 31068 // Re-resolve promises immediately to dodge false rejection from 31069 // subsequent errors 31070 if ( depth ) { 31071 process(); 31072 } else { 31073 31074 // Call an optional hook to record the error, in case of exception 31075 // since it's otherwise lost when execution goes async 31076 if ( jQuery.Deferred.getErrorHook ) { 31077 process.error = jQuery.Deferred.getErrorHook(); 31078 31079 // The deprecated alias of the above. While the name suggests 31080 // returning the stack, not an error instance, jQuery just passes 31081 // it directly to `console.warn` so both will work; an instance 31082 // just better cooperates with source maps. 31083 } else if ( jQuery.Deferred.getStackHook ) { 31084 process.error = jQuery.Deferred.getStackHook(); 31085 } 31086 window.setTimeout( process ); 31087 } 31088 }; 31089 } 31090 31091 return jQuery.Deferred( function( newDefer ) { 31092 31093 // progress_handlers.add( ... ) 31094 tuples[ 0 ][ 3 ].add( 31095 resolve( 31096 0, 31097 newDefer, 31098 isFunction( onProgress ) ? 31099 onProgress : 31100 Identity, 31101 newDefer.notifyWith 31102 ) 31103 ); 31104 31105 // fulfilled_handlers.add( ... ) 31106 tuples[ 1 ][ 3 ].add( 31107 resolve( 31108 0, 31109 newDefer, 31110 isFunction( onFulfilled ) ? 31111 onFulfilled : 31112 Identity 31113 ) 31114 ); 31115 31116 // rejected_handlers.add( ... ) 31117 tuples[ 2 ][ 3 ].add( 31118 resolve( 31119 0, 31120 newDefer, 31121 isFunction( onRejected ) ? 31122 onRejected : 31123 Thrower 31124 ) 31125 ); 31126 } ).promise(); 31127 }, 31128 31129 // Get a promise for this deferred 31130 // If obj is provided, the promise aspect is added to the object 31131 promise: function( obj ) { 31132 return obj != null ? jQuery.extend( obj, promise ) : promise; 31133 } 31134 }, 31135 deferred = {}; 31136 31137 // Add list-specific methods 31138 jQuery.each( tuples, function( i, tuple ) { 31139 var list = tuple[ 2 ], 31140 stateString = tuple[ 5 ]; 31141 31142 // promise.progress = list.add 31143 // promise.done = list.add 31144 // promise.fail = list.add 31145 promise[ tuple[ 1 ] ] = list.add; 31146 31147 // Handle state 31148 if ( stateString ) { 31149 list.add( 31150 function() { 31151 31152 // state = "resolved" (i.e., fulfilled) 31153 // state = "rejected" 31154 state = stateString; 31155 }, 31156 31157 // rejected_callbacks.disable 31158 // fulfilled_callbacks.disable 31159 tuples[ 3 - i ][ 2 ].disable, 31160 31161 // rejected_handlers.disable 31162 // fulfilled_handlers.disable 31163 tuples[ 3 - i ][ 3 ].disable, 31164 31165 // progress_callbacks.lock 31166 tuples[ 0 ][ 2 ].lock, 31167 31168 // progress_handlers.lock 31169 tuples[ 0 ][ 3 ].lock 31170 ); 31171 } 31172 31173 // progress_handlers.fire 31174 // fulfilled_handlers.fire 31175 // rejected_handlers.fire 31176 list.add( tuple[ 3 ].fire ); 31177 31178 // deferred.notify = function() { deferred.notifyWith(...) } 31179 // deferred.resolve = function() { deferred.resolveWith(...) } 31180 // deferred.reject = function() { deferred.rejectWith(...) } 31181 deferred[ tuple[ 0 ] ] = function() { 31182 deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); 31183 return this; 31184 }; 31185 31186 // deferred.notifyWith = list.fireWith 31187 // deferred.resolveWith = list.fireWith 31188 // deferred.rejectWith = list.fireWith 31189 deferred[ tuple[ 0 ] + "With" ] = list.fireWith; 31190 } ); 31191 31192 // Make the deferred a promise 31193 promise.promise( deferred ); 31194 31195 // Call given func if any 31196 if ( func ) { 31197 func.call( deferred, deferred ); 31198 } 31199 31200 // All done! 31201 return deferred; 31202 }, 31203 31204 // Deferred helper 31205 when: function( singleValue ) { 31206 var 31207 31208 // count of uncompleted subordinates 31209 remaining = arguments.length, 31210 31211 // count of unprocessed arguments 31212 i = remaining, 31213 31214 // subordinate fulfillment data 31215 resolveContexts = Array( i ), 31216 resolveValues = slice.call( arguments ), 31217 31218 // the primary Deferred 31219 primary = jQuery.Deferred(), 31220 31221 // subordinate callback factory 31222 updateFunc = function( i ) { 31223 return function( value ) { 31224 resolveContexts[ i ] = this; 31225 resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; 31226 if ( !( --remaining ) ) { 31227 primary.resolveWith( resolveContexts, resolveValues ); 31228 } 31229 }; 31230 }; 31231 31232 // Single- and empty arguments are adopted like Promise.resolve 31233 if ( remaining <= 1 ) { 31234 adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, 31235 !remaining ); 31236 31237 // Use .then() to unwrap secondary thenables (cf. gh-3000) 31238 if ( primary.state() === "pending" || 31239 isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { 31240 31241 return primary.then(); 31242 } 31243 } 31244 31245 // Multiple arguments are aggregated like Promise.all array elements 31246 while ( i-- ) { 31247 adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); 31248 } 31249 31250 return primary.promise(); 31251 } 31252} ); 31253 31254 31255// These usually indicate a programmer mistake during development, 31256// warn about them ASAP rather than swallowing them by default. 31257var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; 31258 31259// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error 31260// captured before the async barrier to get the original error cause 31261// which may otherwise be hidden. 31262jQuery.Deferred.exceptionHook = function( error, asyncError ) { 31263 31264 // Support: IE 8 - 9 only 31265 // Console exists when dev tools are open, which can happen at any time 31266 if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { 31267 window.console.warn( "jQuery.Deferred exception: " + error.message, 31268 error.stack, asyncError ); 31269 } 31270}; 31271 31272 31273 31274 31275jQuery.readyException = function( error ) { 31276 window.setTimeout( function() { 31277 throw error; 31278 } ); 31279}; 31280 31281 31282 31283 31284// The deferred used on DOM ready 31285var readyList = jQuery.Deferred(); 31286 31287jQuery.fn.ready = function( fn ) { 31288 31289 readyList 31290 .then( fn ) 31291 31292 // Wrap jQuery.readyException in a function so that the lookup 31293 // happens at the time of error handling instead of callback 31294 // registration. 31295 .catch( function( error ) { 31296 jQuery.readyException( error ); 31297 } ); 31298 31299 return this; 31300}; 31301 31302jQuery.extend( { 31303 31304 // Is the DOM ready to be used? Set to true once it occurs. 31305 isReady: false, 31306 31307 // A counter to track how many items to wait for before 31308 // the ready event fires. See trac-6781 31309 readyWait: 1, 31310 31311 // Handle when the DOM is ready 31312 ready: function( wait ) { 31313 31314 // Abort if there are pending holds or we're already ready 31315 if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { 31316 return; 31317 } 31318 31319 // Remember that the DOM is ready 31320 jQuery.isReady = true; 31321 31322 // If a normal DOM Ready event fired, decrement, and wait if need be 31323 if ( wait !== true && --jQuery.readyWait > 0 ) { 31324 return; 31325 } 31326 31327 // If there are functions bound, to execute 31328 readyList.resolveWith( document, [ jQuery ] ); 31329 } 31330} ); 31331 31332jQuery.ready.then = readyList.then; 31333 31334// The ready event handler and self cleanup method 31335function completed() { 31336 document.removeEventListener( "DOMContentLoaded", completed ); 31337 window.removeEventListener( "load", completed ); 31338 jQuery.ready(); 31339} 31340 31341// Catch cases where $(document).ready() is called 31342// after the browser event has already occurred. 31343// Support: IE <=9 - 10 only 31344// Older IE sometimes signals "interactive" too soon 31345if ( document.readyState === "complete" || 31346 ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { 31347 31348 // Handle it asynchronously to allow scripts the opportunity to delay ready 31349 window.setTimeout( jQuery.ready ); 31350 31351} else { 31352 31353 // Use the handy event callback 31354 document.addEventListener( "DOMContentLoaded", completed ); 31355 31356 // A fallback to window.onload, that will always work 31357 window.addEventListener( "load", completed ); 31358} 31359 31360 31361 31362 31363// Multifunctional method to get and set values of a collection 31364// The value/s can optionally be executed if it's a function 31365var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { 31366 var i = 0, 31367 len = elems.length, 31368 bulk = key == null; 31369 31370 // Sets many values 31371 if ( toType( key ) === "object" ) { 31372 chainable = true; 31373 for ( i in key ) { 31374 access( elems, fn, i, key[ i ], true, emptyGet, raw ); 31375 } 31376 31377 // Sets one value 31378 } else if ( value !== undefined ) { 31379 chainable = true; 31380 31381 if ( !isFunction( value ) ) { 31382 raw = true; 31383 } 31384 31385 if ( bulk ) { 31386 31387 // Bulk operations run against the entire set 31388 if ( raw ) { 31389 fn.call( elems, value ); 31390 fn = null; 31391 31392 // ...except when executing function values 31393 } else { 31394 bulk = fn; 31395 fn = function( elem, _key, value ) { 31396 return bulk.call( jQuery( elem ), value ); 31397 }; 31398 } 31399 } 31400 31401 if ( fn ) { 31402 for ( ; i < len; i++ ) { 31403 fn( 31404 elems[ i ], key, raw ? 31405 value : 31406 value.call( elems[ i ], i, fn( elems[ i ], key ) ) 31407 ); 31408 } 31409 } 31410 } 31411 31412 if ( chainable ) { 31413 return elems; 31414 } 31415 31416 // Gets 31417 if ( bulk ) { 31418 return fn.call( elems ); 31419 } 31420 31421 return len ? fn( elems[ 0 ], key ) : emptyGet; 31422}; 31423 31424 31425// Matches dashed string for camelizing 31426var rmsPrefix = /^-ms-/, 31427 rdashAlpha = /-([a-z])/g; 31428 31429// Used by camelCase as callback to replace() 31430function fcamelCase( _all, letter ) { 31431 return letter.toUpperCase(); 31432} 31433 31434// Convert dashed to camelCase; used by the css and data modules 31435// Support: IE <=9 - 11, Edge 12 - 15 31436// Microsoft forgot to hump their vendor prefix (trac-9572) 31437function camelCase( string ) { 31438 return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); 31439} 31440var acceptData = function( owner ) { 31441 31442 // Accepts only: 31443 // - Node 31444 // - Node.ELEMENT_NODE 31445 // - Node.DOCUMENT_NODE 31446 // - Object 31447 // - Any 31448 return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); 31449}; 31450 31451 31452 31453 31454function Data() { 31455 this.expando = jQuery.expando + Data.uid++; 31456} 31457 31458Data.uid = 1; 31459 31460Data.prototype = { 31461 31462 cache: function( owner ) { 31463 31464 // Check if the owner object already has a cache 31465 var value = owner[ this.expando ]; 31466 31467 // If not, create one 31468 if ( !value ) { 31469 value = {}; 31470 31471 // We can accept data for non-element nodes in modern browsers, 31472 // but we should not, see trac-8335. 31473 // Always return an empty object. 31474 if ( acceptData( owner ) ) { 31475 31476 // If it is a node unlikely to be stringify-ed or looped over 31477 // use plain assignment 31478 if ( owner.nodeType ) { 31479 owner[ this.expando ] = value; 31480 31481 // Otherwise secure it in a non-enumerable property 31482 // configurable must be true to allow the property to be 31483 // deleted when data is removed 31484 } else { 31485 Object.defineProperty( owner, this.expando, { 31486 value: value, 31487 configurable: true 31488 } ); 31489 } 31490 } 31491 } 31492 31493 return value; 31494 }, 31495 set: function( owner, data, value ) { 31496 var prop, 31497 cache = this.cache( owner ); 31498 31499 // Handle: [ owner, key, value ] args 31500 // Always use camelCase key (gh-2257) 31501 if ( typeof data === "string" ) { 31502 cache[ camelCase( data ) ] = value; 31503 31504 // Handle: [ owner, { properties } ] args 31505 } else { 31506 31507 // Copy the properties one-by-one to the cache object 31508 for ( prop in data ) { 31509 cache[ camelCase( prop ) ] = data[ prop ]; 31510 } 31511 } 31512 return cache; 31513 }, 31514 get: function( owner, key ) { 31515 return key === undefined ? 31516 this.cache( owner ) : 31517 31518 // Always use camelCase key (gh-2257) 31519 owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; 31520 }, 31521 access: function( owner, key, value ) { 31522 31523 // In cases where either: 31524 // 31525 // 1. No key was specified 31526 // 2. A string key was specified, but no value provided 31527 // 31528 // Take the "read" path and allow the get method to determine 31529 // which value to return, respectively either: 31530 // 31531 // 1. The entire cache object 31532 // 2. The data stored at the key 31533 // 31534 if ( key === undefined || 31535 ( ( key && typeof key === "string" ) && value === undefined ) ) { 31536 31537 return this.get( owner, key ); 31538 } 31539 31540 // When the key is not a string, or both a key and value 31541 // are specified, set or extend (existing objects) with either: 31542 // 31543 // 1. An object of properties 31544 // 2. A key and value 31545 // 31546 this.set( owner, key, value ); 31547 31548 // Since the "set" path can have two possible entry points 31549 // return the expected data based on which path was taken[*] 31550 return value !== undefined ? value : key; 31551 }, 31552 remove: function( owner, key ) { 31553 var i, 31554 cache = owner[ this.expando ]; 31555 31556 if ( cache === undefined ) { 31557 return; 31558 } 31559 31560 if ( key !== undefined ) { 31561 31562 // Support array or space separated string of keys 31563 if ( Array.isArray( key ) ) { 31564 31565 // If key is an array of keys... 31566 // We always set camelCase keys, so remove that. 31567 key = key.map( camelCase ); 31568 } else { 31569 key = camelCase( key ); 31570 31571 // If a key with the spaces exists, use it. 31572 // Otherwise, create an array by matching non-whitespace 31573 key = key in cache ? 31574 [ key ] : 31575 ( key.match( rnothtmlwhite ) || [] ); 31576 } 31577 31578 i = key.length; 31579 31580 while ( i-- ) { 31581 delete cache[ key[ i ] ]; 31582 } 31583 } 31584 31585 // Remove the expando if there's no more data 31586 if ( key === undefined || jQuery.isEmptyObject( cache ) ) { 31587 31588 // Support: Chrome <=35 - 45 31589 // Webkit & Blink performance suffers when deleting properties 31590 // from DOM nodes, so set to undefined instead 31591 // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) 31592 if ( owner.nodeType ) { 31593 owner[ this.expando ] = undefined; 31594 } else { 31595 delete owner[ this.expando ]; 31596 } 31597 } 31598 }, 31599 hasData: function( owner ) { 31600 var cache = owner[ this.expando ]; 31601 return cache !== undefined && !jQuery.isEmptyObject( cache ); 31602 } 31603}; 31604var dataPriv = new Data(); 31605 31606var dataUser = new Data(); 31607 31608 31609 31610// Implementation Summary 31611// 31612// 1. Enforce API surface and semantic compatibility with 1.9.x branch 31613// 2. Improve the module's maintainability by reducing the storage 31614// paths to a single mechanism. 31615// 3. Use the same single mechanism to support "private" and "user" data. 31616// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) 31617// 5. Avoid exposing implementation details on user objects (eg. expando properties) 31618// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 31619 31620var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, 31621 rmultiDash = /[A-Z]/g; 31622 31623function getData( data ) { 31624 if ( data === "true" ) { 31625 return true; 31626 } 31627 31628 if ( data === "false" ) { 31629 return false; 31630 } 31631 31632 if ( data === "null" ) { 31633 return null; 31634 } 31635 31636 // Only convert to a number if it doesn't change the string 31637 if ( data === +data + "" ) { 31638 return +data; 31639 } 31640 31641 if ( rbrace.test( data ) ) { 31642 return JSON.parse( data ); 31643 } 31644 31645 return data; 31646} 31647 31648function dataAttr( elem, key, data ) { 31649 var name; 31650 31651 // If nothing was found internally, try to fetch any 31652 // data from the HTML5 data-* attribute 31653 if ( data === undefined && elem.nodeType === 1 ) { 31654 name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); 31655 data = elem.getAttribute( name ); 31656 31657 if ( typeof data === "string" ) { 31658 try { 31659 data = getData( data ); 31660 } catch ( e ) {} 31661 31662 // Make sure we set the data so it isn't changed later 31663 dataUser.set( elem, key, data ); 31664 } else { 31665 data = undefined; 31666 } 31667 } 31668 return data; 31669} 31670 31671jQuery.extend( { 31672 hasData: function( elem ) { 31673 return dataUser.hasData( elem ) || dataPriv.hasData( elem ); 31674 }, 31675 31676 data: function( elem, name, data ) { 31677 return dataUser.access( elem, name, data ); 31678 }, 31679 31680 removeData: function( elem, name ) { 31681 dataUser.remove( elem, name ); 31682 }, 31683 31684 // TODO: Now that all calls to _data and _removeData have been replaced 31685 // with direct calls to dataPriv methods, these can be deprecated. 31686 _data: function( elem, name, data ) { 31687 return dataPriv.access( elem, name, data ); 31688 }, 31689 31690 _removeData: function( elem, name ) { 31691 dataPriv.remove( elem, name ); 31692 } 31693} ); 31694 31695jQuery.fn.extend( { 31696 data: function( key, value ) { 31697 var i, name, data, 31698 elem = this[ 0 ], 31699 attrs = elem && elem.attributes; 31700 31701 // Gets all values 31702 if ( key === undefined ) { 31703 if ( this.length ) { 31704 data = dataUser.get( elem ); 31705 31706 if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { 31707 i = attrs.length; 31708 while ( i-- ) { 31709 31710 // Support: IE 11 only 31711 // The attrs elements can be null (trac-14894) 31712 if ( attrs[ i ] ) { 31713 name = attrs[ i ].name; 31714 if ( name.indexOf( "data-" ) === 0 ) { 31715 name = camelCase( name.slice( 5 ) ); 31716 dataAttr( elem, name, data[ name ] ); 31717 } 31718 } 31719 } 31720 dataPriv.set( elem, "hasDataAttrs", true ); 31721 } 31722 } 31723 31724 return data; 31725 } 31726 31727 // Sets multiple values 31728 if ( typeof key === "object" ) { 31729 return this.each( function() { 31730 dataUser.set( this, key ); 31731 } ); 31732 } 31733 31734 return access( this, function( value ) { 31735 var data; 31736 31737 // The calling jQuery object (element matches) is not empty 31738 // (and therefore has an element appears at this[ 0 ]) and the 31739 // `value` parameter was not undefined. An empty jQuery object 31740 // will result in `undefined` for elem = this[ 0 ] which will 31741 // throw an exception if an attempt to read a data cache is made. 31742 if ( elem && value === undefined ) { 31743 31744 // Attempt to get data from the cache 31745 // The key will always be camelCased in Data 31746 data = dataUser.get( elem, key ); 31747 if ( data !== undefined ) { 31748 return data; 31749 } 31750 31751 // Attempt to "discover" the data in 31752 // HTML5 custom data-* attrs 31753 data = dataAttr( elem, key ); 31754 if ( data !== undefined ) { 31755 return data; 31756 } 31757 31758 // We tried really hard, but the data doesn't exist. 31759 return; 31760 } 31761 31762 // Set the data... 31763 this.each( function() { 31764 31765 // We always store the camelCased key 31766 dataUser.set( this, key, value ); 31767 } ); 31768 }, null, value, arguments.length > 1, null, true ); 31769 }, 31770 31771 removeData: function( key ) { 31772 return this.each( function() { 31773 dataUser.remove( this, key ); 31774 } ); 31775 } 31776} ); 31777 31778 31779jQuery.extend( { 31780 queue: function( elem, type, data ) { 31781 var queue; 31782 31783 if ( elem ) { 31784 type = ( type || "fx" ) + "queue"; 31785 queue = dataPriv.get( elem, type ); 31786 31787 // Speed up dequeue by getting out quickly if this is just a lookup 31788 if ( data ) { 31789 if ( !queue || Array.isArray( data ) ) { 31790 queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); 31791 } else { 31792 queue.push( data ); 31793 } 31794 } 31795 return queue || []; 31796 } 31797 }, 31798 31799 dequeue: function( elem, type ) { 31800 type = type || "fx"; 31801 31802 var queue = jQuery.queue( elem, type ), 31803 startLength = queue.length, 31804 fn = queue.shift(), 31805 hooks = jQuery._queueHooks( elem, type ), 31806 next = function() { 31807 jQuery.dequeue( elem, type ); 31808 }; 31809 31810 // If the fx queue is dequeued, always remove the progress sentinel 31811 if ( fn === "inprogress" ) { 31812 fn = queue.shift(); 31813 startLength--; 31814 } 31815 31816 if ( fn ) { 31817 31818 // Add a progress sentinel to prevent the fx queue from being 31819 // automatically dequeued 31820 if ( type === "fx" ) { 31821 queue.unshift( "inprogress" ); 31822 } 31823 31824 // Clear up the last queue stop function 31825 delete hooks.stop; 31826 fn.call( elem, next, hooks ); 31827 } 31828 31829 if ( !startLength && hooks ) { 31830 hooks.empty.fire(); 31831 } 31832 }, 31833 31834 // Not public - generate a queueHooks object, or return the current one 31835 _queueHooks: function( elem, type ) { 31836 var key = type + "queueHooks"; 31837 return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { 31838 empty: jQuery.Callbacks( "once memory" ).add( function() { 31839 dataPriv.remove( elem, [ type + "queue", key ] ); 31840 } ) 31841 } ); 31842 } 31843} ); 31844 31845jQuery.fn.extend( { 31846 queue: function( type, data ) { 31847 var setter = 2; 31848 31849 if ( typeof type !== "string" ) { 31850 data = type; 31851 type = "fx"; 31852 setter--; 31853 } 31854 31855 if ( arguments.length < setter ) { 31856 return jQuery.queue( this[ 0 ], type ); 31857 } 31858 31859 return data === undefined ? 31860 this : 31861 this.each( function() { 31862 var queue = jQuery.queue( this, type, data ); 31863 31864 // Ensure a hooks for this queue 31865 jQuery._queueHooks( this, type ); 31866 31867 if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { 31868 jQuery.dequeue( this, type ); 31869 } 31870 } ); 31871 }, 31872 dequeue: function( type ) { 31873 return this.each( function() { 31874 jQuery.dequeue( this, type ); 31875 } ); 31876 }, 31877 clearQueue: function( type ) { 31878 return this.queue( type || "fx", [] ); 31879 }, 31880 31881 // Get a promise resolved when queues of a certain type 31882 // are emptied (fx is the type by default) 31883 promise: function( type, obj ) { 31884 var tmp, 31885 count = 1, 31886 defer = jQuery.Deferred(), 31887 elements = this, 31888 i = this.length, 31889 resolve = function() { 31890 if ( !( --count ) ) { 31891 defer.resolveWith( elements, [ elements ] ); 31892 } 31893 }; 31894 31895 if ( typeof type !== "string" ) { 31896 obj = type; 31897 type = undefined; 31898 } 31899 type = type || "fx"; 31900 31901 while ( i-- ) { 31902 tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); 31903 if ( tmp && tmp.empty ) { 31904 count++; 31905 tmp.empty.add( resolve ); 31906 } 31907 } 31908 resolve(); 31909 return defer.promise( obj ); 31910 } 31911} ); 31912var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; 31913 31914var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); 31915 31916 31917var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; 31918 31919var documentElement = document.documentElement; 31920 31921 31922 31923 var isAttached = function( elem ) { 31924 return jQuery.contains( elem.ownerDocument, elem ); 31925 }, 31926 composed = { composed: true }; 31927 31928 // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only 31929 // Check attachment across shadow DOM boundaries when possible (gh-3504) 31930 // Support: iOS 10.0-10.2 only 31931 // Early iOS 10 versions support `attachShadow` but not `getRootNode`, 31932 // leading to errors. We need to check for `getRootNode`. 31933 if ( documentElement.getRootNode ) { 31934 isAttached = function( elem ) { 31935 return jQuery.contains( elem.ownerDocument, elem ) || 31936 elem.getRootNode( composed ) === elem.ownerDocument; 31937 }; 31938 } 31939var isHiddenWithinTree = function( elem, el ) { 31940 31941 // isHiddenWithinTree might be called from jQuery#filter function; 31942 // in that case, element will be second argument 31943 elem = el || elem; 31944 31945 // Inline style trumps all 31946 return elem.style.display === "none" || 31947 elem.style.display === "" && 31948 31949 // Otherwise, check computed style 31950 // Support: Firefox <=43 - 45 31951 // Disconnected elements can have computed display: none, so first confirm that elem is 31952 // in the document. 31953 isAttached( elem ) && 31954 31955 jQuery.css( elem, "display" ) === "none"; 31956 }; 31957 31958 31959 31960function adjustCSS( elem, prop, valueParts, tween ) { 31961 var adjusted, scale, 31962 maxIterations = 20, 31963 currentValue = tween ? 31964 function() { 31965 return tween.cur(); 31966 } : 31967 function() { 31968 return jQuery.css( elem, prop, "" ); 31969 }, 31970 initial = currentValue(), 31971 unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), 31972 31973 // Starting value computation is required for potential unit mismatches 31974 initialInUnit = elem.nodeType && 31975 ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && 31976 rcssNum.exec( jQuery.css( elem, prop ) ); 31977 31978 if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { 31979 31980 // Support: Firefox <=54 31981 // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) 31982 initial = initial / 2; 31983 31984 // Trust units reported by jQuery.css 31985 unit = unit || initialInUnit[ 3 ]; 31986 31987 // Iteratively approximate from a nonzero starting point 31988 initialInUnit = +initial || 1; 31989 31990 while ( maxIterations-- ) { 31991 31992 // Evaluate and update our best guess (doubling guesses that zero out). 31993 // Finish if the scale equals or crosses 1 (making the old*new product non-positive). 31994 jQuery.style( elem, prop, initialInUnit + unit ); 31995 if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { 31996 maxIterations = 0; 31997 } 31998 initialInUnit = initialInUnit / scale; 31999 32000 } 32001 32002 initialInUnit = initialInUnit * 2; 32003 jQuery.style( elem, prop, initialInUnit + unit ); 32004 32005 // Make sure we update the tween properties later on 32006 valueParts = valueParts || []; 32007 } 32008 32009 if ( valueParts ) { 32010 initialInUnit = +initialInUnit || +initial || 0; 32011 32012 // Apply relative offset (+=/-=) if specified 32013 adjusted = valueParts[ 1 ] ? 32014 initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : 32015 +valueParts[ 2 ]; 32016 if ( tween ) { 32017 tween.unit = unit; 32018 tween.start = initialInUnit; 32019 tween.end = adjusted; 32020 } 32021 } 32022 return adjusted; 32023} 32024 32025 32026var defaultDisplayMap = {}; 32027 32028function getDefaultDisplay( elem ) { 32029 var temp, 32030 doc = elem.ownerDocument, 32031 nodeName = elem.nodeName, 32032 display = defaultDisplayMap[ nodeName ]; 32033 32034 if ( display ) { 32035 return display; 32036 } 32037 32038 temp = doc.body.appendChild( doc.createElement( nodeName ) ); 32039 display = jQuery.css( temp, "display" ); 32040 32041 temp.parentNode.removeChild( temp ); 32042 32043 if ( display === "none" ) { 32044 display = "block"; 32045 } 32046 defaultDisplayMap[ nodeName ] = display; 32047 32048 return display; 32049} 32050 32051function showHide( elements, show ) { 32052 var display, elem, 32053 values = [], 32054 index = 0, 32055 length = elements.length; 32056 32057 // Determine new display value for elements that need to change 32058 for ( ; index < length; index++ ) { 32059 elem = elements[ index ]; 32060 if ( !elem.style ) { 32061 continue; 32062 } 32063 32064 display = elem.style.display; 32065 if ( show ) { 32066 32067 // Since we force visibility upon cascade-hidden elements, an immediate (and slow) 32068 // check is required in this first loop unless we have a nonempty display value (either 32069 // inline or about-to-be-restored) 32070 if ( display === "none" ) { 32071 values[ index ] = dataPriv.get( elem, "display" ) || null; 32072 if ( !values[ index ] ) { 32073 elem.style.display = ""; 32074 } 32075 } 32076 if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { 32077 values[ index ] = getDefaultDisplay( elem ); 32078 } 32079 } else { 32080 if ( display !== "none" ) { 32081 values[ index ] = "none"; 32082 32083 // Remember what we're overwriting 32084 dataPriv.set( elem, "display", display ); 32085 } 32086 } 32087 } 32088 32089 // Set the display of the elements in a second loop to avoid constant reflow 32090 for ( index = 0; index < length; index++ ) { 32091 if ( values[ index ] != null ) { 32092 elements[ index ].style.display = values[ index ]; 32093 } 32094 } 32095 32096 return elements; 32097} 32098 32099jQuery.fn.extend( { 32100 show: function() { 32101 return showHide( this, true ); 32102 }, 32103 hide: function() { 32104 return showHide( this ); 32105 }, 32106 toggle: function( state ) { 32107 if ( typeof state === "boolean" ) { 32108 return state ? this.show() : this.hide(); 32109 } 32110 32111 return this.each( function() { 32112 if ( isHiddenWithinTree( this ) ) { 32113 jQuery( this ).show(); 32114 } else { 32115 jQuery( this ).hide(); 32116 } 32117 } ); 32118 } 32119} ); 32120var rcheckableType = ( /^(?:checkbox|radio)$/i ); 32121 32122var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); 32123 32124var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); 32125 32126 32127 32128( function() { 32129 var fragment = document.createDocumentFragment(), 32130 div = fragment.appendChild( document.createElement( "div" ) ), 32131 input = document.createElement( "input" ); 32132 32133 // Support: Android 4.0 - 4.3 only 32134 // Check state lost if the name is set (trac-11217) 32135 // Support: Windows Web Apps (WWA) 32136 // `name` and `type` must use .setAttribute for WWA (trac-14901) 32137 input.setAttribute( "type", "radio" ); 32138 input.setAttribute( "checked", "checked" ); 32139 input.setAttribute( "name", "t" ); 32140 32141 div.appendChild( input ); 32142 32143 // Support: Android <=4.1 only 32144 // Older WebKit doesn't clone checked state correctly in fragments 32145 support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; 32146 32147 // Support: IE <=11 only 32148 // Make sure textarea (and checkbox) defaultValue is properly cloned 32149 div.innerHTML = "<textarea>x</textarea>"; 32150 support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; 32151 32152 // Support: IE <=9 only 32153 // IE <=9 replaces <option> tags with their contents when inserted outside of 32154 // the select element. 32155 div.innerHTML = "<option></option>"; 32156 support.option = !!div.lastChild; 32157} )(); 32158 32159 32160// We have to close these tags to support XHTML (trac-13200) 32161var wrapMap = { 32162 32163 // XHTML parsers do not magically insert elements in the 32164 // same way that tag soup parsers do. So we cannot shorten 32165 // this by omitting <tbody> or other required elements. 32166 thead: [ 1, "<table>", "</table>" ], 32167 col: [ 2, "<table><colgroup>", "</colgroup></table>" ], 32168 tr: [ 2, "<table><tbody>", "</tbody></table>" ], 32169 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], 32170 32171 _default: [ 0, "", "" ] 32172}; 32173 32174wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; 32175wrapMap.th = wrapMap.td; 32176 32177// Support: IE <=9 only 32178if ( !support.option ) { 32179 wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ]; 32180} 32181 32182 32183function getAll( context, tag ) { 32184 32185 // Support: IE <=9 - 11 only 32186 // Use typeof to avoid zero-argument method invocation on host objects (trac-15151) 32187 var ret; 32188 32189 if ( typeof context.getElementsByTagName !== "undefined" ) { 32190 ret = context.getElementsByTagName( tag || "*" ); 32191 32192 } else if ( typeof context.querySelectorAll !== "undefined" ) { 32193 ret = context.querySelectorAll( tag || "*" ); 32194 32195 } else { 32196 ret = []; 32197 } 32198 32199 if ( tag === undefined || tag && nodeName( context, tag ) ) { 32200 return jQuery.merge( [ context ], ret ); 32201 } 32202 32203 return ret; 32204} 32205 32206 32207// Mark scripts as having already been evaluated 32208function setGlobalEval( elems, refElements ) { 32209 var i = 0, 32210 l = elems.length; 32211 32212 for ( ; i < l; i++ ) { 32213 dataPriv.set( 32214 elems[ i ], 32215 "globalEval", 32216 !refElements || dataPriv.get( refElements[ i ], "globalEval" ) 32217 ); 32218 } 32219} 32220 32221 32222var rhtml = /<|&#?\w+;/; 32223 32224function buildFragment( elems, context, scripts, selection, ignored ) { 32225 var elem, tmp, tag, wrap, attached, j, 32226 fragment = context.createDocumentFragment(), 32227 nodes = [], 32228 i = 0, 32229 l = elems.length; 32230 32231 for ( ; i < l; i++ ) { 32232 elem = elems[ i ]; 32233 32234 if ( elem || elem === 0 ) { 32235 32236 // Add nodes directly 32237 if ( toType( elem ) === "object" ) { 32238 32239 // Support: Android <=4.0 only, PhantomJS 1 only 32240 // push.apply(_, arraylike) throws on ancient WebKit 32241 jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); 32242 32243 // Convert non-html into a text node 32244 } else if ( !rhtml.test( elem ) ) { 32245 nodes.push( context.createTextNode( elem ) ); 32246 32247 // Convert html into DOM nodes 32248 } else { 32249 tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); 32250 32251 // Deserialize a standard representation 32252 tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); 32253 wrap = wrapMap[ tag ] || wrapMap._default; 32254 tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; 32255 32256 // Descend through wrappers to the right content 32257 j = wrap[ 0 ]; 32258 while ( j-- ) { 32259 tmp = tmp.lastChild; 32260 } 32261 32262 // Support: Android <=4.0 only, PhantomJS 1 only 32263 // push.apply(_, arraylike) throws on ancient WebKit 32264 jQuery.merge( nodes, tmp.childNodes ); 32265 32266 // Remember the top-level container 32267 tmp = fragment.firstChild; 32268 32269 // Ensure the created nodes are orphaned (trac-12392) 32270 tmp.textContent = ""; 32271 } 32272 } 32273 } 32274 32275 // Remove wrapper from fragment 32276 fragment.textContent = ""; 32277 32278 i = 0; 32279 while ( ( elem = nodes[ i++ ] ) ) { 32280 32281 // Skip elements already in the context collection (trac-4087) 32282 if ( selection && jQuery.inArray( elem, selection ) > -1 ) { 32283 if ( ignored ) { 32284 ignored.push( elem ); 32285 } 32286 continue; 32287 } 32288 32289 attached = isAttached( elem ); 32290 32291 // Append to fragment 32292 tmp = getAll( fragment.appendChild( elem ), "script" ); 32293 32294 // Preserve script evaluation history 32295 if ( attached ) { 32296 setGlobalEval( tmp ); 32297 } 32298 32299 // Capture executables 32300 if ( scripts ) { 32301 j = 0; 32302 while ( ( elem = tmp[ j++ ] ) ) { 32303 if ( rscriptType.test( elem.type || "" ) ) { 32304 scripts.push( elem ); 32305 } 32306 } 32307 } 32308 } 32309 32310 return fragment; 32311} 32312 32313 32314var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; 32315 32316function returnTrue() { 32317 return true; 32318} 32319 32320function returnFalse() { 32321 return false; 32322} 32323 32324function on( elem, types, selector, data, fn, one ) { 32325 var origFn, type; 32326 32327 // Types can be a map of types/handlers 32328 if ( typeof types === "object" ) { 32329 32330 // ( types-Object, selector, data ) 32331 if ( typeof selector !== "string" ) { 32332 32333 // ( types-Object, data ) 32334 data = data || selector; 32335 selector = undefined; 32336 } 32337 for ( type in types ) { 32338 on( elem, type, selector, data, types[ type ], one ); 32339 } 32340 return elem; 32341 } 32342 32343 if ( data == null && fn == null ) { 32344 32345 // ( types, fn ) 32346 fn = selector; 32347 data = selector = undefined; 32348 } else if ( fn == null ) { 32349 if ( typeof selector === "string" ) { 32350 32351 // ( types, selector, fn ) 32352 fn = data; 32353 data = undefined; 32354 } else { 32355 32356 // ( types, data, fn ) 32357 fn = data; 32358 data = selector; 32359 selector = undefined; 32360 } 32361 } 32362 if ( fn === false ) { 32363 fn = returnFalse; 32364 } else if ( !fn ) { 32365 return elem; 32366 } 32367 32368 if ( one === 1 ) { 32369 origFn = fn; 32370 fn = function( event ) { 32371 32372 // Can use an empty set, since event contains the info 32373 jQuery().off( event ); 32374 return origFn.apply( this, arguments ); 32375 }; 32376 32377 // Use same guid so caller can remove using origFn 32378 fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); 32379 } 32380 return elem.each( function() { 32381 jQuery.event.add( this, types, fn, data, selector ); 32382 } ); 32383} 32384 32385/* 32386 * Helper functions for managing events -- not part of the public interface. 32387 * Props to Dean Edwards' addEvent library for many of the ideas. 32388 */ 32389jQuery.event = { 32390 32391 global: {}, 32392 32393 add: function( elem, types, handler, data, selector ) { 32394 32395 var handleObjIn, eventHandle, tmp, 32396 events, t, handleObj, 32397 special, handlers, type, namespaces, origType, 32398 elemData = dataPriv.get( elem ); 32399 32400 // Only attach events to objects that accept data 32401 if ( !acceptData( elem ) ) { 32402 return; 32403 } 32404 32405 // Caller can pass in an object of custom data in lieu of the handler 32406 if ( handler.handler ) { 32407 handleObjIn = handler; 32408 handler = handleObjIn.handler; 32409 selector = handleObjIn.selector; 32410 } 32411 32412 // Ensure that invalid selectors throw exceptions at attach time 32413 // Evaluate against documentElement in case elem is a non-element node (e.g., document) 32414 if ( selector ) { 32415 jQuery.find.matchesSelector( documentElement, selector ); 32416 } 32417 32418 // Make sure that the handler has a unique ID, used to find/remove it later 32419 if ( !handler.guid ) { 32420 handler.guid = jQuery.guid++; 32421 } 32422 32423 // Init the element's event structure and main handler, if this is the first 32424 if ( !( events = elemData.events ) ) { 32425 events = elemData.events = Object.create( null ); 32426 } 32427 if ( !( eventHandle = elemData.handle ) ) { 32428 eventHandle = elemData.handle = function( e ) { 32429 32430 // Discard the second event of a jQuery.event.trigger() and 32431 // when an event is called after a page has unloaded 32432 return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? 32433 jQuery.event.dispatch.apply( elem, arguments ) : undefined; 32434 }; 32435 } 32436 32437 // Handle multiple events separated by a space 32438 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 32439 t = types.length; 32440 while ( t-- ) { 32441 tmp = rtypenamespace.exec( types[ t ] ) || []; 32442 type = origType = tmp[ 1 ]; 32443 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 32444 32445 // There *must* be a type, no attaching namespace-only handlers 32446 if ( !type ) { 32447 continue; 32448 } 32449 32450 // If event changes its type, use the special event handlers for the changed type 32451 special = jQuery.event.special[ type ] || {}; 32452 32453 // If selector defined, determine special event api type, otherwise given type 32454 type = ( selector ? special.delegateType : special.bindType ) || type; 32455 32456 // Update special based on newly reset type 32457 special = jQuery.event.special[ type ] || {}; 32458 32459 // handleObj is passed to all event handlers 32460 handleObj = jQuery.extend( { 32461 type: type, 32462 origType: origType, 32463 data: data, 32464 handler: handler, 32465 guid: handler.guid, 32466 selector: selector, 32467 needsContext: selector && jQuery.expr.match.needsContext.test( selector ), 32468 namespace: namespaces.join( "." ) 32469 }, handleObjIn ); 32470 32471 // Init the event handler queue if we're the first 32472 if ( !( handlers = events[ type ] ) ) { 32473 handlers = events[ type ] = []; 32474 handlers.delegateCount = 0; 32475 32476 // Only use addEventListener if the special events handler returns false 32477 if ( !special.setup || 32478 special.setup.call( elem, data, namespaces, eventHandle ) === false ) { 32479 32480 if ( elem.addEventListener ) { 32481 elem.addEventListener( type, eventHandle ); 32482 } 32483 } 32484 } 32485 32486 if ( special.add ) { 32487 special.add.call( elem, handleObj ); 32488 32489 if ( !handleObj.handler.guid ) { 32490 handleObj.handler.guid = handler.guid; 32491 } 32492 } 32493 32494 // Add to the element's handler list, delegates in front 32495 if ( selector ) { 32496 handlers.splice( handlers.delegateCount++, 0, handleObj ); 32497 } else { 32498 handlers.push( handleObj ); 32499 } 32500 32501 // Keep track of which events have ever been used, for event optimization 32502 jQuery.event.global[ type ] = true; 32503 } 32504 32505 }, 32506 32507 // Detach an event or set of events from an element 32508 remove: function( elem, types, handler, selector, mappedTypes ) { 32509 32510 var j, origCount, tmp, 32511 events, t, handleObj, 32512 special, handlers, type, namespaces, origType, 32513 elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); 32514 32515 if ( !elemData || !( events = elemData.events ) ) { 32516 return; 32517 } 32518 32519 // Once for each type.namespace in types; type may be omitted 32520 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 32521 t = types.length; 32522 while ( t-- ) { 32523 tmp = rtypenamespace.exec( types[ t ] ) || []; 32524 type = origType = tmp[ 1 ]; 32525 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 32526 32527 // Unbind all events (on this namespace, if provided) for the element 32528 if ( !type ) { 32529 for ( type in events ) { 32530 jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); 32531 } 32532 continue; 32533 } 32534 32535 special = jQuery.event.special[ type ] || {}; 32536 type = ( selector ? special.delegateType : special.bindType ) || type; 32537 handlers = events[ type ] || []; 32538 tmp = tmp[ 2 ] && 32539 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); 32540 32541 // Remove matching events 32542 origCount = j = handlers.length; 32543 while ( j-- ) { 32544 handleObj = handlers[ j ]; 32545 32546 if ( ( mappedTypes || origType === handleObj.origType ) && 32547 ( !handler || handler.guid === handleObj.guid ) && 32548 ( !tmp || tmp.test( handleObj.namespace ) ) && 32549 ( !selector || selector === handleObj.selector || 32550 selector === "**" && handleObj.selector ) ) { 32551 handlers.splice( j, 1 ); 32552 32553 if ( handleObj.selector ) { 32554 handlers.delegateCount--; 32555 } 32556 if ( special.remove ) { 32557 special.remove.call( elem, handleObj ); 32558 } 32559 } 32560 } 32561 32562 // Remove generic event handler if we removed something and no more handlers exist 32563 // (avoids potential for endless recursion during removal of special event handlers) 32564 if ( origCount && !handlers.length ) { 32565 if ( !special.teardown || 32566 special.teardown.call( elem, namespaces, elemData.handle ) === false ) { 32567 32568 jQuery.removeEvent( elem, type, elemData.handle ); 32569 } 32570 32571 delete events[ type ]; 32572 } 32573 } 32574 32575 // Remove data and the expando if it's no longer used 32576 if ( jQuery.isEmptyObject( events ) ) { 32577 dataPriv.remove( elem, "handle events" ); 32578 } 32579 }, 32580 32581 dispatch: function( nativeEvent ) { 32582 32583 var i, j, ret, matched, handleObj, handlerQueue, 32584 args = new Array( arguments.length ), 32585 32586 // Make a writable jQuery.Event from the native event object 32587 event = jQuery.event.fix( nativeEvent ), 32588 32589 handlers = ( 32590 dataPriv.get( this, "events" ) || Object.create( null ) 32591 )[ event.type ] || [], 32592 special = jQuery.event.special[ event.type ] || {}; 32593 32594 // Use the fix-ed jQuery.Event rather than the (read-only) native event 32595 args[ 0 ] = event; 32596 32597 for ( i = 1; i < arguments.length; i++ ) { 32598 args[ i ] = arguments[ i ]; 32599 } 32600 32601 event.delegateTarget = this; 32602 32603 // Call the preDispatch hook for the mapped type, and let it bail if desired 32604 if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { 32605 return; 32606 } 32607 32608 // Determine handlers 32609 handlerQueue = jQuery.event.handlers.call( this, event, handlers ); 32610 32611 // Run delegates first; they may want to stop propagation beneath us 32612 i = 0; 32613 while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { 32614 event.currentTarget = matched.elem; 32615 32616 j = 0; 32617 while ( ( handleObj = matched.handlers[ j++ ] ) && 32618 !event.isImmediatePropagationStopped() ) { 32619 32620 // If the event is namespaced, then each handler is only invoked if it is 32621 // specially universal or its namespaces are a superset of the event's. 32622 if ( !event.rnamespace || handleObj.namespace === false || 32623 event.rnamespace.test( handleObj.namespace ) ) { 32624 32625 event.handleObj = handleObj; 32626 event.data = handleObj.data; 32627 32628 ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || 32629 handleObj.handler ).apply( matched.elem, args ); 32630 32631 if ( ret !== undefined ) { 32632 if ( ( event.result = ret ) === false ) { 32633 event.preventDefault(); 32634 event.stopPropagation(); 32635 } 32636 } 32637 } 32638 } 32639 } 32640 32641 // Call the postDispatch hook for the mapped type 32642 if ( special.postDispatch ) { 32643 special.postDispatch.call( this, event ); 32644 } 32645 32646 return event.result; 32647 }, 32648 32649 handlers: function( event, handlers ) { 32650 var i, handleObj, sel, matchedHandlers, matchedSelectors, 32651 handlerQueue = [], 32652 delegateCount = handlers.delegateCount, 32653 cur = event.target; 32654 32655 // Find delegate handlers 32656 if ( delegateCount && 32657 32658 // Support: IE <=9 32659 // Black-hole SVG <use> instance trees (trac-13180) 32660 cur.nodeType && 32661 32662 // Support: Firefox <=42 32663 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) 32664 // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click 32665 // Support: IE 11 only 32666 // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) 32667 !( event.type === "click" && event.button >= 1 ) ) { 32668 32669 for ( ; cur !== this; cur = cur.parentNode || this ) { 32670 32671 // Don't check non-elements (trac-13208) 32672 // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) 32673 if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { 32674 matchedHandlers = []; 32675 matchedSelectors = {}; 32676 for ( i = 0; i < delegateCount; i++ ) { 32677 handleObj = handlers[ i ]; 32678 32679 // Don't conflict with Object.prototype properties (trac-13203) 32680 sel = handleObj.selector + " "; 32681 32682 if ( matchedSelectors[ sel ] === undefined ) { 32683 matchedSelectors[ sel ] = handleObj.needsContext ? 32684 jQuery( sel, this ).index( cur ) > -1 : 32685 jQuery.find( sel, this, null, [ cur ] ).length; 32686 } 32687 if ( matchedSelectors[ sel ] ) { 32688 matchedHandlers.push( handleObj ); 32689 } 32690 } 32691 if ( matchedHandlers.length ) { 32692 handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); 32693 } 32694 } 32695 } 32696 } 32697 32698 // Add the remaining (directly-bound) handlers 32699 cur = this; 32700 if ( delegateCount < handlers.length ) { 32701 handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); 32702 } 32703 32704 return handlerQueue; 32705 }, 32706 32707 addProp: function( name, hook ) { 32708 Object.defineProperty( jQuery.Event.prototype, name, { 32709 enumerable: true, 32710 configurable: true, 32711 32712 get: isFunction( hook ) ? 32713 function() { 32714 if ( this.originalEvent ) { 32715 return hook( this.originalEvent ); 32716 } 32717 } : 32718 function() { 32719 if ( this.originalEvent ) { 32720 return this.originalEvent[ name ]; 32721 } 32722 }, 32723 32724 set: function( value ) { 32725 Object.defineProperty( this, name, { 32726 enumerable: true, 32727 configurable: true, 32728 writable: true, 32729 value: value 32730 } ); 32731 } 32732 } ); 32733 }, 32734 32735 fix: function( originalEvent ) { 32736 return originalEvent[ jQuery.expando ] ? 32737 originalEvent : 32738 new jQuery.Event( originalEvent ); 32739 }, 32740 32741 special: { 32742 load: { 32743 32744 // Prevent triggered image.load events from bubbling to window.load 32745 noBubble: true 32746 }, 32747 click: { 32748 32749 // Utilize native event to ensure correct state for checkable inputs 32750 setup: function( data ) { 32751 32752 // For mutual compressibility with _default, replace `this` access with a local var. 32753 // `|| data` is dead code meant only to preserve the variable through minification. 32754 var el = this || data; 32755 32756 // Claim the first handler 32757 if ( rcheckableType.test( el.type ) && 32758 el.click && nodeName( el, "input" ) ) { 32759 32760 // dataPriv.set( el, "click", ... ) 32761 leverageNative( el, "click", true ); 32762 } 32763 32764 // Return false to allow normal processing in the caller 32765 return false; 32766 }, 32767 trigger: function( data ) { 32768 32769 // For mutual compressibility with _default, replace `this` access with a local var. 32770 // `|| data` is dead code meant only to preserve the variable through minification. 32771 var el = this || data; 32772 32773 // Force setup before triggering a click 32774 if ( rcheckableType.test( el.type ) && 32775 el.click && nodeName( el, "input" ) ) { 32776 32777 leverageNative( el, "click" ); 32778 } 32779 32780 // Return non-false to allow normal event-path propagation 32781 return true; 32782 }, 32783 32784 // For cross-browser consistency, suppress native .click() on links 32785 // Also prevent it if we're currently inside a leveraged native-event stack 32786 _default: function( event ) { 32787 var target = event.target; 32788 return rcheckableType.test( target.type ) && 32789 target.click && nodeName( target, "input" ) && 32790 dataPriv.get( target, "click" ) || 32791 nodeName( target, "a" ); 32792 } 32793 }, 32794 32795 beforeunload: { 32796 postDispatch: function( event ) { 32797 32798 // Support: Firefox 20+ 32799 // Firefox doesn't alert if the returnValue field is not set. 32800 if ( event.result !== undefined && event.originalEvent ) { 32801 event.originalEvent.returnValue = event.result; 32802 } 32803 } 32804 } 32805 } 32806}; 32807 32808// Ensure the presence of an event listener that handles manually-triggered 32809// synthetic events by interrupting progress until reinvoked in response to 32810// *native* events that it fires directly, ensuring that state changes have 32811// already occurred before other listeners are invoked. 32812function leverageNative( el, type, isSetup ) { 32813 32814 // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add 32815 if ( !isSetup ) { 32816 if ( dataPriv.get( el, type ) === undefined ) { 32817 jQuery.event.add( el, type, returnTrue ); 32818 } 32819 return; 32820 } 32821 32822 // Register the controller as a special universal handler for all event namespaces 32823 dataPriv.set( el, type, false ); 32824 jQuery.event.add( el, type, { 32825 namespace: false, 32826 handler: function( event ) { 32827 var result, 32828 saved = dataPriv.get( this, type ); 32829 32830 if ( ( event.isTrigger & 1 ) && this[ type ] ) { 32831 32832 // Interrupt processing of the outer synthetic .trigger()ed event 32833 if ( !saved ) { 32834 32835 // Store arguments for use when handling the inner native event 32836 // There will always be at least one argument (an event object), so this array 32837 // will not be confused with a leftover capture object. 32838 saved = slice.call( arguments ); 32839 dataPriv.set( this, type, saved ); 32840 32841 // Trigger the native event and capture its result 32842 this[ type ](); 32843 result = dataPriv.get( this, type ); 32844 dataPriv.set( this, type, false ); 32845 32846 if ( saved !== result ) { 32847 32848 // Cancel the outer synthetic event 32849 event.stopImmediatePropagation(); 32850 event.preventDefault(); 32851 32852 return result; 32853 } 32854 32855 // If this is an inner synthetic event for an event with a bubbling surrogate 32856 // (focus or blur), assume that the surrogate already propagated from triggering 32857 // the native event and prevent that from happening again here. 32858 // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the 32859 // bubbling surrogate propagates *after* the non-bubbling base), but that seems 32860 // less bad than duplication. 32861 } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { 32862 event.stopPropagation(); 32863 } 32864 32865 // If this is a native event triggered above, everything is now in order 32866 // Fire an inner synthetic event with the original arguments 32867 } else if ( saved ) { 32868 32869 // ...and capture the result 32870 dataPriv.set( this, type, jQuery.event.trigger( 32871 saved[ 0 ], 32872 saved.slice( 1 ), 32873 this 32874 ) ); 32875 32876 // Abort handling of the native event by all jQuery handlers while allowing 32877 // native handlers on the same element to run. On target, this is achieved 32878 // by stopping immediate propagation just on the jQuery event. However, 32879 // the native event is re-wrapped by a jQuery one on each level of the 32880 // propagation so the only way to stop it for jQuery is to stop it for 32881 // everyone via native `stopPropagation()`. This is not a problem for 32882 // focus/blur which don't bubble, but it does also stop click on checkboxes 32883 // and radios. We accept this limitation. 32884 event.stopPropagation(); 32885 event.isImmediatePropagationStopped = returnTrue; 32886 } 32887 } 32888 } ); 32889} 32890 32891jQuery.removeEvent = function( elem, type, handle ) { 32892 32893 // This "if" is needed for plain objects 32894 if ( elem.removeEventListener ) { 32895 elem.removeEventListener( type, handle ); 32896 } 32897}; 32898 32899jQuery.Event = function( src, props ) { 32900 32901 // Allow instantiation without the 'new' keyword 32902 if ( !( this instanceof jQuery.Event ) ) { 32903 return new jQuery.Event( src, props ); 32904 } 32905 32906 // Event object 32907 if ( src && src.type ) { 32908 this.originalEvent = src; 32909 this.type = src.type; 32910 32911 // Events bubbling up the document may have been marked as prevented 32912 // by a handler lower down the tree; reflect the correct value. 32913 this.isDefaultPrevented = src.defaultPrevented || 32914 src.defaultPrevented === undefined && 32915 32916 // Support: Android <=2.3 only 32917 src.returnValue === false ? 32918 returnTrue : 32919 returnFalse; 32920 32921 // Create target properties 32922 // Support: Safari <=6 - 7 only 32923 // Target should not be a text node (trac-504, trac-13143) 32924 this.target = ( src.target && src.target.nodeType === 3 ) ? 32925 src.target.parentNode : 32926 src.target; 32927 32928 this.currentTarget = src.currentTarget; 32929 this.relatedTarget = src.relatedTarget; 32930 32931 // Event type 32932 } else { 32933 this.type = src; 32934 } 32935 32936 // Put explicitly provided properties onto the event object 32937 if ( props ) { 32938 jQuery.extend( this, props ); 32939 } 32940 32941 // Create a timestamp if incoming event doesn't have one 32942 this.timeStamp = src && src.timeStamp || Date.now(); 32943 32944 // Mark it as fixed 32945 this[ jQuery.expando ] = true; 32946}; 32947 32948// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding 32949// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html 32950jQuery.Event.prototype = { 32951 constructor: jQuery.Event, 32952 isDefaultPrevented: returnFalse, 32953 isPropagationStopped: returnFalse, 32954 isImmediatePropagationStopped: returnFalse, 32955 isSimulated: false, 32956 32957 preventDefault: function() { 32958 var e = this.originalEvent; 32959 32960 this.isDefaultPrevented = returnTrue; 32961 32962 if ( e && !this.isSimulated ) { 32963 e.preventDefault(); 32964 } 32965 }, 32966 stopPropagation: function() { 32967 var e = this.originalEvent; 32968 32969 this.isPropagationStopped = returnTrue; 32970 32971 if ( e && !this.isSimulated ) { 32972 e.stopPropagation(); 32973 } 32974 }, 32975 stopImmediatePropagation: function() { 32976 var e = this.originalEvent; 32977 32978 this.isImmediatePropagationStopped = returnTrue; 32979 32980 if ( e && !this.isSimulated ) { 32981 e.stopImmediatePropagation(); 32982 } 32983 32984 this.stopPropagation(); 32985 } 32986}; 32987 32988// Includes all common event props including KeyEvent and MouseEvent specific props 32989jQuery.each( { 32990 altKey: true, 32991 bubbles: true, 32992 cancelable: true, 32993 changedTouches: true, 32994 ctrlKey: true, 32995 detail: true, 32996 eventPhase: true, 32997 metaKey: true, 32998 pageX: true, 32999 pageY: true, 33000 shiftKey: true, 33001 view: true, 33002 "char": true, 33003 code: true, 33004 charCode: true, 33005 key: true, 33006 keyCode: true, 33007 button: true, 33008 buttons: true, 33009 clientX: true, 33010 clientY: true, 33011 offsetX: true, 33012 offsetY: true, 33013 pointerId: true, 33014 pointerType: true, 33015 screenX: true, 33016 screenY: true, 33017 targetTouches: true, 33018 toElement: true, 33019 touches: true, 33020 which: true 33021}, jQuery.event.addProp ); 33022 33023jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { 33024 33025 function focusMappedHandler( nativeEvent ) { 33026 if ( document.documentMode ) { 33027 33028 // Support: IE 11+ 33029 // Attach a single focusin/focusout handler on the document while someone wants 33030 // focus/blur. This is because the former are synchronous in IE while the latter 33031 // are async. In other browsers, all those handlers are invoked synchronously. 33032 33033 // `handle` from private data would already wrap the event, but we need 33034 // to change the `type` here. 33035 var handle = dataPriv.get( this, "handle" ), 33036 event = jQuery.event.fix( nativeEvent ); 33037 event.type = nativeEvent.type === "focusin" ? "focus" : "blur"; 33038 event.isSimulated = true; 33039 33040 // First, handle focusin/focusout 33041 handle( nativeEvent ); 33042 33043 // ...then, handle focus/blur 33044 // 33045 // focus/blur don't bubble while focusin/focusout do; simulate the former by only 33046 // invoking the handler at the lower level. 33047 if ( event.target === event.currentTarget ) { 33048 33049 // The setup part calls `leverageNative`, which, in turn, calls 33050 // `jQuery.event.add`, so event handle will already have been set 33051 // by this point. 33052 handle( event ); 33053 } 33054 } else { 33055 33056 // For non-IE browsers, attach a single capturing handler on the document 33057 // while someone wants focusin/focusout. 33058 jQuery.event.simulate( delegateType, nativeEvent.target, 33059 jQuery.event.fix( nativeEvent ) ); 33060 } 33061 } 33062 33063 jQuery.event.special[ type ] = { 33064 33065 // Utilize native event if possible so blur/focus sequence is correct 33066 setup: function() { 33067 33068 var attaches; 33069 33070 // Claim the first handler 33071 // dataPriv.set( this, "focus", ... ) 33072 // dataPriv.set( this, "blur", ... ) 33073 leverageNative( this, type, true ); 33074 33075 if ( document.documentMode ) { 33076 33077 // Support: IE 9 - 11+ 33078 // We use the same native handler for focusin & focus (and focusout & blur) 33079 // so we need to coordinate setup & teardown parts between those events. 33080 // Use `delegateType` as the key as `type` is already used by `leverageNative`. 33081 attaches = dataPriv.get( this, delegateType ); 33082 if ( !attaches ) { 33083 this.addEventListener( delegateType, focusMappedHandler ); 33084 } 33085 dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 ); 33086 } else { 33087 33088 // Return false to allow normal processing in the caller 33089 return false; 33090 } 33091 }, 33092 trigger: function() { 33093 33094 // Force setup before trigger 33095 leverageNative( this, type ); 33096 33097 // Return non-false to allow normal event-path propagation 33098 return true; 33099 }, 33100 33101 teardown: function() { 33102 var attaches; 33103 33104 if ( document.documentMode ) { 33105 attaches = dataPriv.get( this, delegateType ) - 1; 33106 if ( !attaches ) { 33107 this.removeEventListener( delegateType, focusMappedHandler ); 33108 dataPriv.remove( this, delegateType ); 33109 } else { 33110 dataPriv.set( this, delegateType, attaches ); 33111 } 33112 } else { 33113 33114 // Return false to indicate standard teardown should be applied 33115 return false; 33116 } 33117 }, 33118 33119 // Suppress native focus or blur if we're currently inside 33120 // a leveraged native-event stack 33121 _default: function( event ) { 33122 return dataPriv.get( event.target, type ); 33123 }, 33124 33125 delegateType: delegateType 33126 }; 33127 33128 // Support: Firefox <=44 33129 // Firefox doesn't have focus(in | out) events 33130 // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 33131 // 33132 // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 33133 // focus(in | out) events fire after focus & blur events, 33134 // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order 33135 // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 33136 // 33137 // Support: IE 9 - 11+ 33138 // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch, 33139 // attach a single handler for both events in IE. 33140 jQuery.event.special[ delegateType ] = { 33141 setup: function() { 33142 33143 // Handle: regular nodes (via `this.ownerDocument`), window 33144 // (via `this.document`) & document (via `this`). 33145 var doc = this.ownerDocument || this.document || this, 33146 dataHolder = document.documentMode ? this : doc, 33147 attaches = dataPriv.get( dataHolder, delegateType ); 33148 33149 // Support: IE 9 - 11+ 33150 // We use the same native handler for focusin & focus (and focusout & blur) 33151 // so we need to coordinate setup & teardown parts between those events. 33152 // Use `delegateType` as the key as `type` is already used by `leverageNative`. 33153 if ( !attaches ) { 33154 if ( document.documentMode ) { 33155 this.addEventListener( delegateType, focusMappedHandler ); 33156 } else { 33157 doc.addEventListener( type, focusMappedHandler, true ); 33158 } 33159 } 33160 dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 ); 33161 }, 33162 teardown: function() { 33163 var doc = this.ownerDocument || this.document || this, 33164 dataHolder = document.documentMode ? this : doc, 33165 attaches = dataPriv.get( dataHolder, delegateType ) - 1; 33166 33167 if ( !attaches ) { 33168 if ( document.documentMode ) { 33169 this.removeEventListener( delegateType, focusMappedHandler ); 33170 } else { 33171 doc.removeEventListener( type, focusMappedHandler, true ); 33172 } 33173 dataPriv.remove( dataHolder, delegateType ); 33174 } else { 33175 dataPriv.set( dataHolder, delegateType, attaches ); 33176 } 33177 } 33178 }; 33179} ); 33180 33181// Create mouseenter/leave events using mouseover/out and event-time checks 33182// so that event delegation works in jQuery. 33183// Do the same for pointerenter/pointerleave and pointerover/pointerout 33184// 33185// Support: Safari 7 only 33186// Safari sends mouseenter too often; see: 33187// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 33188// for the description of the bug (it existed in older Chrome versions as well). 33189jQuery.each( { 33190 mouseenter: "mouseover", 33191 mouseleave: "mouseout", 33192 pointerenter: "pointerover", 33193 pointerleave: "pointerout" 33194}, function( orig, fix ) { 33195 jQuery.event.special[ orig ] = { 33196 delegateType: fix, 33197 bindType: fix, 33198 33199 handle: function( event ) { 33200 var ret, 33201 target = this, 33202 related = event.relatedTarget, 33203 handleObj = event.handleObj; 33204 33205 // For mouseenter/leave call the handler if related is outside the target. 33206 // NB: No relatedTarget if the mouse left/entered the browser window 33207 if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { 33208 event.type = handleObj.origType; 33209 ret = handleObj.handler.apply( this, arguments ); 33210 event.type = fix; 33211 } 33212 return ret; 33213 } 33214 }; 33215} ); 33216 33217jQuery.fn.extend( { 33218 33219 on: function( types, selector, data, fn ) { 33220 return on( this, types, selector, data, fn ); 33221 }, 33222 one: function( types, selector, data, fn ) { 33223 return on( this, types, selector, data, fn, 1 ); 33224 }, 33225 off: function( types, selector, fn ) { 33226 var handleObj, type; 33227 if ( types && types.preventDefault && types.handleObj ) { 33228 33229 // ( event ) dispatched jQuery.Event 33230 handleObj = types.handleObj; 33231 jQuery( types.delegateTarget ).off( 33232 handleObj.namespace ? 33233 handleObj.origType + "." + handleObj.namespace : 33234 handleObj.origType, 33235 handleObj.selector, 33236 handleObj.handler 33237 ); 33238 return this; 33239 } 33240 if ( typeof types === "object" ) { 33241 33242 // ( types-object [, selector] ) 33243 for ( type in types ) { 33244 this.off( type, selector, types[ type ] ); 33245 } 33246 return this; 33247 } 33248 if ( selector === false || typeof selector === "function" ) { 33249 33250 // ( types [, fn] ) 33251 fn = selector; 33252 selector = undefined; 33253 } 33254 if ( fn === false ) { 33255 fn = returnFalse; 33256 } 33257 return this.each( function() { 33258 jQuery.event.remove( this, types, fn, selector ); 33259 } ); 33260 } 33261} ); 33262 33263 33264var 33265 33266 // Support: IE <=10 - 11, Edge 12 - 13 only 33267 // In IE/Edge using regex groups here causes severe slowdowns. 33268 // See https://connect.microsoft.com/IE/feedback/details/1736512/ 33269 rnoInnerhtml = /<script|<style|<link/i, 33270 33271 // checked="checked" or checked 33272 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, 33273 33274 rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g; 33275 33276// Prefer a tbody over its parent table for containing new rows 33277function manipulationTarget( elem, content ) { 33278 if ( nodeName( elem, "table" ) && 33279 nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { 33280 33281 return jQuery( elem ).children( "tbody" )[ 0 ] || elem; 33282 } 33283 33284 return elem; 33285} 33286 33287// Replace/restore the type attribute of script elements for safe DOM manipulation 33288function disableScript( elem ) { 33289 elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; 33290 return elem; 33291} 33292function restoreScript( elem ) { 33293 if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { 33294 elem.type = elem.type.slice( 5 ); 33295 } else { 33296 elem.removeAttribute( "type" ); 33297 } 33298 33299 return elem; 33300} 33301 33302function cloneCopyEvent( src, dest ) { 33303 var i, l, type, pdataOld, udataOld, udataCur, events; 33304 33305 if ( dest.nodeType !== 1 ) { 33306 return; 33307 } 33308 33309 // 1. Copy private data: events, handlers, etc. 33310 if ( dataPriv.hasData( src ) ) { 33311 pdataOld = dataPriv.get( src ); 33312 events = pdataOld.events; 33313 33314 if ( events ) { 33315 dataPriv.remove( dest, "handle events" ); 33316 33317 for ( type in events ) { 33318 for ( i = 0, l = events[ type ].length; i < l; i++ ) { 33319 jQuery.event.add( dest, type, events[ type ][ i ] ); 33320 } 33321 } 33322 } 33323 } 33324 33325 // 2. Copy user data 33326 if ( dataUser.hasData( src ) ) { 33327 udataOld = dataUser.access( src ); 33328 udataCur = jQuery.extend( {}, udataOld ); 33329 33330 dataUser.set( dest, udataCur ); 33331 } 33332} 33333 33334// Fix IE bugs, see support tests 33335function fixInput( src, dest ) { 33336 var nodeName = dest.nodeName.toLowerCase(); 33337 33338 // Fails to persist the checked state of a cloned checkbox or radio button. 33339 if ( nodeName === "input" && rcheckableType.test( src.type ) ) { 33340 dest.checked = src.checked; 33341 33342 // Fails to return the selected option to the default selected state when cloning options 33343 } else if ( nodeName === "input" || nodeName === "textarea" ) { 33344 dest.defaultValue = src.defaultValue; 33345 } 33346} 33347 33348function domManip( collection, args, callback, ignored ) { 33349 33350 // Flatten any nested arrays 33351 args = flat( args ); 33352 33353 var fragment, first, scripts, hasScripts, node, doc, 33354 i = 0, 33355 l = collection.length, 33356 iNoClone = l - 1, 33357 value = args[ 0 ], 33358 valueIsFunction = isFunction( value ); 33359 33360 // We can't cloneNode fragments that contain checked, in WebKit 33361 if ( valueIsFunction || 33362 ( l > 1 && typeof value === "string" && 33363 !support.checkClone && rchecked.test( value ) ) ) { 33364 return collection.each( function( index ) { 33365 var self = collection.eq( index ); 33366 if ( valueIsFunction ) { 33367 args[ 0 ] = value.call( this, index, self.html() ); 33368 } 33369 domManip( self, args, callback, ignored ); 33370 } ); 33371 } 33372 33373 if ( l ) { 33374 fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); 33375 first = fragment.firstChild; 33376 33377 if ( fragment.childNodes.length === 1 ) { 33378 fragment = first; 33379 } 33380 33381 // Require either new content or an interest in ignored elements to invoke the callback 33382 if ( first || ignored ) { 33383 scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); 33384 hasScripts = scripts.length; 33385 33386 // Use the original fragment for the last item 33387 // instead of the first because it can end up 33388 // being emptied incorrectly in certain situations (trac-8070). 33389 for ( ; i < l; i++ ) { 33390 node = fragment; 33391 33392 if ( i !== iNoClone ) { 33393 node = jQuery.clone( node, true, true ); 33394 33395 // Keep references to cloned scripts for later restoration 33396 if ( hasScripts ) { 33397 33398 // Support: Android <=4.0 only, PhantomJS 1 only 33399 // push.apply(_, arraylike) throws on ancient WebKit 33400 jQuery.merge( scripts, getAll( node, "script" ) ); 33401 } 33402 } 33403 33404 callback.call( collection[ i ], node, i ); 33405 } 33406 33407 if ( hasScripts ) { 33408 doc = scripts[ scripts.length - 1 ].ownerDocument; 33409 33410 // Re-enable scripts 33411 jQuery.map( scripts, restoreScript ); 33412 33413 // Evaluate executable scripts on first document insertion 33414 for ( i = 0; i < hasScripts; i++ ) { 33415 node = scripts[ i ]; 33416 if ( rscriptType.test( node.type || "" ) && 33417 !dataPriv.access( node, "globalEval" ) && 33418 jQuery.contains( doc, node ) ) { 33419 33420 if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { 33421 33422 // Optional AJAX dependency, but won't run scripts if not present 33423 if ( jQuery._evalUrl && !node.noModule ) { 33424 jQuery._evalUrl( node.src, { 33425 nonce: node.nonce || node.getAttribute( "nonce" ) 33426 }, doc ); 33427 } 33428 } else { 33429 33430 // Unwrap a CDATA section containing script contents. This shouldn't be 33431 // needed as in XML documents they're already not visible when 33432 // inspecting element contents and in HTML documents they have no 33433 // meaning but we're preserving that logic for backwards compatibility. 33434 // This will be removed completely in 4.0. See gh-4904. 33435 DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); 33436 } 33437 } 33438 } 33439 } 33440 } 33441 } 33442 33443 return collection; 33444} 33445 33446function remove( elem, selector, keepData ) { 33447 var node, 33448 nodes = selector ? jQuery.filter( selector, elem ) : elem, 33449 i = 0; 33450 33451 for ( ; ( node = nodes[ i ] ) != null; i++ ) { 33452 if ( !keepData && node.nodeType === 1 ) { 33453 jQuery.cleanData( getAll( node ) ); 33454 } 33455 33456 if ( node.parentNode ) { 33457 if ( keepData && isAttached( node ) ) { 33458 setGlobalEval( getAll( node, "script" ) ); 33459 } 33460 node.parentNode.removeChild( node ); 33461 } 33462 } 33463 33464 return elem; 33465} 33466 33467jQuery.extend( { 33468 htmlPrefilter: function( html ) { 33469 return html; 33470 }, 33471 33472 clone: function( elem, dataAndEvents, deepDataAndEvents ) { 33473 var i, l, srcElements, destElements, 33474 clone = elem.cloneNode( true ), 33475 inPage = isAttached( elem ); 33476 33477 // Fix IE cloning issues 33478 if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && 33479 !jQuery.isXMLDoc( elem ) ) { 33480 33481 // We eschew jQuery#find here for performance reasons: 33482 // https://jsperf.com/getall-vs-sizzle/2 33483 destElements = getAll( clone ); 33484 srcElements = getAll( elem ); 33485 33486 for ( i = 0, l = srcElements.length; i < l; i++ ) { 33487 fixInput( srcElements[ i ], destElements[ i ] ); 33488 } 33489 } 33490 33491 // Copy the events from the original to the clone 33492 if ( dataAndEvents ) { 33493 if ( deepDataAndEvents ) { 33494 srcElements = srcElements || getAll( elem ); 33495 destElements = destElements || getAll( clone ); 33496 33497 for ( i = 0, l = srcElements.length; i < l; i++ ) { 33498 cloneCopyEvent( srcElements[ i ], destElements[ i ] ); 33499 } 33500 } else { 33501 cloneCopyEvent( elem, clone ); 33502 } 33503 } 33504 33505 // Preserve script evaluation history 33506 destElements = getAll( clone, "script" ); 33507 if ( destElements.length > 0 ) { 33508 setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); 33509 } 33510 33511 // Return the cloned set 33512 return clone; 33513 }, 33514 33515 cleanData: function( elems ) { 33516 var data, elem, type, 33517 special = jQuery.event.special, 33518 i = 0; 33519 33520 for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { 33521 if ( acceptData( elem ) ) { 33522 if ( ( data = elem[ dataPriv.expando ] ) ) { 33523 if ( data.events ) { 33524 for ( type in data.events ) { 33525 if ( special[ type ] ) { 33526 jQuery.event.remove( elem, type ); 33527 33528 // This is a shortcut to avoid jQuery.event.remove's overhead 33529 } else { 33530 jQuery.removeEvent( elem, type, data.handle ); 33531 } 33532 } 33533 } 33534 33535 // Support: Chrome <=35 - 45+ 33536 // Assign undefined instead of using delete, see Data#remove 33537 elem[ dataPriv.expando ] = undefined; 33538 } 33539 if ( elem[ dataUser.expando ] ) { 33540 33541 // Support: Chrome <=35 - 45+ 33542 // Assign undefined instead of using delete, see Data#remove 33543 elem[ dataUser.expando ] = undefined; 33544 } 33545 } 33546 } 33547 } 33548} ); 33549 33550jQuery.fn.extend( { 33551 detach: function( selector ) { 33552 return remove( this, selector, true ); 33553 }, 33554 33555 remove: function( selector ) { 33556 return remove( this, selector ); 33557 }, 33558 33559 text: function( value ) { 33560 return access( this, function( value ) { 33561 return value === undefined ? 33562 jQuery.text( this ) : 33563 this.empty().each( function() { 33564 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 33565 this.textContent = value; 33566 } 33567 } ); 33568 }, null, value, arguments.length ); 33569 }, 33570 33571 append: function() { 33572 return domManip( this, arguments, function( elem ) { 33573 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 33574 var target = manipulationTarget( this, elem ); 33575 target.appendChild( elem ); 33576 } 33577 } ); 33578 }, 33579 33580 prepend: function() { 33581 return domManip( this, arguments, function( elem ) { 33582 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 33583 var target = manipulationTarget( this, elem ); 33584 target.insertBefore( elem, target.firstChild ); 33585 } 33586 } ); 33587 }, 33588 33589 before: function() { 33590 return domManip( this, arguments, function( elem ) { 33591 if ( this.parentNode ) { 33592 this.parentNode.insertBefore( elem, this ); 33593 } 33594 } ); 33595 }, 33596 33597 after: function() { 33598 return domManip( this, arguments, function( elem ) { 33599 if ( this.parentNode ) { 33600 this.parentNode.insertBefore( elem, this.nextSibling ); 33601 } 33602 } ); 33603 }, 33604 33605 empty: function() { 33606 var elem, 33607 i = 0; 33608 33609 for ( ; ( elem = this[ i ] ) != null; i++ ) { 33610 if ( elem.nodeType === 1 ) { 33611 33612 // Prevent memory leaks 33613 jQuery.cleanData( getAll( elem, false ) ); 33614 33615 // Remove any remaining nodes 33616 elem.textContent = ""; 33617 } 33618 } 33619 33620 return this; 33621 }, 33622 33623 clone: function( dataAndEvents, deepDataAndEvents ) { 33624 dataAndEvents = dataAndEvents == null ? false : dataAndEvents; 33625 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; 33626 33627 return this.map( function() { 33628 return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); 33629 } ); 33630 }, 33631 33632 html: function( value ) { 33633 return access( this, function( value ) { 33634 var elem = this[ 0 ] || {}, 33635 i = 0, 33636 l = this.length; 33637 33638 if ( value === undefined && elem.nodeType === 1 ) { 33639 return elem.innerHTML; 33640 } 33641 33642 // See if we can take a shortcut and just use innerHTML 33643 if ( typeof value === "string" && !rnoInnerhtml.test( value ) && 33644 !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { 33645 33646 value = jQuery.htmlPrefilter( value ); 33647 33648 try { 33649 for ( ; i < l; i++ ) { 33650 elem = this[ i ] || {}; 33651 33652 // Remove element nodes and prevent memory leaks 33653 if ( elem.nodeType === 1 ) { 33654 jQuery.cleanData( getAll( elem, false ) ); 33655 elem.innerHTML = value; 33656 } 33657 } 33658 33659 elem = 0; 33660 33661 // If using innerHTML throws an exception, use the fallback method 33662 } catch ( e ) {} 33663 } 33664 33665 if ( elem ) { 33666 this.empty().append( value ); 33667 } 33668 }, null, value, arguments.length ); 33669 }, 33670 33671 replaceWith: function() { 33672 var ignored = []; 33673 33674 // Make the changes, replacing each non-ignored context element with the new content 33675 return domManip( this, arguments, function( elem ) { 33676 var parent = this.parentNode; 33677 33678 if ( jQuery.inArray( this, ignored ) < 0 ) { 33679 jQuery.cleanData( getAll( this ) ); 33680 if ( parent ) { 33681 parent.replaceChild( elem, this ); 33682 } 33683 } 33684 33685 // Force callback invocation 33686 }, ignored ); 33687 } 33688} ); 33689 33690jQuery.each( { 33691 appendTo: "append", 33692 prependTo: "prepend", 33693 insertBefore: "before", 33694 insertAfter: "after", 33695 replaceAll: "replaceWith" 33696}, function( name, original ) { 33697 jQuery.fn[ name ] = function( selector ) { 33698 var elems, 33699 ret = [], 33700 insert = jQuery( selector ), 33701 last = insert.length - 1, 33702 i = 0; 33703 33704 for ( ; i <= last; i++ ) { 33705 elems = i === last ? this : this.clone( true ); 33706 jQuery( insert[ i ] )[ original ]( elems ); 33707 33708 // Support: Android <=4.0 only, PhantomJS 1 only 33709 // .get() because push.apply(_, arraylike) throws on ancient WebKit 33710 push.apply( ret, elems.get() ); 33711 } 33712 33713 return this.pushStack( ret ); 33714 }; 33715} ); 33716var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); 33717 33718var rcustomProp = /^--/; 33719 33720 33721var getStyles = function( elem ) { 33722 33723 // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150) 33724 // IE throws on elements created in popups 33725 // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" 33726 var view = elem.ownerDocument.defaultView; 33727 33728 if ( !view || !view.opener ) { 33729 view = window; 33730 } 33731 33732 return view.getComputedStyle( elem ); 33733 }; 33734 33735var swap = function( elem, options, callback ) { 33736 var ret, name, 33737 old = {}; 33738 33739 // Remember the old values, and insert the new ones 33740 for ( name in options ) { 33741 old[ name ] = elem.style[ name ]; 33742 elem.style[ name ] = options[ name ]; 33743 } 33744 33745 ret = callback.call( elem ); 33746 33747 // Revert the old values 33748 for ( name in options ) { 33749 elem.style[ name ] = old[ name ]; 33750 } 33751 33752 return ret; 33753}; 33754 33755 33756var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); 33757 33758 33759 33760( function() { 33761 33762 // Executing both pixelPosition & boxSizingReliable tests require only one layout 33763 // so they're executed at the same time to save the second computation. 33764 function computeStyleTests() { 33765 33766 // This is a singleton, we need to execute it only once 33767 if ( !div ) { 33768 return; 33769 } 33770 33771 container.style.cssText = "position:absolute;left:-11111px;width:60px;" + 33772 "margin-top:1px;padding:0;border:0"; 33773 div.style.cssText = 33774 "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + 33775 "margin:auto;border:1px;padding:1px;" + 33776 "width:60%;top:1%"; 33777 documentElement.appendChild( container ).appendChild( div ); 33778 33779 var divStyle = window.getComputedStyle( div ); 33780 pixelPositionVal = divStyle.top !== "1%"; 33781 33782 // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 33783 reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; 33784 33785 // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 33786 // Some styles come back with percentage values, even though they shouldn't 33787 div.style.right = "60%"; 33788 pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; 33789 33790 // Support: IE 9 - 11 only 33791 // Detect misreporting of content dimensions for box-sizing:border-box elements 33792 boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; 33793 33794 // Support: IE 9 only 33795 // Detect overflow:scroll screwiness (gh-3699) 33796 // Support: Chrome <=64 33797 // Don't get tricked when zoom affects offsetWidth (gh-4029) 33798 div.style.position = "absolute"; 33799 scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; 33800 33801 documentElement.removeChild( container ); 33802 33803 // Nullify the div so it wouldn't be stored in the memory and 33804 // it will also be a sign that checks already performed 33805 div = null; 33806 } 33807 33808 function roundPixelMeasures( measure ) { 33809 return Math.round( parseFloat( measure ) ); 33810 } 33811 33812 var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, 33813 reliableTrDimensionsVal, reliableMarginLeftVal, 33814 container = document.createElement( "div" ), 33815 div = document.createElement( "div" ); 33816 33817 // Finish early in limited (non-browser) environments 33818 if ( !div.style ) { 33819 return; 33820 } 33821 33822 // Support: IE <=9 - 11 only 33823 // Style of cloned element affects source element cloned (trac-8908) 33824 div.style.backgroundClip = "content-box"; 33825 div.cloneNode( true ).style.backgroundClip = ""; 33826 support.clearCloneStyle = div.style.backgroundClip === "content-box"; 33827 33828 jQuery.extend( support, { 33829 boxSizingReliable: function() { 33830 computeStyleTests(); 33831 return boxSizingReliableVal; 33832 }, 33833 pixelBoxStyles: function() { 33834 computeStyleTests(); 33835 return pixelBoxStylesVal; 33836 }, 33837 pixelPosition: function() { 33838 computeStyleTests(); 33839 return pixelPositionVal; 33840 }, 33841 reliableMarginLeft: function() { 33842 computeStyleTests(); 33843 return reliableMarginLeftVal; 33844 }, 33845 scrollboxSize: function() { 33846 computeStyleTests(); 33847 return scrollboxSizeVal; 33848 }, 33849 33850 // Support: IE 9 - 11+, Edge 15 - 18+ 33851 // IE/Edge misreport `getComputedStyle` of table rows with width/height 33852 // set in CSS while `offset*` properties report correct values. 33853 // Behavior in IE 9 is more subtle than in newer versions & it passes 33854 // some versions of this test; make sure not to make it pass there! 33855 // 33856 // Support: Firefox 70+ 33857 // Only Firefox includes border widths 33858 // in computed dimensions. (gh-4529) 33859 reliableTrDimensions: function() { 33860 var table, tr, trChild, trStyle; 33861 if ( reliableTrDimensionsVal == null ) { 33862 table = document.createElement( "table" ); 33863 tr = document.createElement( "tr" ); 33864 trChild = document.createElement( "div" ); 33865 33866 table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; 33867 tr.style.cssText = "box-sizing:content-box;border:1px solid"; 33868 33869 // Support: Chrome 86+ 33870 // Height set through cssText does not get applied. 33871 // Computed height then comes back as 0. 33872 tr.style.height = "1px"; 33873 trChild.style.height = "9px"; 33874 33875 // Support: Android 8 Chrome 86+ 33876 // In our bodyBackground.html iframe, 33877 // display for all div elements is set to "inline", 33878 // which causes a problem only in Android 8 Chrome 86. 33879 // Ensuring the div is `display: block` 33880 // gets around this issue. 33881 trChild.style.display = "block"; 33882 33883 documentElement 33884 .appendChild( table ) 33885 .appendChild( tr ) 33886 .appendChild( trChild ); 33887 33888 trStyle = window.getComputedStyle( tr ); 33889 reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + 33890 parseInt( trStyle.borderTopWidth, 10 ) + 33891 parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; 33892 33893 documentElement.removeChild( table ); 33894 } 33895 return reliableTrDimensionsVal; 33896 } 33897 } ); 33898} )(); 33899 33900 33901function curCSS( elem, name, computed ) { 33902 var width, minWidth, maxWidth, ret, 33903 isCustomProp = rcustomProp.test( name ), 33904 33905 // Support: Firefox 51+ 33906 // Retrieving style before computed somehow 33907 // fixes an issue with getting wrong values 33908 // on detached elements 33909 style = elem.style; 33910 33911 computed = computed || getStyles( elem ); 33912 33913 // getPropertyValue is needed for: 33914 // .css('filter') (IE 9 only, trac-12537) 33915 // .css('--customProperty) (gh-3144) 33916 if ( computed ) { 33917 33918 // Support: IE <=9 - 11+ 33919 // IE only supports `"float"` in `getPropertyValue`; in computed styles 33920 // it's only available as `"cssFloat"`. We no longer modify properties 33921 // sent to `.css()` apart from camelCasing, so we need to check both. 33922 // Normally, this would create difference in behavior: if 33923 // `getPropertyValue` returns an empty string, the value returned 33924 // by `.css()` would be `undefined`. This is usually the case for 33925 // disconnected elements. However, in IE even disconnected elements 33926 // with no styles return `"none"` for `getPropertyValue( "float" )` 33927 ret = computed.getPropertyValue( name ) || computed[ name ]; 33928 33929 if ( isCustomProp && ret ) { 33930 33931 // Support: Firefox 105+, Chrome <=105+ 33932 // Spec requires trimming whitespace for custom properties (gh-4926). 33933 // Firefox only trims leading whitespace. Chrome just collapses 33934 // both leading & trailing whitespace to a single space. 33935 // 33936 // Fall back to `undefined` if empty string returned. 33937 // This collapses a missing definition with property defined 33938 // and set to an empty string but there's no standard API 33939 // allowing us to differentiate them without a performance penalty 33940 // and returning `undefined` aligns with older jQuery. 33941 // 33942 // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED 33943 // as whitespace while CSS does not, but this is not a problem 33944 // because CSS preprocessing replaces them with U+000A LINE FEED 33945 // (which *is* CSS whitespace) 33946 // https://www.w3.org/TR/css-syntax-3/#input-preprocessing 33947 ret = ret.replace( rtrimCSS, "$1" ) || undefined; 33948 } 33949 33950 if ( ret === "" && !isAttached( elem ) ) { 33951 ret = jQuery.style( elem, name ); 33952 } 33953 33954 // A tribute to the "awesome hack by Dean Edwards" 33955 // Android Browser returns percentage for some values, 33956 // but width seems to be reliably pixels. 33957 // This is against the CSSOM draft spec: 33958 // https://drafts.csswg.org/cssom/#resolved-values 33959 if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { 33960 33961 // Remember the original values 33962 width = style.width; 33963 minWidth = style.minWidth; 33964 maxWidth = style.maxWidth; 33965 33966 // Put in the new values to get a computed value out 33967 style.minWidth = style.maxWidth = style.width = ret; 33968 ret = computed.width; 33969 33970 // Revert the changed values 33971 style.width = width; 33972 style.minWidth = minWidth; 33973 style.maxWidth = maxWidth; 33974 } 33975 } 33976 33977 return ret !== undefined ? 33978 33979 // Support: IE <=9 - 11 only 33980 // IE returns zIndex value as an integer. 33981 ret + "" : 33982 ret; 33983} 33984 33985 33986function addGetHookIf( conditionFn, hookFn ) { 33987 33988 // Define the hook, we'll check on the first run if it's really needed. 33989 return { 33990 get: function() { 33991 if ( conditionFn() ) { 33992 33993 // Hook not needed (or it's not possible to use it due 33994 // to missing dependency), remove it. 33995 delete this.get; 33996 return; 33997 } 33998 33999 // Hook needed; redefine it so that the support test is not executed again. 34000 return ( this.get = hookFn ).apply( this, arguments ); 34001 } 34002 }; 34003} 34004 34005 34006var cssPrefixes = [ "Webkit", "Moz", "ms" ], 34007 emptyStyle = document.createElement( "div" ).style, 34008 vendorProps = {}; 34009 34010// Return a vendor-prefixed property or undefined 34011function vendorPropName( name ) { 34012 34013 // Check for vendor prefixed names 34014 var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), 34015 i = cssPrefixes.length; 34016 34017 while ( i-- ) { 34018 name = cssPrefixes[ i ] + capName; 34019 if ( name in emptyStyle ) { 34020 return name; 34021 } 34022 } 34023} 34024 34025// Return a potentially-mapped jQuery.cssProps or vendor prefixed property 34026function finalPropName( name ) { 34027 var final = jQuery.cssProps[ name ] || vendorProps[ name ]; 34028 34029 if ( final ) { 34030 return final; 34031 } 34032 if ( name in emptyStyle ) { 34033 return name; 34034 } 34035 return vendorProps[ name ] = vendorPropName( name ) || name; 34036} 34037 34038 34039var 34040 34041 // Swappable if display is none or starts with table 34042 // except "table", "table-cell", or "table-caption" 34043 // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display 34044 rdisplayswap = /^(none|table(?!-c[ea]).+)/, 34045 cssShow = { position: "absolute", visibility: "hidden", display: "block" }, 34046 cssNormalTransform = { 34047 letterSpacing: "0", 34048 fontWeight: "400" 34049 }; 34050 34051function setPositiveNumber( _elem, value, subtract ) { 34052 34053 // Any relative (+/-) values have already been 34054 // normalized at this point 34055 var matches = rcssNum.exec( value ); 34056 return matches ? 34057 34058 // Guard against undefined "subtract", e.g., when used as in cssHooks 34059 Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : 34060 value; 34061} 34062 34063function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { 34064 var i = dimension === "width" ? 1 : 0, 34065 extra = 0, 34066 delta = 0, 34067 marginDelta = 0; 34068 34069 // Adjustment may not be necessary 34070 if ( box === ( isBorderBox ? "border" : "content" ) ) { 34071 return 0; 34072 } 34073 34074 for ( ; i < 4; i += 2 ) { 34075 34076 // Both box models exclude margin 34077 // Count margin delta separately to only add it after scroll gutter adjustment. 34078 // This is needed to make negative margins work with `outerHeight( true )` (gh-3982). 34079 if ( box === "margin" ) { 34080 marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); 34081 } 34082 34083 // If we get here with a content-box, we're seeking "padding" or "border" or "margin" 34084 if ( !isBorderBox ) { 34085 34086 // Add padding 34087 delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 34088 34089 // For "border" or "margin", add border 34090 if ( box !== "padding" ) { 34091 delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 34092 34093 // But still keep track of it otherwise 34094 } else { 34095 extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 34096 } 34097 34098 // If we get here with a border-box (content + padding + border), we're seeking "content" or 34099 // "padding" or "margin" 34100 } else { 34101 34102 // For "content", subtract padding 34103 if ( box === "content" ) { 34104 delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 34105 } 34106 34107 // For "content" or "padding", subtract border 34108 if ( box !== "margin" ) { 34109 delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 34110 } 34111 } 34112 } 34113 34114 // Account for positive content-box scroll gutter when requested by providing computedVal 34115 if ( !isBorderBox && computedVal >= 0 ) { 34116 34117 // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border 34118 // Assuming integer scroll gutter, subtract the rest and round down 34119 delta += Math.max( 0, Math.ceil( 34120 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - 34121 computedVal - 34122 delta - 34123 extra - 34124 0.5 34125 34126 // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter 34127 // Use an explicit zero to avoid NaN (gh-3964) 34128 ) ) || 0; 34129 } 34130 34131 return delta + marginDelta; 34132} 34133 34134function getWidthOrHeight( elem, dimension, extra ) { 34135 34136 // Start with computed style 34137 var styles = getStyles( elem ), 34138 34139 // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). 34140 // Fake content-box until we know it's needed to know the true value. 34141 boxSizingNeeded = !support.boxSizingReliable() || extra, 34142 isBorderBox = boxSizingNeeded && 34143 jQuery.css( elem, "boxSizing", false, styles ) === "border-box", 34144 valueIsBorderBox = isBorderBox, 34145 34146 val = curCSS( elem, dimension, styles ), 34147 offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); 34148 34149 // Support: Firefox <=54 34150 // Return a confounding non-pixel value or feign ignorance, as appropriate. 34151 if ( rnumnonpx.test( val ) ) { 34152 if ( !extra ) { 34153 return val; 34154 } 34155 val = "auto"; 34156 } 34157 34158 34159 // Support: IE 9 - 11 only 34160 // Use offsetWidth/offsetHeight for when box sizing is unreliable. 34161 // In those cases, the computed value can be trusted to be border-box. 34162 if ( ( !support.boxSizingReliable() && isBorderBox || 34163 34164 // Support: IE 10 - 11+, Edge 15 - 18+ 34165 // IE/Edge misreport `getComputedStyle` of table rows with width/height 34166 // set in CSS while `offset*` properties report correct values. 34167 // Interestingly, in some cases IE 9 doesn't suffer from this issue. 34168 !support.reliableTrDimensions() && nodeName( elem, "tr" ) || 34169 34170 // Fall back to offsetWidth/offsetHeight when value is "auto" 34171 // This happens for inline elements with no explicit setting (gh-3571) 34172 val === "auto" || 34173 34174 // Support: Android <=4.1 - 4.3 only 34175 // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) 34176 !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && 34177 34178 // Make sure the element is visible & connected 34179 elem.getClientRects().length ) { 34180 34181 isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; 34182 34183 // Where available, offsetWidth/offsetHeight approximate border box dimensions. 34184 // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the 34185 // retrieved value as a content box dimension. 34186 valueIsBorderBox = offsetProp in elem; 34187 if ( valueIsBorderBox ) { 34188 val = elem[ offsetProp ]; 34189 } 34190 } 34191 34192 // Normalize "" and auto 34193 val = parseFloat( val ) || 0; 34194 34195 // Adjust for the element's box model 34196 return ( val + 34197 boxModelAdjustment( 34198 elem, 34199 dimension, 34200 extra || ( isBorderBox ? "border" : "content" ), 34201 valueIsBorderBox, 34202 styles, 34203 34204 // Provide the current computed size to request scroll gutter calculation (gh-3589) 34205 val 34206 ) 34207 ) + "px"; 34208} 34209 34210jQuery.extend( { 34211 34212 // Add in style property hooks for overriding the default 34213 // behavior of getting and setting a style property 34214 cssHooks: { 34215 opacity: { 34216 get: function( elem, computed ) { 34217 if ( computed ) { 34218 34219 // We should always get a number back from opacity 34220 var ret = curCSS( elem, "opacity" ); 34221 return ret === "" ? "1" : ret; 34222 } 34223 } 34224 } 34225 }, 34226 34227 // Don't automatically add "px" to these possibly-unitless properties 34228 cssNumber: { 34229 animationIterationCount: true, 34230 aspectRatio: true, 34231 borderImageSlice: true, 34232 columnCount: true, 34233 flexGrow: true, 34234 flexShrink: true, 34235 fontWeight: true, 34236 gridArea: true, 34237 gridColumn: true, 34238 gridColumnEnd: true, 34239 gridColumnStart: true, 34240 gridRow: true, 34241 gridRowEnd: true, 34242 gridRowStart: true, 34243 lineHeight: true, 34244 opacity: true, 34245 order: true, 34246 orphans: true, 34247 scale: true, 34248 widows: true, 34249 zIndex: true, 34250 zoom: true, 34251 34252 // SVG-related 34253 fillOpacity: true, 34254 floodOpacity: true, 34255 stopOpacity: true, 34256 strokeMiterlimit: true, 34257 strokeOpacity: true 34258 }, 34259 34260 // Add in properties whose names you wish to fix before 34261 // setting or getting the value 34262 cssProps: {}, 34263 34264 // Get and set the style property on a DOM Node 34265 style: function( elem, name, value, extra ) { 34266 34267 // Don't set styles on text and comment nodes 34268 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { 34269 return; 34270 } 34271 34272 // Make sure that we're working with the right name 34273 var ret, type, hooks, 34274 origName = camelCase( name ), 34275 isCustomProp = rcustomProp.test( name ), 34276 style = elem.style; 34277 34278 // Make sure that we're working with the right name. We don't 34279 // want to query the value if it is a CSS custom property 34280 // since they are user-defined. 34281 if ( !isCustomProp ) { 34282 name = finalPropName( origName ); 34283 } 34284 34285 // Gets hook for the prefixed version, then unprefixed version 34286 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 34287 34288 // Check if we're setting a value 34289 if ( value !== undefined ) { 34290 type = typeof value; 34291 34292 // Convert "+=" or "-=" to relative numbers (trac-7345) 34293 if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { 34294 value = adjustCSS( elem, name, ret ); 34295 34296 // Fixes bug trac-9237 34297 type = "number"; 34298 } 34299 34300 // Make sure that null and NaN values aren't set (trac-7116) 34301 if ( value == null || value !== value ) { 34302 return; 34303 } 34304 34305 // If a number was passed in, add the unit (except for certain CSS properties) 34306 // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append 34307 // "px" to a few hardcoded values. 34308 if ( type === "number" && !isCustomProp ) { 34309 value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); 34310 } 34311 34312 // background-* props affect original clone's values 34313 if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { 34314 style[ name ] = "inherit"; 34315 } 34316 34317 // If a hook was provided, use that value, otherwise just set the specified value 34318 if ( !hooks || !( "set" in hooks ) || 34319 ( value = hooks.set( elem, value, extra ) ) !== undefined ) { 34320 34321 if ( isCustomProp ) { 34322 style.setProperty( name, value ); 34323 } else { 34324 style[ name ] = value; 34325 } 34326 } 34327 34328 } else { 34329 34330 // If a hook was provided get the non-computed value from there 34331 if ( hooks && "get" in hooks && 34332 ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { 34333 34334 return ret; 34335 } 34336 34337 // Otherwise just get the value from the style object 34338 return style[ name ]; 34339 } 34340 }, 34341 34342 css: function( elem, name, extra, styles ) { 34343 var val, num, hooks, 34344 origName = camelCase( name ), 34345 isCustomProp = rcustomProp.test( name ); 34346 34347 // Make sure that we're working with the right name. We don't 34348 // want to modify the value if it is a CSS custom property 34349 // since they are user-defined. 34350 if ( !isCustomProp ) { 34351 name = finalPropName( origName ); 34352 } 34353 34354 // Try prefixed name followed by the unprefixed name 34355 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 34356 34357 // If a hook was provided get the computed value from there 34358 if ( hooks && "get" in hooks ) { 34359 val = hooks.get( elem, true, extra ); 34360 } 34361 34362 // Otherwise, if a way to get the computed value exists, use that 34363 if ( val === undefined ) { 34364 val = curCSS( elem, name, styles ); 34365 } 34366 34367 // Convert "normal" to computed value 34368 if ( val === "normal" && name in cssNormalTransform ) { 34369 val = cssNormalTransform[ name ]; 34370 } 34371 34372 // Make numeric if forced or a qualifier was provided and val looks numeric 34373 if ( extra === "" || extra ) { 34374 num = parseFloat( val ); 34375 return extra === true || isFinite( num ) ? num || 0 : val; 34376 } 34377 34378 return val; 34379 } 34380} ); 34381 34382jQuery.each( [ "height", "width" ], function( _i, dimension ) { 34383 jQuery.cssHooks[ dimension ] = { 34384 get: function( elem, computed, extra ) { 34385 if ( computed ) { 34386 34387 // Certain elements can have dimension info if we invisibly show them 34388 // but it must have a current display style that would benefit 34389 return rdisplayswap.test( jQuery.css( elem, "display" ) ) && 34390 34391 // Support: Safari 8+ 34392 // Table columns in Safari have non-zero offsetWidth & zero 34393 // getBoundingClientRect().width unless display is changed. 34394 // Support: IE <=11 only 34395 // Running getBoundingClientRect on a disconnected node 34396 // in IE throws an error. 34397 ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? 34398 swap( elem, cssShow, function() { 34399 return getWidthOrHeight( elem, dimension, extra ); 34400 } ) : 34401 getWidthOrHeight( elem, dimension, extra ); 34402 } 34403 }, 34404 34405 set: function( elem, value, extra ) { 34406 var matches, 34407 styles = getStyles( elem ), 34408 34409 // Only read styles.position if the test has a chance to fail 34410 // to avoid forcing a reflow. 34411 scrollboxSizeBuggy = !support.scrollboxSize() && 34412 styles.position === "absolute", 34413 34414 // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) 34415 boxSizingNeeded = scrollboxSizeBuggy || extra, 34416 isBorderBox = boxSizingNeeded && 34417 jQuery.css( elem, "boxSizing", false, styles ) === "border-box", 34418 subtract = extra ? 34419 boxModelAdjustment( 34420 elem, 34421 dimension, 34422 extra, 34423 isBorderBox, 34424 styles 34425 ) : 34426 0; 34427 34428 // Account for unreliable border-box dimensions by comparing offset* to computed and 34429 // faking a content-box to get border and padding (gh-3699) 34430 if ( isBorderBox && scrollboxSizeBuggy ) { 34431 subtract -= Math.ceil( 34432 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - 34433 parseFloat( styles[ dimension ] ) - 34434 boxModelAdjustment( elem, dimension, "border", false, styles ) - 34435 0.5 34436 ); 34437 } 34438 34439 // Convert to pixels if value adjustment is needed 34440 if ( subtract && ( matches = rcssNum.exec( value ) ) && 34441 ( matches[ 3 ] || "px" ) !== "px" ) { 34442 34443 elem.style[ dimension ] = value; 34444 value = jQuery.css( elem, dimension ); 34445 } 34446 34447 return setPositiveNumber( elem, value, subtract ); 34448 } 34449 }; 34450} ); 34451 34452jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, 34453 function( elem, computed ) { 34454 if ( computed ) { 34455 return ( parseFloat( curCSS( elem, "marginLeft" ) ) || 34456 elem.getBoundingClientRect().left - 34457 swap( elem, { marginLeft: 0 }, function() { 34458 return elem.getBoundingClientRect().left; 34459 } ) 34460 ) + "px"; 34461 } 34462 } 34463); 34464 34465// These hooks are used by animate to expand properties 34466jQuery.each( { 34467 margin: "", 34468 padding: "", 34469 border: "Width" 34470}, function( prefix, suffix ) { 34471 jQuery.cssHooks[ prefix + suffix ] = { 34472 expand: function( value ) { 34473 var i = 0, 34474 expanded = {}, 34475 34476 // Assumes a single number if not a string 34477 parts = typeof value === "string" ? value.split( " " ) : [ value ]; 34478 34479 for ( ; i < 4; i++ ) { 34480 expanded[ prefix + cssExpand[ i ] + suffix ] = 34481 parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; 34482 } 34483 34484 return expanded; 34485 } 34486 }; 34487 34488 if ( prefix !== "margin" ) { 34489 jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; 34490 } 34491} ); 34492 34493jQuery.fn.extend( { 34494 css: function( name, value ) { 34495 return access( this, function( elem, name, value ) { 34496 var styles, len, 34497 map = {}, 34498 i = 0; 34499 34500 if ( Array.isArray( name ) ) { 34501 styles = getStyles( elem ); 34502 len = name.length; 34503 34504 for ( ; i < len; i++ ) { 34505 map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); 34506 } 34507 34508 return map; 34509 } 34510 34511 return value !== undefined ? 34512 jQuery.style( elem, name, value ) : 34513 jQuery.css( elem, name ); 34514 }, name, value, arguments.length > 1 ); 34515 } 34516} ); 34517 34518 34519function Tween( elem, options, prop, end, easing ) { 34520 return new Tween.prototype.init( elem, options, prop, end, easing ); 34521} 34522jQuery.Tween = Tween; 34523 34524Tween.prototype = { 34525 constructor: Tween, 34526 init: function( elem, options, prop, end, easing, unit ) { 34527 this.elem = elem; 34528 this.prop = prop; 34529 this.easing = easing || jQuery.easing._default; 34530 this.options = options; 34531 this.start = this.now = this.cur(); 34532 this.end = end; 34533 this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); 34534 }, 34535 cur: function() { 34536 var hooks = Tween.propHooks[ this.prop ]; 34537 34538 return hooks && hooks.get ? 34539 hooks.get( this ) : 34540 Tween.propHooks._default.get( this ); 34541 }, 34542 run: function( percent ) { 34543 var eased, 34544 hooks = Tween.propHooks[ this.prop ]; 34545 34546 if ( this.options.duration ) { 34547 this.pos = eased = jQuery.easing[ this.easing ]( 34548 percent, this.options.duration * percent, 0, 1, this.options.duration 34549 ); 34550 } else { 34551 this.pos = eased = percent; 34552 } 34553 this.now = ( this.end - this.start ) * eased + this.start; 34554 34555 if ( this.options.step ) { 34556 this.options.step.call( this.elem, this.now, this ); 34557 } 34558 34559 if ( hooks && hooks.set ) { 34560 hooks.set( this ); 34561 } else { 34562 Tween.propHooks._default.set( this ); 34563 } 34564 return this; 34565 } 34566}; 34567 34568Tween.prototype.init.prototype = Tween.prototype; 34569 34570Tween.propHooks = { 34571 _default: { 34572 get: function( tween ) { 34573 var result; 34574 34575 // Use a property on the element directly when it is not a DOM element, 34576 // or when there is no matching style property that exists. 34577 if ( tween.elem.nodeType !== 1 || 34578 tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { 34579 return tween.elem[ tween.prop ]; 34580 } 34581 34582 // Passing an empty string as a 3rd parameter to .css will automatically 34583 // attempt a parseFloat and fallback to a string if the parse fails. 34584 // Simple values such as "10px" are parsed to Float; 34585 // complex values such as "rotate(1rad)" are returned as-is. 34586 result = jQuery.css( tween.elem, tween.prop, "" ); 34587 34588 // Empty strings, null, undefined and "auto" are converted to 0. 34589 return !result || result === "auto" ? 0 : result; 34590 }, 34591 set: function( tween ) { 34592 34593 // Use step hook for back compat. 34594 // Use cssHook if its there. 34595 // Use .style if available and use plain properties where available. 34596 if ( jQuery.fx.step[ tween.prop ] ) { 34597 jQuery.fx.step[ tween.prop ]( tween ); 34598 } else if ( tween.elem.nodeType === 1 && ( 34599 jQuery.cssHooks[ tween.prop ] || 34600 tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { 34601 jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); 34602 } else { 34603 tween.elem[ tween.prop ] = tween.now; 34604 } 34605 } 34606 } 34607}; 34608 34609// Support: IE <=9 only 34610// Panic based approach to setting things on disconnected nodes 34611Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { 34612 set: function( tween ) { 34613 if ( tween.elem.nodeType && tween.elem.parentNode ) { 34614 tween.elem[ tween.prop ] = tween.now; 34615 } 34616 } 34617}; 34618 34619jQuery.easing = { 34620 linear: function( p ) { 34621 return p; 34622 }, 34623 swing: function( p ) { 34624 return 0.5 - Math.cos( p * Math.PI ) / 2; 34625 }, 34626 _default: "swing" 34627}; 34628 34629jQuery.fx = Tween.prototype.init; 34630 34631// Back compat <1.8 extension point 34632jQuery.fx.step = {}; 34633 34634 34635 34636 34637var 34638 fxNow, inProgress, 34639 rfxtypes = /^(?:toggle|show|hide)$/, 34640 rrun = /queueHooks$/; 34641 34642function schedule() { 34643 if ( inProgress ) { 34644 if ( document.hidden === false && window.requestAnimationFrame ) { 34645 window.requestAnimationFrame( schedule ); 34646 } else { 34647 window.setTimeout( schedule, jQuery.fx.interval ); 34648 } 34649 34650 jQuery.fx.tick(); 34651 } 34652} 34653 34654// Animations created synchronously will run synchronously 34655function createFxNow() { 34656 window.setTimeout( function() { 34657 fxNow = undefined; 34658 } ); 34659 return ( fxNow = Date.now() ); 34660} 34661 34662// Generate parameters to create a standard animation 34663function genFx( type, includeWidth ) { 34664 var which, 34665 i = 0, 34666 attrs = { height: type }; 34667 34668 // If we include width, step value is 1 to do all cssExpand values, 34669 // otherwise step value is 2 to skip over Left and Right 34670 includeWidth = includeWidth ? 1 : 0; 34671 for ( ; i < 4; i += 2 - includeWidth ) { 34672 which = cssExpand[ i ]; 34673 attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; 34674 } 34675 34676 if ( includeWidth ) { 34677 attrs.opacity = attrs.width = type; 34678 } 34679 34680 return attrs; 34681} 34682 34683function createTween( value, prop, animation ) { 34684 var tween, 34685 collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), 34686 index = 0, 34687 length = collection.length; 34688 for ( ; index < length; index++ ) { 34689 if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { 34690 34691 // We're done with this property 34692 return tween; 34693 } 34694 } 34695} 34696 34697function defaultPrefilter( elem, props, opts ) { 34698 var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, 34699 isBox = "width" in props || "height" in props, 34700 anim = this, 34701 orig = {}, 34702 style = elem.style, 34703 hidden = elem.nodeType && isHiddenWithinTree( elem ), 34704 dataShow = dataPriv.get( elem, "fxshow" ); 34705 34706 // Queue-skipping animations hijack the fx hooks 34707 if ( !opts.queue ) { 34708 hooks = jQuery._queueHooks( elem, "fx" ); 34709 if ( hooks.unqueued == null ) { 34710 hooks.unqueued = 0; 34711 oldfire = hooks.empty.fire; 34712 hooks.empty.fire = function() { 34713 if ( !hooks.unqueued ) { 34714 oldfire(); 34715 } 34716 }; 34717 } 34718 hooks.unqueued++; 34719 34720 anim.always( function() { 34721 34722 // Ensure the complete handler is called before this completes 34723 anim.always( function() { 34724 hooks.unqueued--; 34725 if ( !jQuery.queue( elem, "fx" ).length ) { 34726 hooks.empty.fire(); 34727 } 34728 } ); 34729 } ); 34730 } 34731 34732 // Detect show/hide animations 34733 for ( prop in props ) { 34734 value = props[ prop ]; 34735 if ( rfxtypes.test( value ) ) { 34736 delete props[ prop ]; 34737 toggle = toggle || value === "toggle"; 34738 if ( value === ( hidden ? "hide" : "show" ) ) { 34739 34740 // Pretend to be hidden if this is a "show" and 34741 // there is still data from a stopped show/hide 34742 if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { 34743 hidden = true; 34744 34745 // Ignore all other no-op show/hide data 34746 } else { 34747 continue; 34748 } 34749 } 34750 orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); 34751 } 34752 } 34753 34754 // Bail out if this is a no-op like .hide().hide() 34755 propTween = !jQuery.isEmptyObject( props ); 34756 if ( !propTween && jQuery.isEmptyObject( orig ) ) { 34757 return; 34758 } 34759 34760 // Restrict "overflow" and "display" styles during box animations 34761 if ( isBox && elem.nodeType === 1 ) { 34762 34763 // Support: IE <=9 - 11, Edge 12 - 15 34764 // Record all 3 overflow attributes because IE does not infer the shorthand 34765 // from identically-valued overflowX and overflowY and Edge just mirrors 34766 // the overflowX value there. 34767 opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; 34768 34769 // Identify a display type, preferring old show/hide data over the CSS cascade 34770 restoreDisplay = dataShow && dataShow.display; 34771 if ( restoreDisplay == null ) { 34772 restoreDisplay = dataPriv.get( elem, "display" ); 34773 } 34774 display = jQuery.css( elem, "display" ); 34775 if ( display === "none" ) { 34776 if ( restoreDisplay ) { 34777 display = restoreDisplay; 34778 } else { 34779 34780 // Get nonempty value(s) by temporarily forcing visibility 34781 showHide( [ elem ], true ); 34782 restoreDisplay = elem.style.display || restoreDisplay; 34783 display = jQuery.css( elem, "display" ); 34784 showHide( [ elem ] ); 34785 } 34786 } 34787 34788 // Animate inline elements as inline-block 34789 if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { 34790 if ( jQuery.css( elem, "float" ) === "none" ) { 34791 34792 // Restore the original display value at the end of pure show/hide animations 34793 if ( !propTween ) { 34794 anim.done( function() { 34795 style.display = restoreDisplay; 34796 } ); 34797 if ( restoreDisplay == null ) { 34798 display = style.display; 34799 restoreDisplay = display === "none" ? "" : display; 34800 } 34801 } 34802 style.display = "inline-block"; 34803 } 34804 } 34805 } 34806 34807 if ( opts.overflow ) { 34808 style.overflow = "hidden"; 34809 anim.always( function() { 34810 style.overflow = opts.overflow[ 0 ]; 34811 style.overflowX = opts.overflow[ 1 ]; 34812 style.overflowY = opts.overflow[ 2 ]; 34813 } ); 34814 } 34815 34816 // Implement show/hide animations 34817 propTween = false; 34818 for ( prop in orig ) { 34819 34820 // General show/hide setup for this element animation 34821 if ( !propTween ) { 34822 if ( dataShow ) { 34823 if ( "hidden" in dataShow ) { 34824 hidden = dataShow.hidden; 34825 } 34826 } else { 34827 dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); 34828 } 34829 34830 // Store hidden/visible for toggle so `.stop().toggle()` "reverses" 34831 if ( toggle ) { 34832 dataShow.hidden = !hidden; 34833 } 34834 34835 // Show elements before animating them 34836 if ( hidden ) { 34837 showHide( [ elem ], true ); 34838 } 34839 34840 /* eslint-disable no-loop-func */ 34841 34842 anim.done( function() { 34843 34844 /* eslint-enable no-loop-func */ 34845 34846 // The final step of a "hide" animation is actually hiding the element 34847 if ( !hidden ) { 34848 showHide( [ elem ] ); 34849 } 34850 dataPriv.remove( elem, "fxshow" ); 34851 for ( prop in orig ) { 34852 jQuery.style( elem, prop, orig[ prop ] ); 34853 } 34854 } ); 34855 } 34856 34857 // Per-property setup 34858 propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); 34859 if ( !( prop in dataShow ) ) { 34860 dataShow[ prop ] = propTween.start; 34861 if ( hidden ) { 34862 propTween.end = propTween.start; 34863 propTween.start = 0; 34864 } 34865 } 34866 } 34867} 34868 34869function propFilter( props, specialEasing ) { 34870 var index, name, easing, value, hooks; 34871 34872 // camelCase, specialEasing and expand cssHook pass 34873 for ( index in props ) { 34874 name = camelCase( index ); 34875 easing = specialEasing[ name ]; 34876 value = props[ index ]; 34877 if ( Array.isArray( value ) ) { 34878 easing = value[ 1 ]; 34879 value = props[ index ] = value[ 0 ]; 34880 } 34881 34882 if ( index !== name ) { 34883 props[ name ] = value; 34884 delete props[ index ]; 34885 } 34886 34887 hooks = jQuery.cssHooks[ name ]; 34888 if ( hooks && "expand" in hooks ) { 34889 value = hooks.expand( value ); 34890 delete props[ name ]; 34891 34892 // Not quite $.extend, this won't overwrite existing keys. 34893 // Reusing 'index' because we have the correct "name" 34894 for ( index in value ) { 34895 if ( !( index in props ) ) { 34896 props[ index ] = value[ index ]; 34897 specialEasing[ index ] = easing; 34898 } 34899 } 34900 } else { 34901 specialEasing[ name ] = easing; 34902 } 34903 } 34904} 34905 34906function Animation( elem, properties, options ) { 34907 var result, 34908 stopped, 34909 index = 0, 34910 length = Animation.prefilters.length, 34911 deferred = jQuery.Deferred().always( function() { 34912 34913 // Don't match elem in the :animated selector 34914 delete tick.elem; 34915 } ), 34916 tick = function() { 34917 if ( stopped ) { 34918 return false; 34919 } 34920 var currentTime = fxNow || createFxNow(), 34921 remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), 34922 34923 // Support: Android 2.3 only 34924 // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497) 34925 temp = remaining / animation.duration || 0, 34926 percent = 1 - temp, 34927 index = 0, 34928 length = animation.tweens.length; 34929 34930 for ( ; index < length; index++ ) { 34931 animation.tweens[ index ].run( percent ); 34932 } 34933 34934 deferred.notifyWith( elem, [ animation, percent, remaining ] ); 34935 34936 // If there's more to do, yield 34937 if ( percent < 1 && length ) { 34938 return remaining; 34939 } 34940 34941 // If this was an empty animation, synthesize a final progress notification 34942 if ( !length ) { 34943 deferred.notifyWith( elem, [ animation, 1, 0 ] ); 34944 } 34945 34946 // Resolve the animation and report its conclusion 34947 deferred.resolveWith( elem, [ animation ] ); 34948 return false; 34949 }, 34950 animation = deferred.promise( { 34951 elem: elem, 34952 props: jQuery.extend( {}, properties ), 34953 opts: jQuery.extend( true, { 34954 specialEasing: {}, 34955 easing: jQuery.easing._default 34956 }, options ), 34957 originalProperties: properties, 34958 originalOptions: options, 34959 startTime: fxNow || createFxNow(), 34960 duration: options.duration, 34961 tweens: [], 34962 createTween: function( prop, end ) { 34963 var tween = jQuery.Tween( elem, animation.opts, prop, end, 34964 animation.opts.specialEasing[ prop ] || animation.opts.easing ); 34965 animation.tweens.push( tween ); 34966 return tween; 34967 }, 34968 stop: function( gotoEnd ) { 34969 var index = 0, 34970 34971 // If we are going to the end, we want to run all the tweens 34972 // otherwise we skip this part 34973 length = gotoEnd ? animation.tweens.length : 0; 34974 if ( stopped ) { 34975 return this; 34976 } 34977 stopped = true; 34978 for ( ; index < length; index++ ) { 34979 animation.tweens[ index ].run( 1 ); 34980 } 34981 34982 // Resolve when we played the last frame; otherwise, reject 34983 if ( gotoEnd ) { 34984 deferred.notifyWith( elem, [ animation, 1, 0 ] ); 34985 deferred.resolveWith( elem, [ animation, gotoEnd ] ); 34986 } else { 34987 deferred.rejectWith( elem, [ animation, gotoEnd ] ); 34988 } 34989 return this; 34990 } 34991 } ), 34992 props = animation.props; 34993 34994 propFilter( props, animation.opts.specialEasing ); 34995 34996 for ( ; index < length; index++ ) { 34997 result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); 34998 if ( result ) { 34999 if ( isFunction( result.stop ) ) { 35000 jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = 35001 result.stop.bind( result ); 35002 } 35003 return result; 35004 } 35005 } 35006 35007 jQuery.map( props, createTween, animation ); 35008 35009 if ( isFunction( animation.opts.start ) ) { 35010 animation.opts.start.call( elem, animation ); 35011 } 35012 35013 // Attach callbacks from options 35014 animation 35015 .progress( animation.opts.progress ) 35016 .done( animation.opts.done, animation.opts.complete ) 35017 .fail( animation.opts.fail ) 35018 .always( animation.opts.always ); 35019 35020 jQuery.fx.timer( 35021 jQuery.extend( tick, { 35022 elem: elem, 35023 anim: animation, 35024 queue: animation.opts.queue 35025 } ) 35026 ); 35027 35028 return animation; 35029} 35030 35031jQuery.Animation = jQuery.extend( Animation, { 35032 35033 tweeners: { 35034 "*": [ function( prop, value ) { 35035 var tween = this.createTween( prop, value ); 35036 adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); 35037 return tween; 35038 } ] 35039 }, 35040 35041 tweener: function( props, callback ) { 35042 if ( isFunction( props ) ) { 35043 callback = props; 35044 props = [ "*" ]; 35045 } else { 35046 props = props.match( rnothtmlwhite ); 35047 } 35048 35049 var prop, 35050 index = 0, 35051 length = props.length; 35052 35053 for ( ; index < length; index++ ) { 35054 prop = props[ index ]; 35055 Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; 35056 Animation.tweeners[ prop ].unshift( callback ); 35057 } 35058 }, 35059 35060 prefilters: [ defaultPrefilter ], 35061 35062 prefilter: function( callback, prepend ) { 35063 if ( prepend ) { 35064 Animation.prefilters.unshift( callback ); 35065 } else { 35066 Animation.prefilters.push( callback ); 35067 } 35068 } 35069} ); 35070 35071jQuery.speed = function( speed, easing, fn ) { 35072 var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { 35073 complete: fn || !fn && easing || 35074 isFunction( speed ) && speed, 35075 duration: speed, 35076 easing: fn && easing || easing && !isFunction( easing ) && easing 35077 }; 35078 35079 // Go to the end state if fx are off 35080 if ( jQuery.fx.off ) { 35081 opt.duration = 0; 35082 35083 } else { 35084 if ( typeof opt.duration !== "number" ) { 35085 if ( opt.duration in jQuery.fx.speeds ) { 35086 opt.duration = jQuery.fx.speeds[ opt.duration ]; 35087 35088 } else { 35089 opt.duration = jQuery.fx.speeds._default; 35090 } 35091 } 35092 } 35093 35094 // Normalize opt.queue - true/undefined/null -> "fx" 35095 if ( opt.queue == null || opt.queue === true ) { 35096 opt.queue = "fx"; 35097 } 35098 35099 // Queueing 35100 opt.old = opt.complete; 35101 35102 opt.complete = function() { 35103 if ( isFunction( opt.old ) ) { 35104 opt.old.call( this ); 35105 } 35106 35107 if ( opt.queue ) { 35108 jQuery.dequeue( this, opt.queue ); 35109 } 35110 }; 35111 35112 return opt; 35113}; 35114 35115jQuery.fn.extend( { 35116 fadeTo: function( speed, to, easing, callback ) { 35117 35118 // Show any hidden elements after setting opacity to 0 35119 return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() 35120 35121 // Animate to the value specified 35122 .end().animate( { opacity: to }, speed, easing, callback ); 35123 }, 35124 animate: function( prop, speed, easing, callback ) { 35125 var empty = jQuery.isEmptyObject( prop ), 35126 optall = jQuery.speed( speed, easing, callback ), 35127 doAnimation = function() { 35128 35129 // Operate on a copy of prop so per-property easing won't be lost 35130 var anim = Animation( this, jQuery.extend( {}, prop ), optall ); 35131 35132 // Empty animations, or finishing resolves immediately 35133 if ( empty || dataPriv.get( this, "finish" ) ) { 35134 anim.stop( true ); 35135 } 35136 }; 35137 35138 doAnimation.finish = doAnimation; 35139 35140 return empty || optall.queue === false ? 35141 this.each( doAnimation ) : 35142 this.queue( optall.queue, doAnimation ); 35143 }, 35144 stop: function( type, clearQueue, gotoEnd ) { 35145 var stopQueue = function( hooks ) { 35146 var stop = hooks.stop; 35147 delete hooks.stop; 35148 stop( gotoEnd ); 35149 }; 35150 35151 if ( typeof type !== "string" ) { 35152 gotoEnd = clearQueue; 35153 clearQueue = type; 35154 type = undefined; 35155 } 35156 if ( clearQueue ) { 35157 this.queue( type || "fx", [] ); 35158 } 35159 35160 return this.each( function() { 35161 var dequeue = true, 35162 index = type != null && type + "queueHooks", 35163 timers = jQuery.timers, 35164 data = dataPriv.get( this ); 35165 35166 if ( index ) { 35167 if ( data[ index ] && data[ index ].stop ) { 35168 stopQueue( data[ index ] ); 35169 } 35170 } else { 35171 for ( index in data ) { 35172 if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { 35173 stopQueue( data[ index ] ); 35174 } 35175 } 35176 } 35177 35178 for ( index = timers.length; index--; ) { 35179 if ( timers[ index ].elem === this && 35180 ( type == null || timers[ index ].queue === type ) ) { 35181 35182 timers[ index ].anim.stop( gotoEnd ); 35183 dequeue = false; 35184 timers.splice( index, 1 ); 35185 } 35186 } 35187 35188 // Start the next in the queue if the last step wasn't forced. 35189 // Timers currently will call their complete callbacks, which 35190 // will dequeue but only if they were gotoEnd. 35191 if ( dequeue || !gotoEnd ) { 35192 jQuery.dequeue( this, type ); 35193 } 35194 } ); 35195 }, 35196 finish: function( type ) { 35197 if ( type !== false ) { 35198 type = type || "fx"; 35199 } 35200 return this.each( function() { 35201 var index, 35202 data = dataPriv.get( this ), 35203 queue = data[ type + "queue" ], 35204 hooks = data[ type + "queueHooks" ], 35205 timers = jQuery.timers, 35206 length = queue ? queue.length : 0; 35207 35208 // Enable finishing flag on private data 35209 data.finish = true; 35210 35211 // Empty the queue first 35212 jQuery.queue( this, type, [] ); 35213 35214 if ( hooks && hooks.stop ) { 35215 hooks.stop.call( this, true ); 35216 } 35217 35218 // Look for any active animations, and finish them 35219 for ( index = timers.length; index--; ) { 35220 if ( timers[ index ].elem === this && timers[ index ].queue === type ) { 35221 timers[ index ].anim.stop( true ); 35222 timers.splice( index, 1 ); 35223 } 35224 } 35225 35226 // Look for any animations in the old queue and finish them 35227 for ( index = 0; index < length; index++ ) { 35228 if ( queue[ index ] && queue[ index ].finish ) { 35229 queue[ index ].finish.call( this ); 35230 } 35231 } 35232 35233 // Turn off finishing flag 35234 delete data.finish; 35235 } ); 35236 } 35237} ); 35238 35239jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { 35240 var cssFn = jQuery.fn[ name ]; 35241 jQuery.fn[ name ] = function( speed, easing, callback ) { 35242 return speed == null || typeof speed === "boolean" ? 35243 cssFn.apply( this, arguments ) : 35244 this.animate( genFx( name, true ), speed, easing, callback ); 35245 }; 35246} ); 35247 35248// Generate shortcuts for custom animations 35249jQuery.each( { 35250 slideDown: genFx( "show" ), 35251 slideUp: genFx( "hide" ), 35252 slideToggle: genFx( "toggle" ), 35253 fadeIn: { opacity: "show" }, 35254 fadeOut: { opacity: "hide" }, 35255 fadeToggle: { opacity: "toggle" } 35256}, function( name, props ) { 35257 jQuery.fn[ name ] = function( speed, easing, callback ) { 35258 return this.animate( props, speed, easing, callback ); 35259 }; 35260} ); 35261 35262jQuery.timers = []; 35263jQuery.fx.tick = function() { 35264 var timer, 35265 i = 0, 35266 timers = jQuery.timers; 35267 35268 fxNow = Date.now(); 35269 35270 for ( ; i < timers.length; i++ ) { 35271 timer = timers[ i ]; 35272 35273 // Run the timer and safely remove it when done (allowing for external removal) 35274 if ( !timer() && timers[ i ] === timer ) { 35275 timers.splice( i--, 1 ); 35276 } 35277 } 35278 35279 if ( !timers.length ) { 35280 jQuery.fx.stop(); 35281 } 35282 fxNow = undefined; 35283}; 35284 35285jQuery.fx.timer = function( timer ) { 35286 jQuery.timers.push( timer ); 35287 jQuery.fx.start(); 35288}; 35289 35290jQuery.fx.interval = 13; 35291jQuery.fx.start = function() { 35292 if ( inProgress ) { 35293 return; 35294 } 35295 35296 inProgress = true; 35297 schedule(); 35298}; 35299 35300jQuery.fx.stop = function() { 35301 inProgress = null; 35302}; 35303 35304jQuery.fx.speeds = { 35305 slow: 600, 35306 fast: 200, 35307 35308 // Default speed 35309 _default: 400 35310}; 35311 35312 35313// Based off of the plugin by Clint Helfers, with permission. 35314jQuery.fn.delay = function( time, type ) { 35315 time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; 35316 type = type || "fx"; 35317 35318 return this.queue( type, function( next, hooks ) { 35319 var timeout = window.setTimeout( next, time ); 35320 hooks.stop = function() { 35321 window.clearTimeout( timeout ); 35322 }; 35323 } ); 35324}; 35325 35326 35327( function() { 35328 var input = document.createElement( "input" ), 35329 select = document.createElement( "select" ), 35330 opt = select.appendChild( document.createElement( "option" ) ); 35331 35332 input.type = "checkbox"; 35333 35334 // Support: Android <=4.3 only 35335 // Default value for a checkbox should be "on" 35336 support.checkOn = input.value !== ""; 35337 35338 // Support: IE <=11 only 35339 // Must access selectedIndex to make default options select 35340 support.optSelected = opt.selected; 35341 35342 // Support: IE <=11 only 35343 // An input loses its value after becoming a radio 35344 input = document.createElement( "input" ); 35345 input.value = "t"; 35346 input.type = "radio"; 35347 support.radioValue = input.value === "t"; 35348} )(); 35349 35350 35351var boolHook, 35352 attrHandle = jQuery.expr.attrHandle; 35353 35354jQuery.fn.extend( { 35355 attr: function( name, value ) { 35356 return access( this, jQuery.attr, name, value, arguments.length > 1 ); 35357 }, 35358 35359 removeAttr: function( name ) { 35360 return this.each( function() { 35361 jQuery.removeAttr( this, name ); 35362 } ); 35363 } 35364} ); 35365 35366jQuery.extend( { 35367 attr: function( elem, name, value ) { 35368 var ret, hooks, 35369 nType = elem.nodeType; 35370 35371 // Don't get/set attributes on text, comment and attribute nodes 35372 if ( nType === 3 || nType === 8 || nType === 2 ) { 35373 return; 35374 } 35375 35376 // Fallback to prop when attributes are not supported 35377 if ( typeof elem.getAttribute === "undefined" ) { 35378 return jQuery.prop( elem, name, value ); 35379 } 35380 35381 // Attribute hooks are determined by the lowercase version 35382 // Grab necessary hook if one is defined 35383 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 35384 hooks = jQuery.attrHooks[ name.toLowerCase() ] || 35385 ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); 35386 } 35387 35388 if ( value !== undefined ) { 35389 if ( value === null ) { 35390 jQuery.removeAttr( elem, name ); 35391 return; 35392 } 35393 35394 if ( hooks && "set" in hooks && 35395 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 35396 return ret; 35397 } 35398 35399 elem.setAttribute( name, value + "" ); 35400 return value; 35401 } 35402 35403 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 35404 return ret; 35405 } 35406 35407 ret = jQuery.find.attr( elem, name ); 35408 35409 // Non-existent attributes return null, we normalize to undefined 35410 return ret == null ? undefined : ret; 35411 }, 35412 35413 attrHooks: { 35414 type: { 35415 set: function( elem, value ) { 35416 if ( !support.radioValue && value === "radio" && 35417 nodeName( elem, "input" ) ) { 35418 var val = elem.value; 35419 elem.setAttribute( "type", value ); 35420 if ( val ) { 35421 elem.value = val; 35422 } 35423 return value; 35424 } 35425 } 35426 } 35427 }, 35428 35429 removeAttr: function( elem, value ) { 35430 var name, 35431 i = 0, 35432 35433 // Attribute names can contain non-HTML whitespace characters 35434 // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 35435 attrNames = value && value.match( rnothtmlwhite ); 35436 35437 if ( attrNames && elem.nodeType === 1 ) { 35438 while ( ( name = attrNames[ i++ ] ) ) { 35439 elem.removeAttribute( name ); 35440 } 35441 } 35442 } 35443} ); 35444 35445// Hooks for boolean attributes 35446boolHook = { 35447 set: function( elem, value, name ) { 35448 if ( value === false ) { 35449 35450 // Remove boolean attributes when set to false 35451 jQuery.removeAttr( elem, name ); 35452 } else { 35453 elem.setAttribute( name, name ); 35454 } 35455 return name; 35456 } 35457}; 35458 35459jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { 35460 var getter = attrHandle[ name ] || jQuery.find.attr; 35461 35462 attrHandle[ name ] = function( elem, name, isXML ) { 35463 var ret, handle, 35464 lowercaseName = name.toLowerCase(); 35465 35466 if ( !isXML ) { 35467 35468 // Avoid an infinite loop by temporarily removing this function from the getter 35469 handle = attrHandle[ lowercaseName ]; 35470 attrHandle[ lowercaseName ] = ret; 35471 ret = getter( elem, name, isXML ) != null ? 35472 lowercaseName : 35473 null; 35474 attrHandle[ lowercaseName ] = handle; 35475 } 35476 return ret; 35477 }; 35478} ); 35479 35480 35481 35482 35483var rfocusable = /^(?:input|select|textarea|button)$/i, 35484 rclickable = /^(?:a|area)$/i; 35485 35486jQuery.fn.extend( { 35487 prop: function( name, value ) { 35488 return access( this, jQuery.prop, name, value, arguments.length > 1 ); 35489 }, 35490 35491 removeProp: function( name ) { 35492 return this.each( function() { 35493 delete this[ jQuery.propFix[ name ] || name ]; 35494 } ); 35495 } 35496} ); 35497 35498jQuery.extend( { 35499 prop: function( elem, name, value ) { 35500 var ret, hooks, 35501 nType = elem.nodeType; 35502 35503 // Don't get/set properties on text, comment and attribute nodes 35504 if ( nType === 3 || nType === 8 || nType === 2 ) { 35505 return; 35506 } 35507 35508 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 35509 35510 // Fix name and attach hooks 35511 name = jQuery.propFix[ name ] || name; 35512 hooks = jQuery.propHooks[ name ]; 35513 } 35514 35515 if ( value !== undefined ) { 35516 if ( hooks && "set" in hooks && 35517 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 35518 return ret; 35519 } 35520 35521 return ( elem[ name ] = value ); 35522 } 35523 35524 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 35525 return ret; 35526 } 35527 35528 return elem[ name ]; 35529 }, 35530 35531 propHooks: { 35532 tabIndex: { 35533 get: function( elem ) { 35534 35535 // Support: IE <=9 - 11 only 35536 // elem.tabIndex doesn't always return the 35537 // correct value when it hasn't been explicitly set 35538 // Use proper attribute retrieval (trac-12072) 35539 var tabindex = jQuery.find.attr( elem, "tabindex" ); 35540 35541 if ( tabindex ) { 35542 return parseInt( tabindex, 10 ); 35543 } 35544 35545 if ( 35546 rfocusable.test( elem.nodeName ) || 35547 rclickable.test( elem.nodeName ) && 35548 elem.href 35549 ) { 35550 return 0; 35551 } 35552 35553 return -1; 35554 } 35555 } 35556 }, 35557 35558 propFix: { 35559 "for": "htmlFor", 35560 "class": "className" 35561 } 35562} ); 35563 35564// Support: IE <=11 only 35565// Accessing the selectedIndex property 35566// forces the browser to respect setting selected 35567// on the option 35568// The getter ensures a default option is selected 35569// when in an optgroup 35570// eslint rule "no-unused-expressions" is disabled for this code 35571// since it considers such accessions noop 35572if ( !support.optSelected ) { 35573 jQuery.propHooks.selected = { 35574 get: function( elem ) { 35575 35576 /* eslint no-unused-expressions: "off" */ 35577 35578 var parent = elem.parentNode; 35579 if ( parent && parent.parentNode ) { 35580 parent.parentNode.selectedIndex; 35581 } 35582 return null; 35583 }, 35584 set: function( elem ) { 35585 35586 /* eslint no-unused-expressions: "off" */ 35587 35588 var parent = elem.parentNode; 35589 if ( parent ) { 35590 parent.selectedIndex; 35591 35592 if ( parent.parentNode ) { 35593 parent.parentNode.selectedIndex; 35594 } 35595 } 35596 } 35597 }; 35598} 35599 35600jQuery.each( [ 35601 "tabIndex", 35602 "readOnly", 35603 "maxLength", 35604 "cellSpacing", 35605 "cellPadding", 35606 "rowSpan", 35607 "colSpan", 35608 "useMap", 35609 "frameBorder", 35610 "contentEditable" 35611], function() { 35612 jQuery.propFix[ this.toLowerCase() ] = this; 35613} ); 35614 35615 35616 35617 35618 // Strip and collapse whitespace according to HTML spec 35619 // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace 35620 function stripAndCollapse( value ) { 35621 var tokens = value.match( rnothtmlwhite ) || []; 35622 return tokens.join( " " ); 35623 } 35624 35625 35626function getClass( elem ) { 35627 return elem.getAttribute && elem.getAttribute( "class" ) || ""; 35628} 35629 35630function classesToArray( value ) { 35631 if ( Array.isArray( value ) ) { 35632 return value; 35633 } 35634 if ( typeof value === "string" ) { 35635 return value.match( rnothtmlwhite ) || []; 35636 } 35637 return []; 35638} 35639 35640jQuery.fn.extend( { 35641 addClass: function( value ) { 35642 var classNames, cur, curValue, className, i, finalValue; 35643 35644 if ( isFunction( value ) ) { 35645 return this.each( function( j ) { 35646 jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); 35647 } ); 35648 } 35649 35650 classNames = classesToArray( value ); 35651 35652 if ( classNames.length ) { 35653 return this.each( function() { 35654 curValue = getClass( this ); 35655 cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); 35656 35657 if ( cur ) { 35658 for ( i = 0; i < classNames.length; i++ ) { 35659 className = classNames[ i ]; 35660 if ( cur.indexOf( " " + className + " " ) < 0 ) { 35661 cur += className + " "; 35662 } 35663 } 35664 35665 // Only assign if different to avoid unneeded rendering. 35666 finalValue = stripAndCollapse( cur ); 35667 if ( curValue !== finalValue ) { 35668 this.setAttribute( "class", finalValue ); 35669 } 35670 } 35671 } ); 35672 } 35673 35674 return this; 35675 }, 35676 35677 removeClass: function( value ) { 35678 var classNames, cur, curValue, className, i, finalValue; 35679 35680 if ( isFunction( value ) ) { 35681 return this.each( function( j ) { 35682 jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); 35683 } ); 35684 } 35685 35686 if ( !arguments.length ) { 35687 return this.attr( "class", "" ); 35688 } 35689 35690 classNames = classesToArray( value ); 35691 35692 if ( classNames.length ) { 35693 return this.each( function() { 35694 curValue = getClass( this ); 35695 35696 // This expression is here for better compressibility (see addClass) 35697 cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); 35698 35699 if ( cur ) { 35700 for ( i = 0; i < classNames.length; i++ ) { 35701 className = classNames[ i ]; 35702 35703 // Remove *all* instances 35704 while ( cur.indexOf( " " + className + " " ) > -1 ) { 35705 cur = cur.replace( " " + className + " ", " " ); 35706 } 35707 } 35708 35709 // Only assign if different to avoid unneeded rendering. 35710 finalValue = stripAndCollapse( cur ); 35711 if ( curValue !== finalValue ) { 35712 this.setAttribute( "class", finalValue ); 35713 } 35714 } 35715 } ); 35716 } 35717 35718 return this; 35719 }, 35720 35721 toggleClass: function( value, stateVal ) { 35722 var classNames, className, i, self, 35723 type = typeof value, 35724 isValidValue = type === "string" || Array.isArray( value ); 35725 35726 if ( isFunction( value ) ) { 35727 return this.each( function( i ) { 35728 jQuery( this ).toggleClass( 35729 value.call( this, i, getClass( this ), stateVal ), 35730 stateVal 35731 ); 35732 } ); 35733 } 35734 35735 if ( typeof stateVal === "boolean" && isValidValue ) { 35736 return stateVal ? this.addClass( value ) : this.removeClass( value ); 35737 } 35738 35739 classNames = classesToArray( value ); 35740 35741 return this.each( function() { 35742 if ( isValidValue ) { 35743 35744 // Toggle individual class names 35745 self = jQuery( this ); 35746 35747 for ( i = 0; i < classNames.length; i++ ) { 35748 className = classNames[ i ]; 35749 35750 // Check each className given, space separated list 35751 if ( self.hasClass( className ) ) { 35752 self.removeClass( className ); 35753 } else { 35754 self.addClass( className ); 35755 } 35756 } 35757 35758 // Toggle whole class name 35759 } else if ( value === undefined || type === "boolean" ) { 35760 className = getClass( this ); 35761 if ( className ) { 35762 35763 // Store className if set 35764 dataPriv.set( this, "__className__", className ); 35765 } 35766 35767 // If the element has a class name or if we're passed `false`, 35768 // then remove the whole classname (if there was one, the above saved it). 35769 // Otherwise bring back whatever was previously saved (if anything), 35770 // falling back to the empty string if nothing was stored. 35771 if ( this.setAttribute ) { 35772 this.setAttribute( "class", 35773 className || value === false ? 35774 "" : 35775 dataPriv.get( this, "__className__" ) || "" 35776 ); 35777 } 35778 } 35779 } ); 35780 }, 35781 35782 hasClass: function( selector ) { 35783 var className, elem, 35784 i = 0; 35785 35786 className = " " + selector + " "; 35787 while ( ( elem = this[ i++ ] ) ) { 35788 if ( elem.nodeType === 1 && 35789 ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { 35790 return true; 35791 } 35792 } 35793 35794 return false; 35795 } 35796} ); 35797 35798 35799 35800 35801var rreturn = /\r/g; 35802 35803jQuery.fn.extend( { 35804 val: function( value ) { 35805 var hooks, ret, valueIsFunction, 35806 elem = this[ 0 ]; 35807 35808 if ( !arguments.length ) { 35809 if ( elem ) { 35810 hooks = jQuery.valHooks[ elem.type ] || 35811 jQuery.valHooks[ elem.nodeName.toLowerCase() ]; 35812 35813 if ( hooks && 35814 "get" in hooks && 35815 ( ret = hooks.get( elem, "value" ) ) !== undefined 35816 ) { 35817 return ret; 35818 } 35819 35820 ret = elem.value; 35821 35822 // Handle most common string cases 35823 if ( typeof ret === "string" ) { 35824 return ret.replace( rreturn, "" ); 35825 } 35826 35827 // Handle cases where value is null/undef or number 35828 return ret == null ? "" : ret; 35829 } 35830 35831 return; 35832 } 35833 35834 valueIsFunction = isFunction( value ); 35835 35836 return this.each( function( i ) { 35837 var val; 35838 35839 if ( this.nodeType !== 1 ) { 35840 return; 35841 } 35842 35843 if ( valueIsFunction ) { 35844 val = value.call( this, i, jQuery( this ).val() ); 35845 } else { 35846 val = value; 35847 } 35848 35849 // Treat null/undefined as ""; convert numbers to string 35850 if ( val == null ) { 35851 val = ""; 35852 35853 } else if ( typeof val === "number" ) { 35854 val += ""; 35855 35856 } else if ( Array.isArray( val ) ) { 35857 val = jQuery.map( val, function( value ) { 35858 return value == null ? "" : value + ""; 35859 } ); 35860 } 35861 35862 hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; 35863 35864 // If set returns undefined, fall back to normal setting 35865 if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { 35866 this.value = val; 35867 } 35868 } ); 35869 } 35870} ); 35871 35872jQuery.extend( { 35873 valHooks: { 35874 option: { 35875 get: function( elem ) { 35876 35877 var val = jQuery.find.attr( elem, "value" ); 35878 return val != null ? 35879 val : 35880 35881 // Support: IE <=10 - 11 only 35882 // option.text throws exceptions (trac-14686, trac-14858) 35883 // Strip and collapse whitespace 35884 // https://html.spec.whatwg.org/#strip-and-collapse-whitespace 35885 stripAndCollapse( jQuery.text( elem ) ); 35886 } 35887 }, 35888 select: { 35889 get: function( elem ) { 35890 var value, option, i, 35891 options = elem.options, 35892 index = elem.selectedIndex, 35893 one = elem.type === "select-one", 35894 values = one ? null : [], 35895 max = one ? index + 1 : options.length; 35896 35897 if ( index < 0 ) { 35898 i = max; 35899 35900 } else { 35901 i = one ? index : 0; 35902 } 35903 35904 // Loop through all the selected options 35905 for ( ; i < max; i++ ) { 35906 option = options[ i ]; 35907 35908 // Support: IE <=9 only 35909 // IE8-9 doesn't update selected after form reset (trac-2551) 35910 if ( ( option.selected || i === index ) && 35911 35912 // Don't return options that are disabled or in a disabled optgroup 35913 !option.disabled && 35914 ( !option.parentNode.disabled || 35915 !nodeName( option.parentNode, "optgroup" ) ) ) { 35916 35917 // Get the specific value for the option 35918 value = jQuery( option ).val(); 35919 35920 // We don't need an array for one selects 35921 if ( one ) { 35922 return value; 35923 } 35924 35925 // Multi-Selects return an array 35926 values.push( value ); 35927 } 35928 } 35929 35930 return values; 35931 }, 35932 35933 set: function( elem, value ) { 35934 var optionSet, option, 35935 options = elem.options, 35936 values = jQuery.makeArray( value ), 35937 i = options.length; 35938 35939 while ( i-- ) { 35940 option = options[ i ]; 35941 35942 /* eslint-disable no-cond-assign */ 35943 35944 if ( option.selected = 35945 jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 35946 ) { 35947 optionSet = true; 35948 } 35949 35950 /* eslint-enable no-cond-assign */ 35951 } 35952 35953 // Force browsers to behave consistently when non-matching value is set 35954 if ( !optionSet ) { 35955 elem.selectedIndex = -1; 35956 } 35957 return values; 35958 } 35959 } 35960 } 35961} ); 35962 35963// Radios and checkboxes getter/setter 35964jQuery.each( [ "radio", "checkbox" ], function() { 35965 jQuery.valHooks[ this ] = { 35966 set: function( elem, value ) { 35967 if ( Array.isArray( value ) ) { 35968 return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); 35969 } 35970 } 35971 }; 35972 if ( !support.checkOn ) { 35973 jQuery.valHooks[ this ].get = function( elem ) { 35974 return elem.getAttribute( "value" ) === null ? "on" : elem.value; 35975 }; 35976 } 35977} ); 35978 35979 35980 35981 35982// Return jQuery for attributes-only inclusion 35983var location = window.location; 35984 35985var nonce = { guid: Date.now() }; 35986 35987var rquery = ( /\?/ ); 35988 35989 35990 35991// Cross-browser xml parsing 35992jQuery.parseXML = function( data ) { 35993 var xml, parserErrorElem; 35994 if ( !data || typeof data !== "string" ) { 35995 return null; 35996 } 35997 35998 // Support: IE 9 - 11 only 35999 // IE throws on parseFromString with invalid input. 36000 try { 36001 xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); 36002 } catch ( e ) {} 36003 36004 parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; 36005 if ( !xml || parserErrorElem ) { 36006 jQuery.error( "Invalid XML: " + ( 36007 parserErrorElem ? 36008 jQuery.map( parserErrorElem.childNodes, function( el ) { 36009 return el.textContent; 36010 } ).join( "\n" ) : 36011 data 36012 ) ); 36013 } 36014 return xml; 36015}; 36016 36017 36018var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, 36019 stopPropagationCallback = function( e ) { 36020 e.stopPropagation(); 36021 }; 36022 36023jQuery.extend( jQuery.event, { 36024 36025 trigger: function( event, data, elem, onlyHandlers ) { 36026 36027 var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, 36028 eventPath = [ elem || document ], 36029 type = hasOwn.call( event, "type" ) ? event.type : event, 36030 namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; 36031 36032 cur = lastElement = tmp = elem = elem || document; 36033 36034 // Don't do events on text and comment nodes 36035 if ( elem.nodeType === 3 || elem.nodeType === 8 ) { 36036 return; 36037 } 36038 36039 // focus/blur morphs to focusin/out; ensure we're not firing them right now 36040 if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { 36041 return; 36042 } 36043 36044 if ( type.indexOf( "." ) > -1 ) { 36045 36046 // Namespaced trigger; create a regexp to match event type in handle() 36047 namespaces = type.split( "." ); 36048 type = namespaces.shift(); 36049 namespaces.sort(); 36050 } 36051 ontype = type.indexOf( ":" ) < 0 && "on" + type; 36052 36053 // Caller can pass in a jQuery.Event object, Object, or just an event type string 36054 event = event[ jQuery.expando ] ? 36055 event : 36056 new jQuery.Event( type, typeof event === "object" && event ); 36057 36058 // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) 36059 event.isTrigger = onlyHandlers ? 2 : 3; 36060 event.namespace = namespaces.join( "." ); 36061 event.rnamespace = event.namespace ? 36062 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : 36063 null; 36064 36065 // Clean up the event in case it is being reused 36066 event.result = undefined; 36067 if ( !event.target ) { 36068 event.target = elem; 36069 } 36070 36071 // Clone any incoming data and prepend the event, creating the handler arg list 36072 data = data == null ? 36073 [ event ] : 36074 jQuery.makeArray( data, [ event ] ); 36075 36076 // Allow special events to draw outside the lines 36077 special = jQuery.event.special[ type ] || {}; 36078 if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { 36079 return; 36080 } 36081 36082 // Determine event propagation path in advance, per W3C events spec (trac-9951) 36083 // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724) 36084 if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { 36085 36086 bubbleType = special.delegateType || type; 36087 if ( !rfocusMorph.test( bubbleType + type ) ) { 36088 cur = cur.parentNode; 36089 } 36090 for ( ; cur; cur = cur.parentNode ) { 36091 eventPath.push( cur ); 36092 tmp = cur; 36093 } 36094 36095 // Only add window if we got to document (e.g., not plain obj or detached DOM) 36096 if ( tmp === ( elem.ownerDocument || document ) ) { 36097 eventPath.push( tmp.defaultView || tmp.parentWindow || window ); 36098 } 36099 } 36100 36101 // Fire handlers on the event path 36102 i = 0; 36103 while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { 36104 lastElement = cur; 36105 event.type = i > 1 ? 36106 bubbleType : 36107 special.bindType || type; 36108 36109 // jQuery handler 36110 handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && 36111 dataPriv.get( cur, "handle" ); 36112 if ( handle ) { 36113 handle.apply( cur, data ); 36114 } 36115 36116 // Native handler 36117 handle = ontype && cur[ ontype ]; 36118 if ( handle && handle.apply && acceptData( cur ) ) { 36119 event.result = handle.apply( cur, data ); 36120 if ( event.result === false ) { 36121 event.preventDefault(); 36122 } 36123 } 36124 } 36125 event.type = type; 36126 36127 // If nobody prevented the default action, do it now 36128 if ( !onlyHandlers && !event.isDefaultPrevented() ) { 36129 36130 if ( ( !special._default || 36131 special._default.apply( eventPath.pop(), data ) === false ) && 36132 acceptData( elem ) ) { 36133 36134 // Call a native DOM method on the target with the same name as the event. 36135 // Don't do default actions on window, that's where global variables be (trac-6170) 36136 if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { 36137 36138 // Don't re-trigger an onFOO event when we call its FOO() method 36139 tmp = elem[ ontype ]; 36140 36141 if ( tmp ) { 36142 elem[ ontype ] = null; 36143 } 36144 36145 // Prevent re-triggering of the same event, since we already bubbled it above 36146 jQuery.event.triggered = type; 36147 36148 if ( event.isPropagationStopped() ) { 36149 lastElement.addEventListener( type, stopPropagationCallback ); 36150 } 36151 36152 elem[ type ](); 36153 36154 if ( event.isPropagationStopped() ) { 36155 lastElement.removeEventListener( type, stopPropagationCallback ); 36156 } 36157 36158 jQuery.event.triggered = undefined; 36159 36160 if ( tmp ) { 36161 elem[ ontype ] = tmp; 36162 } 36163 } 36164 } 36165 } 36166 36167 return event.result; 36168 }, 36169 36170 // Piggyback on a donor event to simulate a different one 36171 // Used only for `focus(in | out)` events 36172 simulate: function( type, elem, event ) { 36173 var e = jQuery.extend( 36174 new jQuery.Event(), 36175 event, 36176 { 36177 type: type, 36178 isSimulated: true 36179 } 36180 ); 36181 36182 jQuery.event.trigger( e, null, elem ); 36183 } 36184 36185} ); 36186 36187jQuery.fn.extend( { 36188 36189 trigger: function( type, data ) { 36190 return this.each( function() { 36191 jQuery.event.trigger( type, data, this ); 36192 } ); 36193 }, 36194 triggerHandler: function( type, data ) { 36195 var elem = this[ 0 ]; 36196 if ( elem ) { 36197 return jQuery.event.trigger( type, data, elem, true ); 36198 } 36199 } 36200} ); 36201 36202 36203var 36204 rbracket = /\[\]$/, 36205 rCRLF = /\r?\n/g, 36206 rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, 36207 rsubmittable = /^(?:input|select|textarea|keygen)/i; 36208 36209function buildParams( prefix, obj, traditional, add ) { 36210 var name; 36211 36212 if ( Array.isArray( obj ) ) { 36213 36214 // Serialize array item. 36215 jQuery.each( obj, function( i, v ) { 36216 if ( traditional || rbracket.test( prefix ) ) { 36217 36218 // Treat each array item as a scalar. 36219 add( prefix, v ); 36220 36221 } else { 36222 36223 // Item is non-scalar (array or object), encode its numeric index. 36224 buildParams( 36225 prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", 36226 v, 36227 traditional, 36228 add 36229 ); 36230 } 36231 } ); 36232 36233 } else if ( !traditional && toType( obj ) === "object" ) { 36234 36235 // Serialize object item. 36236 for ( name in obj ) { 36237 buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); 36238 } 36239 36240 } else { 36241 36242 // Serialize scalar item. 36243 add( prefix, obj ); 36244 } 36245} 36246 36247// Serialize an array of form elements or a set of 36248// key/values into a query string 36249jQuery.param = function( a, traditional ) { 36250 var prefix, 36251 s = [], 36252 add = function( key, valueOrFunction ) { 36253 36254 // If value is a function, invoke it and use its return value 36255 var value = isFunction( valueOrFunction ) ? 36256 valueOrFunction() : 36257 valueOrFunction; 36258 36259 s[ s.length ] = encodeURIComponent( key ) + "=" + 36260 encodeURIComponent( value == null ? "" : value ); 36261 }; 36262 36263 if ( a == null ) { 36264 return ""; 36265 } 36266 36267 // If an array was passed in, assume that it is an array of form elements. 36268 if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { 36269 36270 // Serialize the form elements 36271 jQuery.each( a, function() { 36272 add( this.name, this.value ); 36273 } ); 36274 36275 } else { 36276 36277 // If traditional, encode the "old" way (the way 1.3.2 or older 36278 // did it), otherwise encode params recursively. 36279 for ( prefix in a ) { 36280 buildParams( prefix, a[ prefix ], traditional, add ); 36281 } 36282 } 36283 36284 // Return the resulting serialization 36285 return s.join( "&" ); 36286}; 36287 36288jQuery.fn.extend( { 36289 serialize: function() { 36290 return jQuery.param( this.serializeArray() ); 36291 }, 36292 serializeArray: function() { 36293 return this.map( function() { 36294 36295 // Can add propHook for "elements" to filter or add form elements 36296 var elements = jQuery.prop( this, "elements" ); 36297 return elements ? jQuery.makeArray( elements ) : this; 36298 } ).filter( function() { 36299 var type = this.type; 36300 36301 // Use .is( ":disabled" ) so that fieldset[disabled] works 36302 return this.name && !jQuery( this ).is( ":disabled" ) && 36303 rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && 36304 ( this.checked || !rcheckableType.test( type ) ); 36305 } ).map( function( _i, elem ) { 36306 var val = jQuery( this ).val(); 36307 36308 if ( val == null ) { 36309 return null; 36310 } 36311 36312 if ( Array.isArray( val ) ) { 36313 return jQuery.map( val, function( val ) { 36314 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 36315 } ); 36316 } 36317 36318 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 36319 } ).get(); 36320 } 36321} ); 36322 36323 36324var 36325 r20 = /%20/g, 36326 rhash = /#.*$/, 36327 rantiCache = /([?&])_=[^&]*/, 36328 rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, 36329 36330 // trac-7653, trac-8125, trac-8152: local protocol detection 36331 rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, 36332 rnoContent = /^(?:GET|HEAD)$/, 36333 rprotocol = /^\/\//, 36334 36335 /* Prefilters 36336 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) 36337 * 2) These are called: 36338 * - BEFORE asking for a transport 36339 * - AFTER param serialization (s.data is a string if s.processData is true) 36340 * 3) key is the dataType 36341 * 4) the catchall symbol "*" can be used 36342 * 5) execution will start with transport dataType and THEN continue down to "*" if needed 36343 */ 36344 prefilters = {}, 36345 36346 /* Transports bindings 36347 * 1) key is the dataType 36348 * 2) the catchall symbol "*" can be used 36349 * 3) selection will start with transport dataType and THEN go to "*" if needed 36350 */ 36351 transports = {}, 36352 36353 // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression 36354 allTypes = "*/".concat( "*" ), 36355 36356 // Anchor tag for parsing the document origin 36357 originAnchor = document.createElement( "a" ); 36358 36359originAnchor.href = location.href; 36360 36361// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport 36362function addToPrefiltersOrTransports( structure ) { 36363 36364 // dataTypeExpression is optional and defaults to "*" 36365 return function( dataTypeExpression, func ) { 36366 36367 if ( typeof dataTypeExpression !== "string" ) { 36368 func = dataTypeExpression; 36369 dataTypeExpression = "*"; 36370 } 36371 36372 var dataType, 36373 i = 0, 36374 dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; 36375 36376 if ( isFunction( func ) ) { 36377 36378 // For each dataType in the dataTypeExpression 36379 while ( ( dataType = dataTypes[ i++ ] ) ) { 36380 36381 // Prepend if requested 36382 if ( dataType[ 0 ] === "+" ) { 36383 dataType = dataType.slice( 1 ) || "*"; 36384 ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); 36385 36386 // Otherwise append 36387 } else { 36388 ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); 36389 } 36390 } 36391 } 36392 }; 36393} 36394 36395// Base inspection function for prefilters and transports 36396function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { 36397 36398 var inspected = {}, 36399 seekingTransport = ( structure === transports ); 36400 36401 function inspect( dataType ) { 36402 var selected; 36403 inspected[ dataType ] = true; 36404 jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { 36405 var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); 36406 if ( typeof dataTypeOrTransport === "string" && 36407 !seekingTransport && !inspected[ dataTypeOrTransport ] ) { 36408 36409 options.dataTypes.unshift( dataTypeOrTransport ); 36410 inspect( dataTypeOrTransport ); 36411 return false; 36412 } else if ( seekingTransport ) { 36413 return !( selected = dataTypeOrTransport ); 36414 } 36415 } ); 36416 return selected; 36417 } 36418 36419 return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); 36420} 36421 36422// A special extend for ajax options 36423// that takes "flat" options (not to be deep extended) 36424// Fixes trac-9887 36425function ajaxExtend( target, src ) { 36426 var key, deep, 36427 flatOptions = jQuery.ajaxSettings.flatOptions || {}; 36428 36429 for ( key in src ) { 36430 if ( src[ key ] !== undefined ) { 36431 ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; 36432 } 36433 } 36434 if ( deep ) { 36435 jQuery.extend( true, target, deep ); 36436 } 36437 36438 return target; 36439} 36440 36441/* Handles responses to an ajax request: 36442 * - finds the right dataType (mediates between content-type and expected dataType) 36443 * - returns the corresponding response 36444 */ 36445function ajaxHandleResponses( s, jqXHR, responses ) { 36446 36447 var ct, type, finalDataType, firstDataType, 36448 contents = s.contents, 36449 dataTypes = s.dataTypes; 36450 36451 // Remove auto dataType and get content-type in the process 36452 while ( dataTypes[ 0 ] === "*" ) { 36453 dataTypes.shift(); 36454 if ( ct === undefined ) { 36455 ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); 36456 } 36457 } 36458 36459 // Check if we're dealing with a known content-type 36460 if ( ct ) { 36461 for ( type in contents ) { 36462 if ( contents[ type ] && contents[ type ].test( ct ) ) { 36463 dataTypes.unshift( type ); 36464 break; 36465 } 36466 } 36467 } 36468 36469 // Check to see if we have a response for the expected dataType 36470 if ( dataTypes[ 0 ] in responses ) { 36471 finalDataType = dataTypes[ 0 ]; 36472 } else { 36473 36474 // Try convertible dataTypes 36475 for ( type in responses ) { 36476 if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { 36477 finalDataType = type; 36478 break; 36479 } 36480 if ( !firstDataType ) { 36481 firstDataType = type; 36482 } 36483 } 36484 36485 // Or just use first one 36486 finalDataType = finalDataType || firstDataType; 36487 } 36488 36489 // If we found a dataType 36490 // We add the dataType to the list if needed 36491 // and return the corresponding response 36492 if ( finalDataType ) { 36493 if ( finalDataType !== dataTypes[ 0 ] ) { 36494 dataTypes.unshift( finalDataType ); 36495 } 36496 return responses[ finalDataType ]; 36497 } 36498} 36499 36500/* Chain conversions given the request and the original response 36501 * Also sets the responseXXX fields on the jqXHR instance 36502 */ 36503function ajaxConvert( s, response, jqXHR, isSuccess ) { 36504 var conv2, current, conv, tmp, prev, 36505 converters = {}, 36506 36507 // Work with a copy of dataTypes in case we need to modify it for conversion 36508 dataTypes = s.dataTypes.slice(); 36509 36510 // Create converters map with lowercased keys 36511 if ( dataTypes[ 1 ] ) { 36512 for ( conv in s.converters ) { 36513 converters[ conv.toLowerCase() ] = s.converters[ conv ]; 36514 } 36515 } 36516 36517 current = dataTypes.shift(); 36518 36519 // Convert to each sequential dataType 36520 while ( current ) { 36521 36522 if ( s.responseFields[ current ] ) { 36523 jqXHR[ s.responseFields[ current ] ] = response; 36524 } 36525 36526 // Apply the dataFilter if provided 36527 if ( !prev && isSuccess && s.dataFilter ) { 36528 response = s.dataFilter( response, s.dataType ); 36529 } 36530 36531 prev = current; 36532 current = dataTypes.shift(); 36533 36534 if ( current ) { 36535 36536 // There's only work to do if current dataType is non-auto 36537 if ( current === "*" ) { 36538 36539 current = prev; 36540 36541 // Convert response if prev dataType is non-auto and differs from current 36542 } else if ( prev !== "*" && prev !== current ) { 36543 36544 // Seek a direct converter 36545 conv = converters[ prev + " " + current ] || converters[ "* " + current ]; 36546 36547 // If none found, seek a pair 36548 if ( !conv ) { 36549 for ( conv2 in converters ) { 36550 36551 // If conv2 outputs current 36552 tmp = conv2.split( " " ); 36553 if ( tmp[ 1 ] === current ) { 36554 36555 // If prev can be converted to accepted input 36556 conv = converters[ prev + " " + tmp[ 0 ] ] || 36557 converters[ "* " + tmp[ 0 ] ]; 36558 if ( conv ) { 36559 36560 // Condense equivalence converters 36561 if ( conv === true ) { 36562 conv = converters[ conv2 ]; 36563 36564 // Otherwise, insert the intermediate dataType 36565 } else if ( converters[ conv2 ] !== true ) { 36566 current = tmp[ 0 ]; 36567 dataTypes.unshift( tmp[ 1 ] ); 36568 } 36569 break; 36570 } 36571 } 36572 } 36573 } 36574 36575 // Apply converter (if not an equivalence) 36576 if ( conv !== true ) { 36577 36578 // Unless errors are allowed to bubble, catch and return them 36579 if ( conv && s.throws ) { 36580 response = conv( response ); 36581 } else { 36582 try { 36583 response = conv( response ); 36584 } catch ( e ) { 36585 return { 36586 state: "parsererror", 36587 error: conv ? e : "No conversion from " + prev + " to " + current 36588 }; 36589 } 36590 } 36591 } 36592 } 36593 } 36594 } 36595 36596 return { state: "success", data: response }; 36597} 36598 36599jQuery.extend( { 36600 36601 // Counter for holding the number of active queries 36602 active: 0, 36603 36604 // Last-Modified header cache for next request 36605 lastModified: {}, 36606 etag: {}, 36607 36608 ajaxSettings: { 36609 url: location.href, 36610 type: "GET", 36611 isLocal: rlocalProtocol.test( location.protocol ), 36612 global: true, 36613 processData: true, 36614 async: true, 36615 contentType: "application/x-www-form-urlencoded; charset=UTF-8", 36616 36617 /* 36618 timeout: 0, 36619 data: null, 36620 dataType: null, 36621 username: null, 36622 password: null, 36623 cache: null, 36624 throws: false, 36625 traditional: false, 36626 headers: {}, 36627 */ 36628 36629 accepts: { 36630 "*": allTypes, 36631 text: "text/plain", 36632 html: "text/html", 36633 xml: "application/xml, text/xml", 36634 json: "application/json, text/javascript" 36635 }, 36636 36637 contents: { 36638 xml: /\bxml\b/, 36639 html: /\bhtml/, 36640 json: /\bjson\b/ 36641 }, 36642 36643 responseFields: { 36644 xml: "responseXML", 36645 text: "responseText", 36646 json: "responseJSON" 36647 }, 36648 36649 // Data converters 36650 // Keys separate source (or catchall "*") and destination types with a single space 36651 converters: { 36652 36653 // Convert anything to text 36654 "* text": String, 36655 36656 // Text to html (true = no transformation) 36657 "text html": true, 36658 36659 // Evaluate text as a json expression 36660 "text json": JSON.parse, 36661 36662 // Parse text as xml 36663 "text xml": jQuery.parseXML 36664 }, 36665 36666 // For options that shouldn't be deep extended: 36667 // you can add your own custom options here if 36668 // and when you create one that shouldn't be 36669 // deep extended (see ajaxExtend) 36670 flatOptions: { 36671 url: true, 36672 context: true 36673 } 36674 }, 36675 36676 // Creates a full fledged settings object into target 36677 // with both ajaxSettings and settings fields. 36678 // If target is omitted, writes into ajaxSettings. 36679 ajaxSetup: function( target, settings ) { 36680 return settings ? 36681 36682 // Building a settings object 36683 ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : 36684 36685 // Extending ajaxSettings 36686 ajaxExtend( jQuery.ajaxSettings, target ); 36687 }, 36688 36689 ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), 36690 ajaxTransport: addToPrefiltersOrTransports( transports ), 36691 36692 // Main method 36693 ajax: function( url, options ) { 36694 36695 // If url is an object, simulate pre-1.5 signature 36696 if ( typeof url === "object" ) { 36697 options = url; 36698 url = undefined; 36699 } 36700 36701 // Force options to be an object 36702 options = options || {}; 36703 36704 var transport, 36705 36706 // URL without anti-cache param 36707 cacheURL, 36708 36709 // Response headers 36710 responseHeadersString, 36711 responseHeaders, 36712 36713 // timeout handle 36714 timeoutTimer, 36715 36716 // Url cleanup var 36717 urlAnchor, 36718 36719 // Request state (becomes false upon send and true upon completion) 36720 completed, 36721 36722 // To know if global events are to be dispatched 36723 fireGlobals, 36724 36725 // Loop variable 36726 i, 36727 36728 // uncached part of the url 36729 uncached, 36730 36731 // Create the final options object 36732 s = jQuery.ajaxSetup( {}, options ), 36733 36734 // Callbacks context 36735 callbackContext = s.context || s, 36736 36737 // Context for global events is callbackContext if it is a DOM node or jQuery collection 36738 globalEventContext = s.context && 36739 ( callbackContext.nodeType || callbackContext.jquery ) ? 36740 jQuery( callbackContext ) : 36741 jQuery.event, 36742 36743 // Deferreds 36744 deferred = jQuery.Deferred(), 36745 completeDeferred = jQuery.Callbacks( "once memory" ), 36746 36747 // Status-dependent callbacks 36748 statusCode = s.statusCode || {}, 36749 36750 // Headers (they are sent all at once) 36751 requestHeaders = {}, 36752 requestHeadersNames = {}, 36753 36754 // Default abort message 36755 strAbort = "canceled", 36756 36757 // Fake xhr 36758 jqXHR = { 36759 readyState: 0, 36760 36761 // Builds headers hashtable if needed 36762 getResponseHeader: function( key ) { 36763 var match; 36764 if ( completed ) { 36765 if ( !responseHeaders ) { 36766 responseHeaders = {}; 36767 while ( ( match = rheaders.exec( responseHeadersString ) ) ) { 36768 responseHeaders[ match[ 1 ].toLowerCase() + " " ] = 36769 ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) 36770 .concat( match[ 2 ] ); 36771 } 36772 } 36773 match = responseHeaders[ key.toLowerCase() + " " ]; 36774 } 36775 return match == null ? null : match.join( ", " ); 36776 }, 36777 36778 // Raw string 36779 getAllResponseHeaders: function() { 36780 return completed ? responseHeadersString : null; 36781 }, 36782 36783 // Caches the header 36784 setRequestHeader: function( name, value ) { 36785 if ( completed == null ) { 36786 name = requestHeadersNames[ name.toLowerCase() ] = 36787 requestHeadersNames[ name.toLowerCase() ] || name; 36788 requestHeaders[ name ] = value; 36789 } 36790 return this; 36791 }, 36792 36793 // Overrides response content-type header 36794 overrideMimeType: function( type ) { 36795 if ( completed == null ) { 36796 s.mimeType = type; 36797 } 36798 return this; 36799 }, 36800 36801 // Status-dependent callbacks 36802 statusCode: function( map ) { 36803 var code; 36804 if ( map ) { 36805 if ( completed ) { 36806 36807 // Execute the appropriate callbacks 36808 jqXHR.always( map[ jqXHR.status ] ); 36809 } else { 36810 36811 // Lazy-add the new callbacks in a way that preserves old ones 36812 for ( code in map ) { 36813 statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; 36814 } 36815 } 36816 } 36817 return this; 36818 }, 36819 36820 // Cancel the request 36821 abort: function( statusText ) { 36822 var finalText = statusText || strAbort; 36823 if ( transport ) { 36824 transport.abort( finalText ); 36825 } 36826 done( 0, finalText ); 36827 return this; 36828 } 36829 }; 36830 36831 // Attach deferreds 36832 deferred.promise( jqXHR ); 36833 36834 // Add protocol if not provided (prefilters might expect it) 36835 // Handle falsy url in the settings object (trac-10093: consistency with old signature) 36836 // We also use the url parameter if available 36837 s.url = ( ( url || s.url || location.href ) + "" ) 36838 .replace( rprotocol, location.protocol + "//" ); 36839 36840 // Alias method option to type as per ticket trac-12004 36841 s.type = options.method || options.type || s.method || s.type; 36842 36843 // Extract dataTypes list 36844 s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; 36845 36846 // A cross-domain request is in order when the origin doesn't match the current origin. 36847 if ( s.crossDomain == null ) { 36848 urlAnchor = document.createElement( "a" ); 36849 36850 // Support: IE <=8 - 11, Edge 12 - 15 36851 // IE throws exception on accessing the href property if url is malformed, 36852 // e.g. http://example.com:80x/ 36853 try { 36854 urlAnchor.href = s.url; 36855 36856 // Support: IE <=8 - 11 only 36857 // Anchor's host property isn't correctly set when s.url is relative 36858 urlAnchor.href = urlAnchor.href; 36859 s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== 36860 urlAnchor.protocol + "//" + urlAnchor.host; 36861 } catch ( e ) { 36862 36863 // If there is an error parsing the URL, assume it is crossDomain, 36864 // it can be rejected by the transport if it is invalid 36865 s.crossDomain = true; 36866 } 36867 } 36868 36869 // Convert data if not already a string 36870 if ( s.data && s.processData && typeof s.data !== "string" ) { 36871 s.data = jQuery.param( s.data, s.traditional ); 36872 } 36873 36874 // Apply prefilters 36875 inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); 36876 36877 // If request was aborted inside a prefilter, stop there 36878 if ( completed ) { 36879 return jqXHR; 36880 } 36881 36882 // We can fire global events as of now if asked to 36883 // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118) 36884 fireGlobals = jQuery.event && s.global; 36885 36886 // Watch for a new set of requests 36887 if ( fireGlobals && jQuery.active++ === 0 ) { 36888 jQuery.event.trigger( "ajaxStart" ); 36889 } 36890 36891 // Uppercase the type 36892 s.type = s.type.toUpperCase(); 36893 36894 // Determine if request has content 36895 s.hasContent = !rnoContent.test( s.type ); 36896 36897 // Save the URL in case we're toying with the If-Modified-Since 36898 // and/or If-None-Match header later on 36899 // Remove hash to simplify url manipulation 36900 cacheURL = s.url.replace( rhash, "" ); 36901 36902 // More options handling for requests with no content 36903 if ( !s.hasContent ) { 36904 36905 // Remember the hash so we can put it back 36906 uncached = s.url.slice( cacheURL.length ); 36907 36908 // If data is available and should be processed, append data to url 36909 if ( s.data && ( s.processData || typeof s.data === "string" ) ) { 36910 cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; 36911 36912 // trac-9682: remove data so that it's not used in an eventual retry 36913 delete s.data; 36914 } 36915 36916 // Add or update anti-cache param if needed 36917 if ( s.cache === false ) { 36918 cacheURL = cacheURL.replace( rantiCache, "$1" ); 36919 uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + 36920 uncached; 36921 } 36922 36923 // Put hash and anti-cache on the URL that will be requested (gh-1732) 36924 s.url = cacheURL + uncached; 36925 36926 // Change '%20' to '+' if this is encoded form body content (gh-2658) 36927 } else if ( s.data && s.processData && 36928 ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { 36929 s.data = s.data.replace( r20, "+" ); 36930 } 36931 36932 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 36933 if ( s.ifModified ) { 36934 if ( jQuery.lastModified[ cacheURL ] ) { 36935 jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); 36936 } 36937 if ( jQuery.etag[ cacheURL ] ) { 36938 jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); 36939 } 36940 } 36941 36942 // Set the correct header, if data is being sent 36943 if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { 36944 jqXHR.setRequestHeader( "Content-Type", s.contentType ); 36945 } 36946 36947 // Set the Accepts header for the server, depending on the dataType 36948 jqXHR.setRequestHeader( 36949 "Accept", 36950 s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? 36951 s.accepts[ s.dataTypes[ 0 ] ] + 36952 ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : 36953 s.accepts[ "*" ] 36954 ); 36955 36956 // Check for headers option 36957 for ( i in s.headers ) { 36958 jqXHR.setRequestHeader( i, s.headers[ i ] ); 36959 } 36960 36961 // Allow custom headers/mimetypes and early abort 36962 if ( s.beforeSend && 36963 ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { 36964 36965 // Abort if not done already and return 36966 return jqXHR.abort(); 36967 } 36968 36969 // Aborting is no longer a cancellation 36970 strAbort = "abort"; 36971 36972 // Install callbacks on deferreds 36973 completeDeferred.add( s.complete ); 36974 jqXHR.done( s.success ); 36975 jqXHR.fail( s.error ); 36976 36977 // Get transport 36978 transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); 36979 36980 // If no transport, we auto-abort 36981 if ( !transport ) { 36982 done( -1, "No Transport" ); 36983 } else { 36984 jqXHR.readyState = 1; 36985 36986 // Send global event 36987 if ( fireGlobals ) { 36988 globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); 36989 } 36990 36991 // If request was aborted inside ajaxSend, stop there 36992 if ( completed ) { 36993 return jqXHR; 36994 } 36995 36996 // Timeout 36997 if ( s.async && s.timeout > 0 ) { 36998 timeoutTimer = window.setTimeout( function() { 36999 jqXHR.abort( "timeout" ); 37000 }, s.timeout ); 37001 } 37002 37003 try { 37004 completed = false; 37005 transport.send( requestHeaders, done ); 37006 } catch ( e ) { 37007 37008 // Rethrow post-completion exceptions 37009 if ( completed ) { 37010 throw e; 37011 } 37012 37013 // Propagate others as results 37014 done( -1, e ); 37015 } 37016 } 37017 37018 // Callback for when everything is done 37019 function done( status, nativeStatusText, responses, headers ) { 37020 var isSuccess, success, error, response, modified, 37021 statusText = nativeStatusText; 37022 37023 // Ignore repeat invocations 37024 if ( completed ) { 37025 return; 37026 } 37027 37028 completed = true; 37029 37030 // Clear timeout if it exists 37031 if ( timeoutTimer ) { 37032 window.clearTimeout( timeoutTimer ); 37033 } 37034 37035 // Dereference transport for early garbage collection 37036 // (no matter how long the jqXHR object will be used) 37037 transport = undefined; 37038 37039 // Cache response headers 37040 responseHeadersString = headers || ""; 37041 37042 // Set readyState 37043 jqXHR.readyState = status > 0 ? 4 : 0; 37044 37045 // Determine if successful 37046 isSuccess = status >= 200 && status < 300 || status === 304; 37047 37048 // Get response data 37049 if ( responses ) { 37050 response = ajaxHandleResponses( s, jqXHR, responses ); 37051 } 37052 37053 // Use a noop converter for missing script but not if jsonp 37054 if ( !isSuccess && 37055 jQuery.inArray( "script", s.dataTypes ) > -1 && 37056 jQuery.inArray( "json", s.dataTypes ) < 0 ) { 37057 s.converters[ "text script" ] = function() {}; 37058 } 37059 37060 // Convert no matter what (that way responseXXX fields are always set) 37061 response = ajaxConvert( s, response, jqXHR, isSuccess ); 37062 37063 // If successful, handle type chaining 37064 if ( isSuccess ) { 37065 37066 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 37067 if ( s.ifModified ) { 37068 modified = jqXHR.getResponseHeader( "Last-Modified" ); 37069 if ( modified ) { 37070 jQuery.lastModified[ cacheURL ] = modified; 37071 } 37072 modified = jqXHR.getResponseHeader( "etag" ); 37073 if ( modified ) { 37074 jQuery.etag[ cacheURL ] = modified; 37075 } 37076 } 37077 37078 // if no content 37079 if ( status === 204 || s.type === "HEAD" ) { 37080 statusText = "nocontent"; 37081 37082 // if not modified 37083 } else if ( status === 304 ) { 37084 statusText = "notmodified"; 37085 37086 // If we have data, let's convert it 37087 } else { 37088 statusText = response.state; 37089 success = response.data; 37090 error = response.error; 37091 isSuccess = !error; 37092 } 37093 } else { 37094 37095 // Extract error from statusText and normalize for non-aborts 37096 error = statusText; 37097 if ( status || !statusText ) { 37098 statusText = "error"; 37099 if ( status < 0 ) { 37100 status = 0; 37101 } 37102 } 37103 } 37104 37105 // Set data for the fake xhr object 37106 jqXHR.status = status; 37107 jqXHR.statusText = ( nativeStatusText || statusText ) + ""; 37108 37109 // Success/Error 37110 if ( isSuccess ) { 37111 deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); 37112 } else { 37113 deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); 37114 } 37115 37116 // Status-dependent callbacks 37117 jqXHR.statusCode( statusCode ); 37118 statusCode = undefined; 37119 37120 if ( fireGlobals ) { 37121 globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", 37122 [ jqXHR, s, isSuccess ? success : error ] ); 37123 } 37124 37125 // Complete 37126 completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); 37127 37128 if ( fireGlobals ) { 37129 globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); 37130 37131 // Handle the global AJAX counter 37132 if ( !( --jQuery.active ) ) { 37133 jQuery.event.trigger( "ajaxStop" ); 37134 } 37135 } 37136 } 37137 37138 return jqXHR; 37139 }, 37140 37141 getJSON: function( url, data, callback ) { 37142 return jQuery.get( url, data, callback, "json" ); 37143 }, 37144 37145 getScript: function( url, callback ) { 37146 return jQuery.get( url, undefined, callback, "script" ); 37147 } 37148} ); 37149 37150jQuery.each( [ "get", "post" ], function( _i, method ) { 37151 jQuery[ method ] = function( url, data, callback, type ) { 37152 37153 // Shift arguments if data argument was omitted 37154 if ( isFunction( data ) ) { 37155 type = type || callback; 37156 callback = data; 37157 data = undefined; 37158 } 37159 37160 // The url can be an options object (which then must have .url) 37161 return jQuery.ajax( jQuery.extend( { 37162 url: url, 37163 type: method, 37164 dataType: type, 37165 data: data, 37166 success: callback 37167 }, jQuery.isPlainObject( url ) && url ) ); 37168 }; 37169} ); 37170 37171jQuery.ajaxPrefilter( function( s ) { 37172 var i; 37173 for ( i in s.headers ) { 37174 if ( i.toLowerCase() === "content-type" ) { 37175 s.contentType = s.headers[ i ] || ""; 37176 } 37177 } 37178} ); 37179 37180 37181jQuery._evalUrl = function( url, options, doc ) { 37182 return jQuery.ajax( { 37183 url: url, 37184 37185 // Make this explicit, since user can override this through ajaxSetup (trac-11264) 37186 type: "GET", 37187 dataType: "script", 37188 cache: true, 37189 async: false, 37190 global: false, 37191 37192 // Only evaluate the response if it is successful (gh-4126) 37193 // dataFilter is not invoked for failure responses, so using it instead 37194 // of the default converter is kludgy but it works. 37195 converters: { 37196 "text script": function() {} 37197 }, 37198 dataFilter: function( response ) { 37199 jQuery.globalEval( response, options, doc ); 37200 } 37201 } ); 37202}; 37203 37204 37205jQuery.fn.extend( { 37206 wrapAll: function( html ) { 37207 var wrap; 37208 37209 if ( this[ 0 ] ) { 37210 if ( isFunction( html ) ) { 37211 html = html.call( this[ 0 ] ); 37212 } 37213 37214 // The elements to wrap the target around 37215 wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); 37216 37217 if ( this[ 0 ].parentNode ) { 37218 wrap.insertBefore( this[ 0 ] ); 37219 } 37220 37221 wrap.map( function() { 37222 var elem = this; 37223 37224 while ( elem.firstElementChild ) { 37225 elem = elem.firstElementChild; 37226 } 37227 37228 return elem; 37229 } ).append( this ); 37230 } 37231 37232 return this; 37233 }, 37234 37235 wrapInner: function( html ) { 37236 if ( isFunction( html ) ) { 37237 return this.each( function( i ) { 37238 jQuery( this ).wrapInner( html.call( this, i ) ); 37239 } ); 37240 } 37241 37242 return this.each( function() { 37243 var self = jQuery( this ), 37244 contents = self.contents(); 37245 37246 if ( contents.length ) { 37247 contents.wrapAll( html ); 37248 37249 } else { 37250 self.append( html ); 37251 } 37252 } ); 37253 }, 37254 37255 wrap: function( html ) { 37256 var htmlIsFunction = isFunction( html ); 37257 37258 return this.each( function( i ) { 37259 jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); 37260 } ); 37261 }, 37262 37263 unwrap: function( selector ) { 37264 this.parent( selector ).not( "body" ).each( function() { 37265 jQuery( this ).replaceWith( this.childNodes ); 37266 } ); 37267 return this; 37268 } 37269} ); 37270 37271 37272jQuery.expr.pseudos.hidden = function( elem ) { 37273 return !jQuery.expr.pseudos.visible( elem ); 37274}; 37275jQuery.expr.pseudos.visible = function( elem ) { 37276 return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); 37277}; 37278 37279 37280 37281 37282jQuery.ajaxSettings.xhr = function() { 37283 try { 37284 return new window.XMLHttpRequest(); 37285 } catch ( e ) {} 37286}; 37287 37288var xhrSuccessStatus = { 37289 37290 // File protocol always yields status code 0, assume 200 37291 0: 200, 37292 37293 // Support: IE <=9 only 37294 // trac-1450: sometimes IE returns 1223 when it should be 204 37295 1223: 204 37296 }, 37297 xhrSupported = jQuery.ajaxSettings.xhr(); 37298 37299support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); 37300support.ajax = xhrSupported = !!xhrSupported; 37301 37302jQuery.ajaxTransport( function( options ) { 37303 var callback, errorCallback; 37304 37305 // Cross domain only allowed if supported through XMLHttpRequest 37306 if ( support.cors || xhrSupported && !options.crossDomain ) { 37307 return { 37308 send: function( headers, complete ) { 37309 var i, 37310 xhr = options.xhr(); 37311 37312 xhr.open( 37313 options.type, 37314 options.url, 37315 options.async, 37316 options.username, 37317 options.password 37318 ); 37319 37320 // Apply custom fields if provided 37321 if ( options.xhrFields ) { 37322 for ( i in options.xhrFields ) { 37323 xhr[ i ] = options.xhrFields[ i ]; 37324 } 37325 } 37326 37327 // Override mime type if needed 37328 if ( options.mimeType && xhr.overrideMimeType ) { 37329 xhr.overrideMimeType( options.mimeType ); 37330 } 37331 37332 // X-Requested-With header 37333 // For cross-domain requests, seeing as conditions for a preflight are 37334 // akin to a jigsaw puzzle, we simply never set it to be sure. 37335 // (it can always be set on a per-request basis or even using ajaxSetup) 37336 // For same-domain requests, won't change header if already provided. 37337 if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { 37338 headers[ "X-Requested-With" ] = "XMLHttpRequest"; 37339 } 37340 37341 // Set headers 37342 for ( i in headers ) { 37343 xhr.setRequestHeader( i, headers[ i ] ); 37344 } 37345 37346 // Callback 37347 callback = function( type ) { 37348 return function() { 37349 if ( callback ) { 37350 callback = errorCallback = xhr.onload = 37351 xhr.onerror = xhr.onabort = xhr.ontimeout = 37352 xhr.onreadystatechange = null; 37353 37354 if ( type === "abort" ) { 37355 xhr.abort(); 37356 } else if ( type === "error" ) { 37357 37358 // Support: IE <=9 only 37359 // On a manual native abort, IE9 throws 37360 // errors on any property access that is not readyState 37361 if ( typeof xhr.status !== "number" ) { 37362 complete( 0, "error" ); 37363 } else { 37364 complete( 37365 37366 // File: protocol always yields status 0; see trac-8605, trac-14207 37367 xhr.status, 37368 xhr.statusText 37369 ); 37370 } 37371 } else { 37372 complete( 37373 xhrSuccessStatus[ xhr.status ] || xhr.status, 37374 xhr.statusText, 37375 37376 // Support: IE <=9 only 37377 // IE9 has no XHR2 but throws on binary (trac-11426) 37378 // For XHR2 non-text, let the caller handle it (gh-2498) 37379 ( xhr.responseType || "text" ) !== "text" || 37380 typeof xhr.responseText !== "string" ? 37381 { binary: xhr.response } : 37382 { text: xhr.responseText }, 37383 xhr.getAllResponseHeaders() 37384 ); 37385 } 37386 } 37387 }; 37388 }; 37389 37390 // Listen to events 37391 xhr.onload = callback(); 37392 errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); 37393 37394 // Support: IE 9 only 37395 // Use onreadystatechange to replace onabort 37396 // to handle uncaught aborts 37397 if ( xhr.onabort !== undefined ) { 37398 xhr.onabort = errorCallback; 37399 } else { 37400 xhr.onreadystatechange = function() { 37401 37402 // Check readyState before timeout as it changes 37403 if ( xhr.readyState === 4 ) { 37404 37405 // Allow onerror to be called first, 37406 // but that will not handle a native abort 37407 // Also, save errorCallback to a variable 37408 // as xhr.onerror cannot be accessed 37409 window.setTimeout( function() { 37410 if ( callback ) { 37411 errorCallback(); 37412 } 37413 } ); 37414 } 37415 }; 37416 } 37417 37418 // Create the abort callback 37419 callback = callback( "abort" ); 37420 37421 try { 37422 37423 // Do send the request (this may raise an exception) 37424 xhr.send( options.hasContent && options.data || null ); 37425 } catch ( e ) { 37426 37427 // trac-14683: Only rethrow if this hasn't been notified as an error yet 37428 if ( callback ) { 37429 throw e; 37430 } 37431 } 37432 }, 37433 37434 abort: function() { 37435 if ( callback ) { 37436 callback(); 37437 } 37438 } 37439 }; 37440 } 37441} ); 37442 37443 37444 37445 37446// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) 37447jQuery.ajaxPrefilter( function( s ) { 37448 if ( s.crossDomain ) { 37449 s.contents.script = false; 37450 } 37451} ); 37452 37453// Install script dataType 37454jQuery.ajaxSetup( { 37455 accepts: { 37456 script: "text/javascript, application/javascript, " + 37457 "application/ecmascript, application/x-ecmascript" 37458 }, 37459 contents: { 37460 script: /\b(?:java|ecma)script\b/ 37461 }, 37462 converters: { 37463 "text script": function( text ) { 37464 jQuery.globalEval( text ); 37465 return text; 37466 } 37467 } 37468} ); 37469 37470// Handle cache's special case and crossDomain 37471jQuery.ajaxPrefilter( "script", function( s ) { 37472 if ( s.cache === undefined ) { 37473 s.cache = false; 37474 } 37475 if ( s.crossDomain ) { 37476 s.type = "GET"; 37477 } 37478} ); 37479 37480// Bind script tag hack transport 37481jQuery.ajaxTransport( "script", function( s ) { 37482 37483 // This transport only deals with cross domain or forced-by-attrs requests 37484 if ( s.crossDomain || s.scriptAttrs ) { 37485 var script, callback; 37486 return { 37487 send: function( _, complete ) { 37488 script = jQuery( "<script>" ) 37489 .attr( s.scriptAttrs || {} ) 37490 .prop( { charset: s.scriptCharset, src: s.url } ) 37491 .on( "load error", callback = function( evt ) { 37492 script.remove(); 37493 callback = null; 37494 if ( evt ) { 37495 complete( evt.type === "error" ? 404 : 200, evt.type ); 37496 } 37497 } ); 37498 37499 // Use native DOM manipulation to avoid our domManip AJAX trickery 37500 document.head.appendChild( script[ 0 ] ); 37501 }, 37502 abort: function() { 37503 if ( callback ) { 37504 callback(); 37505 } 37506 } 37507 }; 37508 } 37509} ); 37510 37511 37512 37513 37514var oldCallbacks = [], 37515 rjsonp = /(=)\?(?=&|$)|\?\?/; 37516 37517// Default jsonp settings 37518jQuery.ajaxSetup( { 37519 jsonp: "callback", 37520 jsonpCallback: function() { 37521 var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) ); 37522 this[ callback ] = true; 37523 return callback; 37524 } 37525} ); 37526 37527// Detect, normalize options and install callbacks for jsonp requests 37528jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { 37529 37530 var callbackName, overwritten, responseContainer, 37531 jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? 37532 "url" : 37533 typeof s.data === "string" && 37534 ( s.contentType || "" ) 37535 .indexOf( "application/x-www-form-urlencoded" ) === 0 && 37536 rjsonp.test( s.data ) && "data" 37537 ); 37538 37539 // Handle iff the expected data type is "jsonp" or we have a parameter to set 37540 if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { 37541 37542 // Get callback name, remembering preexisting value associated with it 37543 callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ? 37544 s.jsonpCallback() : 37545 s.jsonpCallback; 37546 37547 // Insert callback into url or form data 37548 if ( jsonProp ) { 37549 s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); 37550 } else if ( s.jsonp !== false ) { 37551 s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; 37552 } 37553 37554 // Use data converter to retrieve json after script execution 37555 s.converters[ "script json" ] = function() { 37556 if ( !responseContainer ) { 37557 jQuery.error( callbackName + " was not called" ); 37558 } 37559 return responseContainer[ 0 ]; 37560 }; 37561 37562 // Force json dataType 37563 s.dataTypes[ 0 ] = "json"; 37564 37565 // Install callback 37566 overwritten = window[ callbackName ]; 37567 window[ callbackName ] = function() { 37568 responseContainer = arguments; 37569 }; 37570 37571 // Clean-up function (fires after converters) 37572 jqXHR.always( function() { 37573 37574 // If previous value didn't exist - remove it 37575 if ( overwritten === undefined ) { 37576 jQuery( window ).removeProp( callbackName ); 37577 37578 // Otherwise restore preexisting value 37579 } else { 37580 window[ callbackName ] = overwritten; 37581 } 37582 37583 // Save back as free 37584 if ( s[ callbackName ] ) { 37585 37586 // Make sure that re-using the options doesn't screw things around 37587 s.jsonpCallback = originalSettings.jsonpCallback; 37588 37589 // Save the callback name for future use 37590 oldCallbacks.push( callbackName ); 37591 } 37592 37593 // Call if it was a function and we have a response 37594 if ( responseContainer && isFunction( overwritten ) ) { 37595 overwritten( responseContainer[ 0 ] ); 37596 } 37597 37598 responseContainer = overwritten = undefined; 37599 } ); 37600 37601 // Delegate to script 37602 return "script"; 37603 } 37604} ); 37605 37606 37607 37608 37609// Support: Safari 8 only 37610// In Safari 8 documents created via document.implementation.createHTMLDocument 37611// collapse sibling forms: the second one becomes a child of the first one. 37612// Because of that, this security measure has to be disabled in Safari 8. 37613// https://bugs.webkit.org/show_bug.cgi?id=137337 37614support.createHTMLDocument = ( function() { 37615 var body = document.implementation.createHTMLDocument( "" ).body; 37616 body.innerHTML = "<form></form><form></form>"; 37617 return body.childNodes.length === 2; 37618} )(); 37619 37620 37621// Argument "data" should be string of html 37622// context (optional): If specified, the fragment will be created in this context, 37623// defaults to document 37624// keepScripts (optional): If true, will include scripts passed in the html string 37625jQuery.parseHTML = function( data, context, keepScripts ) { 37626 if ( typeof data !== "string" ) { 37627 return []; 37628 } 37629 if ( typeof context === "boolean" ) { 37630 keepScripts = context; 37631 context = false; 37632 } 37633 37634 var base, parsed, scripts; 37635 37636 if ( !context ) { 37637 37638 // Stop scripts or inline event handlers from being executed immediately 37639 // by using document.implementation 37640 if ( support.createHTMLDocument ) { 37641 context = document.implementation.createHTMLDocument( "" ); 37642 37643 // Set the base href for the created document 37644 // so any parsed elements with URLs 37645 // are based on the document's URL (gh-2965) 37646 base = context.createElement( "base" ); 37647 base.href = document.location.href; 37648 context.head.appendChild( base ); 37649 } else { 37650 context = document; 37651 } 37652 } 37653 37654 parsed = rsingleTag.exec( data ); 37655 scripts = !keepScripts && []; 37656 37657 // Single tag 37658 if ( parsed ) { 37659 return [ context.createElement( parsed[ 1 ] ) ]; 37660 } 37661 37662 parsed = buildFragment( [ data ], context, scripts ); 37663 37664 if ( scripts && scripts.length ) { 37665 jQuery( scripts ).remove(); 37666 } 37667 37668 return jQuery.merge( [], parsed.childNodes ); 37669}; 37670 37671 37672/** 37673 * Load a url into a page 37674 */ 37675jQuery.fn.load = function( url, params, callback ) { 37676 var selector, type, response, 37677 self = this, 37678 off = url.indexOf( " " ); 37679 37680 if ( off > -1 ) { 37681 selector = stripAndCollapse( url.slice( off ) ); 37682 url = url.slice( 0, off ); 37683 } 37684 37685 // If it's a function 37686 if ( isFunction( params ) ) { 37687 37688 // We assume that it's the callback 37689 callback = params; 37690 params = undefined; 37691 37692 // Otherwise, build a param string 37693 } else if ( params && typeof params === "object" ) { 37694 type = "POST"; 37695 } 37696 37697 // If we have elements to modify, make the request 37698 if ( self.length > 0 ) { 37699 jQuery.ajax( { 37700 url: url, 37701 37702 // If "type" variable is undefined, then "GET" method will be used. 37703 // Make value of this field explicit since 37704 // user can override it through ajaxSetup method 37705 type: type || "GET", 37706 dataType: "html", 37707 data: params 37708 } ).done( function( responseText ) { 37709 37710 // Save response for use in complete callback 37711 response = arguments; 37712 37713 self.html( selector ? 37714 37715 // If a selector was specified, locate the right elements in a dummy div 37716 // Exclude scripts to avoid IE 'Permission Denied' errors 37717 jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) : 37718 37719 // Otherwise use the full result 37720 responseText ); 37721 37722 // If the request succeeds, this function gets "data", "status", "jqXHR" 37723 // but they are ignored because response was set above. 37724 // If it fails, this function gets "jqXHR", "status", "error" 37725 } ).always( callback && function( jqXHR, status ) { 37726 self.each( function() { 37727 callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); 37728 } ); 37729 } ); 37730 } 37731 37732 return this; 37733}; 37734 37735 37736 37737 37738jQuery.expr.pseudos.animated = function( elem ) { 37739 return jQuery.grep( jQuery.timers, function( fn ) { 37740 return elem === fn.elem; 37741 } ).length; 37742}; 37743 37744 37745 37746 37747jQuery.offset = { 37748 setOffset: function( elem, options, i ) { 37749 var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, 37750 position = jQuery.css( elem, "position" ), 37751 curElem = jQuery( elem ), 37752 props = {}; 37753 37754 // Set position first, in-case top/left are set even on static elem 37755 if ( position === "static" ) { 37756 elem.style.position = "relative"; 37757 } 37758 37759 curOffset = curElem.offset(); 37760 curCSSTop = jQuery.css( elem, "top" ); 37761 curCSSLeft = jQuery.css( elem, "left" ); 37762 calculatePosition = ( position === "absolute" || position === "fixed" ) && 37763 ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1; 37764 37765 // Need to be able to calculate position if either 37766 // top or left is auto and position is either absolute or fixed 37767 if ( calculatePosition ) { 37768 curPosition = curElem.position(); 37769 curTop = curPosition.top; 37770 curLeft = curPosition.left; 37771 37772 } else { 37773 curTop = parseFloat( curCSSTop ) || 0; 37774 curLeft = parseFloat( curCSSLeft ) || 0; 37775 } 37776 37777 if ( isFunction( options ) ) { 37778 37779 // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) 37780 options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); 37781 } 37782 37783 if ( options.top != null ) { 37784 props.top = ( options.top - curOffset.top ) + curTop; 37785 } 37786 if ( options.left != null ) { 37787 props.left = ( options.left - curOffset.left ) + curLeft; 37788 } 37789 37790 if ( "using" in options ) { 37791 options.using.call( elem, props ); 37792 37793 } else { 37794 curElem.css( props ); 37795 } 37796 } 37797}; 37798 37799jQuery.fn.extend( { 37800 37801 // offset() relates an element's border box to the document origin 37802 offset: function( options ) { 37803 37804 // Preserve chaining for setter 37805 if ( arguments.length ) { 37806 return options === undefined ? 37807 this : 37808 this.each( function( i ) { 37809 jQuery.offset.setOffset( this, options, i ); 37810 } ); 37811 } 37812 37813 var rect, win, 37814 elem = this[ 0 ]; 37815 37816 if ( !elem ) { 37817 return; 37818 } 37819 37820 // Return zeros for disconnected and hidden (display: none) elements (gh-2310) 37821 // Support: IE <=11 only 37822 // Running getBoundingClientRect on a 37823 // disconnected node in IE throws an error 37824 if ( !elem.getClientRects().length ) { 37825 return { top: 0, left: 0 }; 37826 } 37827 37828 // Get document-relative position by adding viewport scroll to viewport-relative gBCR 37829 rect = elem.getBoundingClientRect(); 37830 win = elem.ownerDocument.defaultView; 37831 return { 37832 top: rect.top + win.pageYOffset, 37833 left: rect.left + win.pageXOffset 37834 }; 37835 }, 37836 37837 // position() relates an element's margin box to its offset parent's padding box 37838 // This corresponds to the behavior of CSS absolute positioning 37839 position: function() { 37840 if ( !this[ 0 ] ) { 37841 return; 37842 } 37843 37844 var offsetParent, offset, doc, 37845 elem = this[ 0 ], 37846 parentOffset = { top: 0, left: 0 }; 37847 37848 // position:fixed elements are offset from the viewport, which itself always has zero offset 37849 if ( jQuery.css( elem, "position" ) === "fixed" ) { 37850 37851 // Assume position:fixed implies availability of getBoundingClientRect 37852 offset = elem.getBoundingClientRect(); 37853 37854 } else { 37855 offset = this.offset(); 37856 37857 // Account for the *real* offset parent, which can be the document or its root element 37858 // when a statically positioned element is identified 37859 doc = elem.ownerDocument; 37860 offsetParent = elem.offsetParent || doc.documentElement; 37861 while ( offsetParent && 37862 ( offsetParent === doc.body || offsetParent === doc.documentElement ) && 37863 jQuery.css( offsetParent, "position" ) === "static" ) { 37864 37865 offsetParent = offsetParent.parentNode; 37866 } 37867 if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) { 37868 37869 // Incorporate borders into its offset, since they are outside its content origin 37870 parentOffset = jQuery( offsetParent ).offset(); 37871 parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true ); 37872 parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true ); 37873 } 37874 } 37875 37876 // Subtract parent offsets and element margins 37877 return { 37878 top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), 37879 left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) 37880 }; 37881 }, 37882 37883 // This method will return documentElement in the following cases: 37884 // 1) For the element inside the iframe without offsetParent, this method will return 37885 // documentElement of the parent window 37886 // 2) For the hidden or detached element 37887 // 3) For body or html element, i.e. in case of the html node - it will return itself 37888 // 37889 // but those exceptions were never presented as a real life use-cases 37890 // and might be considered as more preferable results. 37891 // 37892 // This logic, however, is not guaranteed and can change at any point in the future 37893 offsetParent: function() { 37894 return this.map( function() { 37895 var offsetParent = this.offsetParent; 37896 37897 while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) { 37898 offsetParent = offsetParent.offsetParent; 37899 } 37900 37901 return offsetParent || documentElement; 37902 } ); 37903 } 37904} ); 37905 37906// Create scrollLeft and scrollTop methods 37907jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { 37908 var top = "pageYOffset" === prop; 37909 37910 jQuery.fn[ method ] = function( val ) { 37911 return access( this, function( elem, method, val ) { 37912 37913 // Coalesce documents and windows 37914 var win; 37915 if ( isWindow( elem ) ) { 37916 win = elem; 37917 } else if ( elem.nodeType === 9 ) { 37918 win = elem.defaultView; 37919 } 37920 37921 if ( val === undefined ) { 37922 return win ? win[ prop ] : elem[ method ]; 37923 } 37924 37925 if ( win ) { 37926 win.scrollTo( 37927 !top ? val : win.pageXOffset, 37928 top ? val : win.pageYOffset 37929 ); 37930 37931 } else { 37932 elem[ method ] = val; 37933 } 37934 }, method, val, arguments.length ); 37935 }; 37936} ); 37937 37938// Support: Safari <=7 - 9.1, Chrome <=37 - 49 37939// Add the top/left cssHooks using jQuery.fn.position 37940// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 37941// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347 37942// getComputedStyle returns percent when specified for top/left/bottom/right; 37943// rather than make the css module depend on the offset module, just check for it here 37944jQuery.each( [ "top", "left" ], function( _i, prop ) { 37945 jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, 37946 function( elem, computed ) { 37947 if ( computed ) { 37948 computed = curCSS( elem, prop ); 37949 37950 // If curCSS returns percentage, fallback to offset 37951 return rnumnonpx.test( computed ) ? 37952 jQuery( elem ).position()[ prop ] + "px" : 37953 computed; 37954 } 37955 } 37956 ); 37957} ); 37958 37959 37960// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods 37961jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { 37962 jQuery.each( { 37963 padding: "inner" + name, 37964 content: type, 37965 "": "outer" + name 37966 }, function( defaultExtra, funcName ) { 37967 37968 // Margin is only for outerHeight, outerWidth 37969 jQuery.fn[ funcName ] = function( margin, value ) { 37970 var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), 37971 extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); 37972 37973 return access( this, function( elem, type, value ) { 37974 var doc; 37975 37976 if ( isWindow( elem ) ) { 37977 37978 // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729) 37979 return funcName.indexOf( "outer" ) === 0 ? 37980 elem[ "inner" + name ] : 37981 elem.document.documentElement[ "client" + name ]; 37982 } 37983 37984 // Get document width or height 37985 if ( elem.nodeType === 9 ) { 37986 doc = elem.documentElement; 37987 37988 // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], 37989 // whichever is greatest 37990 return Math.max( 37991 elem.body[ "scroll" + name ], doc[ "scroll" + name ], 37992 elem.body[ "offset" + name ], doc[ "offset" + name ], 37993 doc[ "client" + name ] 37994 ); 37995 } 37996 37997 return value === undefined ? 37998 37999 // Get width or height on the element, requesting but not forcing parseFloat 38000 jQuery.css( elem, type, extra ) : 38001 38002 // Set width or height on the element 38003 jQuery.style( elem, type, value, extra ); 38004 }, type, chainable ? margin : undefined, chainable ); 38005 }; 38006 } ); 38007} ); 38008 38009 38010jQuery.each( [ 38011 "ajaxStart", 38012 "ajaxStop", 38013 "ajaxComplete", 38014 "ajaxError", 38015 "ajaxSuccess", 38016 "ajaxSend" 38017], function( _i, type ) { 38018 jQuery.fn[ type ] = function( fn ) { 38019 return this.on( type, fn ); 38020 }; 38021} ); 38022 38023 38024 38025 38026jQuery.fn.extend( { 38027 38028 bind: function( types, data, fn ) { 38029 return this.on( types, null, data, fn ); 38030 }, 38031 unbind: function( types, fn ) { 38032 return this.off( types, null, fn ); 38033 }, 38034 38035 delegate: function( selector, types, data, fn ) { 38036 return this.on( types, selector, data, fn ); 38037 }, 38038 undelegate: function( selector, types, fn ) { 38039 38040 // ( namespace ) or ( selector, types [, fn] ) 38041 return arguments.length === 1 ? 38042 this.off( selector, "**" ) : 38043 this.off( types, selector || "**", fn ); 38044 }, 38045 38046 hover: function( fnOver, fnOut ) { 38047 return this 38048 .on( "mouseenter", fnOver ) 38049 .on( "mouseleave", fnOut || fnOver ); 38050 } 38051} ); 38052 38053jQuery.each( 38054 ( "blur focus focusin focusout resize scroll click dblclick " + 38055 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + 38056 "change select submit keydown keypress keyup contextmenu" ).split( " " ), 38057 function( _i, name ) { 38058 38059 // Handle event binding 38060 jQuery.fn[ name ] = function( data, fn ) { 38061 return arguments.length > 0 ? 38062 this.on( name, null, data, fn ) : 38063 this.trigger( name ); 38064 }; 38065 } 38066); 38067 38068 38069 38070 38071// Support: Android <=4.0 only 38072// Make sure we trim BOM and NBSP 38073// Require that the "whitespace run" starts from a non-whitespace 38074// to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position. 38075var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g; 38076 38077// Bind a function to a context, optionally partially applying any 38078// arguments. 38079// jQuery.proxy is deprecated to promote standards (specifically Function#bind) 38080// However, it is not slated for removal any time soon 38081jQuery.proxy = function( fn, context ) { 38082 var tmp, args, proxy; 38083 38084 if ( typeof context === "string" ) { 38085 tmp = fn[ context ]; 38086 context = fn; 38087 fn = tmp; 38088 } 38089 38090 // Quick check to determine if target is callable, in the spec 38091 // this throws a TypeError, but we will just return undefined. 38092 if ( !isFunction( fn ) ) { 38093 return undefined; 38094 } 38095 38096 // Simulated bind 38097 args = slice.call( arguments, 2 ); 38098 proxy = function() { 38099 return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); 38100 }; 38101 38102 // Set the guid of unique handler to the same of original handler, so it can be removed 38103 proxy.guid = fn.guid = fn.guid || jQuery.guid++; 38104 38105 return proxy; 38106}; 38107 38108jQuery.holdReady = function( hold ) { 38109 if ( hold ) { 38110 jQuery.readyWait++; 38111 } else { 38112 jQuery.ready( true ); 38113 } 38114}; 38115jQuery.isArray = Array.isArray; 38116jQuery.parseJSON = JSON.parse; 38117jQuery.nodeName = nodeName; 38118jQuery.isFunction = isFunction; 38119jQuery.isWindow = isWindow; 38120jQuery.camelCase = camelCase; 38121jQuery.type = toType; 38122 38123jQuery.now = Date.now; 38124 38125jQuery.isNumeric = function( obj ) { 38126 38127 // As of jQuery 3.0, isNumeric is limited to 38128 // strings and numbers (primitives or objects) 38129 // that can be coerced to finite numbers (gh-2662) 38130 var type = jQuery.type( obj ); 38131 return ( type === "number" || type === "string" ) && 38132 38133 // parseFloat NaNs numeric-cast false positives ("") 38134 // ...but misinterprets leading-number strings, particularly hex literals ("0x...") 38135 // subtraction forces infinities to NaN 38136 !isNaN( obj - parseFloat( obj ) ); 38137}; 38138 38139jQuery.trim = function( text ) { 38140 return text == null ? 38141 "" : 38142 ( text + "" ).replace( rtrim, "$1" ); 38143}; 38144 38145 38146 38147// Register as a named AMD module, since jQuery can be concatenated with other 38148// files that may use define, but not via a proper concatenation script that 38149// understands anonymous AMD modules. A named AMD is safest and most robust 38150// way to register. Lowercase jquery is used because AMD module names are 38151// derived from file names, and jQuery is normally delivered in a lowercase 38152// file name. Do this after creating the global so that if an AMD module wants 38153// to call noConflict to hide this version of jQuery, it will work. 38154 38155// Note that for maximum portability, libraries that are not jQuery should 38156// declare themselves as anonymous modules, and avoid setting a global if an 38157// AMD loader is present. jQuery is a special case. For more information, see 38158// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon 38159 38160if ( typeof define === "function" && define.amd ) { 38161 define( "jquery", [], function() { 38162 return jQuery; 38163 } ); 38164} 38165 38166 38167 38168 38169var 38170 38171 // Map over jQuery in case of overwrite 38172 _jQuery = window.jQuery, 38173 38174 // Map over the $ in case of overwrite 38175 _$ = window.$; 38176 38177jQuery.noConflict = function( deep ) { 38178 if ( window.$ === jQuery ) { 38179 window.$ = _$; 38180 } 38181 38182 if ( deep && window.jQuery === jQuery ) { 38183 window.jQuery = _jQuery; 38184 } 38185 38186 return jQuery; 38187}; 38188 38189// Expose jQuery and $ identifiers, even in AMD 38190// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557) 38191// and CommonJS for browser emulators (trac-13566) 38192if ( typeof noGlobal === "undefined" ) { 38193 window.jQuery = window.$ = jQuery; 38194} 38195 38196 38197 38198 38199return jQuery; 38200} );
38201 38202},{}],76:[function(require,module,exports){ 38203arguments[4][39][0].apply(exports,arguments) 38204},{"dup":39,"get-size":68,"outlayer":79}],77:[function(require,module,exports){
vendor: 106,364 bytes, lines 38205-40545
38205(function (global, factory) { 38206 typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : 38207 typeof define === 'function' && define.amd ? define(['exports'], factory) : 38208 (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.noUiSlider = {})); 38209})(this, (function (exports) { 'use strict'; 38210 38211 exports.PipsMode = void 0; 38212 (function (PipsMode) { 38213 PipsMode["Range"] = "range"; 38214 PipsMode["Steps"] = "steps"; 38215 PipsMode["Positions"] = "positions"; 38216 PipsMode["Count"] = "count"; 38217 PipsMode["Values"] = "values"; 38218 })(exports.PipsMode || (exports.PipsMode = {})); 38219 exports.PipsType = void 0; 38220 (function (PipsType) { 38221 PipsType[PipsType["None"] = -1] = "None"; 38222 PipsType[PipsType["NoValue"] = 0] = "NoValue"; 38223 PipsType[PipsType["LargeValue"] = 1] = "LargeValue"; 38224 PipsType[PipsType["SmallValue"] = 2] = "SmallValue"; 38225 })(exports.PipsType || (exports.PipsType = {})); 38226 //region Helper Methods 38227 function isValidFormatter(entry) { 38228 return isValidPartialFormatter(entry) && typeof entry.from === "function"; 38229 } 38230 function isValidPartialFormatter(entry) { 38231 // partial formatters only need a to function and not a from function 38232 return typeof entry === "object" && typeof entry.to === "function"; 38233 } 38234 function removeElement(el) { 38235 el.parentElement.removeChild(el); 38236 } 38237 function isSet(value) { 38238 return value !== null && value !== undefined; 38239 } 38240 // Bindable version 38241 function preventDefault(e) { 38242 e.preventDefault(); 38243 } 38244 // Removes duplicates from an array. 38245 function unique(array) { 38246 return array.filter(function (a) { 38247 return !this[a] ? (this[a] = true) : false; 38248 }, {}); 38249 } 38250 // Round a value to the closest 'to'. 38251 function closest(value, to) { 38252 return Math.round(value / to) * to; 38253 } 38254 // Current position of an element relative to the document. 38255 function offset(elem, orientation) { 38256 var rect = elem.getBoundingClientRect(); 38257 var doc = elem.ownerDocument; 38258 var docElem = doc.documentElement; 38259 var pageOffset = getPageOffset(doc); 38260 // getBoundingClientRect contains left scroll in Chrome on Android. 38261 // I haven't found a feature detection that proves this. Worst case 38262 // scenario on mis-match: the 'tap' feature on horizontal sliders breaks. 38263 if (/webkit.*Chrome.*Mobile/i.test(navigator.userAgent)) { 38264 pageOffset.x = 0; 38265 } 38266 return orientation ? rect.top + pageOffset.y - docElem.clientTop : rect.left + pageOffset.x - docElem.clientLeft; 38267 } 38268 // Checks whether a value is numerical. 38269 function isNumeric(a) { 38270 return typeof a === "number" && !isNaN(a) && isFinite(a); 38271 } 38272 // Sets a class and removes it after [duration] ms. 38273 function addClassFor(element, className, duration) { 38274 if (duration > 0) { 38275 addClass(element, className); 38276 setTimeout(function () { 38277 removeClass(element, className); 38278 }, duration); 38279 } 38280 } 38281 // Limits a value to 0 - 100 38282 function limit(a) { 38283 return Math.max(Math.min(a, 100), 0); 38284 } 38285 // Wraps a variable as an array, if it isn't one yet. 38286 // Note that an input array is returned by reference! 38287 function asArray(a) { 38288 return Array.isArray(a) ? a : [a]; 38289 } 38290 // Counts decimals 38291 function countDecimals(numStr) { 38292 numStr = String(numStr); 38293 var pieces = numStr.split("."); 38294 return pieces.length > 1 ? pieces[1].length : 0; 38295 } 38296 // http://youmightnotneedjquery.com/#add_class 38297 function addClass(el, className) { 38298 if (el.classList && !/\s/.test(className)) { 38299 el.classList.add(className); 38300 } 38301 else { 38302 el.className += " " + className; 38303 } 38304 } 38305 // http://youmightnotneedjquery.com/#remove_class 38306 function removeClass(el, className) { 38307 if (el.classList && !/\s/.test(className)) { 38308 el.classList.remove(className); 38309 } 38310 else { 38311 el.className = el.className.replace(new RegExp("(^|\\b)" + className.split(" ").join("|") + "(\\b|$)", "gi"), " "); 38312 } 38313 } 38314 // https://plainjs.com/javascript/attributes/adding-removing-and-testing-for-classes-9/ 38315 function hasClass(el, className) { 38316 return el.classList ? el.classList.contains(className) : new RegExp("\\b" + className + "\\b").test(el.className); 38317 } 38318 // https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollY#Notes 38319 function getPageOffset(doc) { 38320 var supportPageOffset = window.pageXOffset !== undefined; 38321 var isCSS1Compat = (doc.compatMode || "") === "CSS1Compat"; 38322 var x = supportPageOffset 38323 ? window.pageXOffset 38324 : isCSS1Compat 38325 ? doc.documentElement.scrollLeft 38326 : doc.body.scrollLeft; 38327 var y = supportPageOffset 38328 ? window.pageYOffset 38329 : isCSS1Compat 38330 ? doc.documentElement.scrollTop 38331 : doc.body.scrollTop; 38332 return { 38333 x: x, 38334 y: y, 38335 }; 38336 } 38337 // we provide a function to compute constants instead 38338 // of accessing window.* as soon as the module needs it 38339 // so that we do not compute anything if not needed 38340 function getActions() { 38341 // Determine the events to bind. IE11 implements pointerEvents without 38342 // a prefix, which breaks compatibility with the IE10 implementation. 38343 return window.navigator.pointerEnabled 38344 ? { 38345 start: "pointerdown", 38346 move: "pointermove", 38347 end: "pointerup", 38348 } 38349 : window.navigator.msPointerEnabled 38350 ? { 38351 start: "MSPointerDown", 38352 move: "MSPointerMove", 38353 end: "MSPointerUp", 38354 } 38355 : { 38356 start: "mousedown touchstart", 38357 move: "mousemove touchmove", 38358 end: "mouseup touchend", 38359 }; 38360 } 38361 // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md 38362 // Issue #785 38363 function getSupportsPassive() { 38364 var supportsPassive = false; 38365 /* eslint-disable */ 38366 try { 38367 var opts = Object.defineProperty({}, "passive", { 38368 get: function () { 38369 supportsPassive = true; 38370 }, 38371 }); 38372 // @ts-ignore 38373 window.addEventListener("test", null, opts); 38374 } 38375 catch (e) { } 38376 /* eslint-enable */ 38377 return supportsPassive; 38378 } 38379 function getSupportsTouchActionNone() { 38380 return window.CSS && CSS.supports && CSS.supports("touch-action", "none"); 38381 } 38382 //endregion 38383 //region Range Calculation 38384 // Determine the size of a sub-range in relation to a full range. 38385 function subRangeRatio(pa, pb) { 38386 return 100 / (pb - pa); 38387 } 38388 // (percentage) How many percent is this value of this range? 38389 function fromPercentage(range, value, startRange) { 38390 return (value * 100) / (range[startRange + 1] - range[startRange]); 38391 } 38392 // (percentage) Where is this value on this range? 38393 function toPercentage(range, value) { 38394 return fromPercentage(range, range[0] < 0 ? value + Math.abs(range[0]) : value - range[0], 0); 38395 } 38396 // (value) How much is this percentage on this range? 38397 function isPercentage(range, value) { 38398 return (value * (range[1] - range[0])) / 100 + range[0]; 38399 } 38400 function getJ(value, arr) { 38401 var j = 1; 38402 while (value >= arr[j]) { 38403 j += 1; 38404 } 38405 return j; 38406 } 38407 // (percentage) Input a value, find where, on a scale of 0-100, it applies. 38408 function toStepping(xVal, xPct, value) { 38409 if (value >= xVal.slice(-1)[0]) { 38410 return 100; 38411 } 38412 var j = getJ(value, xVal); 38413 var va = xVal[j - 1]; 38414 var vb = xVal[j]; 38415 var pa = xPct[j - 1]; 38416 var pb = xPct[j]; 38417 return pa + toPercentage([va, vb], value) / subRangeRatio(pa, pb); 38418 } 38419 // (value) Input a percentage, find where it is on the specified range. 38420 function fromStepping(xVal, xPct, value) { 38421 // There is no range group that fits 100 38422 if (value >= 100) { 38423 return xVal.slice(-1)[0]; 38424 } 38425 var j = getJ(value, xPct); 38426 var va = xVal[j - 1]; 38427 var vb = xVal[j]; 38428 var pa = xPct[j - 1]; 38429 var pb = xPct[j]; 38430 return isPercentage([va, vb], (value - pa) * subRangeRatio(pa, pb)); 38431 } 38432 // (percentage) Get the step that applies at a certain value. 38433 function getStep(xPct, xSteps, snap, value) { 38434 if (value === 100) { 38435 return value; 38436 } 38437 var j = getJ(value, xPct); 38438 var a = xPct[j - 1]; 38439 var b = xPct[j]; 38440 // If 'snap' is set, steps are used as fixed points on the slider. 38441 if (snap) { 38442 // Find the closest position, a or b. 38443 if (value - a > (b - a) / 2) { 38444 return b; 38445 } 38446 return a; 38447 } 38448 if (!xSteps[j - 1]) { 38449 return value; 38450 } 38451 return xPct[j - 1] + closest(value - xPct[j - 1], xSteps[j - 1]); 38452 } 38453 //endregion 38454 //region Spectrum 38455 var Spectrum = /** @class */ (function () { 38456 function Spectrum(entry, snap, singleStep) { 38457 this.xPct = []; 38458 this.xVal = []; 38459 this.xSteps = []; 38460 this.xNumSteps = []; 38461 this.xHighestCompleteStep = []; 38462 this.xSteps = [singleStep || false]; 38463 this.xNumSteps = [false]; 38464 this.snap = snap; 38465 var index; 38466 var ordered = []; 38467 // Map the object keys to an array. 38468 Object.keys(entry).forEach(function (index) { 38469 ordered.push([asArray(entry[index]), index]); 38470 }); 38471 // Sort all entries by value (numeric sort). 38472 ordered.sort(function (a, b) { 38473 return a[0][0] - b[0][0]; 38474 }); 38475 // Convert all entries to subranges. 38476 for (index = 0; index < ordered.length; index++) { 38477 this.handleEntryPoint(ordered[index][1], ordered[index][0]); 38478 } 38479 // Store the actual step values. 38480 // xSteps is sorted in the same order as xPct and xVal. 38481 this.xNumSteps = this.xSteps.slice(0); 38482 // Convert all numeric steps to the percentage of the subrange they represent. 38483 for (index = 0; index < this.xNumSteps.length; index++) { 38484 this.handleStepPoint(index, this.xNumSteps[index]); 38485 } 38486 } 38487 Spectrum.prototype.getDistance = function (value) { 38488 var distances = []; 38489 for (var index = 0; index < this.xNumSteps.length - 1; index++) { 38490 distances[index] = fromPercentage(this.xVal, value, index); 38491 } 38492 return distances; 38493 }; 38494 // Calculate the percentual distance over the whole scale of ranges. 38495 // direction: 0 = backwards / 1 = forwards 38496 Spectrum.prototype.getAbsoluteDistance = function (value, distances, direction) { 38497 var xPct_index = 0; 38498 // Calculate range where to start calculation 38499 if (value < this.xPct[this.xPct.length - 1]) { 38500 while (value > this.xPct[xPct_index + 1]) { 38501 xPct_index++; 38502 } 38503 } 38504 else if (value === this.xPct[this.xPct.length - 1]) { 38505 xPct_index = this.xPct.length - 2; 38506 } 38507 // If looking backwards and the value is exactly at a range separator then look one range further 38508 if (!direction && value === this.xPct[xPct_index + 1]) { 38509 xPct_index++; 38510 } 38511 if (distances === null) { 38512 distances = []; 38513 } 38514 var start_factor; 38515 var rest_factor = 1; 38516 var rest_rel_distance = distances[xPct_index]; 38517 var range_pct = 0; 38518 var rel_range_distance = 0; 38519 var abs_distance_counter = 0; 38520 var range_counter = 0; 38521 // Calculate what part of the start range the value is 38522 if (direction) { 38523 start_factor = (value - this.xPct[xPct_index]) / (this.xPct[xPct_index + 1] - this.xPct[xPct_index]); 38524 } 38525 else { 38526 start_factor = (this.xPct[xPct_index + 1] - value) / (this.xPct[xPct_index + 1] - this.xPct[xPct_index]); 38527 } 38528 // Do until the complete distance across ranges is calculated 38529 while (rest_rel_distance > 0) { 38530 // Calculate the percentage of total range 38531 range_pct = this.xPct[xPct_index + 1 + range_counter] - this.xPct[xPct_index + range_counter]; 38532 // Detect if the margin, padding or limit is larger then the current range and calculate 38533 if (distances[xPct_index + range_counter] * rest_factor + 100 - start_factor * 100 > 100) { 38534 // If larger then take the percentual distance of the whole range 38535 rel_range_distance = range_pct * start_factor; 38536 // Rest factor of relative percentual distance still to be calculated 38537 rest_factor = (rest_rel_distance - 100 * start_factor) / distances[xPct_index + range_counter]; 38538 // Set start factor to 1 as for next range it does not apply. 38539 start_factor = 1; 38540 } 38541 else { 38542 // If smaller or equal then take the percentual distance of the calculate percentual part of that range 38543 rel_range_distance = ((distances[xPct_index + range_counter] * range_pct) / 100) * rest_factor; 38544 // No rest left as the rest fits in current range 38545 rest_factor = 0; 38546 } 38547 if (direction) { 38548 abs_distance_counter = abs_distance_counter - rel_range_distance; 38549 // Limit range to first range when distance becomes outside of minimum range 38550 if (this.xPct.length + range_counter >= 1) { 38551 range_counter--; 38552 } 38553 } 38554 else { 38555 abs_distance_counter = abs_distance_counter + rel_range_distance; 38556 // Limit range to last range when distance becomes outside of maximum range 38557 if (this.xPct.length - range_counter >= 1) { 38558 range_counter++; 38559 } 38560 } 38561 // Rest of relative percentual distance still to be calculated 38562 rest_rel_distance = distances[xPct_index + range_counter] * rest_factor; 38563 } 38564 return value + abs_distance_counter; 38565 }; 38566 Spectrum.prototype.toStepping = function (value) { 38567 value = toStepping(this.xVal, this.xPct, value); 38568 return value; 38569 }; 38570 Spectrum.prototype.fromStepping = function (value) { 38571 return fromStepping(this.xVal, this.xPct, value); 38572 }; 38573 Spectrum.prototype.getStep = function (value) { 38574 value = getStep(this.xPct, this.xSteps, this.snap, value); 38575 return value; 38576 }; 38577 Spectrum.prototype.getDefaultStep = function (value, isDown, size) { 38578 var j = getJ(value, this.xPct); 38579 // When at the top or stepping down, look at the previous sub-range 38580 if (value === 100 || (isDown && value === this.xPct[j - 1])) { 38581 j = Math.max(j - 1, 1); 38582 } 38583 return (this.xVal[j] - this.xVal[j - 1]) / size; 38584 }; 38585 Spectrum.prototype.getNearbySteps = function (value) { 38586 var j = getJ(value, this.xPct); 38587 return { 38588 stepBefore: { 38589 startValue: this.xVal[j - 2], 38590 step: this.xNumSteps[j - 2], 38591 highestStep: this.xHighestCompleteStep[j - 2], 38592 }, 38593 thisStep: { 38594 startValue: this.xVal[j - 1], 38595 step: this.xNumSteps[j - 1], 38596 highestStep: this.xHighestCompleteStep[j - 1], 38597 }, 38598 stepAfter: { 38599 startValue: this.xVal[j], 38600 step: this.xNumSteps[j], 38601 highestStep: this.xHighestCompleteStep[j], 38602 }, 38603 }; 38604 }; 38605 Spectrum.prototype.countStepDecimals = function () { 38606 var stepDecimals = this.xNumSteps.map(countDecimals); 38607 return Math.max.apply(null, stepDecimals); 38608 }; 38609 Spectrum.prototype.hasNoSize = function () { 38610 return this.xVal[0] === this.xVal[this.xVal.length - 1]; 38611 }; 38612 // Outside testing 38613 Spectrum.prototype.convert = function (value) { 38614 return this.getStep(this.toStepping(value)); 38615 }; 38616 Spectrum.prototype.handleEntryPoint = function (index, value) { 38617 var percentage; 38618 // Covert min/max syntax to 0 and 100. 38619 if (index === "min") { 38620 percentage = 0; 38621 } 38622 else if (index === "max") { 38623 percentage = 100; 38624 } 38625 else { 38626 percentage = parseFloat(index); 38627 } 38628 // Check for correct input. 38629 if (!isNumeric(percentage) || !isNumeric(value[0])) { 38630 throw new Error("noUiSlider: 'range' value isn't numeric."); 38631 } 38632 // Store values. 38633 this.xPct.push(percentage); 38634 this.xVal.push(value[0]); 38635 var value1 = Number(value[1]); 38636 // NaN will evaluate to false too, but to keep 38637 // logging clear, set step explicitly. Make sure 38638 // not to override the 'step' setting with false. 38639 if (!percentage) { 38640 if (!isNaN(value1)) { 38641 this.xSteps[0] = value1; 38642 } 38643 } 38644 else { 38645 this.xSteps.push(isNaN(value1) ? false : value1); 38646 } 38647 this.xHighestCompleteStep.push(0); 38648 }; 38649 Spectrum.prototype.handleStepPoint = function (i, n) { 38650 // Ignore 'false' stepping. 38651 if (!n) { 38652 return; 38653 } 38654 // Step over zero-length ranges (#948); 38655 if (this.xVal[i] === this.xVal[i + 1]) { 38656 this.xSteps[i] = this.xHighestCompleteStep[i] = this.xVal[i]; 38657 return; 38658 } 38659 // Factor to range ratio 38660 this.xSteps[i] = 38661 fromPercentage([this.xVal[i], this.xVal[i + 1]], n, 0) / subRangeRatio(this.xPct[i], this.xPct[i + 1]); 38662 var totalSteps = (this.xVal[i + 1] - this.xVal[i]) / this.xNumSteps[i]; 38663 var highestStep = Math.ceil(Number(totalSteps.toFixed(3)) - 1); 38664 var step = this.xVal[i] + this.xNumSteps[i] * highestStep; 38665 this.xHighestCompleteStep[i] = step; 38666 }; 38667 return Spectrum; 38668 }()); 38669 //endregion 38670 //region Options 38671 /* Every input option is tested and parsed. This will prevent 38672 endless validation in internal methods. These tests are 38673 structured with an item for every option available. An 38674 option can be marked as required by setting the 'r' flag. 38675 The testing function is provided with three arguments: 38676 - The provided value for the option; 38677 - A reference to the options object; 38678 - The name for the option; 38679 38680 The testing function returns false when an error is detected, 38681 or true when everything is OK. It can also modify the option 38682 object, to make sure all values can be correctly looped elsewhere. */ 38683 //region Defaults 38684 var defaultFormatter = { 38685 to: function (value) { 38686 return value === undefined ? "" : value.toFixed(2); 38687 }, 38688 from: Number, 38689 }; 38690 var cssClasses = { 38691 target: "target", 38692 base: "base", 38693 origin: "origin", 38694 handle: "handle", 38695 handleLower: "handle-lower", 38696 handleUpper: "handle-upper", 38697 touchArea: "touch-area", 38698 horizontal: "horizontal", 38699 vertical: "vertical", 38700 background: "background", 38701 connect: "connect", 38702 connects: "connects", 38703 ltr: "ltr", 38704 rtl: "rtl", 38705 textDirectionLtr: "txt-dir-ltr", 38706 textDirectionRtl: "txt-dir-rtl", 38707 draggable: "draggable", 38708 drag: "state-drag", 38709 tap: "state-tap", 38710 active: "active", 38711 tooltip: "tooltip", 38712 pips: "pips", 38713 pipsHorizontal: "pips-horizontal", 38714 pipsVertical: "pips-vertical", 38715 marker: "marker", 38716 markerHorizontal: "marker-horizontal", 38717 markerVertical: "marker-vertical", 38718 markerNormal: "marker-normal", 38719 markerLarge: "marker-large", 38720 markerSub: "marker-sub", 38721 value: "value", 38722 valueHorizontal: "value-horizontal", 38723 valueVertical: "value-vertical", 38724 valueNormal: "value-normal", 38725 valueLarge: "value-large", 38726 valueSub: "value-sub", 38727 }; 38728 // Namespaces of internal event listeners 38729 var INTERNAL_EVENT_NS = { 38730 tooltips: ".__tooltips", 38731 aria: ".__aria", 38732 }; 38733 //endregion 38734 function testStep(parsed, entry) { 38735 if (!isNumeric(entry)) { 38736 throw new Error("noUiSlider: 'step' is not numeric."); 38737 } 38738 // The step option can still be used to set stepping 38739 // for linear sliders. Overwritten if set in 'range'. 38740 parsed.singleStep = entry; 38741 } 38742 function testKeyboardPageMultiplier(parsed, entry) { 38743 if (!isNumeric(entry)) { 38744 throw new Error("noUiSlider: 'keyboardPageMultiplier' is not numeric."); 38745 } 38746 parsed.keyboardPageMultiplier = entry; 38747 } 38748 function testKeyboardMultiplier(parsed, entry) { 38749 if (!isNumeric(entry)) { 38750 throw new Error("noUiSlider: 'keyboardMultiplier' is not numeric."); 38751 } 38752 parsed.keyboardMultiplier = entry; 38753 } 38754 function testKeyboardDefaultStep(parsed, entry) { 38755 if (!isNumeric(entry)) { 38756 throw new Error("noUiSlider: 'keyboardDefaultStep' is not numeric."); 38757 } 38758 parsed.keyboardDefaultStep = entry; 38759 } 38760 function testRange(parsed, entry) { 38761 // Filter incorrect input. 38762 if (typeof entry !== "object" || Array.isArray(entry)) { 38763 throw new Error("noUiSlider: 'range' is not an object."); 38764 } 38765 // Catch missing start or end. 38766 if (entry.min === undefined || entry.max === undefined) { 38767 throw new Error("noUiSlider: Missing 'min' or 'max' in 'range'."); 38768 } 38769 parsed.spectrum = new Spectrum(entry, parsed.snap || false, parsed.singleStep); 38770 } 38771 function testStart(parsed, entry) { 38772 entry = asArray(entry); 38773 // Validate input. Values aren't tested, as the public .val method 38774 // will always provide a valid location. 38775 if (!Array.isArray(entry) || !entry.length) { 38776 throw new Error("noUiSlider: 'start' option is incorrect."); 38777 } 38778 // Store the number of handles. 38779 parsed.handles = entry.length; 38780 // When the slider is initialized, the .val method will 38781 // be called with the start options. 38782 parsed.start = entry; 38783 } 38784 function testSnap(parsed, entry) { 38785 if (typeof entry !== "boolean") { 38786 throw new Error("noUiSlider: 'snap' option must be a boolean."); 38787 } 38788 // Enforce 100% stepping within subranges. 38789 parsed.snap = entry; 38790 } 38791 function testAnimate(parsed, entry) { 38792 if (typeof entry !== "boolean") { 38793 throw new Error("noUiSlider: 'animate' option must be a boolean."); 38794 } 38795 // Enforce 100% stepping within subranges. 38796 parsed.animate = entry; 38797 } 38798 function testAnimationDuration(parsed, entry) { 38799 if (typeof entry !== "number") { 38800 throw new Error("noUiSlider: 'animationDuration' option must be a number."); 38801 } 38802 parsed.animationDuration = entry; 38803 } 38804 function testConnect(parsed, entry) { 38805 var connect = [false]; 38806 var i; 38807 // Map legacy options 38808 if (entry === "lower") { 38809 entry = [true, false]; 38810 } 38811 else if (entry === "upper") { 38812 entry = [false, true]; 38813 } 38814 // Handle boolean options 38815 if (entry === true || entry === false) { 38816 for (i = 1; i < parsed.handles; i++) { 38817 connect.push(entry); 38818 } 38819 connect.push(false); 38820 } 38821 // Reject invalid input 38822 else if (!Array.isArray(entry) || !entry.length || entry.length !== parsed.handles + 1) { 38823 throw new Error("noUiSlider: 'connect' option doesn't match handle count."); 38824 } 38825 else { 38826 connect = entry; 38827 } 38828 parsed.connect = connect; 38829 } 38830 function testOrientation(parsed, entry) { 38831 // Set orientation to an a numerical value for easy 38832 // array selection. 38833 switch (entry) { 38834 case "horizontal": 38835 parsed.ort = 0; 38836 break; 38837 case "vertical": 38838 parsed.ort = 1; 38839 break; 38840 default: 38841 throw new Error("noUiSlider: 'orientation' option is invalid."); 38842 } 38843 } 38844 function testMargin(parsed, entry) { 38845 if (!isNumeric(entry)) { 38846 throw new Error("noUiSlider: 'margin' option must be numeric."); 38847 } 38848 // Issue #582 38849 if (entry === 0) { 38850 return; 38851 } 38852 parsed.margin = parsed.spectrum.getDistance(entry); 38853 } 38854 function testLimit(parsed, entry) { 38855 if (!isNumeric(entry)) { 38856 throw new Error("noUiSlider: 'limit' option must be numeric."); 38857 } 38858 parsed.limit = parsed.spectrum.getDistance(entry); 38859 if (!parsed.limit || parsed.handles < 2) { 38860 throw new Error("noUiSlider: 'limit' option is only supported on linear sliders with 2 or more handles."); 38861 } 38862 } 38863 function testPadding(parsed, entry) { 38864 var index; 38865 if (!isNumeric(entry) && !Array.isArray(entry)) { 38866 throw new Error("noUiSlider: 'padding' option must be numeric or array of exactly 2 numbers."); 38867 } 38868 if (Array.isArray(entry) && !(entry.length === 2 || isNumeric(entry[0]) || isNumeric(entry[1]))) { 38869 throw new Error("noUiSlider: 'padding' option must be numeric or array of exactly 2 numbers."); 38870 } 38871 if (entry === 0) { 38872 return; 38873 } 38874 if (!Array.isArray(entry)) { 38875 entry = [entry, entry]; 38876 } 38877 // 'getDistance' returns false for invalid values. 38878 parsed.padding = [parsed.spectrum.getDistance(entry[0]), parsed.spectrum.getDistance(entry[1])]; 38879 for (index = 0; index < parsed.spectrum.xNumSteps.length - 1; index++) { 38880 // last "range" can't contain step size as it is purely an endpoint. 38881 if (parsed.padding[0][index] < 0 || parsed.padding[1][index] < 0) { 38882 throw new Error("noUiSlider: 'padding' option must be a positive number(s)."); 38883 } 38884 } 38885 var totalPadding = entry[0] + entry[1]; 38886 var firstValue = parsed.spectrum.xVal[0]; 38887 var lastValue = parsed.spectrum.xVal[parsed.spectrum.xVal.length - 1]; 38888 if (totalPadding / (lastValue - firstValue) > 1) { 38889 throw new Error("noUiSlider: 'padding' option must not exceed 100% of the range."); 38890 } 38891 } 38892 function testDirection(parsed, entry) { 38893 // Set direction as a numerical value for easy parsing. 38894 // Invert connection for RTL sliders, so that the proper 38895 // handles get the connect/background classes. 38896 switch (entry) { 38897 case "ltr": 38898 parsed.dir = 0; 38899 break; 38900 case "rtl": 38901 parsed.dir = 1; 38902 break; 38903 default: 38904 throw new Error("noUiSlider: 'direction' option was not recognized."); 38905 } 38906 } 38907 function testBehaviour(parsed, entry) { 38908 // Make sure the input is a string. 38909 if (typeof entry !== "string") { 38910 throw new Error("noUiSlider: 'behaviour' must be a string containing options."); 38911 } 38912 // Check if the string contains any keywords. 38913 // None are required. 38914 var tap = entry.indexOf("tap") >= 0; 38915 var drag = entry.indexOf("drag") >= 0; 38916 var fixed = entry.indexOf("fixed") >= 0; 38917 var snap = entry.indexOf("snap") >= 0; 38918 var hover = entry.indexOf("hover") >= 0; 38919 var unconstrained = entry.indexOf("unconstrained") >= 0; 38920 var invertConnects = entry.indexOf("invert-connects") >= 0; 38921 var dragAll = entry.indexOf("drag-all") >= 0; 38922 var smoothSteps = entry.indexOf("smooth-steps") >= 0; 38923 if (fixed) { 38924 if (parsed.handles !== 2) { 38925 throw new Error("noUiSlider: 'fixed' behaviour must be used with 2 handles"); 38926 } 38927 // Use margin to enforce fixed state 38928 testMargin(parsed, parsed.start[1] - parsed.start[0]); 38929 } 38930 if (invertConnects && parsed.handles !== 2) { 38931 throw new Error("noUiSlider: 'invert-connects' behaviour must be used with 2 handles"); 38932 } 38933 if (unconstrained && (parsed.margin || parsed.limit)) { 38934 throw new Error("noUiSlider: 'unconstrained' behaviour cannot be used with margin or limit"); 38935 } 38936 parsed.events = { 38937 tap: tap || snap, 38938 drag: drag, 38939 dragAll: dragAll, 38940 smoothSteps: smoothSteps, 38941 fixed: fixed, 38942 snap: snap, 38943 hover: hover, 38944 unconstrained: unconstrained, 38945 invertConnects: invertConnects, 38946 }; 38947 } 38948 function testTooltips(parsed, entry) { 38949 if (entry === false) { 38950 return; 38951 } 38952 if (entry === true || isValidPartialFormatter(entry)) { 38953 parsed.tooltips = []; 38954 for (var i = 0; i < parsed.handles; i++) { 38955 parsed.tooltips.push(entry); 38956 } 38957 } 38958 else { 38959 entry = asArray(entry); 38960 if (entry.length !== parsed.handles) { 38961 throw new Error("noUiSlider: must pass a formatter for all handles."); 38962 } 38963 entry.forEach(function (formatter) { 38964 if (typeof formatter !== "boolean" && !isValidPartialFormatter(formatter)) { 38965 throw new Error("noUiSlider: 'tooltips' must be passed a formatter or 'false'."); 38966 } 38967 }); 38968 parsed.tooltips = entry; 38969 } 38970 } 38971 function testHandleAttributes(parsed, entry) { 38972 if (entry.length !== parsed.handles) { 38973 throw new Error("noUiSlider: must pass a attributes for all handles."); 38974 } 38975 parsed.handleAttributes = entry; 38976 } 38977 function testAriaFormat(parsed, entry) { 38978 if (!isValidPartialFormatter(entry)) { 38979 throw new Error("noUiSlider: 'ariaFormat' requires 'to' method."); 38980 } 38981 parsed.ariaFormat = entry; 38982 } 38983 function testFormat(parsed, entry) { 38984 if (!isValidFormatter(entry)) { 38985 throw new Error("noUiSlider: 'format' requires 'to' and 'from' methods."); 38986 } 38987 parsed.format = entry; 38988 } 38989 function testKeyboardSupport(parsed, entry) { 38990 if (typeof entry !== "boolean") { 38991 throw new Error("noUiSlider: 'keyboardSupport' option must be a boolean."); 38992 } 38993 parsed.keyboardSupport = entry; 38994 } 38995 function testDocumentElement(parsed, entry) { 38996 // This is an advanced option. Passed values are used without validation. 38997 parsed.documentElement = entry; 38998 } 38999 function testCssPrefix(parsed, entry) { 39000 if (typeof entry !== "string" && entry !== false) { 39001 throw new Error("noUiSlider: 'cssPrefix' must be a string or `false`."); 39002 } 39003 parsed.cssPrefix = entry; 39004 } 39005 function testCssClasses(parsed, entry) { 39006 if (typeof entry !== "object") { 39007 throw new Error("noUiSlider: 'cssClasses' must be an object."); 39008 } 39009 if (typeof parsed.cssPrefix === "string") { 39010 parsed.cssClasses = {}; 39011 Object.keys(entry).forEach(function (key) { 39012 parsed.cssClasses[key] = parsed.cssPrefix + entry[key]; 39013 }); 39014 } 39015 else { 39016 parsed.cssClasses = entry; 39017 } 39018 } 39019 // Test all developer settings and parse to assumption-safe values. 39020 function testOptions(options) { 39021 // To prove a fix for #537, freeze options here. 39022 // If the object is modified, an error will be thrown. 39023 // Object.freeze(options); 39024 var parsed = { 39025 margin: null, 39026 limit: null, 39027 padding: null, 39028 animate: true, 39029 animationDuration: 300, 39030 ariaFormat: defaultFormatter, 39031 format: defaultFormatter, 39032 }; 39033 // Tests are executed in the order they are presented here. 39034 var tests = { 39035 step: { r: false, t: testStep }, 39036 keyboardPageMultiplier: { r: false, t: testKeyboardPageMultiplier }, 39037 keyboardMultiplier: { r: false, t: testKeyboardMultiplier }, 39038 keyboardDefaultStep: { r: false, t: testKeyboardDefaultStep }, 39039 start: { r: true, t: testStart }, 39040 connect: { r: true, t: testConnect }, 39041 direction: { r: true, t: testDirection }, 39042 snap: { r: false, t: testSnap }, 39043 animate: { r: false, t: testAnimate }, 39044 animationDuration: { r: false, t: testAnimationDuration }, 39045 range: { r: true, t: testRange }, 39046 orientation: { r: false, t: testOrientation }, 39047 margin: { r: false, t: testMargin }, 39048 limit: { r: false, t: testLimit }, 39049 padding: { r: false, t: testPadding }, 39050 behaviour: { r: true, t: testBehaviour }, 39051 ariaFormat: { r: false, t: testAriaFormat }, 39052 format: { r: false, t: testFormat }, 39053 tooltips: { r: false, t: testTooltips }, 39054 keyboardSupport: { r: true, t: testKeyboardSupport }, 39055 documentElement: { r: false, t: testDocumentElement }, 39056 cssPrefix: { r: true, t: testCssPrefix }, 39057 cssClasses: { r: true, t: testCssClasses }, 39058 handleAttributes: { r: false, t: testHandleAttributes }, 39059 }; 39060 var defaults = { 39061 connect: false, 39062 direction: "ltr", 39063 behaviour: "tap", 39064 orientation: "horizontal", 39065 keyboardSupport: true, 39066 cssPrefix: "noUi-", 39067 cssClasses: cssClasses, 39068 keyboardPageMultiplier: 5, 39069 keyboardMultiplier: 1, 39070 keyboardDefaultStep: 10, 39071 }; 39072 // AriaFormat defaults to regular format, if any. 39073 if (options.format && !options.ariaFormat) { 39074 options.ariaFormat = options.format; 39075 } 39076 // Run all options through a testing mechanism to ensure correct 39077 // input. It should be noted that options might get modified to 39078 // be handled properly. E.g. wrapping integers in arrays. 39079 Object.keys(tests).forEach(function (name) { 39080 // If the option isn't set, but it is required, throw an error. 39081 if (!isSet(options[name]) && defaults[name] === undefined) { 39082 if (tests[name].r) { 39083 throw new Error("noUiSlider: '" + name + "' is required."); 39084 } 39085 return; 39086 } 39087 tests[name].t(parsed, !isSet(options[name]) ? defaults[name] : options[name]); 39088 }); 39089 // Forward pips options 39090 parsed.pips = options.pips; 39091 // All recent browsers accept unprefixed transform. 39092 // We need -ms- for IE9 and -webkit- for older Android; 39093 // Assume use of -webkit- if unprefixed and -ms- are not supported. 39094 // https://caniuse.com/#feat=transforms2d 39095 var d = document.createElement("div"); 39096 var msPrefix = d.style.msTransform !== undefined; 39097 var noPrefix = d.style.transform !== undefined; 39098 parsed.transformRule = noPrefix ? "transform" : msPrefix ? "msTransform" : "webkitTransform"; 39099 // Pips don't move, so we can place them using left/top. 39100 var styles = [ 39101 ["left", "top"], 39102 ["right", "bottom"], 39103 ]; 39104 parsed.style = styles[parsed.dir][parsed.ort]; 39105 return parsed; 39106 } 39107 //endregion 39108 function scope(target, options, originalOptions) { 39109 var actions = getActions(); 39110 var supportsTouchActionNone = getSupportsTouchActionNone(); 39111 var supportsPassive = supportsTouchActionNone && getSupportsPassive(); 39112 // All variables local to 'scope' are prefixed with 'scope_' 39113 // Slider DOM Nodes 39114 var scope_Target = target; 39115 var scope_Base; 39116 var scope_ConnectBase; 39117 var scope_Handles; 39118 var scope_Connects; 39119 var scope_Pips; 39120 var scope_Tooltips; 39121 // Slider state values 39122 var scope_Spectrum = options.spectrum; 39123 var scope_Values = []; 39124 var scope_Locations = []; 39125 var scope_HandleNumbers = []; 39126 var scope_ActiveHandlesCount = 0; 39127 var scope_Events = {}; 39128 var scope_ConnectsInverted = false; 39129 // Document Nodes 39130 var scope_Document = target.ownerDocument; 39131 var scope_DocumentElement = options.documentElement || scope_Document.documentElement; 39132 var scope_Body = scope_Document.body; 39133 // For horizontal sliders in standard ltr documents, 39134 // make .noUi-origin overflow to the left so the document doesn't scroll. 39135 var scope_DirOffset = scope_Document.dir === "rtl" || options.ort === 1 ? 0 : 100; 39136 // Creates a node, adds it to target, returns the new node. 39137 function addNodeTo(addTarget, className) { 39138 var div = scope_Document.createElement("div"); 39139 if (className) { 39140 addClass(div, className); 39141 } 39142 addTarget.appendChild(div); 39143 return div; 39144 } 39145 // Append a origin to the base 39146 function addOrigin(base, handleNumber) { 39147 var origin = addNodeTo(base, options.cssClasses.origin); 39148 var handle = addNodeTo(origin, options.cssClasses.handle); 39149 addNodeTo(handle, options.cssClasses.touchArea); 39150 handle.setAttribute("data-handle", String(handleNumber)); 39151 if (options.keyboardSupport) { 39152 // https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex 39153 // 0 = focusable and reachable 39154 handle.setAttribute("tabindex", "0"); 39155 handle.addEventListener("keydown", function (event) { 39156 return eventKeydown(event, handleNumber); 39157 }); 39158 } 39159 if (options.handleAttributes !== undefined) { 39160 var attributes_1 = options.handleAttributes[handleNumber]; 39161 Object.keys(attributes_1).forEach(function (attribute) { 39162 handle.setAttribute(attribute, attributes_1[attribute]); 39163 }); 39164 } 39165 handle.setAttribute("role", "slider"); 39166 handle.setAttribute("aria-orientation", options.ort ? "vertical" : "horizontal"); 39167 if (handleNumber === 0) { 39168 addClass(handle, options.cssClasses.handleLower); 39169 } 39170 else if (handleNumber === options.handles - 1) { 39171 addClass(handle, options.cssClasses.handleUpper); 39172 } 39173 origin.handle = handle; 39174 return origin; 39175 } 39176 // Insert nodes for connect elements 39177 function addConnect(base, add) { 39178 if (!add) { 39179 return false; 39180 } 39181 return addNodeTo(base, options.cssClasses.connect); 39182 } 39183 // Add handles to the slider base. 39184 function addElements(connectOptions, base) { 39185 scope_ConnectBase = addNodeTo(base, options.cssClasses.connects); 39186 scope_Handles = []; 39187 scope_Connects = []; 39188 scope_Connects.push(addConnect(scope_ConnectBase, connectOptions[0])); 39189 // [::::O====O====O====] 39190 // connectOptions = [0, 1, 1, 1] 39191 for (var i = 0; i < options.handles; i++) { 39192 // Keep a list of all added handles. 39193 scope_Handles.push(addOrigin(base, i)); 39194 scope_HandleNumbers[i] = i; 39195 scope_Connects.push(addConnect(scope_ConnectBase, connectOptions[i + 1])); 39196 } 39197 } 39198 // Initialize a single slider. 39199 function addSlider(addTarget) { 39200 // Apply classes and data to the target. 39201 addClass(addTarget, options.cssClasses.target); 39202 if (options.dir === 0) { 39203 addClass(addTarget, options.cssClasses.ltr); 39204 } 39205 else { 39206 addClass(addTarget, options.cssClasses.rtl); 39207 } 39208 if (options.ort === 0) { 39209 addClass(addTarget, options.cssClasses.horizontal); 39210 } 39211 else { 39212 addClass(addTarget, options.cssClasses.vertical); 39213 } 39214 var textDirection = getComputedStyle(addTarget).direction; 39215 if (textDirection === "rtl") { 39216 addClass(addTarget, options.cssClasses.textDirectionRtl); 39217 } 39218 else { 39219 addClass(addTarget, options.cssClasses.textDirectionLtr); 39220 } 39221 return addNodeTo(addTarget, options.cssClasses.base); 39222 } 39223 function addTooltip(handle, handleNumber) { 39224 if (!options.tooltips || !options.tooltips[handleNumber]) { 39225 return false; 39226 } 39227 return addNodeTo(handle.firstChild, options.cssClasses.tooltip); 39228 } 39229 function isSliderDisabled() { 39230 return scope_Target.hasAttribute("disabled"); 39231 } 39232 // Disable the slider dragging if any handle is disabled 39233 function isHandleDisabled(handleNumber) { 39234 var handleOrigin = scope_Handles[handleNumber]; 39235 return handleOrigin.hasAttribute("disabled"); 39236 } 39237 function disable(handleNumber) { 39238 if (handleNumber !== null && handleNumber !== undefined) { 39239 scope_Handles[handleNumber].setAttribute("disabled", ""); 39240 scope_Handles[handleNumber].handle.removeAttribute("tabindex"); 39241 } 39242 else { 39243 scope_Target.setAttribute("disabled", ""); 39244 scope_Handles.forEach(function (handle) { 39245 handle.handle.removeAttribute("tabindex"); 39246 }); 39247 } 39248 } 39249 function enable(handleNumber) { 39250 if (handleNumber !== null && handleNumber !== undefined) { 39251 scope_Handles[handleNumber].removeAttribute("disabled"); 39252 scope_Handles[handleNumber].handle.setAttribute("tabindex", "0"); 39253 } 39254 else { 39255 scope_Target.removeAttribute("disabled"); 39256 scope_Handles.forEach(function (handle) { 39257 handle.removeAttribute("disabled"); 39258 handle.handle.setAttribute("tabindex", "0"); 39259 }); 39260 } 39261 } 39262 function removeTooltips() { 39263 if (scope_Tooltips) { 39264 removeEvent("update" + INTERNAL_EVENT_NS.tooltips); 39265 scope_Tooltips.forEach(function (tooltip) { 39266 if (tooltip) { 39267 removeElement(tooltip); 39268 } 39269 }); 39270 scope_Tooltips = null; 39271 } 39272 } 39273 // The tooltips option is a shorthand for using the 'update' event. 39274 function tooltips() { 39275 removeTooltips(); 39276 // Tooltips are added with options.tooltips in original order. 39277 scope_Tooltips = scope_Handles.map(addTooltip); 39278 bindEvent("update" + INTERNAL_EVENT_NS.tooltips, function (values, handleNumber, unencoded) { 39279 if (!scope_Tooltips || !options.tooltips) { 39280 return; 39281 } 39282 if (scope_Tooltips[handleNumber] === false) { 39283 return; 39284 } 39285 var formattedValue = values[handleNumber]; 39286 if (options.tooltips[handleNumber] !== true) { 39287 formattedValue = options.tooltips[handleNumber].to(unencoded[handleNumber]); 39288 } 39289 scope_Tooltips[handleNumber].innerHTML = formattedValue; 39290 }); 39291 } 39292 function aria() { 39293 removeEvent("update" + INTERNAL_EVENT_NS.aria); 39294 bindEvent("update" + INTERNAL_EVENT_NS.aria, function (values, handleNumber, unencoded, tap, positions) { 39295 // Update Aria Values for all handles, as a change in one changes min and max values for the next. 39296 scope_HandleNumbers.forEach(function (index) { 39297 var handle = scope_Handles[index]; 39298 var min = checkHandlePosition(scope_Locations, index, 0, true, true, true); 39299 var max = checkHandlePosition(scope_Locations, index, 100, true, true, true); 39300 var now = positions[index]; 39301 // Formatted value for display 39302 var text = String(options.ariaFormat.to(unencoded[index])); 39303 // Map to slider range values 39304 min = scope_Spectrum.fromStepping(min).toFixed(1); 39305 max = scope_Spectrum.fromStepping(max).toFixed(1); 39306 now = scope_Spectrum.fromStepping(now).toFixed(1); 39307 handle.children[0].setAttribute("aria-valuemin", min); 39308 handle.children[0].setAttribute("aria-valuemax", max); 39309 handle.children[0].setAttribute("aria-valuenow", now); 39310 handle.children[0].setAttribute("aria-valuetext", text); 39311 }); 39312 }); 39313 } 39314 function getGroup(pips) { 39315 // Use the range. 39316 if (pips.mode === exports.PipsMode.Range || pips.mode === exports.PipsMode.Steps) { 39317 return scope_Spectrum.xVal; 39318 } 39319 if (pips.mode === exports.PipsMode.Count) { 39320 if (pips.values < 2) { 39321 throw new Error("noUiSlider: 'values' (>= 2) required for mode 'count'."); 39322 } 39323 // Divide 0 - 100 in 'count' parts. 39324 var interval = pips.values - 1; 39325 var spread = 100 / interval; 39326 var values = []; 39327 // List these parts and have them handled as 'positions'. 39328 while (interval--) { 39329 values[interval] = interval * spread; 39330 } 39331 values.push(100); 39332 return mapToRange(values, pips.stepped); 39333 } 39334 if (pips.mode === exports.PipsMode.Positions) { 39335 // Map all percentages to on-range values. 39336 return mapToRange(pips.values, pips.stepped); 39337 } 39338 if (pips.mode === exports.PipsMode.Values) { 39339 // If the value must be stepped, it needs to be converted to a percentage first. 39340 if (pips.stepped) { 39341 return pips.values.map(function (value) { 39342 // Convert to percentage, apply step, return to value. 39343 return scope_Spectrum.fromStepping(scope_Spectrum.getStep(scope_Spectrum.toStepping(value))); 39344 }); 39345 } 39346 // Otherwise, we can simply use the values. 39347 return pips.values; 39348 } 39349 return []; // pips.mode = never 39350 } 39351 function mapToRange(values, stepped) { 39352 return values.map(function (value) { 39353 return scope_Spectrum.fromStepping(stepped ? scope_Spectrum.getStep(value) : value); 39354 }); 39355 } 39356 function generateSpread(pips) { 39357 function safeIncrement(value, increment) { 39358 // Avoid floating point variance by dropping the smallest decimal places. 39359 return Number((value + increment).toFixed(7)); 39360 } 39361 var group = getGroup(pips); 39362 var indexes = {}; 39363 var firstInRange = scope_Spectrum.xVal[0]; 39364 var lastInRange = scope_Spectrum.xVal[scope_Spectrum.xVal.length - 1]; 39365 var ignoreFirst = false; 39366 var ignoreLast = false; 39367 var prevPct = 0; 39368 // Create a copy of the group, sort it and filter away all duplicates. 39369 group = unique(group.slice().sort(function (a, b) { 39370 return a - b; 39371 })); 39372 // Make sure the range starts with the first element. 39373 if (group[0] !== firstInRange) { 39374 group.unshift(firstInRange); 39375 ignoreFirst = true; 39376 } 39377 // Likewise for the last one. 39378 if (group[group.length - 1] !== lastInRange) { 39379 group.push(lastInRange); 39380 ignoreLast = true; 39381 } 39382 group.forEach(function (current, index) { 39383 // Get the current step and the lower + upper positions. 39384 var step; 39385 var i; 39386 var q; 39387 var low = current; 39388 var high = group[index + 1]; 39389 var newPct; 39390 var pctDifference; 39391 var pctPos; 39392 var type; 39393 var steps; 39394 var realSteps; 39395 var stepSize; 39396 var isSteps = pips.mode === exports.PipsMode.Steps; 39397 // When using 'steps' mode, use the provided steps. 39398 // Otherwise, we'll step on to the next subrange. 39399 if (isSteps) { 39400 step = scope_Spectrum.xNumSteps[index]; 39401 } 39402 // Default to a 'full' step. 39403 if (!step) { 39404 step = high - low; 39405 } 39406 // If high is undefined we are at the last subrange. Make sure it iterates once (#1088) 39407 if (high === undefined) { 39408 high = low; 39409 } 39410 // Make sure step isn't 0, which would cause an infinite loop (#654) 39411 step = Math.max(step, 0.0000001); 39412 // Find all steps in the subrange. 39413 for (i = low; i <= high; i = safeIncrement(i, step)) { 39414 // Get the percentage value for the current step, 39415 // calculate the size for the subrange. 39416 newPct = scope_Spectrum.toStepping(i); 39417 pctDifference = newPct - prevPct; 39418 steps = pctDifference / (pips.density || 1); 39419 realSteps = Math.round(steps); 39420 // This ratio represents the amount of percentage-space a point indicates. 39421 // For a density 1 the points/percentage = 1. For density 2, that percentage needs to be re-divided. 39422 // Round the percentage offset to an even number, then divide by two 39423 // to spread the offset on both sides of the range. 39424 stepSize = pctDifference / realSteps; 39425 // Divide all points evenly, adding the correct number to this subrange. 39426 // Run up to <= so that 100% gets a point, event if ignoreLast is set. 39427 for (q = 1; q <= realSteps; q += 1) { 39428 // The ratio between the rounded value and the actual size might be ~1% off. 39429 // Correct the percentage offset by the number of points 39430 // per subrange. density = 1 will result in 100 points on the 39431 // full range, 2 for 50, 4 for 25, etc. 39432 pctPos = prevPct + q * stepSize; 39433 indexes[pctPos.toFixed(5)] = [scope_Spectrum.fromStepping(pctPos), 0]; 39434 } 39435 // Determine the point type. 39436 type = group.indexOf(i) > -1 ? exports.PipsType.LargeValue : isSteps ? exports.PipsType.SmallValue : exports.PipsType.NoValue; 39437 // Enforce the 'ignoreFirst' option by overwriting the type for 0. 39438 if (!index && ignoreFirst && i !== high) { 39439 type = 0; 39440 } 39441 if (!(i === high && ignoreLast)) { 39442 // Mark the 'type' of this point. 0 = plain, 1 = real value, 2 = step value. 39443 indexes[newPct.toFixed(5)] = [i, type]; 39444 } 39445 // Update the percentage count. 39446 prevPct = newPct; 39447 } 39448 }); 39449 return indexes; 39450 } 39451 function addMarking(spread, filterFunc, formatter) { 39452 var _a, _b; 39453 var element = scope_Document.createElement("div"); 39454 var valueSizeClasses = (_a = {}, 39455 _a[exports.PipsType.None] = "", 39456 _a[exports.PipsType.NoValue] = options.cssClasses.valueNormal, 39457 _a[exports.PipsType.LargeValue] = options.cssClasses.valueLarge, 39458 _a[exports.PipsType.SmallValue] = options.cssClasses.valueSub, 39459 _a); 39460 var markerSizeClasses = (_b = {}, 39461 _b[exports.PipsType.None] = "", 39462 _b[exports.PipsType.NoValue] = options.cssClasses.markerNormal, 39463 _b[exports.PipsType.LargeValue] = options.cssClasses.markerLarge, 39464 _b[exports.PipsType.SmallValue] = options.cssClasses.markerSub, 39465 _b); 39466 var valueOrientationClasses = [options.cssClasses.valueHorizontal, options.cssClasses.valueVertical]; 39467 var markerOrientationClasses = [options.cssClasses.markerHorizontal, options.cssClasses.markerVertical]; 39468 addClass(element, options.cssClasses.pips); 39469 addClass(element, options.ort === 0 ? options.cssClasses.pipsHorizontal : options.cssClasses.pipsVertical); 39470 function getClasses(type, source) { 39471 var a = source === options.cssClasses.value; 39472 var orientationClasses = a ? valueOrientationClasses : markerOrientationClasses; 39473 var sizeClasses = a ? valueSizeClasses : markerSizeClasses; 39474 return source + " " + orientationClasses[options.ort] + " " + sizeClasses[type]; 39475 } 39476 function addSpread(offset, value, type) { 39477 // Apply the filter function, if it is set. 39478 type = filterFunc ? filterFunc(value, type) : type; 39479 if (type === exports.PipsType.None) { 39480 return; 39481 } 39482 // Add a marker for every point 39483 var node = addNodeTo(element, false); 39484 node.className = getClasses(type, options.cssClasses.marker); 39485 node.style[options.style] = offset + "%"; 39486 // Values are only appended for points marked '1' or '2'. 39487 if (type > exports.PipsType.NoValue) { 39488 node = addNodeTo(element, false); 39489 node.className = getClasses(type, options.cssClasses.value); 39490 node.setAttribute("data-value", String(value)); 39491 node.style[options.style] = offset + "%"; 39492 node.innerHTML = String(formatter.to(value)); 39493 } 39494 } 39495 // Append all points. 39496 Object.keys(spread).forEach(function (offset) { 39497 addSpread(offset, spread[offset][0], spread[offset][1]); 39498 }); 39499 return element; 39500 } 39501 function removePips() { 39502 if (scope_Pips) { 39503 removeElement(scope_Pips); 39504 scope_Pips = null; 39505 } 39506 } 39507 function pips(pips) { 39508 // Fix #669 39509 removePips(); 39510 var spread = generateSpread(pips); 39511 var filter = pips.filter; 39512 var format = pips.format || { 39513 to: function (value) { 39514 return String(Math.round(value)); 39515 }, 39516 }; 39517 scope_Pips = scope_Target.appendChild(addMarking(spread, filter, format)); 39518 return scope_Pips; 39519 } 39520 // Shorthand for base dimensions. 39521 function baseSize() { 39522 var rect = scope_Base.getBoundingClientRect(); 39523 var alt = ("offset" + ["Width", "Height"][options.ort]); 39524 return options.ort === 0 ? rect.width || scope_Base[alt] : rect.height || scope_Base[alt]; 39525 } 39526 // Handler for attaching events trough a proxy. 39527 function attachEvent(events, element, callback, data) { 39528 // This function can be used to 'filter' events to the slider. 39529 // element is a node, not a nodeList 39530 var method = function (event) { 39531 var e = fixEvent(event, data.pageOffset, data.target || element); 39532 // fixEvent returns false if this event has a different target 39533 // when handling (multi-) touch events; 39534 if (!e) { 39535 return false; 39536 } 39537 // doNotReject is passed by all end events to make sure released touches 39538 // are not rejected, leaving the slider "stuck" to the cursor; 39539 if (isSliderDisabled() && !data.doNotReject) { 39540 return false; 39541 } 39542 // Stop if an active 'tap' transition is taking place. 39543 if (hasClass(scope_Target, options.cssClasses.tap) && !data.doNotReject) { 39544 return false; 39545 } 39546 // Ignore right or middle clicks on start #454 39547 if (events === actions.start && e.buttons !== undefined && e.buttons > 1) { 39548 return false; 39549 } 39550 // Ignore right or middle clicks on start #454 39551 if (data.hover && e.buttons) { 39552 return false; 39553 } 39554 // 'supportsPassive' is only true if a browser also supports touch-action: none in CSS. 39555 // iOS safari does not, so it doesn't get to benefit from passive scrolling. iOS does support 39556 // touch-action: manipulation, but that allows panning, which breaks 39557 // sliders after zooming/on non-responsive pages. 39558 // See: https://bugs.webkit.org/show_bug.cgi?id=133112 39559 if (!supportsPassive) { 39560 e.preventDefault(); 39561 } 39562 e.calcPoint = e.points[options.ort]; 39563 // Call the event handler with the event [ and additional data ]. 39564 callback(e, data); 39565 return; 39566 }; 39567 var methods = []; 39568 // Bind a closure on the target for every event type. 39569 events.split(" ").forEach(function (eventName) { 39570 element.addEventListener(eventName, method, supportsPassive ? { passive: true } : false); 39571 methods.push([eventName, method]); 39572 }); 39573 return methods; 39574 } 39575 // Provide a clean event with standardized offset values. 39576 function fixEvent(e, pageOffset, eventTarget) { 39577 // Filter the event to register the type, which can be 39578 // touch, mouse or pointer. Offset changes need to be 39579 // made on an event specific basis. 39580 var touch = e.type.indexOf("touch") === 0; 39581 var mouse = e.type.indexOf("mouse") === 0; 39582 var pointer = e.type.indexOf("pointer") === 0; 39583 var x = 0; 39584 var y = 0; 39585 // IE10 implemented pointer events with a prefix; 39586 if (e.type.indexOf("MSPointer") === 0) { 39587 pointer = true; 39588 } 39589 // Erroneous events seem to be passed in occasionally on iOS/iPadOS after user finishes interacting with 39590 // the slider. They appear to be of type MouseEvent, yet they don't have usual properties set. Ignore 39591 // events that have no touches or buttons associated with them. (#1057, #1079, #1095) 39592 if (e.type === "mousedown" && !e.buttons && !e.touches) { 39593 return false; 39594 } 39595 // The only thing one handle should be concerned about is the touches that originated on top of it. 39596 if (touch) { 39597 // Returns true if a touch originated on the target. 39598 var isTouchOnTarget = function (checkTouch) { 39599 var target = checkTouch.target; 39600 return (target === eventTarget || 39601 eventTarget.contains(target) || 39602 (e.composed && e.composedPath().shift() === eventTarget)); 39603 }; 39604 // In the case of touchstart events, we need to make sure there is still no more than one 39605 // touch on the target so we look amongst all touches. 39606 if (e.type === "touchstart") { 39607 var targetTouches = Array.prototype.filter.call(e.touches, isTouchOnTarget); 39608 // Do not support more than one touch per handle. 39609 if (targetTouches.length > 1) { 39610 return false; 39611 } 39612 x = targetTouches[0].pageX; 39613 y = targetTouches[0].pageY; 39614 } 39615 else { 39616 // In the other cases, find on changedTouches is enough. 39617 var targetTouch = Array.prototype.find.call(e.changedTouches, isTouchOnTarget); 39618 // Cancel if the target touch has not moved. 39619 if (!targetTouch) { 39620 return false; 39621 } 39622 x = targetTouch.pageX; 39623 y = targetTouch.pageY; 39624 } 39625 } 39626 pageOffset = pageOffset || getPageOffset(scope_Document); 39627 if (mouse || pointer) { 39628 x = e.clientX + pageOffset.x; 39629 y = e.clientY + pageOffset.y; 39630 } 39631 e.pageOffset = pageOffset; 39632 e.points = [x, y]; 39633 e.cursor = mouse || pointer; // Fix #435 39634 return e; 39635 } 39636 // Translate a coordinate in the document to a percentage on the slider 39637 function calcPointToPercentage(calcPoint) { 39638 var location = calcPoint - offset(scope_Base, options.ort); 39639 var proposal = (location * 100) / baseSize(); 39640 // Clamp proposal between 0% and 100% 39641 // Out-of-bound coordinates may occur when .noUi-base pseudo-elements 39642 // are used (e.g. contained handles feature) 39643 proposal = limit(proposal); 39644 return options.dir ? 100 - proposal : proposal; 39645 } 39646 // Find handle closest to a certain percentage on the slider 39647 function getClosestHandle(clickedPosition) { 39648 var smallestDifference = 100; 39649 var handleNumber = false; 39650 scope_Handles.forEach(function (handle, index) { 39651 // Disabled handles are ignored 39652 if (isHandleDisabled(index)) { 39653 return; 39654 } 39655 var handlePosition = scope_Locations[index]; 39656 var differenceWithThisHandle = Math.abs(handlePosition - clickedPosition); 39657 // Initial state 39658 var clickAtEdge = differenceWithThisHandle === 100 && smallestDifference === 100; 39659 // Difference with this handle is smaller than the previously checked handle 39660 var isCloser = differenceWithThisHandle < smallestDifference; 39661 var isCloserAfter = differenceWithThisHandle <= smallestDifference && clickedPosition > handlePosition; 39662 if (isCloser || isCloserAfter || clickAtEdge) { 39663 handleNumber = index; 39664 smallestDifference = differenceWithThisHandle; 39665 } 39666 }); 39667 return handleNumber; 39668 } 39669 // Fire 'end' when a mouse or pen leaves the document. 39670 function documentLeave(event, data) { 39671 if (event.type === "mouseout" && 39672 event.target.nodeName === "HTML" && 39673 event.relatedTarget === null) { 39674 eventEnd(event, data); 39675 } 39676 } 39677 // Handle movement on document for handle and range drag. 39678 function eventMove(event, data) { 39679 // Fix #498 39680 // Check value of .buttons in 'start' to work around a bug in IE10 mobile (data.buttonsProperty). 39681 // https://connect.microsoft.com/IE/feedback/details/927005/mobile-ie10-windows-phone-buttons-property-of-pointermove-event-always-zero 39682 // IE9 has .buttons and .which zero on mousemove. 39683 // Firefox breaks the spec MDN defines. 39684 if (navigator.appVersion.indexOf("MSIE 9") === -1 && event.buttons === 0 && data.buttonsProperty !== 0) { 39685 return eventEnd(event, data); 39686 } 39687 // Check if we are moving up or down 39688 var movement = (options.dir ? -1 : 1) * (event.calcPoint - data.startCalcPoint); 39689 // Convert the movement into a percentage of the slider width/height 39690 var proposal = (movement * 100) / data.baseSize; 39691 moveHandles(movement > 0, proposal, data.locations, data.handleNumbers, data.connect); 39692 } 39693 // Unbind move events on document, call callbacks. 39694 function eventEnd(event, data) { 39695 // The handle is no longer active, so remove the class. 39696 if (data.handle) { 39697 removeClass(data.handle, options.cssClasses.active); 39698 scope_ActiveHandlesCount -= 1; 39699 } 39700 // Unbind the move and end events, which are added on 'start'. 39701 data.listeners.forEach(function (c) { 39702 scope_DocumentElement.removeEventListener(c[0], c[1]); 39703 }); 39704 if (scope_ActiveHandlesCount === 0) { 39705 // Remove dragging class. 39706 removeClass(scope_Target, options.cssClasses.drag); 39707 setZindex(); 39708 // Remove cursor styles and text-selection events bound to the body. 39709 if (event.cursor) { 39710 scope_Body.style.cursor = ""; 39711 scope_Body.removeEventListener("selectstart", preventDefault); 39712 } 39713 } 39714 if (options.events.smoothSteps) { 39715 data.handleNumbers.forEach(function (handleNumber) { 39716 setHandle(handleNumber, scope_Locations[handleNumber], true, true, false, false); 39717 }); 39718 data.handleNumbers.forEach(function (handleNumber) { 39719 fireEvent("update", handleNumber); 39720 }); 39721 } 39722 data.handleNumbers.forEach(function (handleNumber) { 39723 fireEvent("change", handleNumber); 39724 fireEvent("set", handleNumber); 39725 fireEvent("end", handleNumber); 39726 }); 39727 } 39728 // Bind move events on document. 39729 function eventStart(event, data) { 39730 // Ignore event if any handle is disabled 39731 if (data.handleNumbers.some(isHandleDisabled)) { 39732 return; 39733 } 39734 var handle; 39735 if (data.handleNumbers.length === 1) { 39736 var handleOrigin = scope_Handles[data.handleNumbers[0]]; 39737 handle = handleOrigin.children[0]; 39738 scope_ActiveHandlesCount += 1; 39739 // Mark the handle as 'active' so it can be styled. 39740 addClass(handle, options.cssClasses.active); 39741 } 39742 // A drag should never propagate up to the 'tap' event. 39743 event.stopPropagation(); 39744 // Record the event listeners. 39745 var listeners = []; 39746 // Attach the move and end events. 39747 var moveEvent = attachEvent(actions.move, scope_DocumentElement, eventMove, { 39748 // The event target has changed so we need to propagate the original one so that we keep 39749 // relying on it to extract target touches. 39750 target: event.target, 39751 handle: handle, 39752 connect: data.connect, 39753 listeners: listeners, 39754 startCalcPoint: event.calcPoint, 39755 baseSize: baseSize(), 39756 pageOffset: event.pageOffset, 39757 handleNumbers: data.handleNumbers, 39758 buttonsProperty: event.buttons, 39759 locations: scope_Locations.slice(), 39760 }); 39761 var endEvent = attachEvent(actions.end, scope_DocumentElement, eventEnd, { 39762 target: event.target, 39763 handle: handle, 39764 listeners: listeners, 39765 doNotReject: true, 39766 handleNumbers: data.handleNumbers, 39767 }); 39768 var outEvent = attachEvent("mouseout", scope_DocumentElement, documentLeave, { 39769 target: event.target, 39770 handle: handle, 39771 listeners: listeners, 39772 doNotReject: true, 39773 handleNumbers: data.handleNumbers, 39774 }); 39775 // We want to make sure we pushed the listeners in the listener list rather than creating 39776 // a new one as it has already been passed to the event handlers. 39777 listeners.push.apply(listeners, moveEvent.concat(endEvent, outEvent)); 39778 // Text selection isn't an issue on touch devices, 39779 // so adding cursor styles can be skipped. 39780 if (event.cursor) { 39781 // Prevent the 'I' cursor and extend the range-drag cursor. 39782 scope_Body.style.cursor = getComputedStyle(event.target).cursor; 39783 // Mark the target with a dragging state. 39784 if (scope_Handles.length > 1) { 39785 addClass(scope_Target, options.cssClasses.drag); 39786 } 39787 // Prevent text selection when dragging the handles. 39788 // In noUiSlider <= 9.2.0, this was handled by calling preventDefault on mouse/touch start/move, 39789 // which is scroll blocking. The selectstart event is supported by FireFox starting from version 52, 39790 // meaning the only holdout is iOS Safari. This doesn't matter: text selection isn't triggered there. 39791 // The 'cursor' flag is false. 39792 // See: http://caniuse.com/#search=selectstart 39793 scope_Body.addEventListener("selectstart", preventDefault, false); 39794 } 39795 data.handleNumbers.forEach(function (handleNumber) { 39796 fireEvent("start", handleNumber); 39797 }); 39798 } 39799 // Move closest handle to tapped location. 39800 function eventTap(event) { 39801 // The tap event shouldn't propagate up 39802 event.stopPropagation(); 39803 var proposal = calcPointToPercentage(event.calcPoint); 39804 var handleNumber = getClosestHandle(proposal); 39805 // Tackle the case that all handles are 'disabled'. 39806 if (handleNumber === false) { 39807 return; 39808 } 39809 // Flag the slider as it is now in a transitional state. 39810 // Transition takes a configurable amount of ms (default 300). Re-enable the slider after that. 39811 if (!options.events.snap) { 39812 addClassFor(scope_Target, options.cssClasses.tap, options.animationDuration); 39813 } 39814 setHandle(handleNumber, proposal, true, true); 39815 setZindex(); 39816 fireEvent("slide", handleNumber, true); 39817 fireEvent("update", handleNumber, true); 39818 if (!options.events.snap) { 39819 fireEvent("change", handleNumber, true); 39820 fireEvent("set", handleNumber, true); 39821 } 39822 else { 39823 eventStart(event, { handleNumbers: [handleNumber] }); 39824 } 39825 } 39826 // Fires a 'hover' event for a hovered mouse/pen position. 39827 function eventHover(event) { 39828 var proposal = calcPointToPercentage(event.calcPoint); 39829 var to = scope_Spectrum.getStep(proposal); 39830 var value = scope_Spectrum.fromStepping(to); 39831 Object.keys(scope_Events).forEach(function (targetEvent) { 39832 if ("hover" === targetEvent.split(".")[0]) { 39833 scope_Events[targetEvent].forEach(function (callback) { 39834 callback.call(scope_Self, value); 39835 }); 39836 } 39837 }); 39838 } 39839 // Handles keydown on focused handles 39840 // Don't move the document when pressing arrow keys on focused handles 39841 function eventKeydown(event, handleNumber) { 39842 if (isSliderDisabled() || isHandleDisabled(handleNumber)) { 39843 return false; 39844 } 39845 var horizontalKeys = ["Left", "Right"]; 39846 var verticalKeys = ["Down", "Up"]; 39847 var largeStepKeys = ["PageDown", "PageUp"]; 39848 var edgeKeys = ["Home", "End"]; 39849 if (options.dir && !options.ort) { 39850 // On an right-to-left slider, the left and right keys act inverted 39851 horizontalKeys.reverse(); 39852 } 39853 else if (options.ort && !options.dir) { 39854 // On a top-to-bottom slider, the up and down keys act inverted 39855 verticalKeys.reverse(); 39856 largeStepKeys.reverse(); 39857 } 39858 // Strip "Arrow" for IE compatibility. https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key 39859 var key = event.key.replace("Arrow", ""); 39860 var isLargeDown = key === largeStepKeys[0]; 39861 var isLargeUp = key === largeStepKeys[1]; 39862 var isDown = key === verticalKeys[0] || key === horizontalKeys[0] || isLargeDown; 39863 var isUp = key === verticalKeys[1] || key === horizontalKeys[1] || isLargeUp; 39864 var isMin = key === edgeKeys[0]; 39865 var isMax = key === edgeKeys[1]; 39866 if (!isDown && !isUp && !isMin && !isMax) { 39867 return true; 39868 } 39869 event.preventDefault(); 39870 var to; 39871 if (isUp || isDown) { 39872 var direction = isDown ? 0 : 1; 39873 var steps = getNextStepsForHandle(handleNumber); 39874 var step = steps[direction]; 39875 // At the edge of a slider, do nothing 39876 if (step === null) { 39877 return false; 39878 } 39879 // No step set, use the default of 10% of the sub-range 39880 if (step === false) { 39881 step = scope_Spectrum.getDefaultStep(scope_Locations[handleNumber], isDown, options.keyboardDefaultStep); 39882 } 39883 if (isLargeUp || isLargeDown) { 39884 step *= options.keyboardPageMultiplier; 39885 } 39886 else { 39887 step *= options.keyboardMultiplier; 39888 } 39889 // Step over zero-length ranges (#948); 39890 step = Math.max(step, 0.0000001); 39891 // Decrement for down steps 39892 step = (isDown ? -1 : 1) * step; 39893 to = scope_Values[handleNumber] + step; 39894 } 39895 else if (isMax) { 39896 // End key 39897 to = options.spectrum.xVal[options.spectrum.xVal.length - 1]; 39898 } 39899 else { 39900 // Home key 39901 to = options.spectrum.xVal[0]; 39902 } 39903 setHandle(handleNumber, scope_Spectrum.toStepping(to), true, true); 39904 fireEvent("slide", handleNumber); 39905 fireEvent("update", handleNumber); 39906 fireEvent("change", handleNumber); 39907 fireEvent("set", handleNumber); 39908 return false; 39909 } 39910 // Attach events to several slider parts. 39911 function bindSliderEvents(behaviour) { 39912 // Attach the standard drag event to the handles. 39913 if (!behaviour.fixed) { 39914 scope_Handles.forEach(function (handle, index) { 39915 // These events are only bound to the visual handle 39916 // element, not the 'real' origin element. 39917 attachEvent(actions.start, handle.children[0], eventStart, { 39918 handleNumbers: [index], 39919 }); 39920 }); 39921 } 39922 // Attach the tap event to the slider base. 39923 if (behaviour.tap) { 39924 attachEvent(actions.start, scope_Base, eventTap, {}); 39925 } 39926 // Fire hover events 39927 if (behaviour.hover) { 39928 attachEvent(actions.move, scope_Base, eventHover, { 39929 hover: true, 39930 }); 39931 } 39932 // Make the range draggable. 39933 if (behaviour.drag) { 39934 scope_Connects.forEach(function (connect, index) { 39935 if (connect === false || index === 0 || index === scope_Connects.length - 1) { 39936 return; 39937 } 39938 var handleBefore = scope_Handles[index - 1]; 39939 var handleAfter = scope_Handles[index]; 39940 var eventHolders = [connect]; 39941 var handlesToDrag = [handleBefore, handleAfter]; 39942 var handleNumbersToDrag = [index - 1, index]; 39943 addClass(connect, options.cssClasses.draggable); 39944 // When the range is fixed, the entire range can 39945 // be dragged by the handles. The handle in the first 39946 // origin will propagate the start event upward, 39947 // but it needs to be bound manually on the other. 39948 if (behaviour.fixed) { 39949 eventHolders.push(handleBefore.children[0]); 39950 eventHolders.push(handleAfter.children[0]); 39951 } 39952 if (behaviour.dragAll) { 39953 handlesToDrag = scope_Handles; 39954 handleNumbersToDrag = scope_HandleNumbers; 39955 } 39956 eventHolders.forEach(function (eventHolder) { 39957 attachEvent(actions.start, eventHolder, eventStart, { 39958 handles: handlesToDrag, 39959 handleNumbers: handleNumbersToDrag, 39960 connect: connect, 39961 }); 39962 }); 39963 }); 39964 } 39965 } 39966 // Attach an event to this slider, possibly including a namespace 39967 function bindEvent(namespacedEvent, callback) { 39968 scope_Events[namespacedEvent] = scope_Events[namespacedEvent] || []; 39969 scope_Events[namespacedEvent].push(callback); 39970 // If the event bound is 'update,' fire it immediately for all handles. 39971 if (namespacedEvent.split(".")[0] === "update") { 39972 scope_Handles.forEach(function (a, index) { 39973 fireEvent("update", index); 39974 }); 39975 } 39976 } 39977 function isInternalNamespace(namespace) { 39978 return namespace === INTERNAL_EVENT_NS.aria || namespace === INTERNAL_EVENT_NS.tooltips; 39979 } 39980 // Undo attachment of event 39981 function removeEvent(namespacedEvent) { 39982 var event = namespacedEvent && namespacedEvent.split(".")[0]; 39983 var namespace = event ? namespacedEvent.substring(event.length) : namespacedEvent; 39984 Object.keys(scope_Events).forEach(function (bind) { 39985 var tEvent = bind.split(".")[0]; 39986 var tNamespace = bind.substring(tEvent.length); 39987 if ((!event || event === tEvent) && (!namespace || namespace === tNamespace)) { 39988 // only delete protected internal event if intentional 39989 if (!isInternalNamespace(tNamespace) || namespace === tNamespace) { 39990 delete scope_Events[bind]; 39991 } 39992 } 39993 }); 39994 } 39995 // External event handling 39996 function fireEvent(eventName, handleNumber, tap) { 39997 Object.keys(scope_Events).forEach(function (targetEvent) { 39998 var eventType = targetEvent.split(".")[0]; 39999 if (eventName === eventType) { 40000 scope_Events[targetEvent].forEach(function (callback) { 40001 callback.call( 40002 // Use the slider public API as the scope ('this') 40003 scope_Self, 40004 // Return values as array, so arg_1[arg_2] is always valid. 40005 scope_Values.map(options.format.to), 40006 // Handle index, 0 or 1 40007 handleNumber, 40008 // Un-formatted slider values 40009 scope_Values.slice(), 40010 // Event is fired by tap, true or false 40011 tap || false, 40012 // Left offset of the handle, in relation to the slider 40013 scope_Locations.slice(), 40014 // add the slider public API to an accessible parameter when this is unavailable 40015 scope_Self); 40016 }); 40017 } 40018 }); 40019 } 40020 // Split out the handle positioning logic so the Move event can use it, too 40021 function checkHandlePosition(reference, handleNumber, to, lookBackward, lookForward, getValue, smoothSteps) { 40022 var distance; 40023 // For sliders with multiple handles, limit movement to the other handle. 40024 // Apply the margin option by adding it to the handle positions. 40025 if (scope_Handles.length > 1 && !options.events.unconstrained) { 40026 if (lookBackward && handleNumber > 0) { 40027 distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber - 1], options.margin, false); 40028 to = Math.max(to, distance); 40029 } 40030 if (lookForward && handleNumber < scope_Handles.length - 1) { 40031 distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber + 1], options.margin, true); 40032 to = Math.min(to, distance); 40033 } 40034 } 40035 // The limit option has the opposite effect, limiting handles to a 40036 // maximum distance from another. Limit must be > 0, as otherwise 40037 // handles would be unmovable. 40038 if (scope_Handles.length > 1 && options.limit) { 40039 if (lookBackward && handleNumber > 0) { 40040 distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber - 1], options.limit, false); 40041 to = Math.min(to, distance); 40042 } 40043 if (lookForward && handleNumber < scope_Handles.length - 1) { 40044 distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber + 1], options.limit, true); 40045 to = Math.max(to, distance); 40046 } 40047 } 40048 // The padding option keeps the handles a certain distance from the 40049 // edges of the slider. Padding must be > 0. 40050 if (options.padding) { 40051 if (handleNumber === 0) { 40052 distance = scope_Spectrum.getAbsoluteDistance(0, options.padding[0], false); 40053 to = Math.max(to, distance); 40054 } 40055 if (handleNumber === scope_Handles.length - 1) { 40056 distance = scope_Spectrum.getAbsoluteDistance(100, options.padding[1], true); 40057 to = Math.min(to, distance); 40058 } 40059 } 40060 if (!smoothSteps) { 40061 to = scope_Spectrum.getStep(to); 40062 } 40063 // Limit percentage to the 0 - 100 range 40064 to = limit(to); 40065 // Return false if handle can't move 40066 if (to === reference[handleNumber] && !getValue) { 40067 return false; 40068 } 40069 return to; 40070 } 40071 // Uses slider orientation to create CSS rules. a = base value; 40072 function inRuleOrder(v, a) { 40073 var o = options.ort; 40074 return (o ? a : v) + ", " + (o ? v : a); 40075 } 40076 // Moves handle(s) by a percentage 40077 // (bool, % to move, [% where handle started, ...], [index in scope_Handles, ...]) 40078 function moveHandles(upward, proposal, locations, handleNumbers, connect) { 40079 var proposals = locations.slice(); 40080 // Store first handle now, so we still have it in case handleNumbers is reversed 40081 var firstHandle = handleNumbers[0]; 40082 var smoothSteps = options.events.smoothSteps; 40083 var b = [!upward, upward]; 40084 var f = [upward, !upward]; 40085 // Copy handleNumbers so we don't change the dataset 40086 handleNumbers = handleNumbers.slice(); 40087 // Check to see which handle is 'leading'. 40088 // If that one can't move the second can't either. 40089 if (upward) { 40090 handleNumbers.reverse(); 40091 } 40092 // Step 1: get the maximum percentage that any of the handles can move 40093 if (handleNumbers.length > 1) { 40094 handleNumbers.forEach(function (handleNumber, o) { 40095 var to = checkHandlePosition(proposals, handleNumber, proposals[handleNumber] + proposal, b[o], f[o], false, smoothSteps); 40096 // Stop if one of the handles can't move. 40097 if (to === false) { 40098 proposal = 0; 40099 } 40100 else { 40101 proposal = to - proposals[handleNumber]; 40102 proposals[handleNumber] = to; 40103 } 40104 }); 40105 } 40106 // If using one handle, check backward AND forward 40107 else { 40108 b = f = [true]; 40109 } 40110 var state = false; 40111 // Step 2: Try to set the handles with the found percentage 40112 handleNumbers.forEach(function (handleNumber, o) { 40113 state = 40114 setHandle(handleNumber, locations[handleNumber] + proposal, b[o], f[o], false, smoothSteps) || state; 40115 }); 40116 // Step 3: If a handle moved, fire events 40117 if (state) { 40118 handleNumbers.forEach(function (handleNumber) { 40119 fireEvent("update", handleNumber); 40120 fireEvent("slide", handleNumber); 40121 }); 40122 // If target is a connect, then fire drag event 40123 if (connect != undefined) { 40124 fireEvent("drag", firstHandle); 40125 } 40126 } 40127 } 40128 // Takes a base value and an offset. This offset is used for the connect bar size. 40129 // In the initial design for this feature, the origin element was 1% wide. 40130 // Unfortunately, a rounding bug in Chrome makes it impossible to implement this feature 40131 // in this manner: https://bugs.chromium.org/p/chromium/issues/detail?id=798223 40132 function transformDirection(a, b) { 40133 return options.dir ? 100 - a - b : a; 40134 } 40135 // Updates scope_Locations and scope_Values, updates visual state 40136 function updateHandlePosition(handleNumber, to) { 40137 // Update locations. 40138 scope_Locations[handleNumber] = to; 40139 // Convert the value to the slider stepping/range. 40140 scope_Values[handleNumber] = scope_Spectrum.fromStepping(to); 40141 var translation = transformDirection(to, 0) - scope_DirOffset; 40142 var translateRule = "translate(" + inRuleOrder(translation + "%", "0") + ")"; 40143 scope_Handles[handleNumber].style[options.transformRule] = translateRule; 40144 // sanity check for at least 2 handles (e.g. during setup) 40145 if (options.events.invertConnects && scope_Locations.length > 1) { 40146 // check if handles passed each other, but don't match the ConnectsInverted state 40147 var handlesAreInOrder = scope_Locations.every(function (position, index, locations) { 40148 return index === 0 || position >= locations[index - 1]; 40149 }); 40150 if (scope_ConnectsInverted !== !handlesAreInOrder) { 40151 // invert connects when handles pass each other 40152 invertConnects(); 40153 // invertConnects already updates all connect elements 40154 return; 40155 } 40156 } 40157 updateConnect(handleNumber); 40158 updateConnect(handleNumber + 1); 40159 if (scope_ConnectsInverted) { 40160 // When connects are inverted, we also have to update adjacent connects 40161 updateConnect(handleNumber - 1); 40162 updateConnect(handleNumber + 2); 40163 } 40164 } 40165 // Handles before the slider middle are stacked later = higher, 40166 // Handles after the middle later is lower 40167 // [[7] [8] .......... | .......... [5] [4] 40168 function setZindex() { 40169 scope_HandleNumbers.forEach(function (handleNumber) { 40170 var dir = scope_Locations[handleNumber] > 50 ? -1 : 1; 40171 var zIndex = 3 + (scope_Handles.length + dir * handleNumber); 40172 scope_Handles[handleNumber].style.zIndex = String(zIndex); 40173 }); 40174 } 40175 // Test suggested values and apply margin, step. 40176 // if exactInput is true, don't run checkHandlePosition, then the handle can be placed in between steps (#436) 40177 function setHandle(handleNumber, to, lookBackward, lookForward, exactInput, smoothSteps) { 40178 if (!exactInput) { 40179 to = checkHandlePosition(scope_Locations, handleNumber, to, lookBackward, lookForward, false, smoothSteps); 40180 } 40181 if (to === false) { 40182 return false; 40183 } 40184 updateHandlePosition(handleNumber, to); 40185 return true; 40186 } 40187 // Updates style attribute for connect nodes 40188 function updateConnect(index) { 40189 // Skip connects set to false 40190 if (!scope_Connects[index]) { 40191 return; 40192 } 40193 // Create a copy of locations, so we can sort them for the local scope logic 40194 var locations = scope_Locations.slice(); 40195 if (scope_ConnectsInverted) { 40196 locations.sort(function (a, b) { 40197 return a - b; 40198 }); 40199 } 40200 var l = 0; 40201 var h = 100; 40202 if (index !== 0) { 40203 l = locations[index - 1]; 40204 } 40205 if (index !== scope_Connects.length - 1) { 40206 h = locations[index]; 40207 } 40208 // We use two rules: 40209 // 'translate' to change the left/top offset; 40210 // 'scale' to change the width of the element; 40211 // As the element has a width of 100%, a translation of 100% is equal to 100% of the parent (.noUi-base) 40212 var connectWidth = h - l; 40213 var translateRule = "translate(" + inRuleOrder(transformDirection(l, connectWidth) + "%", "0") + ")"; 40214 var scaleRule = "scale(" + inRuleOrder(connectWidth / 100, "1") + ")"; 40215 scope_Connects[index].style[options.transformRule] = 40216 translateRule + " " + scaleRule; 40217 } 40218 // Parses value passed to .set method. Returns current value if not parse-able. 40219 function resolveToValue(to, handleNumber) { 40220 // Setting with null indicates an 'ignore'. 40221 // Inputting 'false' is invalid. 40222 if (to === null || to === false || to === undefined) { 40223 return scope_Locations[handleNumber]; 40224 } 40225 // If a formatted number was passed, attempt to decode it. 40226 if (typeof to === "number") { 40227 to = String(to); 40228 } 40229 to = options.format.from(to); 40230 if (to !== false) { 40231 to = scope_Spectrum.toStepping(to); 40232 } 40233 // If parsing the number failed, use the current value. 40234 if (to === false || isNaN(to)) { 40235 return scope_Locations[handleNumber]; 40236 } 40237 return to; 40238 } 40239 // Set the slider value. 40240 function valueSet(input, fireSetEvent, exactInput) { 40241 var values = asArray(input); 40242 var isInit = scope_Locations[0] === undefined; 40243 // Event fires by default 40244 fireSetEvent = fireSetEvent === undefined ? true : fireSetEvent; 40245 // Animation is optional. 40246 // Make sure the initial values were set before using animated placement. 40247 if (options.animate && !isInit) { 40248 addClassFor(scope_Target, options.cssClasses.tap, options.animationDuration); 40249 } 40250 // First pass, without lookAhead but with lookBackward. Values are set from left to right. 40251 scope_HandleNumbers.forEach(function (handleNumber) { 40252 setHandle(handleNumber, resolveToValue(values[handleNumber], handleNumber), true, false, exactInput); 40253 }); 40254 var i = scope_HandleNumbers.length === 1 ? 0 : 1; 40255 // Spread handles evenly across the slider if the range has no size (min=max) 40256 if (isInit && scope_Spectrum.hasNoSize()) { 40257 exactInput = true; 40258 scope_Locations[0] = 0; 40259 if (scope_HandleNumbers.length > 1) { 40260 var space_1 = 100 / (scope_HandleNumbers.length - 1); 40261 scope_HandleNumbers.forEach(function (handleNumber) { 40262 scope_Locations[handleNumber] = handleNumber * space_1; 40263 }); 40264 } 40265 } 40266 // Secondary passes. Now that all base values are set, apply constraints. 40267 // Iterate all handles to ensure constraints are applied for the entire slider (Issue #1009) 40268 for (; i < scope_HandleNumbers.length; ++i) { 40269 scope_HandleNumbers.forEach(function (handleNumber) { 40270 setHandle(handleNumber, scope_Locations[handleNumber], true, true, exactInput); 40271 }); 40272 } 40273 setZindex(); 40274 scope_HandleNumbers.forEach(function (handleNumber) { 40275 fireEvent("update", handleNumber); 40276 // Fire the event only for handles that received a new value, as per #579 40277 if (values[handleNumber] !== null && fireSetEvent) { 40278 fireEvent("set", handleNumber); 40279 } 40280 }); 40281 } 40282 // Reset slider to initial values 40283 function valueReset(fireSetEvent) { 40284 valueSet(options.start, fireSetEvent); 40285 } 40286 // Set value for a single handle 40287 function valueSetHandle(handleNumber, value, fireSetEvent, exactInput) { 40288 // Ensure numeric input 40289 handleNumber = Number(handleNumber); 40290 if (!(handleNumber >= 0 && handleNumber < scope_HandleNumbers.length)) { 40291 throw new Error("noUiSlider: invalid handle number, got: " + handleNumber); 40292 } 40293 // Look both backward and forward, since we don't want this handle to "push" other handles (#960); 40294 // The exactInput argument can be used to ignore slider stepping (#436) 40295 setHandle(handleNumber, resolveToValue(value, handleNumber), true, true, exactInput); 40296 fireEvent("update", handleNumber); 40297 if (fireSetEvent) { 40298 fireEvent("set", handleNumber); 40299 } 40300 } 40301 // Get the slider value. 40302 function valueGet(unencoded) { 40303 if (unencoded === void 0) { unencoded = false; } 40304 if (unencoded) { 40305 // return a copy of the raw values 40306 return scope_Values.length === 1 ? scope_Values[0] : scope_Values.slice(0); 40307 } 40308 var values = scope_Values.map(options.format.to); 40309 // If only one handle is used, return a single value. 40310 if (values.length === 1) { 40311 return values[0]; 40312 } 40313 return values; 40314 } 40315 // Removes classes from the root and empties it. 40316 function destroy() { 40317 // remove protected internal listeners 40318 removeEvent(INTERNAL_EVENT_NS.aria); 40319 removeEvent(INTERNAL_EVENT_NS.tooltips); 40320 Object.keys(options.cssClasses).forEach(function (key) { 40321 removeClass(scope_Target, options.cssClasses[key]); 40322 }); 40323 while (scope_Target.firstChild) { 40324 scope_Target.removeChild(scope_Target.firstChild); 40325 } 40326 delete scope_Target.noUiSlider; 40327 } 40328 function getNextStepsForHandle(handleNumber) { 40329 var location = scope_Locations[handleNumber]; 40330 var nearbySteps = scope_Spectrum.getNearbySteps(location); 40331 var value = scope_Values[handleNumber]; 40332 var increment = nearbySteps.thisStep.step; 40333 var decrement = null; 40334 // If snapped, directly use defined step value 40335 if (options.snap) { 40336 return [ 40337 value - nearbySteps.stepBefore.startValue || null, 40338 nearbySteps.stepAfter.startValue - value || null, 40339 ]; 40340 } 40341 // If the next value in this step moves into the next step, 40342 // the increment is the start of the next step - the current value 40343 if (increment !== false) { 40344 if (value + increment > nearbySteps.stepAfter.startValue) { 40345 increment = nearbySteps.stepAfter.startValue - value; 40346 } 40347 } 40348 // If the value is beyond the starting point 40349 if (value > nearbySteps.thisStep.startValue) { 40350 decrement = nearbySteps.thisStep.step; 40351 } 40352 else if (nearbySteps.stepBefore.step === false) { 40353 decrement = false; 40354 } 40355 // If a handle is at the start of a step, it always steps back into the previous step first 40356 else { 40357 decrement = value - nearbySteps.stepBefore.highestStep; 40358 } 40359 // Now, if at the slider edges, there is no in/decrement 40360 if (location === 100) { 40361 increment = null; 40362 } 40363 else if (location === 0) { 40364 decrement = null; 40365 } 40366 // As per #391, the comparison for the decrement step can have some rounding issues. 40367 var stepDecimals = scope_Spectrum.countStepDecimals(); 40368 // Round per #391 40369 if (increment !== null && increment !== false) { 40370 increment = Number(increment.toFixed(stepDecimals)); 40371 } 40372 if (decrement !== null && decrement !== false) { 40373 decrement = Number(decrement.toFixed(stepDecimals)); 40374 } 40375 return [decrement, increment]; 40376 } 40377 // Get the current step size for the slider. 40378 function getNextSteps() { 40379 return scope_HandleNumbers.map(getNextStepsForHandle); 40380 } 40381 // Updatable: margin, limit, padding, step, range, animate, snap 40382 function updateOptions(optionsToUpdate, fireSetEvent) { 40383 // Spectrum is created using the range, snap, direction and step options. 40384 // 'snap' and 'step' can be updated. 40385 // If 'snap' and 'step' are not passed, they should remain unchanged. 40386 var v = valueGet(); 40387 var updateAble = [ 40388 "margin", 40389 "limit", 40390 "padding", 40391 "range", 40392 "animate", 40393 "snap", 40394 "step", 40395 "format", 40396 "pips", 40397 "tooltips", 40398 "connect", 40399 ]; 40400 // Only change options that we're actually passed to update. 40401 updateAble.forEach(function (name) { 40402 // Check for undefined. null removes the value. 40403 if (optionsToUpdate[name] !== undefined) { 40404 originalOptions[name] = optionsToUpdate[name]; 40405 } 40406 }); 40407 var newOptions = testOptions(originalOptions); 40408 // Load new options into the slider state 40409 updateAble.forEach(function (name) { 40410 if (optionsToUpdate[name] !== undefined) { 40411 options[name] = newOptions[name]; 40412 } 40413 }); 40414 scope_Spectrum = newOptions.spectrum; 40415 // Limit, margin and padding depend on the spectrum but are stored outside of it. (#677) 40416 options.margin = newOptions.margin; 40417 options.limit = newOptions.limit; 40418 options.padding = newOptions.padding; 40419 // Update pips, removes existing. 40420 if (options.pips) { 40421 pips(options.pips); 40422 } 40423 else { 40424 removePips(); 40425 } 40426 // Update tooltips, removes existing. 40427 if (options.tooltips) { 40428 tooltips(); 40429 } 40430 else { 40431 removeTooltips(); 40432 } 40433 // Invalidate the current positioning so valueSet forces an update. 40434 scope_Locations = []; 40435 valueSet(isSet(optionsToUpdate.start) ? optionsToUpdate.start : v, fireSetEvent); 40436 // Update connects only if it was set 40437 if (optionsToUpdate.connect) { 40438 updateConnectOption(); 40439 } 40440 } 40441 function updateConnectOption() { 40442 // IE supported way of removing children including event handlers 40443 while (scope_ConnectBase.firstChild) { 40444 scope_ConnectBase.removeChild(scope_ConnectBase.firstChild); 40445 } 40446 // Adding new connects according to the new connect options 40447 for (var i = 0; i <= options.handles; i++) { 40448 scope_Connects[i] = addConnect(scope_ConnectBase, options.connect[i]); 40449 updateConnect(i); 40450 } 40451 // re-adding drag events for the new connect elements 40452 // to ignore the other events we have to negate the 'if (!behaviour.fixed)' check 40453 bindSliderEvents({ drag: options.events.drag, fixed: true }); 40454 } 40455 // Invert options for connect handles 40456 function invertConnects() { 40457 scope_ConnectsInverted = !scope_ConnectsInverted; 40458 testConnect(options, 40459 // inverse the connect boolean array 40460 options.connect.map(function (b) { return !b; })); 40461 updateConnectOption(); 40462 } 40463 // Initialization steps 40464 function setupSlider() { 40465 // Create the base element, initialize HTML and set classes. 40466 // Add handles and connect elements. 40467 scope_Base = addSlider(scope_Target); 40468 addElements(options.connect, scope_Base); 40469 // Attach user events. 40470 bindSliderEvents(options.events); 40471 // Use the public value method to set the start values. 40472 valueSet(options.start); 40473 if (options.pips) { 40474 pips(options.pips); 40475 } 40476 if (options.tooltips) { 40477 tooltips(); 40478 } 40479 aria(); 40480 } 40481 setupSlider(); 40482 var scope_Self = { 40483 destroy: destroy, 40484 steps: getNextSteps, 40485 on: bindEvent, 40486 off: removeEvent, 40487 get: valueGet, 40488 set: valueSet, 40489 setHandle: valueSetHandle, 40490 reset: valueReset, 40491 disable: disable, 40492 enable: enable, 40493 // Exposed for unit testing, don't use this in your application. 40494 __moveHandles: function (upward, proposal, handleNumbers) { 40495 moveHandles(upward, proposal, scope_Locations, handleNumbers); 40496 }, 40497 options: originalOptions, 40498 updateOptions: updateOptions, 40499 target: scope_Target, 40500 removePips: removePips, 40501 removeTooltips: removeTooltips, 40502 getPositions: function () { 40503 return scope_Locations.slice(); 40504 }, 40505 getTooltips: function () { 40506 return scope_Tooltips; 40507 }, 40508 getOrigins: function () { 40509 return scope_Handles; 40510 }, 40511 pips: pips, // Issue #594 40512 }; 40513 return scope_Self; 40514 } 40515 // Run the standard initializer 40516 function initialize(target, originalOptions) { 40517 if (!target || !target.nodeName) { 40518 throw new Error("noUiSlider: create requires a single element, got: " + target); 40519 } 40520 // Throw an error if the slider was already initialized. 40521 if (target.noUiSlider) { 40522 throw new Error("noUiSlider: Slider was already initialized."); 40523 } 40524 // Test the options and create the slider environment; 40525 var options = testOptions(originalOptions); 40526 var api = scope(target, options, originalOptions); 40527 target.noUiSlider = api; 40528 return api; 40529 } 40530 var nouislider = { 40531 // Exposed for unit testing, don't use this in your application. 40532 __spectrum: Spectrum, 40533 // A reference to the default classes, allows global changes. 40534 // Use the cssClasses option for changes to one slider. 40535 cssClasses: cssClasses, 40536 create: initialize, 40537 }; 40538 40539 exports.create = initialize; 40540 exports.cssClasses = cssClasses; 40541 exports["default"] = nouislider; 40542 40543 Object.defineProperty(exports, '__esModule', { value: true }); 40544 40545}));
40546 40547},{}],78:[function(require,module,exports){ 40548arguments[4][40][0].apply(exports,arguments) 40549},{"dup":40,"ev-emitter":66,"get-size":68}],79:[function(require,module,exports){ 40550arguments[4][41][0].apply(exports,arguments) 40551},{"./item":78,"dup":41,"ev-emitter":66,"fizzy-ui-utils":67,"get-size":68}],80:[function(require,module,exports){ 40552(function(factory) { 40553 if (typeof define === "function" && define.amd) { 40554 // AMD. Register as an anonymous module. 40555 define([], factory); 40556 } else if (typeof exports === "object") { 40557 // Node/CommonJS 40558 module.exports = factory(); 40559 } else { 40560 // Browser globals 40561 window.wNumb = factory(); 40562 } 40563})(function() { 40564 "use strict"; 40565 40566 var FormatOptions = [ 40567 "decimals", 40568 "thousand", 40569 "mark", 40570 "prefix", 40571 "suffix", 40572 "encoder", 40573 "decoder", 40574 "negativeBefore", 40575 "negative", 40576 "edit", 40577 "undo" 40578 ]; 40579 40580 // General 40581 40582 // Reverse a string 40583 function strReverse(a) { 40584 return a 40585 .split("") 40586 .reverse() 40587 .join(""); 40588 } 40589 40590 // Check if a string starts with a specified prefix. 40591 function strStartsWith(input, match) { 40592 return input.substring(0, match.length) === match; 40593 } 40594 40595 // Check is a string ends in a specified suffix. 40596 function strEndsWith(input, match) { 40597 return input.slice(-1 * match.length) === match; 40598 } 40599 40600 // Throw an error if formatting options are incompatible.
vendor: 9,435 bytes, lines 40601-40946
40601 function throwEqualError(F, a, b) { 40602 if ((F[a] || F[b]) && F[a] === F[b]) { 40603 throw new Error(a); 40604 } 40605 } 40606 40607 // Check if a number is finite and not NaN 40608 function isValidNumber(input) { 40609 return typeof input === "number" && isFinite(input); 40610 } 40611 40612 // Provide rounding-accurate toFixed method. 40613 // Borrowed: http://stackoverflow.com/a/21323330/775265 40614 function toFixed(value, exp) { 40615 value = value.toString().split("e"); 40616 value = Math.round(+(value[0] + "e" + (value[1] ? +value[1] + exp : exp))); 40617 value = value.toString().split("e"); 40618 return (+(value[0] + "e" + (value[1] ? +value[1] - exp : -exp))).toFixed(exp); 40619 } 40620 40621 // Formatting 40622 40623 // Accept a number as input, output formatted string. 40624 function formatTo( 40625 decimals, 40626 thousand, 40627 mark, 40628 prefix, 40629 suffix, 40630 encoder, 40631 decoder, 40632 negativeBefore, 40633 negative, 40634 edit, 40635 undo, 40636 input 40637 ) { 40638 var originalInput = input, 40639 inputIsNegative, 40640 inputPieces, 40641 inputBase, 40642 inputDecimals = "", 40643 output = ""; 40644 40645 // Apply user encoder to the input. 40646 // Expected outcome: number. 40647 if (encoder) { 40648 input = encoder(input); 40649 } 40650 40651 // Stop if no valid number was provided, the number is infinite or NaN. 40652 if (!isValidNumber(input)) { 40653 return false; 40654 } 40655 40656 // Rounding away decimals might cause a value of -0 40657 // when using very small ranges. Remove those cases. 40658 if (decimals !== false && parseFloat(input.toFixed(decimals)) === 0) { 40659 input = 0; 40660 } 40661 40662 // Formatting is done on absolute numbers, 40663 // decorated by an optional negative symbol. 40664 if (input < 0) { 40665 inputIsNegative = true; 40666 input = Math.abs(input); 40667 } 40668 40669 // Reduce the number of decimals to the specified option. 40670 if (decimals !== false) { 40671 input = toFixed(input, decimals); 40672 } 40673 40674 // Transform the number into a string, so it can be split. 40675 input = input.toString(); 40676 40677 // Break the number on the decimal separator. 40678 if (input.indexOf(".") !== -1) { 40679 inputPieces = input.split("."); 40680 40681 inputBase = inputPieces[0]; 40682 40683 if (mark) { 40684 inputDecimals = mark + inputPieces[1]; 40685 } 40686 } else { 40687 // If it isn't split, the entire number will do. 40688 inputBase = input; 40689 } 40690 40691 // Group numbers in sets of three. 40692 if (thousand) { 40693 inputBase = strReverse(inputBase).match(/.{1,3}/g); 40694 inputBase = strReverse(inputBase.join(strReverse(thousand))); 40695 } 40696 40697 // If the number is negative, prefix with negation symbol. 40698 if (inputIsNegative && negativeBefore) { 40699 output += negativeBefore; 40700 } 40701 40702 // Prefix the number 40703 if (prefix) { 40704 output += prefix; 40705 } 40706 40707 // Normal negative option comes after the prefix. Defaults to '-'. 40708 if (inputIsNegative && negative) { 40709 output += negative; 40710 } 40711 40712 // Append the actual number. 40713 output += inputBase; 40714 output += inputDecimals; 40715 40716 // Apply the suffix. 40717 if (suffix) { 40718 output += suffix; 40719 } 40720 40721 // Run the output through a user-specified post-formatter. 40722 if (edit) { 40723 output = edit(output, originalInput); 40724 } 40725 40726 // All done. 40727 return output; 40728 } 40729 40730 // Accept a sting as input, output decoded number. 40731 function formatFrom( 40732 decimals, 40733 thousand, 40734 mark, 40735 prefix, 40736 suffix, 40737 encoder, 40738 decoder, 40739 negativeBefore, 40740 negative, 40741 edit, 40742 undo, 40743 input 40744 ) { 40745 var originalInput = input, 40746 inputIsNegative, 40747 output = ""; 40748 40749 // User defined pre-decoder. Result must be a non empty string. 40750 if (undo) { 40751 input = undo(input); 40752 } 40753 40754 // Test the input. Can't be empty. 40755 if (!input || typeof input !== "string") { 40756 return false; 40757 } 40758 40759 // If the string starts with the negativeBefore value: remove it. 40760 // Remember is was there, the number is negative. 40761 if (negativeBefore && strStartsWith(input, negativeBefore)) { 40762 input = input.replace(negativeBefore, ""); 40763 inputIsNegative = true; 40764 } 40765 40766 // Repeat the same procedure for the prefix. 40767 if (prefix && strStartsWith(input, prefix)) { 40768 input = input.replace(prefix, ""); 40769 } 40770 40771 // And again for negative. 40772 if (negative && strStartsWith(input, negative)) { 40773 input = input.replace(negative, ""); 40774 inputIsNegative = true; 40775 } 40776 40777 // Remove the suffix. 40778 // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice 40779 if (suffix && strEndsWith(input, suffix)) { 40780 input = input.slice(0, -1 * suffix.length); 40781 } 40782 40783 // Remove the thousand grouping. 40784 if (thousand) { 40785 input = input.split(thousand).join(""); 40786 } 40787 40788 // Set the decimal separator back to period. 40789 if (mark) { 40790 input = input.replace(mark, "."); 40791 } 40792 40793 // Prepend the negative symbol. 40794 if (inputIsNegative) { 40795 output += "-"; 40796 } 40797 40798 // Add the number 40799 output += input; 40800 40801 // Trim all non-numeric characters (allow '.' and '-'); 40802 output = output.replace(/[^0-9\.\-.]/g, ""); 40803 40804 // The value contains no parse-able number. 40805 if (output === "") { 40806 return false; 40807 } 40808 40809 // Covert to number. 40810 output = Number(output); 40811 40812 // Run the user-specified post-decoder. 40813 if (decoder) { 40814 output = decoder(output); 40815 } 40816 40817 // Check is the output is valid, otherwise: return false. 40818 if (!isValidNumber(output)) { 40819 return false; 40820 } 40821 40822 return output; 40823 } 40824 40825 // Framework 40826 40827 // Validate formatting options 40828 function validate(inputOptions) { 40829 var i, 40830 optionName, 40831 optionValue, 40832 filteredOptions = {}; 40833 40834 if (inputOptions["suffix"] === undefined) { 40835 inputOptions["suffix"] = inputOptions["postfix"]; 40836 } 40837 40838 for (i = 0; i < FormatOptions.length; i += 1) { 40839 optionName = FormatOptions[i]; 40840 optionValue = inputOptions[optionName]; 40841 40842 if (optionValue === undefined) { 40843 // Only default if negativeBefore isn't set. 40844 if (optionName === "negative" && !filteredOptions.negativeBefore) { 40845 filteredOptions[optionName] = "-"; 40846 // Don't set a default for mark when 'thousand' is set. 40847 } else if (optionName === "mark" && filteredOptions.thousand !== ".") { 40848 filteredOptions[optionName] = "."; 40849 } else { 40850 filteredOptions[optionName] = false; 40851 } 40852 40853 // Floating points in JS are stable up to 7 decimals. 40854 } else if (optionName === "decimals") { 40855 if (optionValue >= 0 && optionValue < 8) { 40856 filteredOptions[optionName] = optionValue; 40857 } else { 40858 throw new Error(optionName); 40859 } 40860 40861 // These options, when provided, must be functions. 40862 } else if ( 40863 optionName === "encoder" || 40864 optionName === "decoder" || 40865 optionName === "edit" || 40866 optionName === "undo" 40867 ) { 40868 if (typeof optionValue === "function") { 40869 filteredOptions[optionName] = optionValue; 40870 } else { 40871 throw new Error(optionName); 40872 } 40873 40874 // Other options are strings. 40875 } else { 40876 if (typeof optionValue === "string") { 40877 filteredOptions[optionName] = optionValue; 40878 } else { 40879 throw new Error(optionName); 40880 } 40881 } 40882 } 40883 40884 // Some values can't be extracted from a 40885 // string if certain combinations are present. 40886 throwEqualError(filteredOptions, "mark", "thousand"); 40887 throwEqualError(filteredOptions, "prefix", "negative"); 40888 throwEqualError(filteredOptions, "prefix", "negativeBefore"); 40889 40890 return filteredOptions; 40891 } 40892 40893 // Pass all options as function arguments 40894 function passAll(options, method, input) { 40895 var i, 40896 args = []; 40897 40898 // Add all options in order of FormatOptions 40899 for (i = 0; i < FormatOptions.length; i += 1) { 40900 args.push(options[FormatOptions[i]]); 40901 } 40902 40903 // Append the input, then call the method, presenting all 40904 // options as arguments. 40905 args.push(input); 40906 return method.apply("", args); 40907 } 40908 40909 function wNumb(options) { 40910 if (!(this instanceof wNumb)) { 40911 return new wNumb(options); 40912 } 40913 40914 if (typeof options !== "object") { 40915 return; 40916 } 40917 40918 options = validate(options); 40919 40920 // Call 'formatTo' with proper arguments. 40921 this.to = function(input) { 40922 return passAll(options, formatTo, input); 40923 }; 40924 40925 // Call 'formatFrom' with proper arguments. 40926 this.from = function(input) { 40927 return passAll(options, formatFrom, input); 40928 }; 40929 } 40930 40931 return wNumb; 40932}); 40933 40934},{}],81:[function(require,module,exports){ 40935"use strict"; 40936 40937var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 40938Object.defineProperty(exports, "__esModule", { 40939 value: true 40940}); 40941exports.WcoMediaconsent = void 0; 40942var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); 40943var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); 40944var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); 40945var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); 40946var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/
40946defineProperty")); 40947var WcoMediaconsent = exports.WcoMediaconsent = /*#__PURE__*/function () { 40948 function WcoMediaconsent() { 40949 (0, _classCallCheck2["default"])(this, WcoMediaconsent); 40950 } 40951 return (0, _createClass2["default"])(WcoMediaconsent, [{ 40952 key: "initialize", 40953 value: function initialize() { 40954 document.querySelectorAll(".mediaconsent_activate__btn").forEach(function (elem) { 40955 elem.addEventListener("click", function () { 40956 elem.querySelector(".spinner").classList.remove("d-none"); 40957 var $mediaconsent__wrapper = elem.closest('.mediaconsent__wrapper'); 40958 // Walk over list of items matching the type in attr('data-mctype') 40959 var mcType = $mediaconsent__wrapper.getAttribute('data-mctype'); 40960 var selector = '.mediaconsent__wrapper[data-mctype="' + mcType + '"]'; 40961 40962 // Neuen globalen Controller erstellen 40963 WcoMediaconsent.globalController = new AbortController(); 40964 document.querySelectorAll(selector).forEach(function (elem) { 40965 WcoMediaconsent.fireEvent(mcType); 40966 WcoMediaconsent.reloadItem(elem); 40967 }); 40968 }); 40969 }); 40970 var consent = document.querySelector('input[name="mediaconsent_consent"]'); 40971 if (consent && consent.value === "1") { 40972 WcoMediaconsent.fireEvent(consent.dataset.provider); 40973 } 40974 } 40975 }], [{ 40976 key: "fireEvent", 40977 value: function fireEvent(mcType) { 40978 var event = document.createEvent('Event'); 40979 event.initEvent('wco-mediaconsent-accepted', [mcType]); 40980 document.dispatchEvent(event); 40981 } 40982 }, { 40983 key: "reloadItem", 40984 value: function () { 40985 var _reloadItem = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(item) { 40986 return _regenerator["default"].wrap(function (_context) { 40987 while (1) switch (_context.prev = _context.next) { 40988 case 0: 40989 if (item.getAttribute('data-rld-page') === "0") { 40990 fetch(item.getAttribute('data-mcuri')).then(function (data) { 40991 return data.text(); 40992 }).then(function (data) { 40993 item.addEventListener('click', function (event) { 40994 event.stopImmediatePropagation(); 40995 }, true); 40996 item.parentNode.innerHTML = data; 40997 })["catch"](function (error) {}); 40998 } else { 40999 fetch(item.getAttribute('data-mcuri'), { 41000 signal: WcoMediaconsent.globalController.signal 41001 }).then(function (data) { 41002 // Alle anderen Requests abbrechen 41003 WcoMediaconsent.globalController.abort(); 41004 item.addEventListener('click', function (event) { 41005 event.stopImmediatePropagation(); 41006 }, true); 41007 window.location.reload(); 41008 })["catch"](function (error) {}); 41009 } 41010 case 1: 41011 case "end": 41012 return _context.stop(); 41013 } 41014 }, _callee); 41015 })); 41016 function reloadItem(_x) { 41017 return _reloadItem.apply(this, arguments); 41018 } 41019 return reloadItem; 41020 }() 41021 }]); 41022}(); 41023// Globaler AbortController für alle Requests 41024(0, _defineProperty2["default"])(WcoMediaconsent, "globalController", null); 41025 41026},{"@babel/runtime/helpers/asyncToGenerator":82,"@babel/runtime/helpers/classCallCheck":83,"@babel/runtime/helpers/createClass":84,"@babel/runtime/helpers/defineProperty":85,"@babel/runtime/helpers/interopRequireDefault":86,"@babel/runtime/regenerator":91}],82:[function(require,module,exports){ 41027function asyncGeneratorStep(n, t, e, r, o, a, c) { 41028 try { 41029 var i = n[a](c), 41030 u = i.value; 41031 } catch (n) { 41032 return void e(n); 41033 } 41034 i.done ? t(u) : Promise.resolve(u).then(r, o); 41035} 41036function _asyncToGenerator(n) { 41037 return function () { 41038 var t = this, 41039 e = arguments; 41040 return new Promise(function (r, o) { 41041 var a = n.apply(t, e); 41042 function _next(n) { 41043 asyncGeneratorStep(a, r, o, _next, _throw, "next", n); 41044 } 41045 function _throw(n) { 41046 asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); 41047 } 41048 _next(void 0); 41049 }); 41050 }; 41051} 41052module.exports = _asyncToGenerator, module.exports.__esModule = true, module.exports["default"] = module.exports; 41053},{}],83:[function(require,module,exports){ 41054arguments[4][13][0].apply(exports,arguments) 41055},{"dup":13}],84:[function(require,module,exports){ 41056arguments[4][14][0].apply(exports,arguments) 41057},{"./toPropertyKey.js":89,"dup":14}],85:[function(require,module,exports){ 41058arguments[4][15][0].apply(exports,arguments) 41059},{"./toPropertyKey.js":89,"dup":15}],86:[function(require,module,exports){ 41060arguments[4][19][0].apply(exports,arguments) 41061},{"dup":19}],87:[function(require,module,exports){ 41062var _typeof = require("./typeof.js")["default"]; 41063function _regeneratorRuntime() { 41064 "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ 41065 module.exports = _regeneratorRuntime = function _regeneratorRuntime() { 41066 return r; 41067 }, module.exports.__esModule = true, module.exports["default"] = module.exports; 41068 var t, 41069 r = {}, 41070 e = Object.prototype, 41071 n = e.hasOwnProperty, 41072 o = "function" == typeof Symbol ? Symbol : {}, 41073 i = o.iterator || "@@iterator", 41074 a = o.asyncIterator || "@@asyncIterator", 41075 u = o.toStringTag || "@@toStringTag"; 41076 function c(t, r, e, n) { 41077 return Object.defineProperty(t, r, { 41078 value: e, 41079 enumerable: !n, 41080 configurable: !n, 41081 writable: !n 41082 }); 41083 } 41084 try { 41085 c({}, ""); 41086 } catch (t) { 41087 c = function c(t, r, e) { 41088 return t[r] = e; 41089 }; 41090 } 41091 function h(r, e, n, o) { 41092 var i = e && e.prototype instanceof Generator ? e : Generator, 41093 a = Object.create(i.prototype); 41094 return c(a, "_invoke", function (r, e, n) { 41095 var o = 1; 41096 return function (i, a) { 41097 if (3 === o) throw Error("Generator is already running"); 41098 if (4 === o) { 41099 if ("throw" === i) throw a; 41100 return { 41101 value: t, 41102 done: !0 41103 }; 41104 } 41105 for (n.method = i, n.arg = a;;) { 41106 var u = n.delegate; 41107 if (u) { 41108 var c = d(u, n); 41109 if (c) { 41110 if (c === f) continue; 41111 return c; 41112 } 41113 } 41114 if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) {
41115 if (1 === o) throw o = 4, n.arg; 41116 n.dispatchException(n.arg); 41117 } else "return" === n.method && n.abrupt("return", n.arg); 41118 o = 3; 41119 var h = s(r, e, n); 41120 if ("normal" === h.type) { 41121 if (o = n.done ? 4 : 2, h.arg === f) continue; 41122 return { 41123 value: h.arg, 41124 done: n.done 41125 }; 41126 } 41127 "throw" === h.type && (o = 4, n.method = "throw", n.arg = h.arg); 41128 } 41129 }; 41130 }(r, n, new Context(o || [])), !0), a; 41131 } 41132 function s(t, r, e) { 41133 try { 41134 return { 41135 type: "normal", 41136 arg: t.call(r, e) 41137 }; 41138 } catch (t) { 41139 return { 41140 type: "throw", 41141 arg: t 41142 }; 41143 } 41144 } 41145 r.wrap = h; 41146 var f = {}; 41147 function Generator() {} 41148 function GeneratorFunction() {} 41149 function GeneratorFunctionPrototype() {} 41150 var l = {}; 41151 c(l, i, function () { 41152 return this; 41153 }); 41154 var p = Object.getPrototypeOf, 41155 y = p && p(p(x([]))); 41156 y && y !== e && n.call(y, i) && (l = y); 41157 var v = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(l); 41158 function g(t) { 41159 ["next", "throw", "return"].forEach(function (r) { 41160 c(t, r, function (t) { 41161 return this._invoke(r, t); 41162 }); 41163 }); 41164 } 41165 function AsyncIterator(t, r) { 41166 function e(o, i, a, u) { 41167 var c = s(t[o], t, i); 41168 if ("throw" !== c.type) { 41169 var h = c.arg, 41170 f = h.value; 41171 return f && "object" == _typeof(f) && n.call(f, "__await") ? r.resolve(f.__await).then(function (t) { 41172 e("next", t, a, u); 41173 }, function (t) { 41174 e("throw", t, a, u); 41175 }) : r.resolve(f).then(function (t) { 41176 h.value = t, a(h); 41177 }, function (t) { 41178 return e("throw", t, a, u); 41179 }); 41180 } 41181 u(c.arg); 41182 } 41183 var o; 41184 c(this, "_invoke", function (t, n) { 41185 function i() { 41186 return new r(function (r, o) { 41187 e(t, n, r, o); 41188 }); 41189 } 41190 return o = o ? o.then(i, i) : i(); 41191 }, !0); 41192 } 41193 function d(r, e) { 41194 var n = e.method, 41195 o = r.i[n]; 41196 if (o === t) return e.delegate = null, "throw" === n && r.i["return"] && (e.method = "return", e.arg = t, d(r, e), "throw" === e.method) || "return" !== n && (e.method = "throw", e.arg = new TypeError("The iterator does not provide a '" + n + "' method")), f; 41197 var i = s(o, r.i, e.arg); 41198 if ("throw" === i.type) return e.method = "throw", e.arg = i.arg, e.delegate = null, f; 41199 var a = i.arg; 41200 return a ? a.done ? (e[r.r] = a.value, e.next = r.n, "return" !== e.method && (e.method = "next", e.arg = t), e.delegate = null, f) : a : (e.method = "throw", e.arg = new TypeError("iterator result is not an object"), e.delegate = null, f); 41201 } 41202 function w(t) { 41203 this.tryEntries.push(t); 41204 } 41205 function m(r) { 41206 var e = r[4] || {}; 41207 e.type = "normal", e.arg = t, r[4] = e; 41208 } 41209 function Context(t) { 41210 this.tryEntries = [[-1]], t.forEach(w, this), this.reset(!0); 41211 } 41212 function x(r) { 41213 if (null != r) { 41214 var e = r[i]; 41215 if (e) return e.call(r); 41216 if ("function" == typeof r.next) return r; 41217 if (!isNaN(r.length)) { 41218 var o = -1, 41219 a = function e() { 41220 for (; ++o < r.length;) if (n.call(r, o)) return e.value = r[o], e.done = !1, e; 41221 return e.value = t, e.done = !0, e; 41222 }; 41223 return a.next = a; 41224 } 41225 } 41226 throw new TypeError(_typeof(r) + " is not iterable"); 41227 } 41228 return GeneratorFunction.prototype = GeneratorFunctionPrototype, c(v, "constructor", GeneratorFunctionPrototype), c(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = c(GeneratorFunctionPrototype, u, "GeneratorFunction"), r.isGeneratorFunction = function (t) { 41229 var r = "function" == typeof t && t.constructor; 41230 return !!r && (r === GeneratorFunction || "GeneratorFunction" === (r.displayName || r.name)); 41231 }, r.mark = function (t) { 41232 return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, c(t, u, "GeneratorFunction")), t.prototype = Object.create(v), t; 41233 }, r.awrap = function (t) { 41234 return { 41235 __await: t 41236 }; 41237 }, g(AsyncIterator.prototype), c(AsyncIterator.prototype, a, function () { 41238 return this; 41239 }), r.AsyncIterator = AsyncIterator, r.async = function (t, e, n, o, i) { 41240 void 0 === i && (i = Promise); 41241 var a = new AsyncIterator(h(t, e, n, o), i); 41242 return r.isGeneratorFunction(e) ? a : a.next().then(function (t) { 41243 return t.done ? t.value : a.next(); 41244 }); 41245 }, g(v), c(v, u, "Generator"), c(v, i, function () { 41246 return this; 41247 }), c(v, "toString", function () { 41248 return "[object Generator]"; 41249 }), r.keys = function (t) { 41250 var r = Object(t), 41251 e = []; 41252 for (var n in r) e.unshift(n); 41253 return function t() { 41254 for (; e.length;) if ((n = e.pop()) in r) return t.value = n, t.done = !1, t; 41255 return t.done = !0, t; 41256 }; 41257 }, r.values = x, Context.prototype = { 41258 constructor: Context, 41259 reset: function reset(r) { 41260 if (this.prev = this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEac
41260h(m), !r) for (var e in this) "t" === e.charAt(0) && n.call(this, e) && !isNaN(+e.slice(1)) && (this[e] = t); 41261 }, 41262 stop: function stop() { 41263 this.done = !0; 41264 var t = this.tryEntries[0][4]; 41265 if ("throw" === t.type) throw t.arg; 41266 return this.rval; 41267 }, 41268 dispatchException: function dispatchException(r) { 41269 if (this.done) throw r; 41270 var e = this; 41271 function n(t) { 41272 a.type = "throw", a.arg = r, e.next = t; 41273 } 41274 for (var o = e.tryEntries.length - 1; o >= 0; --o) { 41275 var i = this.tryEntries[o], 41276 a = i[4], 41277 u = this.prev, 41278 c = i[1], 41279 h = i[2]; 41280 if (-1 === i[0]) return n("end"), !1; 41281 if (!c && !h) throw Error("try statement without catch or finally"); 41282 if (null != i[0] && i[0] <= u) { 41283 if (u < c) return this.method = "next", this.arg = t, n(c), !0; 41284 if (u < h) return n(h), !1; 41285 } 41286 } 41287 }, 41288 abrupt: function abrupt(t, r) { 41289 for (var e = this.tryEntries.length - 1; e >= 0; --e) { 41290 var n = this.tryEntries[e]; 41291 if (n[0] > -1 && n[0] <= this.prev && this.prev < n[2]) { 41292 var o = n; 41293 break; 41294 } 41295 } 41296 o && ("break" === t || "continue" === t) && o[0] <= r && r <= o[2] && (o = null); 41297 var i = o ? o[4] : {}; 41298 return i.type = t, i.arg = r, o ? (this.method = "next", this.next = o[2], f) : this.complete(i); 41299 }, 41300 complete: function complete(t, r) { 41301 if ("throw" === t.type) throw t.arg; 41302 return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && r && (this.next = r), f; 41303 }, 41304 finish: function finish(t) { 41305 for (var r = this.tryEntries.length - 1; r >= 0; --r) { 41306 var e = this.tryEntries[r]; 41307 if (e[2] === t) return this.complete(e[4], e[3]), m(e), f; 41308 } 41309 }, 41310 "catch": function _catch(t) { 41311 for (var r = this.tryEntries.length - 1; r >= 0; --r) { 41312 var e = this.tryEntries[r]; 41313 if (e[0] === t) { 41314 var n = e[4]; 41315 if ("throw" === n.type) { 41316 var o = n.arg; 41317 m(e); 41318 } 41319 return o; 41320 } 41321 } 41322 throw Error("illegal catch attempt"); 41323 }, 41324 delegateYield: function delegateYield(r, e, n) { 41325 return this.delegate = { 41326 i: x(r), 41327 r: e, 41328 n: n 41329 }, "next" === this.method && (this.arg = t), f; 41330 } 41331 }, r; 41332} 41333module.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports["default"] = module.exports; 41334},{"./typeof.js":90}],88:[function(require,module,exports){ 41335arguments[4][23][0].apply(exports,arguments) 41336},{"./typeof.js":90,"dup":23}],89:[function(require,module,exports){ 41337arguments[4][24][0].apply(exports,arguments) 41338},{"./toPrimitive.js":88,"./typeof.js":90,"dup":24}],90:[function(require,module,exports){ 41339arguments[4][25][0].apply(exports,arguments) 41340},{"dup":25}],91:[function(require,module,exports){ 41341// TODO(Babel 8): Remove this file. 41342 41343var runtime = require("../helpers/regeneratorRuntime")(); 41344module.exports = runtime; 41345 41346// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736= 41347try { 41348 regeneratorRuntime = runtime; 41349} catch (accidentalStrictMode) { 41350 if (typeof globalThis === "object") { 41351 globalThis.regeneratorRuntime = runtime; 41352 } else { 41353 Function("r", "regeneratorRuntime = r")(runtime); 41354 } 41355} 41356 41357},{"../helpers/regeneratorRuntime":87}],92:[function(require,module,exports){ 41358"use strict"; 41359 41360var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 41361var _typeof = require("@babel/runtime/helpers/typeof"); 41362Object.defineProperty(exports, "__esModule", { 41363 value: true 41364}); 41365exports.WcoSwiperSlider = exports.Swiper = void 0; 41366var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); 41367var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); 41368var SwiperModule = _interopRequireWildcard(require("swiper/swiper-bundle.mjs")); 41369function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esMo
41369dule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } 41370var Swiper = exports.Swiper = SwiperModule.Swiper || SwiperModule["default"]; 41371var WcoSwiperSlider = exports.WcoSwiperSlider = /*#__PURE__*/function () { 41372 /** 41373 * 41374 * @param queryString {string} 41375 * @param config {object} 41376 */ 41377 function WcoSwiperSlider(queryString, config) { 41378 (0, _classCallCheck2["default"])(this, WcoSwiperSlider); 41379 this.queryString = queryString; 41380 this.config = config; 41381 this.Swiper = Swiper; 41382 } 41383 return (0, _createClass2["default"])(WcoSwiperSlider, [{ 41384 key: "initialize", 41385 value: function initialize() { 41386 var _this = this; 41387 document.addEventListener("DOMContentLoaded", function () { 41388 if (typeof Swiper !== 'function') { 41389 console.error('Swiper constructor not found!', SwiperModule); 41390 return; 41391 } 41392 _this.slider = new Swiper(_this.queryString, _this.config); 41393 }); 41394 } 41395 }]); 41396}(); 41397 41398},{"@babel/runtime/helpers/classCallCheck":96,"@babel/runtime/helpers/createClass":97,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/typeof":108,"swiper/swiper-bundle.mjs":142}],93:[function(require,module,exports){ 41399function _arrayLikeToArray(r, a) { 41400 (null == a || a > r.length) && (a = r.length); 41401 for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; 41402 return n; 41403} 41404module.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; 41405},{}],94:[function(require,module,exports){ 41406function _arrayWithHoles(r) { 41407 if (Array.isArray(r)) return r; 41408} 41409module.exports = _arrayWithHoles, module.exports.__esModule = true, module.exports["default"] = module.exports; 41410},{}],95:[function(require,module,exports){ 41411var arrayLikeToArray = require("./arrayLikeToArray.js"); 41412function _arrayWithoutHoles(r) { 41413 if (Array.isArray(r)) return arrayLikeToArray(r); 41414} 41415module.exports = _arrayWithoutHoles, module.exports.__esModule = true, module.exports["default"] = module.exports; 41416},{"./arrayLikeToArray.js":93}],96:[function(require,module,exports){ 41417arguments[4][13][0].apply(exports,arguments) 41418},{"dup":13}],97:[function(require,module,exports){ 41419arguments[4][14][0].apply(exports,arguments) 41420},{"./toPropertyKey.js":107,"dup":14}],98:[function(require,module,exports){ 41421arguments[4][15][0].apply(exports,arguments) 41422},{"./toPropertyKey.js":107,"dup":15}],99:[function(require,module,exports){ 41423arguments[4][19][0].apply(exports,arguments) 41424},{"dup":19}],100:[function(require,module,exports){ 41425function _iterableToArray(r) { 41426 if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); 41427} 41428module.exports = _iterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; 41429},{}],101:[function(require,module,exports){ 41430function _iterableToArrayLimit(r, l) { 41431 var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; 41432 if (null != t) { 41433 var e, 41434 n, 41435 i, 41436 u, 41437 a = [], 41438 f = !0, 41439 o = !1; 41440 try { 41441 if (i = (t = t.call(r)).next, 0 === l) { 41442 if (Object(t) !== t) return; 41443 f = !1; 41444 } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); 41445 } catch (r) { 41446 o = !0, n = r; 41447 } finally { 41448 try { 41449 if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; 41450 } finally { 41451 if (o) throw n; 41452 } 41453 } 41454 return a; 41455 } 41456} 41457module.exports = _iterableToArrayLimit, module.exports.__esModule = true, module.exports["default"] = module.exports; 41458},{}],102:[function(require,module,exports){ 41459function _nonIterableRest() { 41460 throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); 41461} 41462module.exports = _nonIterableRest, module.exports.__esModule = true, module.exports["default"] = module.exports; 41463},{}],103:[function(require,module,exports){ 41464function _nonIterableSpread() { 41465 throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); 41466} 41467module.exports = _nonIterableSpread, module.exports.__esModule = true, module.exports["default"] = module.exports; 41468},{}],104:[function(require,module,exports){ 41469var arrayWithHoles = require("./arrayWithHoles.js"); 41470var iterableToArrayLimit = require("./iterableToArrayLimit.js"); 41471var unsupportedIterableToArray = require("./unsupportedIterableToArray.js"); 41472var nonIterableRest = require("./nonIterableRest.js"); 41473function _slicedToArray(r, e) { 41474 return arrayWithHoles(r) || iterableToArrayLimit(r, e) || unsupportedIterableToArray(r, e) || nonIterableRest(); 41475} 41476module.exports = _slicedToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; 41477},{"./arrayWithHoles.js":94,"./iterableToArrayLimit.js":101,"./nonIterableRest.js":102,"./unsupportedIterableToArray.js":109}],105:[function(require,module,exports){ 41478var arrayWithoutHoles = require("./arrayWithoutHoles.js"); 41479var iterableToArray = require("./iterableToArray.js"); 41480var unsupportedIterableToArray = require("./unsupportedIterableToArray.js"); 41481var nonIterableSpread = require("./nonIterableSpread.js"); 41482function _toConsumableArray(r) { 41483 return arrayWithoutHoles(r) || iterableToArray(r) || unsupportedIterableToArray(r) || nonIterableSpread(); 41484} 41485module.exports = _toConsumableArray, module.exports.__esModule = true, module.exports["default"] = module.exports; 41486},{"./arrayWithoutHoles.js":95,"./iterableToArray.js":100,"./nonIterableSpread.js":103,"./unsupportedIterableToArray.js":109}],106:[function(require,module,exports){ 41487arguments[4][23][0].apply(exports,arguments) 41488},{"./typeof.js":108,"dup":23}],107:[function(require,module,exports){ 41489arguments[4][24][0].apply(exports,arguments) 41490},{"./toPrimitive.js":106,"./typeof.js":108,"dup":24}],108:[function(require,module,exports){ 41491arguments[4][25][0].apply(exports,arguments) 41492},{"dup":25}],109:[function(require,module,exports){ 41493var arrayLikeToArray = require("./arrayLikeToArray.js"); 41494function _unsupportedIterableToArray(r, a) { 41495 if (r) { 41496 if ("string" == typeof r) return arrayLikeToArray(r, a); 41497 var t = {}.toString.call(r).slice(8, -1); 41498 return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? arrayLikeToArray(r, a) : void 0; 41499 } 41500} 41501module.exports = _unsupportedIterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; 41502},{"./arrayLikeToArray.js":93}],110:[function(require,module,exports){ 41503"use strict"; 41504 41505Object.defineProperty(exports, "__esModule", { 41506 value: true 41507}); 41508exports["default"] = A11y; 41509var _ssrWindowEsm = require("../shared/ssr-window.esm.mjs"); 41510var _classesToSelector = require("../shared/classes-to-selector.mjs"); 41511var _utils = require("../shared/utils.mjs"); 41512function A11y(_ref) { 41513 var swiper = _ref.swiper, 41514 extendParams = _ref.extendParams, 41515 on = _ref.on; 41516 extendParams({ 41517 a11y: { 41518 enabled: true, 41519 notificationClass: 'swiper-notification', 41520 prevSlideMessage: 'Previous slide', 41521 nextSlideMessage: 'Next slide', 41522 firstSlideMessage: 'This is the first slide', 41523 lastSlideMessage: 'This is the last slide', 41524 paginationBulletMessage: 'Go to slide {{index}}', 41525 slideLabelMessage: '{{index}} / {{slidesLength}}', 41526 containerMessage: null, 41527 containerRoleDescriptionMessage: null, 41528 containerRole: null, 41529 itemRoleDescriptionMessage: null, 41530 slideRole: 'group', 41531 id: null, 41532 scrollOnFocus: true, 41533 wrapperLiveRegion: true 41534 } 41535 }); 41536 swiper.a11y = {
41537 clicked: false 41538 }; 41539 var liveRegion = null; 41540 var preventFocusHandler; 41541 var focusTargetSlideEl; 41542 var visibilityChangedTimestamp = new Date().getTime(); 41543 function notify(message) { 41544 var notification = liveRegion; 41545 if (notification.length === 0) return; 41546 (0, _utils.s)(notification, message); 41547 } 41548 function getRandomNumber() { 41549 var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 16; 41550 var randomChar = function randomChar() { 41551 return Math.round(16 * Math.random()).toString(16); 41552 }; 41553 return 'x'.repeat(size).replace(/x/g, randomChar); 41554 } 41555 function makeElFocusable(el) { 41556 el = (0, _utils.m)(el); 41557 el.forEach(function (subEl) { 41558 subEl.setAttribute('tabIndex', '0'); 41559 }); 41560 } 41561 function makeElNotFocusable(el) { 41562 el = (0, _utils.m)(el); 41563 el.forEach(function (subEl) { 41564 subEl.setAttribute('tabIndex', '-1'); 41565 }); 41566 } 41567 function addElRole(el, role) { 41568 el = (0, _utils.m)(el); 41569 el.forEach(function (subEl) { 41570 subEl.setAttribute('role', role); 41571 }); 41572 } 41573 function addElRoleDescription(el, description) { 41574 el = (0, _utils.m)(el); 41575 el.forEach(function (subEl) { 41576 subEl.setAttribute('aria-roledescription', description); 41577 }); 41578 } 41579 function addElLabel(el, label) { 41580 el = (0, _utils.m)(el); 41581 el.forEach(function (subEl) { 41582 subEl.setAttribute('aria-label', label); 41583 }); 41584 } 41585 function addElId(el, id) { 41586 el = (0, _utils.m)(el); 41587 el.forEach(function (subEl) { 41588 subEl.setAttribute('id', id); 41589 }); 41590 } 41591 function addElLive(el, live) { 41592 el = (0, _utils.m)(el); 41593 el.forEach(function (subEl) { 41594 subEl.setAttribute('aria-live', live); 41595 }); 41596 } 41597 function disableEl(el) { 41598 el = (0, _utils.m)(el); 41599 el.forEach(function (subEl) { 41600 subEl.setAttribute('aria-disabled', true); 41601 }); 41602 } 41603 function enableEl(el) { 41604 el = (0, _utils.m)(el); 41605 el.forEach(function (subEl) { 41606 subEl.removeAttribute('aria-disabled'); 41607 }); 41608 } 41609 function onEnterOrSpaceKey(e) { 41610 if (e.keyCode !== 13 && e.keyCode !== 32) return; 41611 var params = swiper.params.a11y; 41612 var targetEl = e.target; 41613 if (swiper.pagination && swiper.pagination.el && (targetEl === swiper.pagination.el || swiper.pagination.el.contains(e.target))) { 41614 if (!e.target.matches((0, _classesToSelector.c)(swiper.params.pagination.bulletClass))) return; 41615 } 41616 if (swiper.navigation && swiper.navigation.prevEl && swiper.navigation.nextEl) { 41617 var prevEls = (0, _utils.m)(swiper.navigation.prevEl); 41618 var nextEls = (0, _utils.m)(swiper.navigation.nextEl); 41619 if (nextEls.includes(targetEl)) { 41620 if (!(swiper.isEnd && !swiper.params.loop)) { 41621 swiper.slideNext(); 41622 } 41623 if (swiper.isEnd) { 41624 notify(params.lastSlideMessage); 41625 } else { 41626 notify(params.nextSlideMessage); 41627 } 41628 } 41629 if (prevEls.includes(targetEl)) { 41630 if (!(swiper.isBeginning && !swiper.params.loop)) { 41631 swiper.slidePrev(); 41632 } 41633 if (swiper.isBeginning) { 41634 notify(params.firstSlideMessage); 41635 } else { 41636 notify(params.prevSlideMessage); 41637 } 41638 } 41639 } 41640 if (swiper.pagination && targetEl.matches((0, _classesToSelector.c)(swiper.params.pagination.bulletClass))) { 41641 targetEl.click(); 41642 } 41643 } 41644 function updateNavigation() { 41645 if (swiper.params.loop || swiper.params.rewind || !swiper.navigation) return; 41646 var _swiper$navigation = swiper.navigation, 41647 nextEl = _swiper$navigation.nextEl, 41648 prevEl = _swiper$navigation.prevEl; 41649 if (prevEl) { 41650 if (swiper.isBeginning) { 41651 disableEl(prevEl); 41652 makeElNotFocusable(prevEl); 41653 } else { 41654 enableEl(prevEl); 41655 makeElFocusable(prevEl); 41656 } 41657 } 41658 if (nextEl) { 41659 if (swiper.isEnd) { 41660 disableEl(nextEl); 41661 makeElNotFocusable(nextEl); 41662 } else { 41663 enableEl(nextEl); 41664 makeElFocusable(nextEl); 41665 } 41666 } 41667 } 41668 function hasPagination() { 41669 return swiper.pagination && swiper.pagination.bullets && swiper.pagination.bullets.length; 41670 } 41671 function hasClickablePagination() { 41672 return hasPagination() && swiper.params.pagination.clickable; 41673 } 41674 function updatePagination() { 41675 var params = swiper.params.a11y; 41676 if (!hasPagination()) return;
41677 swiper.pagination.bullets.forEach(function (bulletEl) { 41678 if (swiper.params.pagination.clickable) { 41679 makeElFocusable(bulletEl); 41680 if (!swiper.params.pagination.renderBullet) { 41681 addElRole(bulletEl, 'button'); 41682 addElLabel(bulletEl, params.paginationBulletMessage.replace(/\{\{index\}\}/, (0, _utils.j)(bulletEl) + 1)); 41683 } 41684 } 41685 if (bulletEl.matches((0, _classesToSelector.c)(swiper.params.pagination.bulletActiveClass))) { 41686 bulletEl.setAttribute('aria-current', 'true'); 41687 } else { 41688 bulletEl.removeAttribute('aria-current'); 41689 } 41690 }); 41691 } 41692 var initNavEl = function initNavEl(el, wrapperId, message) { 41693 makeElFocusable(el); 41694 if (el.tagName !== 'BUTTON') { 41695 addElRole(el, 'button'); 41696 el.addEventListener('keydown', onEnterOrSpaceKey); 41697 } 41698 addElLabel(el, message); 41699 }; 41700 var handlePointerDown = function handlePointerDown(e) { 41701 if (focusTargetSlideEl && focusTargetSlideEl !== e.target && !focusTargetSlideEl.contains(e.target)) { 41702 preventFocusHandler = true; 41703 } 41704 swiper.a11y.clicked = true; 41705 }; 41706 var handlePointerUp = function handlePointerUp() { 41707 preventFocusHandler = false; 41708 requestAnimationFrame(function () { 41709 requestAnimationFrame(function () { 41710 if (!swiper.destroyed) { 41711 swiper.a11y.clicked = false; 41712 } 41713 }); 41714 }); 41715 }; 41716 var onVisibilityChange = function onVisibilityChange(e) { 41717 visibilityChangedTimestamp = new Date().getTime(); 41718 }; 41719 var handleFocus = function handleFocus(e) { 41720 if (swiper.a11y.clicked || !swiper.params.a11y.scrollOnFocus) return; 41721 if (new Date().getTime() - visibilityChangedTimestamp < 100) return; 41722 var slideEl = e.target.closest(".".concat(swiper.params.slideClass, ", swiper-slide")); 41723 if (!slideEl || !swiper.slides.includes(slideEl)) return; 41724 focusTargetSlideEl = slideEl; 41725 var isVirtual = swiper.virtual && swiper.params.virtual.enabled; 41726 var isActive = (isVirtual ? parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10) : swiper.slides.indexOf(slideEl)) === swiper.activeIndex; 41727 var isVisible = swiper.params.watchSlidesProgress && swiper.visibleSlides && swiper.visibleSlides.includes(slideEl); 41728 if (isActive || isVisible) return; 41729 if (e.sourceCapabilities && e.sourceCapabilities.firesTouchEvents) return; 41730 if (swiper.isHorizontal()) { 41731 swiper.el.scrollLeft = 0; 41732 } else { 41733 swiper.el.scrollTop = 0; 41734 } 41735 requestAnimationFrame(function () { 41736 if (preventFocusHandler) return; 41737 if (swiper.params.loop) { 41738 swiper.slideToLoop(swiper.getSlideIndexWhenGrid(parseInt(slideEl.getAttribute('data-swiper-slide-index'))), 0); 41739 } else if (isVirtual) { 41740 swiper.slideTo(swiper.getSlideIndexWhenGrid(parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10)), 0); 41741 } else { 41742 swiper.slideTo(swiper.getSlideIndexWhenGrid(swiper.slides.indexOf(slideEl)), 0); 41743 } 41744 preventFocusHandler = false; 41745 }); 41746 }; 41747 var initSlides = function initSlides() { 41748 var params = swiper.params.a11y; 41749 if (params.itemRoleDescriptionMessage) { 41750 addElRoleDescription(swiper.slides, params.itemRoleDescriptionMessage); 41751 } 41752 if (params.slideRole) { 41753 addElRole(swiper.slides, params.slideRole); 41754 } 41755 var slidesLength = swiper.slides.length; 41756 if (params.slideLabelMessage) { 41757 swiper.slides.forEach(function (slideEl, index) { 41758 var slideIndex = swiper.params.loop ? parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10) : index; 41759 var ariaLabelMessage = params.slideLabelMessage.replace(/\{\{index\}\}/, slideIndex + 1).replace(/\{\{slidesLength\}\}/, slidesLength); 41760 addElLabel(slideEl, ariaLabelMessage); 41761 }); 41762 } 41763 }; 41764 var init = function init() { 41765 var params = swiper.params.a11y; 41766 swiper.el.append(liveRegion); 41767 41768 // Container 41769 var containerEl = swiper.el; 41770 if (params.containerRoleDescriptionMessage) { 41771 addElRoleDescription(containerEl, params.containerRoleDescriptionMessage); 41772 } 41773 if (params.containerMessage) { 41774 addElLabel(containerEl, params.containerMessage); 41775 } 41776 if (params.containerRole) { 41777 addElRole(containerEl, params.containerRole); 41778 } 41779 41780 // Wrapper 41781 var wrapperEl = swiper.wrapperEl; 41782 var wrapperId = params.id || wrapperEl.getAttribute('id') || "swiper-wrapper-".concat(getRandomNumber(16)); 41783 addElId(wrapperEl, wrapperId); 41784 if (params.wrapperLiveRegion) { 41785 var live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite'; 41786 addElLive(wrapperEl, live); 41787 } 41788 41789 // Slide 41790 initSlides(); 41791 41792 // Navigation 41793 var _ref2 = swiper.navigation ? swiper.navigation : {}, 41794 nextEl = _ref2.nextEl, 41795 prevEl = _ref2.prevEl; 41796 nextEl = (0, _utils.m)(nextEl); 41797 prevEl = (0, _utils.m)(prevEl); 41798 if (nextEl) { 41799 nextEl.forEach(function (el) { 41800 return initNavEl(el, wrapperId, params.nextSlideMessage); 41801 }); 41802 } 41803 if (prevEl) { 41804 prevEl.forEach(function (el) { 41805 return initNavEl(el, wrapperId, params.prevSlideMessage); 41806 }); 41807 } 41808 41809 // Pagination 41810 if (hasClickablePagination()) { 41811 var paginationEl = (0, _utils.m)(swiper.pagination.el); 41812 paginationEl.forEach(function (el) { 41813 el.addEventListener('keydown', onEnterOrSpaceKey); 41814 }); 41815 } 41816 41817 // Tab focus 41818 var document = (0, _ssrWindowEsm.g)(); 41819 document.addEventListener('visibilitychange', onVisibilityChange); 41820 swiper.el.addEventListener('focus', handleFocus, true); 41821 swiper.el.addEventListener('pointerdown', handlePointerDown, true); 41822 swiper.el.addEventListener('pointerup', handlePointerUp, true); 41823 }; 41824 function destroy() { 41825 if (liveRegion) liveRegion.remove(); 41826 var _ref3 = swiper.navigation ? swiper.navigation : {}, 41827 nextEl = _ref3.nextEl, 41828 prevEl = _ref3.prevEl; 41829 nextEl = (0, _utils.m)(nextEl); 41830 prevEl = (0, _utils.m)(prevEl); 41831 if (nextEl) { 41832 nextEl.forEach(function (el) { 41833 return el.removeEventListener('keydown', onEnterOrSpaceKey); 41834 }); 41835 } 41836 if (prevEl) { 41837 prevEl.forEach(function (el) { 41838 return el.removeEventListener('keydown', onEnterOrSpaceKey); 41839 }); 41840 } 41841 41842 // Pagination 41843 if (hasClickablePagination()) { 41844 var paginationEl = (0, _utils.m)(swiper.pagination.el); 41845 paginationEl.forEach(function (el) { 41846 el.removeEventListener('keydown', onEnterOrSpaceKey); 41847 }); 41848 } 41849 var document = (0, _ssrWindowEsm.g)(); 41850 document.removeEventListener('visibilitychange', onVisibilityChange); 41851 // Tab focus 41852 if (swiper.el && typeof swiper.el !== 'string') { 41853 swiper.el.removeEventListener('focus', handleFocus, true); 41854 swiper.el.removeEventListener('pointerdown', handlePointerDown, true); 41855 swiper.el.removeEventListener('pointerup', handlePointerUp, true); 41856 } 41857 } 41858 on('beforeInit', function () { 41859 liveRegion = (0, _utils.c)('span', swiper.params.a11y.notificationClass); 41860 liveRegion.setAttribute('aria-live', 'assertive'); 41861 liveRegion.setAttribute('aria-atomic', 'true'); 41862 }); 41863 on('afterInit', function () { 41864 if (!swiper.params.a11y.enabled) return; 41865 init(); 41866 }); 41867 on('slidesLengthChange snapGridLengthChange slidesGridLengthChange', function () { 41868 if (!swiper.params.a11y.enabled) return; 41869 initSlides(); 41870 }); 41871 on('fromEdge toEdge afterInit lock unlock', function () { 41872 if (!swiper.params.a11y.enabled) return; 41873 updateNavigation(); 41874 }); 41875 on('paginationUpdate', function () { 41876 if (!swiper.params.a11y.enabled) return; 41877 updatePagination(); 41878 }); 41879 on('destroy', function () { 41880 if (!swiper.params.a11y.enabled) return; 41881 destroy(); 41882 }); 41883} 41884 41885},{"../shared/classes-to-selector.mjs":133,"../shared/ssr-window.esm.mjs":139,"../shared/utils.mjs":141}],111:[function(require,module,exports){ 41886"use strict"; 41887 41888Object.defineProperty(exports, "__esModule", { 41889 value: true 41890}); 41891exports["default"] = Autoplay; 41892var _ssrWindowEsm = require("../shared/ssr-window.esm.mjs"); 41893/* eslint no-underscore-dangle: "off" */
41894/* eslint no-use-before-define: "off" */ 41895function Autoplay(_ref) { 41896 var swiper = _ref.swiper, 41897 extendParams = _ref.extendParams, 41898 on = _ref.on, 41899 emit = _ref.emit, 41900 params = _ref.params; 41901 swiper.autoplay = { 41902 running: false, 41903 paused: false, 41904 timeLeft: 0 41905 }; 41906 extendParams({ 41907 autoplay: { 41908 enabled: false, 41909 delay: 3000, 41910 waitForTransition: true, 41911 disableOnInteraction: false, 41912 stopOnLastSlide: false, 41913 reverseDirection: false, 41914 pauseOnMouseEnter: false 41915 } 41916 }); 41917 var timeout; 41918 var raf; 41919 var autoplayDelayTotal = params && params.autoplay ? params.autoplay.delay : 3000; 41920 var autoplayDelayCurrent = params && params.autoplay ? params.autoplay.delay : 3000; 41921 var autoplayTimeLeft; 41922 var autoplayStartTime = new Date().getTime(); 41923 var wasPaused; 41924 var isTouched; 41925 var pausedByTouch; 41926 var touchStartTimeout; 41927 var pausedByInteraction; 41928 var pausedByPointerEnter; 41929 function onTransitionEnd(e) { 41930 if (!swiper || swiper.destroyed || !swiper.wrapperEl) return; 41931 if (e.target !== swiper.wrapperEl) return; 41932 swiper.wrapperEl.removeEventListener('transitionend', onTransitionEnd); 41933 if (pausedByPointerEnter || e.detail && e.detail.bySwiperTouchMove) { 41934 return; 41935 } 41936 resume(); 41937 } 41938 var _calcTimeLeft = function calcTimeLeft() { 41939 if (swiper.destroyed || !swiper.autoplay.running) return; 41940 if (swiper.autoplay.paused) { 41941 wasPaused = true; 41942 } else if (wasPaused) { 41943 autoplayDelayCurrent = autoplayTimeLeft; 41944 wasPaused = false; 41945 } 41946 var timeLeft = swiper.autoplay.paused ? autoplayTimeLeft : autoplayStartTime + autoplayDelayCurrent - new Date().getTime(); 41947 swiper.autoplay.timeLeft = timeLeft; 41948 emit('autoplayTimeLeft', timeLeft, timeLeft / autoplayDelayTotal); 41949 raf = requestAnimationFrame(function () { 41950 _calcTimeLeft(); 41951 }); 41952 }; 41953 var getSlideDelay = function getSlideDelay() { 41954 var activeSlideEl; 41955 if (swiper.virtual && swiper.params.virtual.enabled) { 41956 activeSlideEl = swiper.slides.find(function (slideEl) { 41957 return slideEl.classList.contains('swiper-slide-active'); 41958 }); 41959 } else { 41960 activeSlideEl = swiper.slides[swiper.activeIndex]; 41961 } 41962 if (!activeSlideEl) return undefined; 41963 var currentSlideDelay = parseInt(activeSlideEl.getAttribute('data-swiper-autoplay'), 10); 41964 return currentSlideDelay; 41965 }; 41966 var getTotalDelay = function getTotalDelay() { 41967 var totalDelay = swiper.params.autoplay.delay; 41968 var currentSlideDelay = getSlideDelay(); 41969 if (!Number.isNaN(currentSlideDelay) && currentSlideDelay > 0) { 41970 totalDelay = currentSlideDelay; 41971 } 41972 return totalDelay; 41973 }; 41974 var _run = function run(delayForce) { 41975 if (swiper.destroyed || !swiper.autoplay.running) return; 41976 cancelAnimationFrame(raf); 41977 _calcTimeLeft(); 41978 var delay = delayForce; 41979 if (typeof delay === 'undefined') { 41980 delay = getTotalDelay(); 41981 autoplayDelayTotal = delay; 41982 autoplayDelayCurrent = delay; 41983 } 41984 autoplayTimeLeft = delay; 41985 var speed = swiper.params.speed; 41986 var proceed = function proceed() { 41987 if (!swiper || swiper.destroyed) return; 41988 if (swiper.params.autoplay.reverseDirection) { 41989 if (!swiper.isBeginning || swiper.params.loop || swiper.params.rewind) { 41990 swiper.slidePrev(speed, true, true); 41991 emit('autoplay'); 41992 } else if (!swiper.params.autoplay.stopOnLastSlide) { 41993 swiper.slideTo(swiper.slides.length - 1, speed, true, true); 41994 emit('autoplay'); 41995 } 41996 } else { 41997 if (!swiper.isEnd || swiper.params.loop || swiper.params.rewind) { 41998 swiper.slideNext(speed, true, true); 41999 emit('autoplay'); 42000 } else if (!swiper.params.autoplay.stopOnLastSlide) { 42001 swiper.slideTo(0, speed, true, true); 42002 emit('autoplay'); 42003 } 42004 } 42005 if (swiper.params.cssMode) { 42006 autoplayStartTime = new Date().getTime(); 42007 requestAnimationFrame(function () { 42008 _run(); 42009 }); 42010 } 42011 }; 42012 if (delay > 0) { 42013 clearTimeout(timeout); 42014 timeout = setTimeout(function () { 42015 proceed(); 42016 }, delay); 42017 } else { 42018 requestAnimationFrame(function () { 42019 proceed(); 42020 }); 42021 } 42022 42023 // eslint-disable-next-line 42024 return delay; 42025 }; 42026 var start = function start() { 42027 autoplayStartTime = new Date().getTime(); 42028 swiper.autoplay.running = true; 42029 _run(); 42030 emit('autoplayStart'); 42031 }; 42032 var stop = function stop() { 42033 swiper.autoplay.running = false;
42034 clearTimeout(timeout); 42035 cancelAnimationFrame(raf); 42036 emit('autoplayStop'); 42037 }; 42038 var pause = function pause(internal, reset) { 42039 if (swiper.destroyed || !swiper.autoplay.running) return; 42040 clearTimeout(timeout); 42041 if (!internal) { 42042 pausedByInteraction = true; 42043 } 42044 var proceed = function proceed() { 42045 emit('autoplayPause'); 42046 if (swiper.params.autoplay.waitForTransition) { 42047 swiper.wrapperEl.addEventListener('transitionend', onTransitionEnd); 42048 } else { 42049 resume(); 42050 } 42051 }; 42052 swiper.autoplay.paused = true; 42053 if (reset) { 42054 proceed(); 42055 return; 42056 } 42057 var delay = autoplayTimeLeft || swiper.params.autoplay.delay; 42058 autoplayTimeLeft = delay - (new Date().getTime() - autoplayStartTime); 42059 if (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop) return; 42060 if (autoplayTimeLeft < 0) autoplayTimeLeft = 0; 42061 proceed(); 42062 }; 42063 var resume = function resume() { 42064 if (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop || swiper.destroyed || !swiper.autoplay.running) return; 42065 autoplayStartTime = new Date().getTime(); 42066 if (pausedByInteraction) { 42067 pausedByInteraction = false; 42068 _run(autoplayTimeLeft); 42069 } else { 42070 _run(); 42071 } 42072 swiper.autoplay.paused = false; 42073 emit('autoplayResume'); 42074 }; 42075 var onVisibilityChange = function onVisibilityChange() { 42076 if (swiper.destroyed || !swiper.autoplay.running) return; 42077 var document = (0, _ssrWindowEsm.g)(); 42078 if (document.visibilityState === 'hidden') { 42079 pausedByInteraction = true; 42080 pause(true); 42081 } 42082 if (document.visibilityState === 'visible') { 42083 resume(); 42084 } 42085 }; 42086 var onPointerEnter = function onPointerEnter(e) { 42087 if (e.pointerType !== 'mouse') return; 42088 pausedByInteraction = true; 42089 pausedByPointerEnter = true; 42090 if (swiper.animating || swiper.autoplay.paused) return; 42091 pause(true); 42092 }; 42093 var onPointerLeave = function onPointerLeave(e) { 42094 if (e.pointerType !== 'mouse') return; 42095 pausedByPointerEnter = false; 42096 if (swiper.autoplay.paused) { 42097 resume(); 42098 } 42099 }; 42100 var attachMouseEvents = function attachMouseEvents() { 42101 if (swiper.params.autoplay.pauseOnMouseEnter) { 42102 swiper.el.addEventListener('pointerenter', onPointerEnter); 42103 swiper.el.addEventListener('pointerleave', onPointerLeave); 42104 } 42105 }; 42106 var detachMouseEvents = function detachMouseEvents() { 42107 if (swiper.el && typeof swiper.el !== 'string') { 42108 swiper.el.removeEventListener('pointerenter', onPointerEnter); 42109 swiper.el.removeEventListener('pointerleave', onPointerLeave); 42110 } 42111 }; 42112 var attachDocumentEvents = function attachDocumentEvents() { 42113 var document = (0, _ssrWindowEsm.g)(); 42114 document.addEventListener('visibilitychange', onVisibilityChange); 42115 }; 42116 var detachDocumentEvents = function detachDocumentEvents() { 42117 var document = (0, _ssrWindowEsm.g)(); 42118 document.removeEventListener('visibilitychange', onVisibilityChange); 42119 }; 42120 on('init', function () { 42121 if (swiper.params.autoplay.enabled) { 42122 attachMouseEvents(); 42123 attachDocumentEvents(); 42124 start(); 42125 } 42126 }); 42127 on('destroy', function () { 42128 detachMouseEvents(); 42129 detachDocumentEvents(); 42130 if (swiper.autoplay.running) { 42131 stop(); 42132 } 42133 }); 42134 on('_freeModeStaticRelease', function () { 42135 if (pausedByTouch || pausedByInteraction) { 42136 resume(); 42137 } 42138 }); 42139 on('_freeModeNoMomentumRelease', function () { 42140 if (!swiper.params.autoplay.disableOnInteraction) { 42141 pause(true, true); 42142 } else { 42143 stop(); 42144 } 42145 }); 42146 on('beforeTransitionStart', function (_s, speed, internal) { 42147 if (swiper.destroyed || !swiper.autoplay.running) return; 42148 if (internal || !swiper.params.autoplay.disableOnInteraction) { 42149 pause(true, true); 42150 } else { 42151 stop(); 42152 } 42153 }); 42154 on('sliderFirstMove', function () { 42155 if (swiper.destroyed || !swiper.autoplay.running) return; 42156 if (swiper.params.autoplay.disableOnInteraction) { 42157 stop(); 42158 return; 42159 } 42160 isTouched = true; 42161 pausedByTouch = false; 42162 pausedByInteraction = false; 42163 touchStartTimeout = setTimeout(function () { 42164 pausedByInteraction = true; 42165 pausedByTouch = true; 42166 pause(true); 42167 }, 200); 42168 }); 42169 on('touchEnd', function () { 42170 if (swiper.destroyed || !swiper.autoplay.running || !isTouched) return; 42171 clearTimeout(touchStartTimeout); 42172 clearTimeout(timeout); 42173 if (swiper.params.autoplay.disableOnInteraction) { 42174 pausedByTouch = false;
42175 isTouched = false; 42176 return; 42177 } 42178 if (pausedByTouch && swiper.params.cssMode) resume(); 42179 pausedByTouch = false; 42180 isTouched = false; 42181 }); 42182 on('slideChange', function () { 42183 if (swiper.destroyed || !swiper.autoplay.running) return; 42184 if (swiper.autoplay.paused) { 42185 autoplayTimeLeft = getTotalDelay(); 42186 autoplayDelayTotal = getTotalDelay(); 42187 } 42188 }); 42189 Object.assign(swiper.autoplay, { 42190 start: start, 42191 stop: stop, 42192 pause: pause, 42193 resume: resume 42194 }); 42195} 42196 42197},{"../shared/ssr-window.esm.mjs":139}],112:[function(require,module,exports){ 42198"use strict"; 42199 42200var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 42201Object.defineProperty(exports, "__esModule", { 42202 value: true 42203}); 42204exports["default"] = Controller; 42205var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); 42206var _utils = require("../shared/utils.mjs"); 42207/* eslint no-bitwise: ["error", { "allow": [">>"] }] */ 42208function Controller(_ref) { 42209 var swiper = _ref.swiper, 42210 extendParams = _ref.extendParams, 42211 on = _ref.on; 42212 extendParams({ 42213 controller: { 42214 control: undefined, 42215 inverse: false, 42216 by: 'slide' // or 'container' 42217 } 42218 }); 42219 swiper.controller = { 42220 control: undefined 42221 }; 42222 function LinearSpline(x, y) { 42223 var binarySearch = function search() { 42224 var maxIndex; 42225 var minIndex; 42226 var guess; 42227 return function (array, val) { 42228 minIndex = -1; 42229 maxIndex = array.length; 42230 while (maxIndex - minIndex > 1) { 42231 guess = maxIndex + minIndex >> 1; 42232 if (array[guess] <= val) { 42233 minIndex = guess; 42234 } else { 42235 maxIndex = guess; 42236 } 42237 } 42238 return maxIndex; 42239 }; 42240 }(); 42241 this.x = x; 42242 this.y = y; 42243 this.lastIndex = x.length - 1; 42244 // Given an x value (x2), return the expected y2 value: 42245 // (x1,y1) is the known point before given value, 42246 // (x3,y3) is the known point after given value. 42247 var i1; 42248 var i3; 42249 this.interpolate = function interpolate(x2) { 42250 if (!x2) return 0; 42251 42252 // Get the indexes of x1 and x3 (the array indexes before and after given x2): 42253 i3 = binarySearch(this.x, x2); 42254 i1 = i3 - 1; 42255 42256 // We have our indexes i1 & i3, so we can calculate already: 42257 // y2 := ((x2âx1) à (y3ây1)) ÷ (x3âx1) + y1 42258 return (x2 - this.x[i1]) * (this.y[i3] - this.y[i1]) / (this.x[i3] - this.x[i1]) + this.y[i1]; 42259 }; 42260 return this; 42261 } 42262 function getInterpolateFunction(c) { 42263 swiper.controller.spline = swiper.params.loop ? new LinearSpline(swiper.slidesGrid, c.slidesGrid) : new LinearSpline(swiper.snapGrid, c.snapGrid); 42264 } 42265 function setTranslate(_t, byController) { 42266 var controlled = swiper.controller.control; 42267 var multiplier; 42268 var controlledTranslate; 42269 var Swiper = swiper.constructor; 42270 function setControlledTranslate(c) { 42271 if (c.destroyed) return; 42272 42273 // this will create an Interpolate function based on the snapGrids 42274 // x is the Grid of the scrolled scroller and y will be the controlled scroller 42275 // it makes sense to create this only once and recall it for the interpolation 42276 // the function does a lot of value caching for performance 42277 var translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate; 42278 if (swiper.params.controller.by === 'slide') { 42279 getInterpolateFunction(c); 42280 // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid 42281 // but it did not work out 42282 controlledTranslate = -swiper.controller.spline.interpolate(-translate); 42283 } 42284 if (!controlledTranslate || swiper.params.controller.by === 'container') { 42285 multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate()); 42286 if (Number.isNaN(multiplier) || !Number.isFinite(multiplier)) { 42287 multiplier = 1; 42288 } 42289 controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate(); 42290 } 42291 if (swiper.params.controller.inverse) { 42292 controlledTranslate = c.maxTranslate() - controlledTranslate; 42293 } 42294 c.updateProgress(controlledTranslate); 42295 c.setTranslate(controlledTranslate, swiper); 42296 c.updateActiveIndex(); 42297 c.updateSlidesClasses(); 42298 } 42299 if (Array.isArray(controlled)) { 42300 for (var i = 0; i < controlled.length; i += 1) { 42301 if (controlled[i] !== byController && controlled[i] instanceof Swiper) { 42302 setControlledTranslate(controlled[i]); 42303 } 42304 } 42305 } else if (controlled instanceof Swiper && byController !== controlled) { 42306 setControlledTranslate(controlled); 42307 } 42308 } 42309 function setTransition(duration, byController) { 42310 var Swiper = swiper.constructor; 42311 var controlled = swiper.controller.control; 42312 var i; 42313 function setControlledTransition(c) { 42314 if (c.destroyed) return; 42315 c.setTransition(duration, swiper); 42316 if (duration !== 0) { 42317 c.transitionStart(); 42318 if (c.params.autoHeight) { 42319 (0, _utils.n)(function () { 42320 c.updateAutoHeight(); 42321 }); 42322 } 42323 (0, _utils.o)(c.wrapperEl, function () { 42324 if (!controlled) return; 42325 c.transitionEnd(); 42326 }); 42327 } 42328 } 42329 if (Array.isArray(controlled)) { 42330 for (i = 0; i < controlled.length; i += 1) { 42331 if (controlled[i] !== byController && controlled[i] instanceof Swiper) { 42332 setControlledTransition(controlled[i]); 42333 } 42334 } 42335 } else if (controlled instanceof Swiper && byController !== controlled) { 42336 setControlledTransition(controlled); 42337 } 42338 } 42339 function removeSpline() { 42340 if (!swiper.controller.control) return; 42341 if (swiper.controller.spline) { 42342 swiper.controller.spline = undefined; 42343 delete swiper.controller.spline; 42344 } 42345 } 42346 on('beforeInit', function () { 42347 if (typeof window !== 'undefined' && ( 42348 // eslint-disable-line 42349 typeof swiper.params.controller.control === 'string' || swiper.params.controller.control instanceof HTMLElement)) { 42350 var controlElements = typeof swiper.params.controller.control === 'string' ? (0, _toConsumableArray2["default"])(document.querySelectorAll(swiper.params.controller.control)) : [swiper.params.controller.control];
42351 controlElements.forEach(function (controlElement) { 42352 if (!swiper.controller.control) swiper.controller.control = []; 42353 if (controlElement && controlElement.swiper) { 42354 swiper.controller.control.push(controlElement.swiper); 42355 } else if (controlElement) { 42356 var eventName = "".concat(swiper.params.eventsPrefix, "init"); 42357 var _onControllerSwiper = function onControllerSwiper(e) { 42358 swiper.controller.control.push(e.detail[0]); 42359 swiper.update(); 42360 controlElement.removeEventListener(eventName, _onControllerSwiper); 42361 }; 42362 controlElement.addEventListener(eventName, _onControllerSwiper); 42363 } 42364 }); 42365 return; 42366 } 42367 swiper.controller.control = swiper.params.controller.control; 42368 }); 42369 on('update', function () { 42370 removeSpline(); 42371 }); 42372 on('resize', function () { 42373 removeSpline(); 42374 }); 42375 on('observerUpdate', function () { 42376 removeSpline(); 42377 }); 42378 on('setTranslate', function (_s, translate, byController) { 42379 if (!swiper.controller.control || swiper.controller.control.destroyed) return; 42380 swiper.controller.setTranslate(translate, byController); 42381 }); 42382 on('setTransition', function (_s, duration, byController) { 42383 if (!swiper.controller.control || swiper.controller.control.destroyed) return; 42384 swiper.controller.setTransition(duration, byController); 42385 }); 42386 Object.assign(swiper.controller, { 42387 setTranslate: setTranslate, 42388 setTransition: setTransition 42389 }); 42390} 42391 42392},{"../shared/utils.mjs":141,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/toConsumableArray":105}],113:[function(require,module,exports){ 42393"use strict"; 42394 42395Object.defineProperty(exports, "__esModule", { 42396 value: true 42397}); 42398exports["default"] = EffectCards; 42399var _createShadow = require("../shared/create-shadow.mjs"); 42400var _effectInit = require("../shared/effect-init.mjs"); 42401var _effectTarget = require("../shared/effect-target.mjs"); 42402var _effectVirtualTransitionEnd = require("../shared/effect-virtual-transition-end.mjs"); 42403var _utils = require("../shared/utils.mjs"); 42404function EffectCards(_ref) { 42405 var swiper = _ref.swiper, 42406 extendParams = _ref.extendParams, 42407 on = _ref.on; 42408 extendParams({ 42409 cardsEffect: { 42410 slideShadows: true, 42411 rotate: true, 42412 perSlideRotate: 2, 42413 perSlideOffset: 8 42414 } 42415 }); 42416 var setTranslate = function setTranslate() { 42417 var slides = swiper.slides, 42418 activeIndex = swiper.activeIndex, 42419 rtl = swiper.rtlTranslate; 42420 var params = swiper.params.cardsEffect; 42421 var _swiper$touchEventsDa = swiper.touchEventsData, 42422 startTranslate = _swiper$touchEventsDa.startTranslate, 42423 isTouched = _swiper$touchEventsDa.isTouched; 42424 var currentTranslate = rtl ? -swiper.translate : swiper.translate; 42425 for (var i = 0; i < slides.length; i += 1) { 42426 var slideEl = slides[i]; 42427 var slideProgress = slideEl.progress; 42428 var progress = Math.min(Math.max(slideProgress, -4), 4); 42429 var offset = slideEl.swiperSlideOffset; 42430 if (swiper.params.centeredSlides && !swiper.params.cssMode) { 42431 swiper.wrapperEl.style.transform = "translateX(".concat(swiper.minTranslate(), "px)"); 42432 } 42433 if (swiper.params.centeredSlides && swiper.params.cssMode) { 42434 offset -= slides[0].swiperSlideOffset; 42435 } 42436 var tX = swiper.params.cssMode ? -offset - swiper.translate : -offset; 42437 var tY = 0; 42438 var tZ = -100 * Math.abs(progress); 42439 var scale = 1; 42440 var rotate = -params.perSlideRotate * progress; 42441 var tXAdd = params.perSlideOffset - Math.abs(progress) * 0.75; 42442 var slideIndex = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.from + i : i; 42443 var isSwipeToNext = (slideIndex === activeIndex || slideIndex === activeIndex - 1) && progress > 0 && progress < 1 && (isTouched || swiper.params.cssMode) && currentTranslate < startTranslate; 42444 var isSwipeToPrev = (slideIndex === activeIndex || slideIndex === activeIndex + 1) && progress < 0 && progress > -1 && (isTouched || swiper.params.cssMode) && currentTranslate > startTranslate; 42445 if (isSwipeToNext || isSwipeToPrev) { 42446 var subProgress = Math.pow(1 - Math.abs((Math.abs(progress) - 0.5) / 0.5), 0.5); 42447 rotate += -28 * progress * subProgress; 42448 scale += -0.5 * subProgress; 42449 tXAdd += 96 * subProgress; 42450 tY = "".concat((params.rotate || swiper.isHorizontal() ? -25
42450: 0) * subProgress * Math.abs(progress), "%"); 42451 } 42452 if (progress < 0) { 42453 // next 42454 tX = "calc(".concat(tX, "px ").concat(rtl ? '-' : '+', " (").concat(tXAdd * Math.abs(progress), "%))"); 42455 } else if (progress > 0) { 42456 // prev 42457 tX = "calc(".concat(tX, "px ").concat(rtl ? '-' : '+', " (-").concat(tXAdd * Math.abs(progress), "%))"); 42458 } else { 42459 tX = "".concat(tX, "px"); 42460 } 42461 if (!swiper.isHorizontal()) { 42462 var prevY = tY; 42463 tY = tX; 42464 tX = prevY; 42465 } 42466 var scaleString = progress < 0 ? "".concat(1 + (1 - scale) * progress) : "".concat(1 - (1 - scale) * progress); 42467 42468 /* eslint-disable */ 42469 var transform = "\n translate3d(".concat(tX, ", ").concat(tY, ", ").concat(tZ, "px)\n rotateZ(").concat(params.rotate ? rtl ? -rotate : rotate : 0, "deg)\n scale(").concat(scaleString, ")\n "); 42470 /* eslint-enable */ 42471 42472 if (params.slideShadows) { 42473 // Set shadows 42474 var shadowEl = slideEl.querySelector('.swiper-slide-shadow'); 42475 if (!shadowEl) { 42476 shadowEl = (0, _createShadow.c)('cards', slideEl); 42477 } 42478 if (shadowEl) shadowEl.style.opacity = Math.min(Math.max((Math.abs(progress) - 0.5) / 0.5, 0), 1); 42479 } 42480 slideEl.style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length; 42481 var targetEl = (0, _effectTarget.e)(params, slideEl); 42482 targetEl.style.transform = transform; 42483 } 42484 }; 42485 var setTransition = function setTransition(duration) { 42486 var transformElements = swiper.slides.map(function (slideEl) { 42487 return (0, _utils.g)(slideEl); 42488 }); 42489 transformElements.forEach(function (el) { 42490 el.style.transitionDuration = "".concat(duration, "ms"); 42491 el.querySelectorAll('.swiper-slide-shadow').forEach(function (shadowEl) { 42492 shadowEl.style.transitionDuration = "".concat(duration, "ms"); 42493 }); 42494 }); 42495 (0, _effectVirtualTransitionEnd.e)({ 42496 swiper: swiper, 42497 duration: duration, 42498 transformElements: transformElements 42499 }); 42500 }; 42501 (0, _effectInit.e)({ 42502 effect: 'cards', 42503 swiper: swiper, 42504 on: on, 42505 setTranslate: setTranslate, 42506 setTransition: setTransition, 42507 perspective: function perspective() { 42508 return true; 42509 }, 42510 overwriteParams: function overwriteParams() { 42511 return { 42512 _loopSwapReset: false, 42513 watchSlidesProgress: true, 42514 loopAdditionalSlides: swiper.params.cardsEffect.rotate ? 3 : 2, 42515 centeredSlides: true, 42516 virtualTranslate: !swiper.params.cssMode 42517 }; 42518 } 42519 }); 42520} 42521 42522},{"../shared/create-shadow.mjs":135,"../shared/effect-init.mjs":136,"../shared/effect-target.mjs":137,"../shared/effect-virtual-transition-end.mjs":138,"../shared/utils.mjs":141}],114:[function(require,module,exports){ 42523"use strict"; 42524 42525Object.defineProperty(exports, "__esModule", { 42526 value: true 42527}); 42528exports["default"] = EffectCoverflow; 42529var _createShadow = require("../shared/create-shadow.mjs"); 42530var _effectInit = require("../shared/effect-init.mjs"); 42531var _effectTarget = require("../shared/effect-target.mjs"); 42532var _utils = require("../shared/utils.mjs"); 42533function EffectCoverflow(_ref) { 42534 var swiper = _ref.swiper, 42535 extendParams = _ref.extendParams, 42536 on = _ref.on; 42537 extendParams({ 42538 coverflowEffect: { 42539 rotate: 50, 42540 stretch: 0, 42541 depth: 100, 42542 scale: 1, 42543 modifier: 1, 42544 slideShadows: true 42545 } 42546 }); 42547 var setTranslate = function setTranslate() { 42548 var swiperWidth = swiper.width, 42549 swiperHeight = swiper.height, 42550 slides = swiper.slides, 42551 slidesSizesGrid = swiper.slidesSizesGrid; 42552 var params = swiper.params.coverflowEffect; 42553 var isHorizontal = swiper.isHorizontal(); 42554 var transform = swiper.translate; 42555 var center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2; 42556 var rotate = isHorizontal ? params.rotate : -params.rotate; 42557 var translate = params.depth; 42558 var r = (0, _utils.a)(swiper); 42559 // Each slide offset from center 42560 for (var i = 0, length = slides.length; i < length; i += 1) { 42561 var slideEl = slides[i]; 42562 var slideSize = slidesSizesGrid[i]; 42563 var slideOffset = slideEl.swiperSlideOffset; 42564 var centerOffset = (center - slideOffset - slideSize / 2) / slideSize; 42565 var offsetMultiplier = typeof params.modifier === 'function' ? params.modifier(centerOffset) : centerOffset * params.modifier; 42566 var rotateY = isHorizontal ? rotate * offsetMultiplier : 0; 42567 var rotateX = isHorizontal ? 0 : rotate * offsetMultiplier; 42568 // var rotateZ = 0 42569 var translateZ = -translate * Math.abs(offsetMultiplier); 42570 var stretch = params.stretch; 42571 // Allow percentage to make a relative stretch for responsive sliders 42572 if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) { 42573 stretch = parseFloat(params.stretch) / 100 * slideSize; 42574 } 42575 var translateY = isHorizontal ? 0 : stretch * offsetMultiplier; 42576 var translateX = isHorizontal ? stretch * offsetMultiplier : 0; 42577 var scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier); 42578 42579 // Fix for ultra small values 42580 if (Math.abs(translateX) < 0.001) translateX = 0; 42581 if (Math.abs(translateY) < 0.001) translateY = 0; 42582 if (Math.abs(translateZ) < 0.001) translateZ = 0; 42583 if (Math.abs(rotateY) < 0.001) rotateY = 0; 42584 if (Math.abs(rotateX) < 0.001) rotateX = 0; 42585 if (Math.abs(scale) < 0.001) scale = 0; 42586 var slideTransform = "translate3d(".concat(translateX, "px,").concat(translateY, "px,").concat(translateZ, "px) rotateX(").concat(r(rotateX), "deg) rotateY(").concat(r(rotateY), "deg) scale(").concat(scale, ")"); 42587 var targetEl = (0, _effectTarget.e)(params, slideEl); 42588 targetEl.style.transform = slideTransform; 42589 slideEl.style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1; 42590 if (params.slideShadows) { 42591 // Set shadows 42592 var shadowBeforeEl = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top'); 42593 var shadowAfterEl = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom'); 42594 if (!shadowBeforeEl) { 42595 shadowBeforeEl = (0, _createShadow.c)('coverflow', slideEl, isHorizontal ? 'left' : 'top'); 42596 } 42597 if (!shadowAfterEl) { 42598 shadowAfterEl = (0, _createShadow.c)('coverflow', slideEl, isHorizontal ? 'right' : 'bottom'); 42599 } 42600 if (shadowBeforeEl) shadowBeforeEl.style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0; 42601 if (shadowAfterEl) shadowAfterEl.style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0; 42602 } 42603 } 42604 }; 42605 var setTransition = function setTransition(duration) { 42606 var transformElements = swiper.slides.map(function (slideEl) { 42607 return (0, _utils.g)(slideEl); 42608 });
42609 transformElements.forEach(function (el) { 42610 el.style.transitionDuration = "".concat(duration, "ms"); 42611 el.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(function (shadowEl) { 42612 shadowEl.style.transitionDuration = "".concat(duration, "ms"); 42613 }); 42614 }); 42615 }; 42616 (0, _effectInit.e)({ 42617 effect: 'coverflow', 42618 swiper: swiper, 42619 on: on, 42620 setTranslate: setTranslate, 42621 setTransition: setTransition, 42622 perspective: function perspective() { 42623 return true; 42624 }, 42625 overwriteParams: function overwriteParams() { 42626 return { 42627 watchSlidesProgress: true 42628 }; 42629 } 42630 }); 42631} 42632 42633},{"../shared/create-shadow.mjs":135,"../shared/effect-init.mjs":136,"../shared/effect-target.mjs":137,"../shared/utils.mjs":141}],115:[function(require,module,exports){ 42634"use strict"; 42635 42636Object.defineProperty(exports, "__esModule", { 42637 value: true 42638}); 42639exports["default"] = EffectCreative; 42640var _createShadow = require("../shared/create-shadow.mjs"); 42641var _effectInit = require("../shared/effect-init.mjs"); 42642var _effectTarget = require("../shared/effect-target.mjs"); 42643var _effectVirtualTransitionEnd = require("../shared/effect-virtual-transition-end.mjs"); 42644var _utils = require("../shared/utils.mjs"); 42645function EffectCreative(_ref) { 42646 var swiper = _ref.swiper, 42647 extendParams = _ref.extendParams, 42648 on = _ref.on; 42649 extendParams({ 42650 creativeEffect: { 42651 limitProgress: 1, 42652 shadowPerProgress: false, 42653 progressMultiplier: 1, 42654 perspective: true, 42655 prev: { 42656 translate: [0, 0, 0], 42657 rotate: [0, 0, 0], 42658 opacity: 1, 42659 scale: 1 42660 }, 42661 next: { 42662 translate: [0, 0, 0], 42663 rotate: [0, 0, 0], 42664 opacity: 1, 42665 scale: 1 42666 } 42667 } 42668 }); 42669 var getTranslateValue = function getTranslateValue(value) { 42670 if (typeof value === 'string') return value; 42671 return "".concat(value, "px"); 42672 }; 42673 var setTranslate = function setTranslate() { 42674 var slides = swiper.slides, 42675 wrapperEl = swiper.wrapperEl, 42676 slidesSizesGrid = swiper.slidesSizesGrid; 42677 var params = swiper.params.creativeEffect; 42678 var multiplier = params.progressMultiplier; 42679 var isCenteredSlides = swiper.params.centeredSlides; 42680 var rotateFix = (0, _utils.a)(swiper); 42681 if (isCenteredSlides) { 42682 var margin = slidesSizesGrid[0] / 2 - swiper.params.slidesOffsetBefore || 0; 42683 wrapperEl.style.transform = "translateX(calc(50% - ".concat(margin, "px))"); 42684 } 42685 var _loop = function _loop() { 42686 var slideEl = slides[i]; 42687 var slideProgress = slideEl.progress; 42688 var progress = Math.min(Math.max(slideEl.progress, -params.limitProgress), params.limitProgress); 42689 var originalProgress = progress; 42690 if (!isCenteredSlides) { 42691 originalProgress = Math.min(Math.max(slideEl.originalProgress, -params.limitProgress), params.limitProgress); 42692 } 42693 var offset = slideEl.swiperSlideOffset; 42694 var t = [swiper.params.cssMode ? -offset - swiper.translate : -offset, 0, 0]; 42695 var r = [0, 0, 0]; 42696 var custom = false; 42697 if (!swiper.isHorizontal()) { 42698 t[1] = t[0]; 42699 t[0] = 0; 42700 } 42701 var data = { 42702 translate: [0, 0, 0], 42703 rotate: [0, 0, 0], 42704 scale: 1, 42705 opacity: 1 42706 }; 42707 if (progress < 0) { 42708 data = params.next; 42709 custom = true; 42710 } else if (progress > 0) { 42711 data = params.prev; 42712 custom = true; 42713 } 42714 // set translate 42715 t.forEach(function (value, index) { 42716 t[index] = "calc(".concat(value, "px + (").concat(getTranslateValue(data.translate[index]), " * ").concat(Math.abs(progress * multiplier), "))"); 42717 }); 42718 // set rotates 42719 r.forEach(function (value, index) { 42720 var val = data.rotate[index] * Math.abs(progress * multiplier); 42721 r[index] = val; 42722 }); 42723 slideEl.style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length; 42724 var translateString = t.join(', '); 42725 var rotateString = "rotateX(".concat(rotateFix(r[0]), "deg) rotateY(").concat(rotateFix(r[1]), "deg) rotateZ(").concat(rotateFix(r[2]), "deg)");
42726 var scaleString = originalProgress < 0 ? "scale(".concat(1 + (1 - data.scale) * originalProgress * multiplier, ")") : "scale(".concat(1 - (1 - data.scale) * originalProgress * multiplier, ")"); 42727 var opacityString = originalProgress < 0 ? 1 + (1 - data.opacity) * originalProgress * multiplier : 1 - (1 - data.opacity) * originalProgress * multiplier; 42728 var transform = "translate3d(".concat(translateString, ") ").concat(rotateString, " ").concat(scaleString); 42729 42730 // Set shadows 42731 if (custom && data.shadow || !custom) { 42732 var shadowEl = slideEl.querySelector('.swiper-slide-shadow'); 42733 if (!shadowEl && data.shadow) { 42734 shadowEl = (0, _createShadow.c)('creative', slideEl); 42735 } 42736 if (shadowEl) { 42737 var shadowOpacity = params.shadowPerProgress ? progress * (1 / params.limitProgress) : progress; 42738 shadowEl.style.opacity = Math.min(Math.max(Math.abs(shadowOpacity), 0), 1); 42739 } 42740 } 42741 var targetEl = (0, _effectTarget.e)(params, slideEl); 42742 targetEl.style.transform = transform; 42743 targetEl.style.opacity = opacityString; 42744 if (data.origin) { 42745 targetEl.style.transformOrigin = data.origin; 42746 } 42747 }; 42748 for (var i = 0; i < slides.length; i += 1) { 42749 _loop(); 42750 } 42751 }; 42752 var setTransition = function setTransition(duration) { 42753 var transformElements = swiper.slides.map(function (slideEl) { 42754 return (0, _utils.g)(slideEl); 42755 }); 42756 transformElements.forEach(function (el) { 42757 el.style.transitionDuration = "".concat(duration, "ms"); 42758 el.querySelectorAll('.swiper-slide-shadow').forEach(function (shadowEl) { 42759 shadowEl.style.transitionDuration = "".concat(duration, "ms"); 42760 }); 42761 }); 42762 (0, _effectVirtualTransitionEnd.e)({ 42763 swiper: swiper, 42764 duration: duration, 42765 transformElements: transformElements, 42766 allSlides: true 42767 }); 42768 }; 42769 (0, _effectInit.e)({ 42770 effect: 'creative', 42771 swiper: swiper, 42772 on: on, 42773 setTranslate: setTranslate, 42774 setTransition: setTransition, 42775 perspective: function perspective() { 42776 return swiper.params.creativeEffect.perspective; 42777 }, 42778 overwriteParams: function overwriteParams() { 42779 return { 42780 watchSlidesProgress: true, 42781 virtualTranslate: !swiper.params.cssMode 42782 }; 42783 } 42784 }); 42785} 42786 42787},{"../shared/create-shadow.mjs":135,"../shared/effect-init.mjs":136,"../shared/effect-target.mjs":137,"../shared/effect-virtual-transition-end.mjs":138,"../shared/utils.mjs":141}],116:[function(require,module,exports){ 42788"use strict"; 42789 42790Object.defineProperty(exports, "__esModule", { 42791 value: true 42792}); 42793exports["default"] = EffectCube; 42794var _effectInit = require("../shared/effect-init.mjs"); 42795var _utils = require("../shared/utils.mjs"); 42796function EffectCube(_ref) { 42797 var swiper = _ref.swiper, 42798 extendParams = _ref.extendParams, 42799 on = _ref.on; 42800 extendParams({ 42801 cubeEffect: { 42802 slideShadows: true, 42803 shadow: true, 42804 shadowOffset: 20, 42805 shadowScale: 0.94 42806 } 42807 }); 42808 var createSlideShadows = function createSlideShadows(slideEl, progress, isHorizontal) { 42809 var shadowBefore = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top'); 42810 var shadowAfter = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom'); 42811 if (!shadowBefore) { 42812 shadowBefore = (0, _utils.c)('div', "swiper-slide-shadow-cube swiper-slide-shadow-".concat(isHorizontal ? 'left' : 'top').split(' ')); 42813 slideEl.append(shadowBefore); 42814 } 42815 if (!shadowAfter) { 42816 shadowAfter = (0, _utils.c)('div', "swiper-slide-shadow-cube swiper-slide-shadow-".concat(isHorizontal ? 'right' : 'bottom').split(' ')); 42817 slideEl.append(shadowAfter); 42818 } 42819 if (shadowBefore) shadowBefore.style.opacity = Math.max(-progress, 0); 42820 if (shadowAfter) shadowAfter.style.opacity = Math.max(progress, 0); 42821 }; 42822 var recreateShadows = function recreateShadows() { 42823 // create new ones 42824 var isHorizontal = swiper.isHorizontal();
42825 swiper.slides.forEach(function (slideEl) { 42826 var progress = Math.max(Math.min(slideEl.progress, 1), -1); 42827 createSlideShadows(slideEl, progress, isHorizontal); 42828 }); 42829 }; 42830 var setTranslate = function setTranslate() { 42831 var el = swiper.el, 42832 wrapperEl = swiper.wrapperEl, 42833 slides = swiper.slides, 42834 swiperWidth = swiper.width, 42835 swiperHeight = swiper.height, 42836 rtl = swiper.rtlTranslate, 42837 swiperSize = swiper.size, 42838 browser = swiper.browser; 42839 var r = (0, _utils.a)(swiper); 42840 var params = swiper.params.cubeEffect; 42841 var isHorizontal = swiper.isHorizontal(); 42842 var isVirtual = swiper.virtual && swiper.params.virtual.enabled; 42843 var wrapperRotate = 0; 42844 var cubeShadowEl; 42845 if (params.shadow) { 42846 if (isHorizontal) { 42847 cubeShadowEl = swiper.wrapperEl.querySelector('.swiper-cube-shadow'); 42848 if (!cubeShadowEl) { 42849 cubeShadowEl = (0, _utils.c)('div', 'swiper-cube-shadow'); 42850 swiper.wrapperEl.append(cubeShadowEl); 42851 } 42852 cubeShadowEl.style.height = "".concat(swiperWidth, "px"); 42853 } else { 42854 cubeShadowEl = el.querySelector('.swiper-cube-shadow'); 42855 if (!cubeShadowEl) { 42856 cubeShadowEl = (0, _utils.c)('div', 'swiper-cube-shadow'); 42857 el.append(cubeShadowEl); 42858 } 42859 } 42860 } 42861 for (var i = 0; i < slides.length; i += 1) { 42862 var slideEl = slides[i]; 42863 var slideIndex = i; 42864 if (isVirtual) { 42865 slideIndex = parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10); 42866 } 42867 var slideAngle = slideIndex * 90; 42868 var round = Math.floor(slideAngle / 360); 42869 if (rtl) { 42870 slideAngle = -slideAngle; 42871 round = Math.floor(-slideAngle / 360); 42872 } 42873 var progress = Math.max(Math.min(slideEl.progress, 1), -1); 42874 var tx = 0; 42875 var ty = 0; 42876 var tz = 0; 42877 if (slideIndex % 4 === 0) { 42878 tx = -round * 4 * swiperSize; 42879 tz = 0; 42880 } else if ((slideIndex - 1) % 4 === 0) { 42881 tx = 0; 42882 tz = -round * 4 * swiperSize; 42883 } else if ((slideIndex - 2) % 4 === 0) { 42884 tx = swiperSize + round * 4 * swiperSize; 42885 tz = swiperSize; 42886 } else if ((slideIndex - 3) % 4 === 0) { 42887 tx = -swiperSize; 42888 tz = 3 * swiperSize + swiperSize * 4 * round; 42889 } 42890 if (rtl) { 42891 tx = -tx; 42892 } 42893 if (!isHorizontal) { 42894 ty = tx; 42895 tx = 0; 42896 } 42897 var transform = "rotateX(".concat(r(isHorizontal ? 0 : -slideAngle), "deg) rotateY(").concat(r(isHorizontal ? slideAngle : 0), "deg) translate3d(").concat(tx, "px, ").concat(ty, "px, ").concat(tz, "px)"); 42898 if (progress <= 1 && progress > -1) { 42899 wrapperRotate = slideIndex * 90 + progress * 90; 42900 if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90; 42901 } 42902 slideEl.style.transform = transform; 42903 if (params.slideShadows) { 42904 createSlideShadows(slideEl, progress, isHorizontal); 42905 } 42906 } 42907 wrapperEl.style.transformOrigin = "50% 50% -".concat(swiperSize / 2, "px"); 42908 wrapperEl.style['-webkit-transform-origin'] = "50% 50% -".concat(swiperSize / 2, "px"); 42909 if (params.shadow) { 42910 if (isHorizontal) { 42911 cubeShadowEl.style.transform = "translate3d(0px, ".concat(swiperWidth / 2 + params.shadowOffset, "px, ").concat(-swiperWidth / 2, "px) rotateX(89.99deg) rotateZ(0deg) scale(").concat(params.shadowScale, ")"); 42912 } else { 42913 var shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90; 42914 var multiplier = 1.5 - (Math.sin(shadowAngle * 2 * Math.PI / 360) / 2 + Math.cos(shadowAngle * 2 * Math.PI / 360) / 2); 42915 var scale1 = params.shadowScale; 42916 var scale2 = params.shadowScale / multiplier; 42917 var offset = params.shadowOffset; 42918 cubeShadowEl.style.transform = "scale3d(".concat(scale1, ", 1, ").concat(scale2, ") translate3d(0px, ").concat(swiperHeight / 2 + offset, "px, ").concat(-swiperHeight / 2 / scale2, "px) rotateX(-89.99deg)"); 42919 } 42920 } 42921 var zFactor = (browser.isSafari || browser.isWebView) && browser.needPerspectiveFix ? -swiperSize / 2 : 0; 42922 wrapperEl.style.transform = "translate3d(0px,0,".concat(zFactor, "px) rotateX(").concat(r(swiper.isHorizontal() ? 0 : wrapperRotate), "deg) rotateY(").concat(r(swiper.isHorizontal() ? -wrapperRotate : 0), "deg)"); 42923 wrapperEl.style.setProperty('--swiper-cube-translate-z', "".concat(zFactor, "px")); 42924 }; 42925 var setTransition = function setTransition(duration) { 42926 var el = swiper.el, 42927 slides = swiper.slides;
42928 slides.forEach(function (slideEl) { 42929 slideEl.style.transitionDuration = "".concat(duration, "ms"); 42930 slideEl.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(function (subEl) { 42931 subEl.style.transitionDuration = "".concat(duration, "ms"); 42932 }); 42933 }); 42934 if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) { 42935 var shadowEl = el.querySelector('.swiper-cube-shadow'); 42936 if (shadowEl) shadowEl.style.transitionDuration = "".concat(duration, "ms"); 42937 } 42938 }; 42939 (0, _effectInit.e)({ 42940 effect: 'cube', 42941 swiper: swiper, 42942 on: on, 42943 setTranslate: setTranslate, 42944 setTransition: setTransition, 42945 recreateShadows: recreateShadows, 42946 getEffectParams: function getEffectParams() { 42947 return swiper.params.cubeEffect; 42948 }, 42949 perspective: function perspective() { 42950 return true; 42951 }, 42952 overwriteParams: function overwriteParams() { 42953 return { 42954 slidesPerView: 1, 42955 slidesPerGroup: 1, 42956 watchSlidesProgress: true, 42957 resistanceRatio: 0, 42958 spaceBetween: 0, 42959 centeredSlides: false, 42960 virtualTranslate: true 42961 }; 42962 } 42963 }); 42964} 42965 42966},{"../shared/effect-init.mjs":136,"../shared/utils.mjs":141}],117:[function(require,module,exports){ 42967"use strict"; 42968 42969Object.defineProperty(exports, "__esModule", { 42970 value: true 42971}); 42972exports["default"] = EffectFade; 42973var _effectInit = require("../shared/effect-init.mjs"); 42974var _effectTarget = require("../shared/effect-target.mjs"); 42975var _effectVirtualTransitionEnd = require("../shared/effect-virtual-transition-end.mjs"); 42976var _utils = require("../shared/utils.mjs"); 42977function EffectFade(_ref) { 42978 var swiper = _ref.swiper, 42979 extendParams = _ref.extendParams, 42980 on = _ref.on; 42981 extendParams({ 42982 fadeEffect: { 42983 crossFade: false 42984 } 42985 }); 42986 var setTranslate = function setTranslate() { 42987 var slides = swiper.slides; 42988 var params = swiper.params.fadeEffect; 42989 for (var i = 0; i < slides.length; i += 1) { 42990 var slideEl = swiper.slides[i]; 42991 var offset = slideEl.swiperSlideOffset; 42992 var tx = -offset; 42993 if (!swiper.params.virtualTranslate) tx -= swiper.translate; 42994 var ty = 0; 42995 if (!swiper.isHorizontal()) { 42996 ty = tx; 42997 tx = 0; 42998 } 42999 var slideOpacity = swiper.params.fadeEffect.crossFade ? Math.max(1 - Math.abs(slideEl.progress), 0) : 1 + Math.min(Math.max(slideEl.progress, -1), 0); 43000 var targetEl = (0, _effectTarget.e)(params, slideEl); 43001 targetEl.style.opacity = slideOpacity; 43002 targetEl.style.transform = "translate3d(".concat(tx, "px, ").concat(ty, "px, 0px)"); 43003 } 43004 }; 43005 var setTransition = function setTransition(duration) { 43006 var transformElements = swiper.slides.map(function (slideEl) { 43007 return (0, _utils.g)(slideEl); 43008 }); 43009 transformElements.forEach(function (el) { 43010 el.style.transitionDuration = "".concat(duration, "ms"); 43011 }); 43012 (0, _effectVirtualTransitionEnd.e)({ 43013 swiper: swiper, 43014 duration: duration, 43015 transformElements: transformElements, 43016 allSlides: true 43017 }); 43018 }; 43019 (0, _effectInit.e)({ 43020 effect: 'fade', 43021 swiper: swiper, 43022 on: on, 43023 setTranslate: setTranslate, 43024 setTransition: setTransition, 43025 overwriteParams: function overwriteParams() { 43026 return { 43027 slidesPerView: 1, 43028 slidesPerGroup: 1, 43029 watchSlidesProgress: true, 43030 spaceBetween: 0, 43031 virtualTranslate: !swiper.params.cssMode 43032 }; 43033 } 43034 }); 43035} 43036 43037},{"../shared/effect-init.mjs":136,"../shared/effect-target.mjs":137,"../shared/effect-virtual-transition-end.mjs":138,"../shared/utils.mjs":141}],118:[function(require,module,exports){ 43038"use strict"; 43039 43040Object.defineProperty(exports, "__esModule", { 43041 value: true 43042}); 43043exports["default"] = EffectFlip; 43044var _createShadow = require("../shared/create-shadow.mjs"); 43045var _effectInit = require("../shared/effect-init.mjs"); 43046var _effectTarget = require("../shared/effect-target.mjs"); 43047var _effectVirtualTransitionEnd = require("../shared/effect-virtual-transition-end.mjs"); 43048var _utils = require("../shared/utils.mjs"); 43049function EffectFlip(_ref) { 43050 var swiper = _ref.swiper, 43051 extendParams = _ref.extendParams, 43052 on = _ref.on; 43053 extendParams({ 43054 flipEffect: { 43055 slideShadows: true, 43056 limitRotation: true 43057 } 43058 }); 43059 var createSlideShadows = function createSlideShadows(slideEl, progress) { 43060 var shadowBefore = swiper.isHorizontal() ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top'); 43061 var shadowAfter = swiper.isHorizontal() ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom'); 43062 if (!shadowBefore) { 43063 shadowBefore = (0, _createShadow.c)('flip', slideEl, swiper.isHorizontal() ? 'left' : 'top'); 43064 } 43065 if (!shadowAfter) { 43066 shadowAfter = (0, _createShadow.c)('flip', slideEl, swiper.isHorizontal() ? 'right' : 'bottom'); 43067 } 43068 if (shadowBefore) shadowBefore.style.opacity = Math.max(-progress, 0); 43069 if (shadowAfter) shadowAfter.style.opacity = Math.max(progress, 0); 43070 }; 43071 var recreateShadows = function recreateShadows() { 43072 // Set shadows 43073 swiper.params.flipEffect;
43074 swiper.slides.forEach(function (slideEl) { 43075 var progress = slideEl.progress; 43076 if (swiper.params.flipEffect.limitRotation) { 43077 progress = Math.max(Math.min(slideEl.progress, 1), -1); 43078 } 43079 createSlideShadows(slideEl, progress); 43080 }); 43081 }; 43082 var setTranslate = function setTranslate() { 43083 var slides = swiper.slides, 43084 rtl = swiper.rtlTranslate; 43085 var params = swiper.params.flipEffect; 43086 var rotateFix = (0, _utils.a)(swiper); 43087 for (var i = 0; i < slides.length; i += 1) { 43088 var slideEl = slides[i]; 43089 var progress = slideEl.progress; 43090 if (swiper.params.flipEffect.limitRotation) { 43091 progress = Math.max(Math.min(slideEl.progress, 1), -1); 43092 } 43093 var offset = slideEl.swiperSlideOffset; 43094 var rotate = -180 * progress; 43095 var rotateY = rotate; 43096 var rotateX = 0; 43097 var tx = swiper.params.cssMode ? -offset - swiper.translate : -offset; 43098 var ty = 0; 43099 if (!swiper.isHorizontal()) { 43100 ty = tx; 43101 tx = 0; 43102 rotateX = -rotateY; 43103 rotateY = 0; 43104 } else if (rtl) { 43105 rotateY = -rotateY; 43106 } 43107 slideEl.style.zIndex = -Math.abs(Math.round(progress)) + slides.length; 43108 if (params.slideShadows) { 43109 createSlideShadows(slideEl, progress); 43110 } 43111 var transform = "translate3d(".concat(tx, "px, ").concat(ty, "px, 0px) rotateX(").concat(rotateFix(rotateX), "deg) rotateY(").concat(rotateFix(rotateY), "deg)"); 43112 var targetEl = (0, _effectTarget.e)(params, slideEl); 43113 targetEl.style.transform = transform; 43114 } 43115 }; 43116 var setTransition = function setTransition(duration) { 43117 var transformElements = swiper.slides.map(function (slideEl) { 43118 return (0, _utils.g)(slideEl); 43119 }); 43120 transformElements.forEach(function (el) { 43121 el.style.transitionDuration = "".concat(duration, "ms"); 43122 el.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(function (shadowEl) { 43123 shadowEl.style.transitionDuration = "".concat(duration, "ms"); 43124 }); 43125 }); 43126 (0, _effectVirtualTransitionEnd.e)({ 43127 swiper: swiper, 43128 duration: duration, 43129 transformElements: transformElements 43130 }); 43131 }; 43132 (0, _effectInit.e)({ 43133 effect: 'flip', 43134 swiper: swiper, 43135 on: on, 43136 setTranslate: setTranslate, 43137 setTransition: setTransition, 43138 recreateShadows: recreateShadows, 43139 getEffectParams: function getEffectParams() { 43140 return swiper.params.flipEffect; 43141 }, 43142 perspective: function perspective() { 43143 return true; 43144 }, 43145 overwriteParams: function overwriteParams() { 43146 return { 43147 slidesPerView: 1, 43148 slidesPerGroup: 1, 43149 watchSlidesProgress: true, 43150 spaceBetween: 0, 43151 virtualTranslate: !swiper.params.cssMode 43152 }; 43153 } 43154 }); 43155} 43156 43157},{"../shared/create-shadow.mjs":135,"../shared/effect-init.mjs":136,"../shared/effect-target.mjs":137,"../shared/effect-virtual-transition-end.mjs":138,"../shared/utils.mjs":141}],119:[function(require,module,exports){ 43158"use strict"; 43159 43160Object.defineProperty(exports, "__esModule", { 43161 value: true 43162}); 43163exports["default"] = freeMode; 43164var _utils = require("../shared/utils.mjs"); 43165function freeMode(_ref) { 43166 var swiper = _ref.swiper, 43167 extendParams = _ref.extendParams, 43168 emit = _ref.emit, 43169 once = _ref.once; 43170 extendParams({ 43171 freeMode: { 43172 enabled: false, 43173 momentum: true, 43174 momentumRatio: 1, 43175 momentumBounce: true, 43176 momentumBounceRatio: 1, 43177 momentumVelocityRatio: 1, 43178 sticky: false, 43179 minimumVelocity: 0.02 43180 } 43181 }); 43182 function onTouchStart() { 43183 if (swiper.params.cssMode) return; 43184 var translate = swiper.getTranslate(); 43185 swiper.setTranslate(translate); 43186 swiper.setTransition(0); 43187 swiper.touchEventsData.velocities.length = 0; 43188 swiper.freeMode.onTouchEnd({ 43189 currentPos: swiper.rtl ? swiper.translate : -swiper.translate 43190 }); 43191 } 43192 function onTouchMove() { 43193 if (swiper.params.cssMode) return; 43194 var data = swiper.touchEventsData, 43195 touches = swiper.touches; 43196 // Velocity 43197 if (data.velocities.length === 0) { 43198 data.velocities.push({ 43199 position: touches[swiper.isHorizontal() ? 'startX' : 'startY'], 43200 time: data.touchStartTime 43201 }); 43202 } 43203 data.velocities.push({ 43204 position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'], 43205 time: (0, _utils.h)() 43206 }); 43207 } 43208 function onTouchEnd(_ref2) { 43209 var currentPos = _ref2.currentPos; 43210 if (swiper.params.cssMode) return; 43211 var params = swiper.params, 43212 wrapperEl = swiper.wrapperEl, 43213 rtl = swiper.rtlTranslate, 43214 snapGrid = swiper.snapGrid, 43215 data = swiper.touchEventsData; 43216 // Time diff 43217 var touchEndTime = (0, _utils.h)(); 43218 var timeDiff = touchEndTime - data.touchStartTime;
43219 if (currentPos < -swiper.minTranslate()) { 43220 swiper.slideTo(swiper.activeIndex); 43221 return; 43222 } 43223 if (currentPos > -swiper.maxTranslate()) { 43224 if (swiper.slides.length < snapGrid.length) { 43225 swiper.slideTo(snapGrid.length - 1); 43226 } else { 43227 swiper.slideTo(swiper.slides.length - 1); 43228 } 43229 return; 43230 } 43231 if (params.freeMode.momentum) { 43232 if (data.velocities.length > 1) { 43233 var lastMoveEvent = data.velocities.pop(); 43234 var velocityEvent = data.velocities.pop(); 43235 var distance = lastMoveEvent.position - velocityEvent.position; 43236 var time = lastMoveEvent.time - velocityEvent.time; 43237 swiper.velocity = distance / time; 43238 swiper.velocity /= 2; 43239 if (Math.abs(swiper.velocity) < params.freeMode.minimumVelocity) { 43240 swiper.velocity = 0; 43241 } 43242 // this implies that the user stopped moving a finger then released. 43243 // There would be no events with distance zero, so the last event is stale. 43244 if (time > 150 || (0, _utils.h)() - lastMoveEvent.time > 300) { 43245 swiper.velocity = 0; 43246 } 43247 } else { 43248 swiper.velocity = 0; 43249 } 43250 swiper.velocity *= params.freeMode.momentumVelocityRatio; 43251 data.velocities.length = 0; 43252 var momentumDuration = 1000 * params.freeMode.momentumRatio; 43253 var momentumDistance = swiper.velocity * momentumDuration; 43254 var newPosition = swiper.translate + momentumDistance; 43255 if (rtl) newPosition = -newPosition; 43256 var doBounce = false; 43257 var afterBouncePosition; 43258 var bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeMode.momentumBounceRatio; 43259 var needsLoopFix; 43260 if (newPosition < swiper.maxTranslate()) { 43261 if (params.freeMode.momentumBounce) { 43262 if (newPosition + swiper.maxTranslate() < -bounceAmount) { 43263 newPosition = swiper.maxTranslate() - bounceAmount; 43264 } 43265 afterBouncePosition = swiper.maxTranslate(); 43266 doBounce = true; 43267 data.allowMomentumBounce = true; 43268 } else { 43269 newPosition = swiper.maxTranslate(); 43270 } 43271 if (params.loop && params.centeredSlides) needsLoopFix = true; 43272 } else if (newPosition > swiper.minTranslate()) { 43273 if (params.freeMode.momentumBounce) { 43274 if (newPosition - swiper.minTranslate() > bounceAmount) { 43275 newPosition = swiper.minTranslate() + bounceAmount; 43276 } 43277 afterBouncePosition = swiper.minTranslate(); 43278 doBounce = true; 43279 data.allowMomentumBounce = true; 43280 } else { 43281 newPosition = swiper.minTranslate(); 43282 } 43283 if (params.loop && params.centeredSlides) needsLoopFix = true; 43284 } else if (params.freeMode.sticky) { 43285 var nextSlide; 43286 for (var j = 0; j < snapGrid.length; j += 1) { 43287 if (snapGrid[j] > -newPosition) { 43288 nextSlide = j; 43289 break; 43290 } 43291 } 43292 if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') { 43293 newPosition = snapGrid[nextSlide]; 43294 } else { 43295 newPosition = snapGrid[nextSlide - 1]; 43296 } 43297 newPosition = -newPosition; 43298 } 43299 if (needsLoopFix) { 43300 once('transitionEnd', function () { 43301 swiper.loopFix(); 43302 }); 43303 } 43304 // Fix duration 43305 if (swiper.velocity !== 0) { 43306 if (rtl) { 43307 momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity); 43308 } else { 43309 momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity); 43310 } 43311 if (params.freeMode.sticky) { 43312 // If freeMode.sticky is active and the user ends a swipe with a slow-velocity 43313 // event, then durations can be 20+ seconds to slide one (or zero!) slides. 43314 // It's easy to see this when simulating touch with mouse events. To fix this, 43315 // limit single-slide swipes to the default slide duration. This also has the 43316 // nice side effect of matching slide speed if the user stopped moving before 43317 // lifting finger or mouse vs. moving slowly before lifting the finger/mouse. 43318 // For faster swipes, also apply limits (albeit higher ones). 43319 var moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate); 43320 var currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex]; 43321 if (moveDistance < currentSlideSize) { 43322 momentumDuration = params.speed; 43323 } else if (moveDistance < 2 * currentSlideSize) { 43324 momentumDuration = params.speed * 1.5; 43325 } else { 43326 momentumDuration = params.speed * 2.5; 43327 } 43328 } 43329 } else if (params.freeMode.sticky) { 43330 swiper.slideToClosest(); 43331 return; 43332 } 43333 if (params.freeMode.momentumBounce && doBounce) { 43334 swiper.updateProgress(afterBouncePosition); 43335 swiper.setTransition(momentumDuration); 43336 swiper.setTranslate(newPosition); 43337 swiper.transitionStart(true, swiper.swipeDirection); 43338 swiper.animating = true; 43339 (0, _utils.o)(wrapperEl, function () { 43340 if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return; 43341 emit('momentumBounce'); 43342 swiper.setTransition(params.speed); 43343 setTimeout(function () { 43344 swiper.setTranslate(afterBouncePosition); 43345 (0, _utils.o)(wrapperEl, function () { 43346 if (!swiper || swiper.destroyed) return; 43347 swiper.transitionEnd(); 43348 }); 43349 }, 0); 43350 }); 43351 } else if (swiper.velocity) { 43352 emit('_freeModeNoMomentumRelease'); 43353 swiper.updateProgress(newPosition); 43354 swiper.setTransition(momentumDuration); 43355 swiper.setTranslate(newPosition); 43356 swiper.transitionStart(true, swiper.swipeDirection); 43357 if (!swiper.animating) { 43358 swiper.animating = true; 43359 (0, _utils.o)(wrapperEl, function () { 43360 if (!swiper || swiper.destroyed) return; 43361 swiper.transitionEnd(); 43362 }); 43363 } 43364 } else { 43365 swiper.updateProgress(newPosition); 43366 } 43367 swiper.updateActiveIndex(); 43368 swiper.updateSlidesClasses(); 43369 } else if (params.freeMode.sticky) { 43370 swiper.slideToClosest(); 43371 return; 43372 } else if (params.freeMode) { 43373 emit('_freeModeNoMomentumRelease'); 43374 } 43375 if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) { 43376 emit('_freeModeStaticRelease'); 43377 swiper.updateProgress(); 43378 swiper.updateActiveIndex(); 43379 swiper.updateSlidesClasses(); 43380 } 43381 } 43382 Object.assign(swiper, { 43383 freeMode: { 43384 onTouchStart: onTouchStart, 43385 onTouchMove: onTouchMove, 43386 onTouchEnd: onTouchEnd 43387 } 43388 }); 43389} 43390 43391},{"../shared/utils.mjs":141}],120:[function(require,module,exports){ 43392"use strict"; 43393 43394Object.defineProperty(exports, "__esModule", { 43395 value: true 43396}); 43397exports["default"] = Grid; 43398function Grid(_ref) { 43399 var swiper = _ref.swiper, 43400 extendParams = _ref.extendParams, 43401 on = _ref.on; 43402 extendParams({ 43403 grid: { 43404 rows: 1, 43405 fill: 'column' 43406 } 43407 });
43408 var slidesNumberEvenToRows; 43409 var slidesPerRow; 43410 var numFullColumns; 43411 var wasMultiRow; 43412 var getSpaceBetween = function getSpaceBetween() { 43413 var spaceBetween = swiper.params.spaceBetween; 43414 if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) { 43415 spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiper.size; 43416 } else if (typeof spaceBetween === 'string') { 43417 spaceBetween = parseFloat(spaceBetween); 43418 } 43419 return spaceBetween; 43420 }; 43421 var initSlides = function initSlides(slides) { 43422 var slidesPerView = swiper.params.slidesPerView; 43423 var _swiper$params$grid = swiper.params.grid, 43424 rows = _swiper$params$grid.rows, 43425 fill = _swiper$params$grid.fill; 43426 var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : slides.length; 43427 numFullColumns = Math.floor(slidesLength / rows); 43428 if (Math.floor(slidesLength / rows) === slidesLength / rows) { 43429 slidesNumberEvenToRows = slidesLength; 43430 } else { 43431 slidesNumberEvenToRows = Math.ceil(slidesLength / rows) * rows; 43432 } 43433 if (slidesPerView !== 'auto' && fill === 'row') { 43434 slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, Math.floor(slidesPerView) * rows); 43435 } 43436 slidesPerRow = slidesNumberEvenToRows / rows; 43437 }; 43438 var unsetSlides = function unsetSlides() { 43439 if (swiper.slides) { 43440 swiper.slides.forEach(function (slide) { 43441 if (slide.swiperSlideGridSet) { 43442 slide.style.height = ''; 43443 slide.style[swiper.getDirectionLabel('margin-top')] = ''; 43444 } 43445 }); 43446 } 43447 }; 43448 var updateSlide = function updateSlide(i, slide, slides) { 43449 var slidesPerGroup = swiper.params.slidesPerGroup; 43450 var spaceBetween = getSpaceBetween(); 43451 var _swiper$params$grid2 = swiper.params.grid, 43452 rows = _swiper$params$grid2.rows, 43453 fill = _swiper$params$grid2.fill; 43454 var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : slides.length; 43455 // Set slides order 43456 var newSlideOrderIndex; 43457 var column; 43458 var row; 43459 if (fill === 'row' && slidesPerGroup > 1) { 43460 var groupIndex = Math.floor(i / (slidesPerGroup * rows)); 43461 var slideIndexInGroup = i - rows * slidesPerGroup * groupIndex; 43462 var columnsInGroup = groupIndex === 0 ? slidesPerGroup : Math.min(Math.ceil((slidesLength - groupIndex * rows * slidesPerGroup) / rows), slidesPerGroup); 43463 row = Math.floor(slideIndexInGroup / columnsInGroup); 43464 column = slideIndexInGroup - row * columnsInGroup + groupIndex * slidesPerGroup; 43465 newSlideOrderIndex = column + row * slidesNumberEvenToRows / rows; 43466 slide.style.order = newSlideOrderIndex; 43467 } else if (fill === 'column') { 43468 column = Math.floor(i / rows); 43469 row = i - column * rows; 43470 if (column > numFullColumns || column === numFullColumns && row === rows - 1) { 43471 row += 1; 43472 if (row >= rows) { 43473 row = 0; 43474 column += 1; 43475 } 43476 } 43477 } else { 43478 row = Math.floor(i / slidesPerRow); 43479 column = i - row * slidesPerRow; 43480 } 43481 slide.row = row; 43482 slide.column = column; 43483 slide.style.height = "calc((100% - ".concat((rows - 1) * spaceBetween, "px) / ").concat(rows, ")"); 43484 slide.style[swiper.getDirectionLabel('margin-top')] = row !== 0 ? spaceBetween && "".concat(spaceBetween, "px") : ''; 43485 slide.swiperSlideGridSet = true; 43486 }; 43487 var updateWrapperSize = function updateWrapperSize(slideSize, snapGrid) { 43488 var _swiper$params = swiper.params, 43489 centeredSlides = _swiper$params.centeredSlides, 43490 roundLengths = _swiper$params.roundLengths; 43491 var spaceBetween = getSpaceBetween(); 43492 var rows = swiper.params.grid.rows; 43493 swiper.virtualSize = (slideSize + spaceBetween) * slidesNumberEvenToRows; 43494 swiper.virtualSize = Math.ceil(swiper.virtualSize / rows) - spaceBetween; 43495 if (!swiper.params.cssMode) { 43496 swiper.wrapperEl.style[swiper.getDirectionLabel('width')] = "".concat(swiper.virtualSize + spaceBetween, "px"); 43497 } 43498 if (centeredSlides) { 43499 var newSlidesGrid = []; 43500 for (var i = 0; i < snapGrid.length; i += 1) { 43501 var slidesGridItem = snapGrid[i]; 43502 if (roundLengths) slidesGridItem = Math.floor(slidesGridItem);
43503 if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem); 43504 } 43505 snapGrid.splice(0, snapGrid.length); 43506 snapGrid.push.apply(snapGrid, newSlidesGrid); 43507 } 43508 }; 43509 var onInit = function onInit() { 43510 wasMultiRow = swiper.params.grid && swiper.params.grid.rows > 1; 43511 }; 43512 var onUpdate = function onUpdate() { 43513 var params = swiper.params, 43514 el = swiper.el; 43515 var isMultiRow = params.grid && params.grid.rows > 1; 43516 if (wasMultiRow && !isMultiRow) { 43517 el.classList.remove("".concat(params.containerModifierClass, "grid"), "".concat(params.containerModifierClass, "grid-column")); 43518 numFullColumns = 1; 43519 swiper.emitContainerClasses(); 43520 } else if (!wasMultiRow && isMultiRow) { 43521 el.classList.add("".concat(params.containerModifierClass, "grid")); 43522 if (params.grid.fill === 'column') { 43523 el.classList.add("".concat(params.containerModifierClass, "grid-column")); 43524 } 43525 swiper.emitContainerClasses(); 43526 } 43527 wasMultiRow = isMultiRow; 43528 }; 43529 on('init', onInit); 43530 on('update', onUpdate); 43531 swiper.grid = { 43532 initSlides: initSlides, 43533 unsetSlides: unsetSlides, 43534 updateSlide: updateSlide, 43535 updateWrapperSize: updateWrapperSize 43536 }; 43537} 43538 43539},{}],121:[function(require,module,exports){ 43540"use strict"; 43541 43542Object.defineProperty(exports, "__esModule", { 43543 value: true 43544}); 43545exports["default"] = HashNavigation; 43546var _ssrWindowEsm = require("../shared/ssr-window.esm.mjs"); 43547var _utils = require("../shared/utils.mjs"); 43548function HashNavigation(_ref) { 43549 var swiper = _ref.swiper, 43550 extendParams = _ref.extendParams, 43551 emit = _ref.emit, 43552 on = _ref.on; 43553 var initialized = false; 43554 var document = (0, _ssrWindowEsm.g)(); 43555 var window = (0, _ssrWindowEsm.a)(); 43556 extendParams({ 43557 hashNavigation: { 43558 enabled: false, 43559 replaceState: false, 43560 watchState: false, 43561 getSlideIndex: function getSlideIndex(_s, hash) { 43562 if (swiper.virtual && swiper.params.virtual.enabled) { 43563 var slideWithHash = swiper.slides.find(function (slideEl) { 43564 return slideEl.getAttribute('data-hash') === hash; 43565 }); 43566 if (!slideWithHash) return 0; 43567 var index = parseInt(slideWithHash.getAttribute('data-swiper-slide-index'), 10); 43568 return index; 43569 } 43570 return swiper.getSlideIndex((0, _utils.e)(swiper.slidesEl, ".".concat(swiper.params.slideClass, "[data-hash=\"").concat(hash, "\"], swiper-slide[data-hash=\"").concat(hash, "\"]"))[0]); 43571 } 43572 } 43573 }); 43574 var onHashChange = function onHashChange() { 43575 emit('hashChange'); 43576 var newHash = document.location.hash.replace('#', ''); 43577 var activeSlideEl = swiper.virtual && swiper.params.virtual.enabled ? swiper.slidesEl.querySelector("[data-swiper-slide-index=\"".concat(swiper.activeIndex, "\"]")) : swiper.slides[swiper.activeIndex]; 43578 var activeSlideHash = activeSlideEl ? activeSlideEl.getAttribute('data-hash') : ''; 43579 if (newHash !== activeSlideHash) { 43580 var newIndex = swiper.params.hashNavigation.getSlideIndex(swiper, newHash); 43581 if (typeof newIndex === 'undefined' || Number.isNaN(newIndex)) return; 43582 swiper.slideTo(newIndex); 43583 } 43584 }; 43585 var setHash = function setHash() { 43586 if (!initialized || !swiper.params.hashNavigation.enabled) return; 43587 var activeSlideEl = swiper.virtual && swiper.params.virtual.enabled ? swiper.slidesEl.querySelector("[data-swiper-slide-index=\"".concat(swiper.activeIndex, "\"]")) : swiper.slides[swiper.activeIndex]; 43588 var activeSlideHash = activeSlideEl ? activeSlideEl.getAttribute('data-hash') || activeSlideEl.getAttribute('data-history') : ''; 43589 if (swiper.params.hashNavigation.replaceState && window.history && window.history.replaceState) { 43590 window.history.replaceState(null, null, "#".concat(activeSlideHash) || ''); 43591 emit('hashSet'); 43592 } else { 43593 document.location.hash = activeSlideHash || ''; 43594 emit('hashSet'); 43595 } 43596 }; 43597 var init = function init() { 43598 if (!swiper.params.hashNavigation.enabled || swiper.params.history && swiper.params.history.enabled) return; 43599 initialized = true; 43600 var hash = document.location.hash.replace('#', ''); 43601 if (hash) { 43602 var speed = 0; 43603 var index = swiper.params.hashNavigation.getSlideIndex(swiper, hash); 43604 swiper.slideTo(index || 0, speed, swiper.params.runCallbacksOnInit, true); 43605 } 43606 if (swiper.params.hashNavigation.watchState) { 43607 window.addEventListener('hashchange', onHashChange); 43608 } 43609 }; 43610 var destroy = function destroy() { 43611 if (swiper.params.hashNavigation.watchState) { 43612 window.removeEventListener('hashchange', onHashChange); 43613 } 43614 }; 43615 on('init', function () { 43616 if (swiper.params.hashNavigation.enabled) { 43617 init(); 43618 } 43619 }); 43620 on('destroy', function () { 43621 if (swiper.params.hashNavigation.enabled) { 43622 destroy(); 43623 } 43624 }); 43625 on('transitionEnd _freeModeNoMomentumRelease', function () { 43626 if (initialized) { 43627 setHash(); 43628 } 43629 }); 43630 on('slideChange', function () { 43631 if (initialized && swiper.params.cssMode) { 43632 setHash(); 43633 } 43634 }); 43635} 43636 43637},{"../shared/ssr-window.esm.mjs":139,"../shared/utils.mjs":141}],122:[function(require,module,exports){ 43638"use strict"; 43639 43640Object.defineProperty(exports, "__esModule", { 43641 value: true 43642}); 43643exports["default"] = History; 43644var _ssrWindowEsm = require("../shared/ssr-window.esm.mjs"); 43645function History(_ref) { 43646 var swiper = _ref.swiper, 43647 extendParams = _ref.extendParams, 43648 on = _ref.on; 43649 extendParams({ 43650 history: { 43651 enabled: false, 43652 root: '', 43653 replaceState: false, 43654 key: 'slides', 43655 keepQuery: false 43656 } 43657 }); 43658 var initialized = false;
43659 var paths = {}; 43660 var slugify = function slugify(text) { 43661 return text.toString().replace(/\s+/g, '-').replace(/[^\w-]+/g, '').replace(/--+/g, '-').replace(/^-+/, '').replace(/-+$/, ''); 43662 }; 43663 var getPathValues = function getPathValues(urlOverride) { 43664 var window = (0, _ssrWindowEsm.a)(); 43665 var location; 43666 if (urlOverride) { 43667 location = new URL(urlOverride); 43668 } else { 43669 location = window.location; 43670 } 43671 var pathArray = location.pathname.slice(1).split('/').filter(function (part) { 43672 return part !== ''; 43673 }); 43674 var total = pathArray.length; 43675 var key = pathArray[total - 2]; 43676 var value = pathArray[total - 1]; 43677 return { 43678 key: key, 43679 value: value 43680 }; 43681 }; 43682 var setHistory = function setHistory(key, index) { 43683 var window = (0, _ssrWindowEsm.a)(); 43684 if (!initialized || !swiper.params.history.enabled) return; 43685 var location; 43686 if (swiper.params.url) { 43687 location = new URL(swiper.params.url); 43688 } else { 43689 location = window.location; 43690 } 43691 var slide = swiper.virtual && swiper.params.virtual.enabled ? swiper.slidesEl.querySelector("[data-swiper-slide-index=\"".concat(index, "\"]")) : swiper.slides[index]; 43692 var value = slugify(slide.getAttribute('data-history')); 43693 if (swiper.params.history.root.length > 0) { 43694 var root = swiper.params.history.root; 43695 if (root[root.length - 1] === '/') root = root.slice(0, root.length - 1); 43696 value = "".concat(root, "/").concat(key ? "".concat(key, "/") : '').concat(value); 43697 } else if (!location.pathname.includes(key)) { 43698 value = "".concat(key ? "".concat(key, "/") : '').concat(value); 43699 } 43700 if (swiper.params.history.keepQuery) { 43701 value += location.search; 43702 } 43703 var currentState = window.history.state; 43704 if (currentState && currentState.value === value) { 43705 return; 43706 } 43707 if (swiper.params.history.replaceState) { 43708 window.history.replaceState({ 43709 value: value 43710 }, null, value); 43711 } else { 43712 window.history.pushState({ 43713 value: value 43714 }, null, value); 43715 } 43716 }; 43717 var scrollToSlide = function scrollToSlide(speed, value, runCallbacks) { 43718 if (value) { 43719 for (var i = 0, length = swiper.slides.length; i < length; i += 1) { 43720 var slide = swiper.slides[i]; 43721 var slideHistory = slugify(slide.getAttribute('data-history')); 43722 if (slideHistory === value) { 43723 var index = swiper.getSlideIndex(slide); 43724 swiper.slideTo(index, speed, runCallbacks); 43725 } 43726 } 43727 } else { 43728 swiper.slideTo(0, speed, runCallbacks); 43729 } 43730 }; 43731 var setHistoryPopState = function setHistoryPopState() { 43732 paths = getPathValues(swiper.params.url); 43733 scrollToSlide(swiper.params.speed, paths.value, false); 43734 }; 43735 var init = function init() { 43736 var window = (0, _ssrWindowEsm.a)(); 43737 if (!swiper.params.history) return; 43738 if (!window.history || !window.history.pushState) { 43739 swiper.params.history.enabled = false; 43740 swiper.params.hashNavigation.enabled = true; 43741 return; 43742 } 43743 initialized = true; 43744 paths = getPathValues(swiper.params.url); 43745 if (!paths.key && !paths.value) { 43746 if (!swiper.params.history.replaceState) { 43747 window.addEventListener('popstate', setHistoryPopState); 43748 } 43749 return; 43750 } 43751 scrollToSlide(0, paths.value, swiper.params.runCallbacksOnInit); 43752 if (!swiper.params.history.replaceState) { 43753 window.addEventListener('popstate', setHistoryPopState); 43754 } 43755 }; 43756 var destroy = function destroy() { 43757 var window = (0, _ssrWindowEsm.a)(); 43758 if (!swiper.params.history.replaceState) { 43759 window.removeEventListener('popstate', setHistoryPopState); 43760 } 43761 }; 43762 on('init', function () { 43763 if (swiper.params.history.enabled) { 43764 init(); 43765 } 43766 }); 43767 on('destroy', function () { 43768 if (swiper.params.history.enabled) { 43769 destroy(); 43770 } 43771 }); 43772 on('transitionEnd _freeModeNoMomentumRelease', function () { 43773 if (initialized) { 43774 setHistory(swiper.params.history.key, swiper.activeIndex); 43775 } 43776 }); 43777 on('slideChange', function () { 43778 if (initialized && swiper.params.cssMode) { 43779 setHistory(swiper.params.history.key, swiper.activeIndex); 43780 } 43781 }); 43782} 43783 43784},{"../shared/ssr-window.esm.mjs":139}],123:[function(require,module,exports){ 43785"use strict"; 43786 43787Object.defineProperty(exports, "__esModule", { 43788 value: true 43789}); 43790exports["default"] = Keyboard; 43791var _ssrWindowEsm = require("../shared/ssr-window.esm.mjs"); 43792var _utils = require("../shared/utils.mjs"); 43793/* eslint-disable consistent-return */ 43794function Keyboard(_ref) { 43795 var swiper = _ref.swiper, 43796 extendParams = _ref.extendParams, 43797 on = _ref.on, 43798 emit = _ref.emit; 43799 var document = (0, _ssrWindowEsm.g)(); 43800 var window = (0, _ssrWindowEsm.a)(); 43801 swiper.keyboard = { 43802 enabled: false 43803 }; 43804 extendParams({ 43805 keyboard: { 43806 enabled: false, 43807 onlyInViewport: true, 43808 pageUpDown: true, 43809 speed: undefined 43810 } 43811 }); 43812 function handle(event) { 43813 if (!swiper.enabled) return; 43814 var rtl = swiper.rtlTranslate; 43815 var e = event; 43816 if (e.originalEvent) e = e.originalEvent; // jquery fix 43817 var kc = e.keyCode || e.charCode; 43818 var pageUpDown = swiper.params.keyboard.pageUpDown; 43819 var isPageUp = pageUpDown && kc === 33; 43820 var isPageDown = pageUpDown && kc === 34; 43821 var isArrowLeft = kc === 37; 43822 var isArrowRight = kc === 39; 43823 var isArrowUp = kc === 38; 43824 var isArrowDown = kc === 40; 43825 // Directions locks 43826 if (!swiper.allowSlideNext && (swiper.isHorizontal() && isArrowRight || swiper.isVertical() && isArrowDown || isPageDown)) { 43827 return false;
43828 } 43829 if (!swiper.allowSlidePrev && (swiper.isHorizontal() && isArrowLeft || swiper.isVertical() && isArrowUp || isPageUp)) { 43830 return false; 43831 } 43832 if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) { 43833 return undefined; 43834 } 43835 if (document.activeElement && (document.activeElement.isContentEditable || document.activeElement.nodeName && (document.activeElement.nodeName.toLowerCase() === 'input' || document.activeElement.nodeName.toLowerCase() === 'textarea'))) { 43836 return undefined; 43837 } 43838 if (swiper.params.keyboard.onlyInViewport && (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)) { 43839 var inView = false; 43840 // Check that swiper should be inside of visible area of window 43841 if ((0, _utils.d)(swiper.el, ".".concat(swiper.params.slideClass, ", swiper-slide")).length > 0 && (0, _utils.d)(swiper.el, ".".concat(swiper.params.slideActiveClass)).length === 0) { 43842 return undefined; 43843 } 43844 var el = swiper.el; 43845 var swiperWidth = el.clientWidth; 43846 var swiperHeight = el.clientHeight; 43847 var windowWidth = window.innerWidth; 43848 var windowHeight = window.innerHeight; 43849 var swiperOffset = (0, _utils.f)(el); 43850 if (rtl) swiperOffset.left -= el.scrollLeft; 43851 var swiperCoord = [[swiperOffset.left, swiperOffset.top], [swiperOffset.left + swiperWidth, swiperOffset.top], [swiperOffset.left, swiperOffset.top + swiperHeight], [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight]]; 43852 for (var i = 0; i < swiperCoord.length; i += 1) { 43853 var point = swiperCoord[i]; 43854 if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) { 43855 if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line 43856 inView = true; 43857 } 43858 } 43859 if (!inView) return undefined; 43860 } 43861 var speed = swiper.params.keyboard.speed; 43862 if (swiper.isHorizontal()) { 43863 if (isPageUp || isPageDown || isArrowLeft || isArrowRight) { 43864 if (e.preventDefault) e.preventDefault();else e.returnValue = false; 43865 } 43866 if ((isPageDown || isArrowRight) && !rtl || (isPageUp || isArrowLeft) && rtl) swiper.slideNext(speed); 43867 if ((isPageUp || isArrowLeft) && !rtl || (isPageDown || isArrowRight) && rtl) swiper.slidePrev(speed); 43868 } else { 43869 if (isPageUp || isPageDown || isArrowUp || isArrowDown) { 43870 if (e.preventDefault) e.preventDefault();else e.returnValue = false; 43871 } 43872 if (isPageDown || isArrowDown) swiper.slideNext(speed); 43873 if (isPageUp || isArrowUp) swiper.slidePrev(speed); 43874 } 43875 emit('keyPress', kc); 43876 return undefined; 43877 } 43878 function enable() { 43879 if (swiper.keyboard.enabled) return; 43880 document.addEventListener('keydown', handle); 43881 swiper.keyboard.enabled = true; 43882 } 43883 function disable() { 43884 if (!swiper.keyboard.enabled) return; 43885 document.removeEventListener('keydown', handle); 43886 swiper.keyboard.enabled = false; 43887 } 43888 on('init', function () { 43889 if (swiper.params.keyboard.enabled) { 43890 enable(); 43891 } 43892 }); 43893 on('destroy', function () { 43894 if (swiper.keyboard.enabled) { 43895 disable(); 43896 } 43897 }); 43898 Object.assign(swiper.keyboard, { 43899 enable: enable, 43900 disable: disable 43901 }); 43902} 43903 43904},{"../shared/ssr-window.esm.mjs":139,"../shared/utils.mjs":141}],124:[function(require,module,exports){ 43905"use strict"; 43906 43907var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 43908Object.defineProperty(exports, "__esModule", { 43909 value: true 43910}); 43911exports["default"] = Manipulation; 43912var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); 43913var _utils = require("../shared/utils.mjs"); 43914function appendSlide(slides) { 43915 var swiper = this; 43916 var params = swiper.params, 43917 slidesEl = swiper.slidesEl; 43918 if (params.loop) { 43919 swiper.loopDestroy(); 43920 } 43921 var appendElement = function appendElement(slideEl) { 43922 if (typeof slideEl === 'string') { 43923 var tempDOM = document.createElement('div'); 43924 (0, _utils.s)(tempDOM, slideEl); 43925 slidesEl.append(tempDOM.children[0]); 43926 (0, _utils.s)(tempDOM, ''); 43927 } else { 43928 slidesEl.append(slideEl); 43929 } 43930 }; 43931 if ((0, _typeof2["default"])(slides) === 'object' && 'length' in slides) { 43932 for (var i = 0; i < slides.length; i += 1) { 43933 if (slides[i]) appendElement(slides[i]); 43934 } 43935 } else { 43936 appendElement(slides); 43937 } 43938 swiper.recalcSlides(); 43939 if (params.loop) { 43940 swiper.loopCreate(); 43941 } 43942 if (!params.observer || swiper.isElement) {
43943 swiper.update(); 43944 } 43945} 43946function prependSlide(slides) { 43947 var swiper = this; 43948 var params = swiper.params, 43949 activeIndex = swiper.activeIndex, 43950 slidesEl = swiper.slidesEl; 43951 if (params.loop) { 43952 swiper.loopDestroy(); 43953 } 43954 var newActiveIndex = activeIndex + 1; 43955 var prependElement = function prependElement(slideEl) { 43956 if (typeof slideEl === 'string') { 43957 var tempDOM = document.createElement('div'); 43958 (0, _utils.s)(tempDOM, slideEl); 43959 slidesEl.prepend(tempDOM.children[0]); 43960 (0, _utils.s)(tempDOM, ''); 43961 } else { 43962 slidesEl.prepend(slideEl); 43963 } 43964 }; 43965 if ((0, _typeof2["default"])(slides) === 'object' && 'length' in slides) { 43966 for (var i = 0; i < slides.length; i += 1) { 43967 if (slides[i]) prependElement(slides[i]); 43968 } 43969 newActiveIndex = activeIndex + slides.length; 43970 } else { 43971 prependElement(slides); 43972 } 43973 swiper.recalcSlides(); 43974 if (params.loop) { 43975 swiper.loopCreate(); 43976 } 43977 if (!params.observer || swiper.isElement) { 43978 swiper.update(); 43979 } 43980 swiper.slideTo(newActiveIndex, 0, false); 43981} 43982function addSlide(index, slides) { 43983 var swiper = this; 43984 var params = swiper.params, 43985 activeIndex = swiper.activeIndex, 43986 slidesEl = swiper.slidesEl; 43987 var activeIndexBuffer = activeIndex; 43988 if (params.loop) { 43989 activeIndexBuffer -= swiper.loopedSlides; 43990 swiper.loopDestroy(); 43991 swiper.recalcSlides(); 43992 } 43993 var baseLength = swiper.slides.length; 43994 if (index <= 0) { 43995 swiper.prependSlide(slides); 43996 return; 43997 } 43998 if (index >= baseLength) { 43999 swiper.appendSlide(slides); 44000 return; 44001 } 44002 var newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer; 44003 var slidesBuffer = []; 44004 for (var i = baseLength - 1; i >= index; i -= 1) { 44005 var currentSlide = swiper.slides[i]; 44006 currentSlide.remove(); 44007 slidesBuffer.unshift(currentSlide); 44008 } 44009 if ((0, _typeof2["default"])(slides) === 'object' && 'length' in slides) { 44010 for (var _i = 0; _i < slides.length; _i += 1) { 44011 if (slides[_i]) slidesEl.append(slides[_i]); 44012 } 44013 newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer; 44014 } else { 44015 slidesEl.append(slides); 44016 } 44017 for (var _i2 = 0; _i2 < slidesBuffer.length; _i2 += 1) { 44018 slidesEl.append(slidesBuffer[_i2]); 44019 } 44020 swiper.recalcSlides(); 44021 if (params.loop) { 44022 swiper.loopCreate(); 44023 } 44024 if (!params.observer || swiper.isElement) { 44025 swiper.update(); 44026 } 44027 if (params.loop) { 44028 swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false); 44029 } else { 44030 swiper.slideTo(newActiveIndex, 0, false); 44031 } 44032} 44033function removeSlide(slidesIndexes) { 44034 var swiper = this; 44035 var params = swiper.params, 44036 activeIndex = swiper.activeIndex; 44037 var activeIndexBuffer = activeIndex; 44038 if (params.loop) { 44039 activeIndexBuffer -= swiper.loopedSlides; 44040 swiper.loopDestroy(); 44041 } 44042 var newActiveIndex = activeIndexBuffer; 44043 var indexToRemove; 44044 if ((0, _typeof2["default"])(slidesIndexes) === 'object' && 'length' in slidesIndexes) { 44045 for (var i = 0; i < slidesIndexes.length; i += 1) { 44046 indexToRemove = slidesIndexes[i]; 44047 if (swiper.slides[indexToRemove]) swiper.slides[indexToRemove].remove(); 44048 if (indexToRemove < newActiveIndex) newActiveIndex -= 1; 44049 } 44050 newActiveIndex = Math.max(newActiveIndex, 0); 44051 } else { 44052 indexToRemove = slidesIndexes; 44053 if (swiper.slides[indexToRemove]) swiper.slides[indexToRemove].remove(); 44054 if (indexToRemove < newActiveIndex) newActiveIndex -= 1; 44055 newActiveIndex = Math.max(newActiveIndex, 0); 44056 } 44057 swiper.recalcSlides(); 44058 if (params.loop) { 44059 swiper.loopCreate(); 44060 } 44061 if (!params.observer || swiper.isElement) { 44062 swiper.update(); 44063 } 44064 if (params.loop) { 44065 swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false); 44066 } else { 44067 swiper.slideTo(newActiveIndex, 0, false); 44068 } 44069} 44070function removeAllSlides() { 44071 var swiper = this; 44072 var slidesIndexes = []; 44073 for (var i = 0; i < swiper.slides.length; i += 1) { 44074 slidesIndexes.push(i); 44075 } 44076 swiper.removeSlide(slidesIndexes); 44077} 44078function Manipulation(_ref) { 44079 var swiper = _ref.swiper; 44080 Object.assign(swiper, { 44081 appendSlide: appendSlide.bind(swiper), 44082 prependSlide: prependSlide.bind(swiper), 44083 addSlide: addSlide.bind(swiper), 44084 removeSlide: removeSlide.bind(swiper), 44085 removeAllSlides: removeAllSlides.bind(swiper) 44086 }); 44087} 44088 44089},{"../shared/utils.mjs":141,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/typeof":108}],125:[function(require,module,exports){ 44090"use strict"; 44091 44092Object.defineProperty(exports, "__esModule", { 44093 value: true 44094}); 44095exports["default"] = Mousewheel; 44096var _ssrWindowEsm = require("../shared/ssr-window.esm.mjs"); 44097var _utils = require("../shared/utils.mjs"); 44098/* eslint-disable consistent-return */ 44099function Mousewheel(_ref) { 44100 var swiper = _ref.swiper, 44101 extendParams = _ref.extendParams, 44102 on = _ref.on, 44103 emit = _ref.emit; 44104 var window = (0, _ssrWindowEsm.a)(); 44105 extendParams({ 44106 mousewheel: { 44107 enabled: false, 44108 releaseOnEdges: false, 44109 invert: false,
vendor: 4,312 bytes, lines 44110-44255
44110 forceToAxis: false, 44111 sensitivity: 1, 44112 eventsTarget: 'container', 44113 thresholdDelta: null, 44114 thresholdTime: null, 44115 noMousewheelClass: 'swiper-no-mousewheel' 44116 } 44117 }); 44118 swiper.mousewheel = { 44119 enabled: false 44120 }; 44121 var timeout; 44122 var lastScrollTime = (0, _utils.h)(); 44123 var lastEventBeforeSnap; 44124 var recentWheelEvents = []; 44125 function normalize(e) { 44126 // Reasonable defaults 44127 var PIXEL_STEP = 10; 44128 var LINE_HEIGHT = 40; 44129 var PAGE_HEIGHT = 800; 44130 var sX = 0; 44131 var sY = 0; // spinX, spinY 44132 var pX = 0; 44133 var pY = 0; // pixelX, pixelY 44134 44135 // Legacy 44136 if ('detail' in e) { 44137 sY = e.detail; 44138 } 44139 if ('wheelDelta' in e) { 44140 sY = -e.wheelDelta / 120; 44141 } 44142 if ('wheelDeltaY' in e) { 44143 sY = -e.wheelDeltaY / 120; 44144 } 44145 if ('wheelDeltaX' in e) { 44146 sX = -e.wheelDeltaX / 120; 44147 } 44148 44149 // side scrolling on FF with DOMMouseScroll 44150 if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) { 44151 sX = sY; 44152 sY = 0; 44153 } 44154 pX = sX * PIXEL_STEP; 44155 pY = sY * PIXEL_STEP; 44156 if ('deltaY' in e) { 44157 pY = e.deltaY; 44158 } 44159 if ('deltaX' in e) { 44160 pX = e.deltaX; 44161 } 44162 if (e.shiftKey && !pX) { 44163 // if user scrolls with shift he wants horizontal scroll 44164 pX = pY; 44165 pY = 0; 44166 } 44167 if ((pX || pY) && e.deltaMode) { 44168 if (e.deltaMode === 1) { 44169 // delta in LINE units 44170 pX *= LINE_HEIGHT; 44171 pY *= LINE_HEIGHT; 44172 } else { 44173 // delta in PAGE units 44174 pX *= PAGE_HEIGHT; 44175 pY *= PAGE_HEIGHT; 44176 } 44177 } 44178 44179 // Fall-back if spin cannot be determined 44180 if (pX && !sX) { 44181 sX = pX < 1 ? -1 : 1; 44182 } 44183 if (pY && !sY) { 44184 sY = pY < 1 ? -1 : 1; 44185 } 44186 return { 44187 spinX: sX, 44188 spinY: sY, 44189 pixelX: pX, 44190 pixelY: pY 44191 }; 44192 } 44193 function handleMouseEnter() { 44194 if (!swiper.enabled) return; 44195 swiper.mouseEntered = true; 44196 } 44197 function handleMouseLeave() { 44198 if (!swiper.enabled) return; 44199 swiper.mouseEntered = false; 44200 } 44201 function animateSlider(newEvent) { 44202 if (swiper.params.mousewheel.thresholdDelta && newEvent.delta < swiper.params.mousewheel.thresholdDelta) { 44203 // Prevent if delta of wheel scroll delta is below configured threshold 44204 return false; 44205 } 44206 if (swiper.params.mousewheel.thresholdTime && (0, _utils.h)() - lastScrollTime < swiper.params.mousewheel.thresholdTime) { 44207 // Prevent if time between scrolls is below configured threshold 44208 return false; 44209 } 44210 44211 // If the movement is NOT big enough and 44212 // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider): 44213 // Don't go any further (avoid insignificant scroll movement). 44214 if (newEvent.delta >= 6 && (0, _utils.h)() - lastScrollTime < 60) { 44215 // Return false as a default 44216 return true; 44217 } 44218 // If user is scrolling towards the end: 44219 // If the slider hasn't hit the latest slide or 44220 // if the slider is a loop and 44221 // if the slider isn't moving right now: 44222 // Go to next slide and 44223 // emit a scroll event. 44224 // Else (the user is scrolling towards the beginning) and 44225 // if the slider hasn't hit the first slide or 44226 // if the slider is a loop and 44227 // if the slider isn't moving right now: 44228 // Go to prev slide and 44229 // emit a scroll event. 44230 if (newEvent.direction < 0) { 44231 if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) { 44232 swiper.slideNext(); 44233 emit('scroll', newEvent.raw); 44234 } 44235 } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) { 44236 swiper.slidePrev(); 44237 emit('scroll', newEvent.raw); 44238 } 44239 // If you got here is because an animation has been triggered so store the current time 44240 lastScrollTime = new window.Date().getTime(); 44241 // Return false as a default 44242 return false; 44243 } 44244 function releaseScroll(newEvent) { 44245 var params = swiper.params.mousewheel; 44246 if (newEvent.direction < 0) { 44247 if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) { 44248 // Return true to animate scroll on edges 44249 return true; 44250 } 44251 } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) { 44252 // Return true to animate scroll on edges 44253 return true; 44254 } 44255 return false;
44256 } 44257 function handle(event) { 44258 var e = event; 44259 var disableParentSwiper = true; 44260 if (!swiper.enabled) return; 44261 44262 // Ignore event if the target or its parents have the swiper-no-mousewheel class 44263 if (event.target.closest(".".concat(swiper.params.mousewheel.noMousewheelClass))) return; 44264 var params = swiper.params.mousewheel; 44265 if (swiper.params.cssMode) { 44266 e.preventDefault(); 44267 } 44268 var targetEl = swiper.el; 44269 if (swiper.params.mousewheel.eventsTarget !== 'container') { 44270 targetEl = document.querySelector(swiper.params.mousewheel.eventsTarget); 44271 } 44272 var targetElContainsTarget = targetEl && targetEl.contains(e.target); 44273 if (!swiper.mouseEntered && !targetElContainsTarget && !params.releaseOnEdges) return true; 44274 if (e.originalEvent) e = e.originalEvent; // jquery fix 44275 var delta = 0; 44276 var rtlFactor = swiper.rtlTranslate ? -1 : 1; 44277 var data = normalize(e); 44278 if (params.forceToAxis) { 44279 if (swiper.isHorizontal()) { 44280 if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;else return true; 44281 } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;else return true; 44282 } else { 44283 delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY; 44284 } 44285 if (delta === 0) return true; 44286 if (params.invert) delta = -delta; 44287 44288 // Get the scroll positions 44289 var positions = swiper.getTranslate() + delta * params.sensitivity; 44290 if (positions >= swiper.minTranslate()) positions = swiper.minTranslate(); 44291 if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate(); 44292 44293 // When loop is true: 44294 // the disableParentSwiper will be true. 44295 // When loop is false: 44296 // if the scroll positions is not on edge, 44297 // then the disableParentSwiper will be true. 44298 // if the scroll on edge positions, 44299 // then the disableParentSwiper will be false. 44300 disableParentSwiper = swiper.params.loop ? true : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate()); 44301 if (disableParentSwiper && swiper.params.nested) e.stopPropagation(); 44302 if (!swiper.params.freeMode || !swiper.params.freeMode.enabled) { 44303 // Register the new event in a variable which stores the relevant data 44304 var newEvent = { 44305 time: (0, _utils.h)(), 44306 delta: Math.abs(delta), 44307 direction: Math.sign(delta), 44308 raw: event 44309 }; 44310 44311 // Keep the most recent events 44312 if (recentWheelEvents.length >= 2) { 44313 recentWheelEvents.shift(); // only store the last N events 44314 } 44315 var prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined; 44316 recentWheelEvents.push(newEvent); 44317 44318 // If there is at least one previous recorded event: 44319 // If direction has changed or 44320 // if the scroll is quicker than the previous one: 44321 // Animate the slider. 44322 // Else (this is the first time the wheel is moved): 44323 // Animate the slider. 44324 if (prevEvent) { 44325 if (newEvent.direction !== prevEvent.direction || newEvent.delta > prevEvent.delta || newEvent.time > prevEvent.time + 150) { 44326 animateSlider(newEvent); 44327 } 44328 } else { 44329 animateSlider(newEvent); 44330 } 44331 44332 // If it's time to release the scroll: 44333 // Return now so you don't hit the preventDefault. 44334 if (releaseScroll(newEvent)) { 44335 return true; 44336 } 44337 } else { 44338 // Freemode or scrollContainer: 44339 44340 // If we recently snapped after a momentum scroll, then ignore wheel events 44341 // to give time for the deceleration to finish. Stop ignoring after 500 msecs 44342 // or if it's a new scroll (larger delta or inverse sign as last event before 44343 // an end-of-momentum snap). 44344 var _newEvent = { 44345 time: (0, _utils.h)(), 44346 delta: Math.abs(delta), 44347 direction: Math.sign(delta) 44348 }; 44349 var ignoreWheelEvents = lastEventBeforeSnap && _newEvent.time < lastEventBeforeSnap.time + 500 && _newEvent.delta <= lastEventBeforeSnap.delta && _newEvent.direction === lastEventBeforeSnap.direction; 44350 if (!ignoreWheelEvents) { 44351 lastEventBeforeSnap = undefined; 44352 var position = swiper.getTranslate() + delta * params.sensitivity; 44353 var wasBeginning = swiper.isBeginning; 44354 var wasEnd = swiper.isEnd; 44355 if (position >= swiper.minTranslate()) position = swiper.minTranslate(); 44356 if (position <= swiper.maxTranslate()) position = swiper.maxTranslate(); 44357 swiper.setTransition(0); 44358 swiper.setTranslate(position); 44359 swiper.updateProgress(); 44360 swiper.updateActiveIndex(); 44361 swiper.updateSlidesClasses(); 44362 if (!wasBeginning && swiper.isBeginning || !wasEnd && swiper.isEnd) { 44363 swiper.updateSlidesClasses(); 44364 } 44365 if (swiper.params.loop) { 44366 swiper.loopFix({ 44367 direction: _newEvent.direction < 0 ? 'next' : 'prev', 44368 byMousewheel: true 44369 }); 44370 } 44371 if (swiper.params.freeMode.sticky) { 44372 // When wheel scrolling starts with sticky (aka snap) enabled, then detect 44373 // the end of a momentum scroll by storing recent (N=15?) wheel events.
vendor: 4,190 bytes, lines 44374-44451
44374 // 1. do all N events have decreasing or same (absolute value) delta? 44375 // 2. did all N events arrive in the last M (M=500?) msecs? 44376 // 3. does the earliest event have an (absolute value) delta that's 44377 // at least P (P=1?) larger than the most recent event's delta? 44378 // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels? 44379 // If 1-4 are "yes" then we're near the end of a momentum scroll deceleration. 44380 // Snap immediately and ignore remaining wheel events in this scroll. 44381 // See comment above for "remaining wheel events in this scroll" determination. 44382 // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event. 44383 clearTimeout(timeout); 44384 timeout = undefined; 44385 if (recentWheelEvents.length >= 15) { 44386 recentWheelEvents.shift(); // only store the last N events 44387 } 44388 var _prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined; 44389 var firstEvent = recentWheelEvents[0]; 44390 recentWheelEvents.push(_newEvent); 44391 if (_prevEvent && (_newEvent.delta > _prevEvent.delta || _newEvent.direction !== _prevEvent.direction)) { 44392 // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log. 44393 recentWheelEvents.splice(0); 44394 } else if (recentWheelEvents.length >= 15 && _newEvent.time - firstEvent.time < 500 && firstEvent.delta - _newEvent.delta >= 1 && _newEvent.delta <= 6) { 44395 // We're at the end of the deceleration of a momentum scroll, so there's no need 44396 // to wait for more events. Snap ASAP on the next tick. 44397 // Also, because there's some remaining momentum we'll bias the snap in the 44398 // direction of the ongoing scroll because it's better UX for the scroll to snap 44399 // in the same direction as the scroll instead of reversing to snap. Therefore, 44400 // if it's already scrolled more than 20% in the current direction, keep going. 44401 var snapToThreshold = delta > 0 ? 0.8 : 0.2; 44402 lastEventBeforeSnap = _newEvent; 44403 recentWheelEvents.splice(0); 44404 timeout = (0, _utils.n)(function () { 44405 if (swiper.destroyed || !swiper.params) return; 44406 swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold); 44407 }, 0); // no delay; move on next tick 44408 } 44409 if (!timeout) { 44410 // if we get here, then we haven't detected the end of a momentum scroll, so 44411 // we'll consider a scroll "complete" when there haven't been any wheel events 44412 // for 500ms. 44413 timeout = (0, _utils.n)(function () { 44414 if (swiper.destroyed || !swiper.params) return; 44415 var snapToThreshold = 0.5; 44416 lastEventBeforeSnap = _newEvent; 44417 recentWheelEvents.splice(0); 44418 swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold); 44419 }, 500); 44420 } 44421 } 44422 44423 // Emit event 44424 if (!ignoreWheelEvents) emit('scroll', e); 44425 44426 // Stop autoplay 44427 if (swiper.params.autoplay && swiper.params.autoplay.disableOnInteraction) swiper.autoplay.stop(); 44428 // Return page scroll on edge positions 44429 if (params.releaseOnEdges && (position === swiper.minTranslate() || position === swiper.maxTranslate())) { 44430 return true; 44431 } 44432 } 44433 } 44434 if (e.preventDefault) e.preventDefault();else e.returnValue = false; 44435 return false; 44436 } 44437 function events(method) { 44438 var targetEl = swiper.el; 44439 if (swiper.params.mousewheel.eventsTarget !== 'container') { 44440 targetEl = document.querySelector(swiper.params.mousewheel.eventsTarget); 44441 } 44442 targetEl[method]('mouseenter', handleMouseEnter); 44443 targetEl[method]('mouseleave', handleMouseLeave); 44444 targetEl[method]('wheel', handle); 44445 } 44446 function enable() { 44447 if (swiper.params.cssMode) { 44448 swiper.wrapperEl.removeEventListener('wheel', handle); 44449 return true; 44450 } 44451 if (swiper.mousewheel.enabled) return false;
44452 events('addEventListener'); 44453 swiper.mousewheel.enabled = true; 44454 return true; 44455 } 44456 function disable() { 44457 if (swiper.params.cssMode) { 44458 swiper.wrapperEl.addEventListener(event, handle); 44459 return true; 44460 } 44461 if (!swiper.mousewheel.enabled) return false; 44462 events('removeEventListener'); 44463 swiper.mousewheel.enabled = false; 44464 return true; 44465 } 44466 on('init', function () { 44467 if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) { 44468 disable(); 44469 } 44470 if (swiper.params.mousewheel.enabled) enable(); 44471 }); 44472 on('destroy', function () { 44473 if (swiper.params.cssMode) { 44474 enable(); 44475 } 44476 if (swiper.mousewheel.enabled) disable(); 44477 }); 44478 Object.assign(swiper.mousewheel, { 44479 enable: enable, 44480 disable: disable 44481 }); 44482} 44483 44484},{"../shared/ssr-window.esm.mjs":139,"../shared/utils.mjs":141}],126:[function(require,module,exports){ 44485"use strict"; 44486 44487var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 44488Object.defineProperty(exports, "__esModule", { 44489 value: true 44490}); 44491exports["default"] = Navigation; 44492var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); 44493var _createElementIfNotDefined = require("../shared/create-element-if-not-defined.mjs"); 44494var _utils = require("../shared/utils.mjs"); 44495var arrowSvg = "<svg class=\"swiper-navigation-icon\" width=\"11\" height=\"20\" viewBox=\"0 0 11 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0.38296 20.0762C0.111788 19.805 0.111788 19.3654 0.38296 19.0942L9.19758 10.2796L0.38296 1.46497C0.111788 1.19379 0.111788 0.754138 0.38296 0.482966C0.654131 0.211794 1.09379 0.211794 1.36496 0.482966L10.4341 9.55214C10.8359 9.9539 10.8359 10.6053 10.4341 11.007L1.36496 20.0762C1.09379 20.3474 0.654131 20.3474 0.38296 20.0762Z\" fill=\"currentColor\"/></svg>"; 44496function Navigation(_ref) { 44497 var swiper = _ref.swiper, 44498 extendParams = _ref.extendParams, 44499 on = _ref.on, 44500 emit = _ref.emit; 44501 extendParams({ 44502 navigation: { 44503 nextEl: null, 44504 prevEl: null, 44505 addIcons: true, 44506 hideOnClick: false, 44507 disabledClass: 'swiper-button-disabled', 44508 hiddenClass: 'swiper-button-hidden', 44509 lockClass: 'swiper-button-lock', 44510 navigationDisabledClass: 'swiper-navigation-disabled' 44511 } 44512 }); 44513 swiper.navigation = { 44514 nextEl: null, 44515 prevEl: null, 44516 arrowSvg: arrowSvg 44517 }; 44518 function getEl(el) { 44519 var res; 44520 if (el && typeof el === 'string' && swiper.isElement) { 44521 res = swiper.el.querySelector(el) || swiper.hostEl.querySelector(el); 44522 if (res) return res; 44523 } 44524 if (el) { 44525 if (typeof el === 'string') res = (0, _toConsumableArray2["default"])(document.querySelectorAll(el)); 44526 if (swiper.params.uniqueNavElements && typeof el === 'string' && res && res.length > 1 && swiper.el.querySelectorAll(el).length === 1) { 44527 res = swiper.el.querySelector(el); 44528 } else if (res && res.length === 1) { 44529 res = res[0]; 44530 } 44531 } 44532 if (el && !res) return el; 44533 // if (Array.isArray(res) && res.length === 1) res = res[0]; 44534 return res; 44535 } 44536 function toggleEl(el, disabled) { 44537 var params = swiper.params.navigation; 44538 el = (0, _utils.m)(el); 44539 el.forEach(function (subEl) { 44540 if (subEl) { 44541 var _subEl$classList; 44542 (_subEl$classList = subEl.classList)[disabled ? 'add' : 'remove'].apply(_subEl$classList, (0, _toConsumableArray2["default"])(params.disabledClass.split(' '))); 44543 if (subEl.tagName === 'BUTTON') subEl.disabled = disabled; 44544 if (swiper.params.watchOverflow && swiper.enabled) { 44545 subEl.classList[swiper.isLocked ? 'add' : 'remove'](params.lockClass); 44546 } 44547 } 44548 }); 44549 } 44550 function update() { 44551 // Update Navigation Buttons 44552 var _swiper$navigation = swiper.navigation, 44553 nextEl = _swiper$navigation.nextEl, 44554 prevEl = _swiper$navigation.prevEl; 44555 if (swiper.params.loop) { 44556 toggleEl(prevEl, false); 44557 toggleEl(nextEl, false); 44558 return; 44559 } 44560 toggleEl(prevEl, swiper.isBeginning && !swiper.params.rewind); 44561 toggleEl(nextEl, swiper.isEnd && !swiper.params.rewind); 44562 } 44563 function onPrevClick(e) { 44564 e.preventDefault(); 44565 if (swiper.isBeginning && !swiper.params.loop && !swiper.params.rewind) return; 44566 swiper.slidePrev(); 44567 emit('navigationPrev'); 44568 } 44569 function onNextClick(e) { 44570 e.preventDefault(); 44571 if (swiper.isEnd && !swiper.params.loop && !swiper.params.rewind) return; 44572 swiper.slideNext(); 44573 emit('navigationNext'); 44574 }
44575 function init() { 44576 var params = swiper.params.navigation; 44577 swiper.params.navigation = (0, _createElementIfNotDefined.c)(swiper, swiper.originalParams.navigation, swiper.params.navigation, { 44578 nextEl: 'swiper-button-next', 44579 prevEl: 'swiper-button-prev' 44580 }); 44581 if (!(params.nextEl || params.prevEl)) return; 44582 var nextEl = getEl(params.nextEl); 44583 var prevEl = getEl(params.prevEl); 44584 Object.assign(swiper.navigation, { 44585 nextEl: nextEl, 44586 prevEl: prevEl 44587 }); 44588 nextEl = (0, _utils.m)(nextEl); 44589 prevEl = (0, _utils.m)(prevEl); 44590 var initButton = function initButton(el, dir) { 44591 if (el) { 44592 if (params.addIcons && el.matches('.swiper-button-next,.swiper-button-prev') && !el.querySelector('svg')) { 44593 var tempEl = document.createElement('div'); 44594 (0, _utils.s)(tempEl, arrowSvg); 44595 el.appendChild(tempEl.querySelector('svg')); 44596 tempEl.remove(); 44597 } 44598 el.addEventListener('click', dir === 'next' ? onNextClick : onPrevClick); 44599 } 44600 if (!swiper.enabled && el) { 44601 var _el$classList; 44602 (_el$classList = el.classList).add.apply(_el$classList, (0, _toConsumableArray2["default"])(params.lockClass.split(' '))); 44603 } 44604 }; 44605 nextEl.forEach(function (el) { 44606 return initButton(el, 'next'); 44607 }); 44608 prevEl.forEach(function (el) { 44609 return initButton(el, 'prev'); 44610 }); 44611 } 44612 function destroy() { 44613 var _swiper$navigation2 = swiper.navigation, 44614 nextEl = _swiper$navigation2.nextEl, 44615 prevEl = _swiper$navigation2.prevEl; 44616 nextEl = (0, _utils.m)(nextEl); 44617 prevEl = (0, _utils.m)(prevEl); 44618 var destroyButton = function destroyButton(el, dir) { 44619 var _el$classList2; 44620 el.removeEventListener('click', dir === 'next' ? onNextClick : onPrevClick); 44621 (_el$classList2 = el.classList).remove.apply(_el$classList2, (0, _toConsumableArray2["default"])(swiper.params.navigation.disabledClass.split(' '))); 44622 }; 44623 nextEl.forEach(function (el) { 44624 return destroyButton(el, 'next'); 44625 }); 44626 prevEl.forEach(function (el) { 44627 return destroyButton(el, 'prev'); 44628 }); 44629 } 44630 on('init', function () { 44631 if (swiper.params.navigation.enabled === false) { 44632 // eslint-disable-next-line 44633 disable(); 44634 } else { 44635 init(); 44636 update(); 44637 } 44638 }); 44639 on('toEdge fromEdge lock unlock', function () { 44640 update(); 44641 }); 44642 on('destroy', function () { 44643 destroy(); 44644 }); 44645 on('enable disable', function () { 44646 var _swiper$navigation3 = swiper.navigation, 44647 nextEl = _swiper$navigation3.nextEl, 44648 prevEl = _swiper$navigation3.prevEl; 44649 nextEl = (0, _utils.m)(nextEl); 44650 prevEl = (0, _utils.m)(prevEl); 44651 if (swiper.enabled) { 44652 update(); 44653 return; 44654 } 44655 [].concat((0, _toConsumableArray2["default"])(nextEl), (0, _toConsumableArray2["default"])(prevEl)).filter(function (el) { 44656 return !!el; 44657 }
44657).forEach(function (el) { 44658 return el.classList.add(swiper.params.navigation.lockClass); 44659 }); 44660 }); 44661 on('click', function (_s, e) { 44662 var _swiper$navigation4 = swiper.navigation, 44663 nextEl = _swiper$navigation4.nextEl, 44664 prevEl = _swiper$navigation4.prevEl; 44665 nextEl = (0, _utils.m)(nextEl); 44666 prevEl = (0, _utils.m)(prevEl); 44667 var targetEl = e.target; 44668 var targetIsButton = prevEl.includes(targetEl) || nextEl.includes(targetEl); 44669 if (swiper.isElement && !targetIsButton) { 44670 var path = e.path || e.composedPath && e.composedPath(); 44671 if (path) { 44672 targetIsButton = path.find(function (pathEl) { 44673 return nextEl.includes(pathEl) || prevEl.includes(pathEl); 44674 }); 44675 } 44676 } 44677 if (swiper.params.navigation.hideOnClick && !targetIsButton) { 44678 if (swiper.pagination && swiper.params.pagination && swiper.params.pagination.clickable && (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))) return; 44679 var isHidden; 44680 if (nextEl.length) { 44681 isHidden = nextEl[0].classList.contains(swiper.params.navigation.hiddenClass); 44682 } else if (prevEl.length) { 44683 isHidden = prevEl[0].classList.contains(swiper.params.navigation.hiddenClass); 44684 } 44685 if (isHidden === true) { 44686 emit('navigationShow'); 44687 } else { 44688 emit('navigationHide'); 44689 } 44690 [].concat((0, _toConsumableArray2["default"])(nextEl), (0, _toConsumableArray2["default"])(prevEl)).filter(function (el) { 44691 return !!el; 44692 }
44692).forEach(function (el) { 44693 return el.classList.toggle(swiper.params.navigation.hiddenClass); 44694 }); 44695 } 44696 }); 44697 var enable = function enable() { 44698 var _swiper$el$classList; 44699 (_swiper$el$classList = swiper.el.classList).remove.apply(_swiper$el$classList, (0, _toConsumableArray2["default"])(swiper.params.navigation.navigationDisabledClass.split(' '))); 44700 init(); 44701 update(); 44702 }; 44703 var disable = function disable() { 44704 var _swiper$el$classList2; 44705 (_swiper$el$classList2 = swiper.el.classList).add.apply(_swiper$el$classList2, (0, _toConsumableArray2["default"])(swiper.params.navigation.navigationDisabledClass.split(' '))); 44706 destroy(); 44707 }; 44708 Object.assign(swiper.navigation, { 44709 enable: enable, 44710 disable: disable, 44711 update: update, 44712 init: init, 44713 destroy: destroy 44714 }); 44715} 44716 44717},{"../shared/create-element-if-not-defined.mjs":134,"../shared/utils.mjs":141,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/toConsumableArray":105}],127:[function(require,module,exports){ 44718"use strict"; 44719 44720var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 44721Object.defineProperty(exports, "__esModule", { 44722 value: true 44723}); 44724exports["default"] = Pagination; 44725var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); 44726var _classesToSelector = require("../shared/classes-to-selector.mjs"); 44727var _createElementIfNotDefined = require("../shared/create-element-if-not-defined.mjs"); 44728var _utils = require("../shared/utils.mjs"); 44729function Pagination(_ref) { 44730 var swiper = _ref.swiper, 44731 extendParams = _ref.extendParams, 44732 on = _ref.on, 44733 emit = _ref.emit; 44734 var pfx = 'swiper-pagination'; 44735 extendParams({ 44736 pagination: { 44737 el: null, 44738 bulletElement: 'span', 44739 clickable: false, 44740 hideOnClick: false, 44741 renderBullet: null, 44742 renderProgressbar: null, 44743 renderFraction: null, 44744 renderCustom: null, 44745 progressbarOpposite: false, 44746 type: 'bullets', 44747 // 'bullets' or 'progressbar' or 'fraction' or 'custom' 44748 dynamicBullets: false, 44749 dynamicMainBullets: 1, 44750 formatFractionCurrent: function formatFractionCurrent(number) { 44751 return number; 44752 }, 44753 formatFractionTotal: function formatFractionTotal(number) { 44754 return number; 44755 }, 44756 bulletClass: "".concat(pfx, "-bullet"), 44757 bulletActiveClass: "".concat(pfx, "-bullet-active"), 44758 modifierClass: "".concat(pfx, "-"), 44759 currentClass: "".concat(pfx, "-current"), 44760 totalClass: "".concat(pfx, "-total"), 44761 hiddenClass: "".concat(pfx, "-hidden"), 44762 progressbarFillClass: "".concat(pfx, "-progressbar-fill"), 44763 progressbarOppositeClass: "".concat(pfx, "-progressbar-opposite"), 44764 clickableClass: "".concat(pfx, "-clickable"), 44765 lockClass: "".concat(pfx, "-lock"), 44766 horizontalClass: "".concat(pfx, "-horizontal"), 44767 verticalClass: "".concat(pfx, "-vertical"), 44768 paginationDisabledClass: "".concat(pfx, "-disabled") 44769 } 44770 }); 44771 swiper.pagination = { 44772 el: null, 44773 bullets: [] 44774 }; 44775 var bulletSize; 44776 var dynamicBulletIndex = 0; 44777 function isPaginationDisabled() { 44778 return !swiper.params.pagination.el || !swiper.pagination.el || Array.isArray(swiper.pagination.el) && swiper.pagination.el.length === 0; 44779 } 44780 function setSideBullets(bulletEl, position) { 44781 var bulletActiveClass = swiper.params.pagination.bulletActiveClass; 44782 if (!bulletEl) return; 44783 bulletEl = bulletEl["".concat(position === 'prev' ? 'previous' : 'next', "ElementSibling")]; 44784 if (bulletEl) { 44785 bulletEl.classList.add("".concat(bulletActiveClass, "-").concat(position)); 44786 bulletEl = bulletEl["".concat(position === 'prev' ? 'previous' : 'next', "ElementSibling")]; 44787 if (bulletEl) { 44788 bulletEl.classList.add("".concat(bulletActiveClass, "-").concat(position, "-").concat(position)); 44789 } 44790 } 44791 } 44792 function getMoveDirection(prevIndex, nextIndex, length) { 44793 prevIndex = prevIndex % length; 44794 nextIndex = nextIndex % length; 44795 if (nextIndex === prevIndex + 1) { 44796 return 'next'; 44797 } else if (nextIndex === prevIndex - 1) { 44798 return 'previous'; 44799 } 44800 return; 44801 } 44802 function onBulletClick(e) { 44803 var bulletEl = e.target.closest((0, _classesToSelector.c)(swiper.params.pagination.bulletClass)); 44804 if (!bulletEl) { 44805 return; 44806 } 44807 e.preventDefault(); 44808 var index = (0, _utils.j)(bulletEl) * swiper.params.slidesPerGroup; 44809 if (swiper.params.loop) { 44810 if (swiper.realIndex === index) return; 44811 var moveDirection = getMoveDirection(swiper.realIndex, index, swiper.slides.length); 44812 if (moveDirection === 'next') { 44813 swiper.slideNext(); 44814 } else if (moveDirection === 'previous') { 44815 swiper.slidePrev(); 44816 } else { 44817 swiper.slideToLoop(index); 44818 } 44819 } else { 44820 swiper.slideTo(index); 44821 } 44822 }
44823 function update() { 44824 // Render || Update Pagination bullets/items 44825 var rtl = swiper.rtl; 44826 var params = swiper.params.pagination; 44827 if (isPaginationDisabled()) return; 44828 var el = swiper.pagination.el; 44829 el = (0, _utils.m)(el); 44830 // Current/Total 44831 var current; 44832 var previousIndex; 44833 var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length; 44834 var total = swiper.params.loop ? Math.ceil(slidesLength / swiper.params.slidesPerGroup) : swiper.snapGrid.length; 44835 if (swiper.params.loop) { 44836 previousIndex = swiper.previousRealIndex || 0; 44837 current = swiper.params.slidesPerGroup > 1 ? Math.floor(swiper.realIndex / swiper.params.slidesPerGroup) : swiper.realIndex; 44838 } else if (typeof swiper.snapIndex !== 'undefined') { 44839 current = swiper.snapIndex; 44840 previousIndex = swiper.previousSnapIndex; 44841 } else { 44842 previousIndex = swiper.previousIndex || 0; 44843 current = swiper.activeIndex || 0; 44844 } 44845 // Types 44846 if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) { 44847 var bullets = swiper.pagination.bullets; 44848 var firstIndex; 44849 var lastIndex; 44850 var midIndex; 44851 if (params.dynamicBullets) { 44852 bulletSize = (0, _utils.i)(bullets[0], swiper.isHorizontal() ? 'width' : 'height', true); 44853 el.forEach(function (subEl) { 44854 subEl.style[swiper.isHorizontal() ? 'width' : 'height'] = "".concat(bulletSize * (params.dynamicMainBullets + 4), "px"); 44855 }); 44856 if (params.dynamicMainBullets > 1 && previousIndex !== undefined) { 44857 dynamicBulletIndex += current - (previousIndex || 0); 44858 if (dynamicBulletIndex > params.dynamicMainBullets - 1) { 44859 dynamicBulletIndex = params.dynamicMainBullets - 1; 44860 } else if (dynamicBulletIndex < 0) { 44861 dynamicBulletIndex = 0; 44862 } 44863 } 44864 firstIndex = Math.max(current - dynamicBulletIndex, 0); 44865 lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1); 44866 midIndex = (lastIndex + firstIndex) / 2; 44867 } 44868 bullets.forEach(function (bulletEl) { 44869 var _bulletEl$classList; 44870 var classesToRemove = (0, _toConsumableArray2["default"])(['', '-next', '-next-next', '-prev', '-prev-prev', '-main'].map(function (suffix) { 44871 return "".concat(params.bulletActiveClass).concat(suffix); 44872 })).map(function (s) { 44873 return typeof s === 'string' && s.includes(' ') ? s.split(' ') : s; 44874 }).flat(); 44875 (_bulletEl$classList = bulletEl.classList).remove.apply(_bulletEl$classList, (0, _toConsumableArray2["default"])(classesToRemove)); 44876 }); 44877 if (el.length > 1) { 44878 bullets.forEach(function (bullet) { 44879 var bulletIndex = (0, _utils.j)(bullet); 44880 if (bulletIndex === current) { 44881 var _bullet$classList; 44882 (_bullet$classList = bullet.classList).add.apply(_bullet$classList, (0, _toConsumableArray2["default"])(params.bulletActiveClass.split(' '))); 44883 } else if (swiper.isElement) { 44884 bullet.setAttribute('part', 'bullet'); 44885 } 44886 if (params.dynamicBullets) { 44887 if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) { 44888 var _bullet$classList2; 44889 (_bullet$classList2 = bullet.classList).add.apply(_bullet$classList2, (0, _toConsumableArray2["default"])("".concat(params.bulletActiveClass, "-main").split(' '))); 44890 } 44891 if (bulletIndex === firstIndex) { 44892 setSideBullets(bullet, 'prev'); 44893 } 44894 if (bulletIndex === lastIndex) { 44895 setSideBullets(bullet, 'next'); 44896 } 44897 } 44898 }); 44899 } else { 44900 var bullet = bullets[current]; 44901 if (bullet) { 44902 var _bullet$classList3; 44903 (_bullet$classList3 = bullet.classList).add.apply(_bullet$classList3, (0, _toConsumableArray2["default"])(params.bulletActiveClass.split(' '))); 44904 } 44905 if (swiper.isElement) { 44906 bullets.forEach(function (bulletEl, bulletIndex) { 44907 bulletEl.setAttribute('part', bulletIndex === current ? 'bullet-active' : 'bullet'); 44908 }); 44909 } 44910 if (params.dynamicBullets) { 44911 var firstDisplayedBullet = bullets[firstIndex]; 44912 var lastDisplayedBullet = bullets[lastIndex]; 44913 for (var i = firstIndex; i <= lastIndex; i += 1) { 44914 if (bullets[i]) { 44915 var _bullets$i$classList; 44916 (_bullets$i$classList = bullets[i].classList).add.apply(_bullets$i$classList, (0, _toConsumableArray2["default"])("".concat(params.bulletActiveClass, "-main").split(' '))); 44917 } 44918 } 44919 setSideBullets(firstDisplayedBullet, 'prev'); 44920 setSideBullets(lastDisplayedBullet, 'next'); 44921 } 44922 } 44923 if (params.dynamicBullets) { 44924 var dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4); 44925 var bulletsOffset = (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize; 44926 var offsetProp = rtl ? 'right' : 'left';
44927 bullets.forEach(function (bullet) { 44928 bullet.style[swiper.isHorizontal() ? offsetProp : 'top'] = "".concat(bulletsOffset, "px"); 44929 }); 44930 } 44931 } 44932 el.forEach(function (subEl, subElIndex) { 44933 if (params.type === 'fraction') { 44934 subEl.querySelectorAll((0, _classesToSelector.c)(params.currentClass)).forEach(function (fractionEl) { 44935 fractionEl.textContent = params.formatFractionCurrent(current + 1); 44936 }); 44937 subEl.querySelectorAll((0, _classesToSelector.c)(params.totalClass)).forEach(function (totalEl) { 44938 totalEl.textContent = params.formatFractionTotal(total); 44939 }); 44940 } 44941 if (params.type === 'progressbar') { 44942 var progressbarDirection; 44943 if (params.progressbarOpposite) { 44944 progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal'; 44945 } else { 44946 progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical'; 44947 } 44948 var scale = (current + 1) / total; 44949 var scaleX = 1; 44950 var scaleY = 1; 44951 if (progressbarDirection === 'horizontal') { 44952 scaleX = scale; 44953 } else { 44954 scaleY = scale; 44955 } 44956 subEl.querySelectorAll((0, _classesToSelector.c)(params.progressbarFillClass)).forEach(function (progressEl) { 44957 progressEl.style.transform = "translate3d(0,0,0) scaleX(".concat(scaleX, ") scaleY(").concat(scaleY, ")"); 44958 progressEl.style.transitionDuration = "".concat(swiper.params.speed, "ms"); 44959 }); 44960 } 44961 if (params.type === 'custom' && params.renderCustom) { 44962 (0, _utils.s)(subEl, params.renderCustom(swiper, current + 1, total)); 44963 if (subElIndex === 0) emit('paginationRender', subEl); 44964 } else { 44965 if (subElIndex === 0) emit('paginationRender', subEl); 44966 emit('paginationUpdate', subEl); 44967 } 44968 if (swiper.params.watchOverflow && swiper.enabled) { 44969 subEl.classList[swiper.isLocked ? 'add' : 'remove'](params.lockClass); 44970 } 44971 }); 44972 } 44973 function render() { 44974 // Render Container 44975 var params = swiper.params.pagination; 44976 if (isPaginationDisabled()) return; 44977 var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.grid && swiper.params.grid.rows > 1 ? swiper.slides.length / Math.ceil(swiper.params.grid.rows) : swiper.slides.length; 44978 var el = swiper.pagination.el; 44979 el = (0, _utils.m)(el); 44980 var paginationHTML = ''; 44981 if (params.type === 'bullets') { 44982 var numberOfBullets = swiper.params.loop ? Math.ceil(slidesLength / swiper.params.slidesPerGroup) : swiper.snapGrid.length; 44983 if (swiper.params.freeMode && swiper.params.freeMode.enabled && numberOfBullets > slidesLength) { 44984 numberOfBullets = slidesLength; 44985 } 44986 for (var i = 0; i < numberOfBullets; i += 1) { 44987 if (params.renderBullet) { 44988 paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass); 44989 } else { 44990 // prettier-ignore 44991 paginationHTML += "<".concat(params.bulletElement, " ").concat(swiper.isElement ? 'part="bullet"' : '', " class=\"").concat(params.bulletClass, "\"></").concat(params.bulletElement, ">"); 44992 } 44993 } 44994 } 44995 if (params.type === 'fraction') { 44996 if (params.renderFraction) { 44997 paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass); 44998 } else { 44999 paginationHTML = "<span class=\"".concat(params.currentClass, "\"></span>") + ' / ' + "<span class=\"".concat(params.totalClass, "\"></span>"); 45000 } 45001 } 45002 if (params.type === 'progressbar') { 45003 if (params.renderProgressbar) { 45004 paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass); 45005 } else { 45006 paginationHTML = "<span class=\"".concat(params.progressbarFillClass, "\"></span>"); 45007 } 45008 } 45009 swiper.pagination.bullets = []; 45010 el.forEach(function (subEl) { 45011 if (params.type !== 'custom') { 45012 (0, _utils.s)(subEl, paginationHTML || ''); 45013 } 45014 if (params.type === 'bullets') { 45015 var _swiper$pagination$bu; 45016 (_swiper$pagination$bu = swiper.pagination.bullets).push.apply(_swiper$pagination$bu, (0, _toConsumableArray2["default"])(subEl.querySelectorAll((0, _classesToSelector.c)(params.bulletClass)))); 45017 } 45018 }); 45019 if (params.type !== 'custom') { 45020 emit('paginationRender', el[0]); 45021 } 45022 }
45023 function init() { 45024 swiper.params.pagination = (0, _createElementIfNotDefined.c)(swiper, swiper.originalParams.pagination, swiper.params.pagination, { 45025 el: 'swiper-pagination' 45026 }); 45027 var params = swiper.params.pagination; 45028 if (!params.el) return; 45029 var el; 45030 if (typeof params.el === 'string' && swiper.isElement) { 45031 el = swiper.el.querySelector(params.el); 45032 } 45033 if (!el && typeof params.el === 'string') { 45034 el = (0, _toConsumableArray2["default"])(document.querySelectorAll(params.el)); 45035 } 45036 if (!el) { 45037 el = params.el; 45038 } 45039 if (!el || el.length === 0) return; 45040 if (swiper.params.uniqueNavElements && typeof params.el === 'string' && Array.isArray(el) && el.length > 1) { 45041 el = (0, _toConsumableArray2["default"])(swiper.el.querySelectorAll(params.el)); 45042 // check if it belongs to another nested Swiper 45043 if (el.length > 1) { 45044 el = el.find(function (subEl) { 45045 if ((0, _utils.d)(subEl, '.swiper')[0] !== swiper.el) return false; 45046 return true; 45047 }); 45048 } 45049 } 45050 if (Array.isArray(el) && el.length === 1) el = el[0]; 45051 Object.assign(swiper.pagination, { 45052 el: el 45053 }); 45054 el = (0, _utils.m)(el); 45055 el.forEach(function (subEl) { 45056 if (params.type === 'bullets' && params.clickable) { 45057 var _subEl$classList; 45058 (_subEl$classList = subEl.classList).add.apply(_subEl$classList, (0, _toConsumableArray2["default"])((params.clickableClass || '').split(' '))); 45059 } 45060 subEl.classList.add(params.modifierClass + params.type); 45061 subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass); 45062 if (params.type === 'bullets' && params.dynamicBullets) { 45063 subEl.classList.add("".concat(params.modifierClass).concat(params.type, "-dynamic")); 45064 dynamicBulletIndex = 0; 45065 if (params.dynamicMainBullets < 1) { 45066 params.dynamicMainBullets = 1; 45067 } 45068 } 45069 if (params.type === 'progressbar' && params.progressbarOpposite) { 45070 subEl.classList.add(params.progressbarOppositeClass); 45071 } 45072 if (params.clickable) { 45073 subEl.addEventListener('click', onBulletClick); 45074 } 45075 if (!swiper.enabled) { 45076 subEl.classList.add(params.lockClass); 45077 } 45078 }); 45079 } 45080 function destroy() { 45081 var params = swiper.params.pagination; 45082 if (isPaginationDisabled()) return; 45083 var el = swiper.pagination.el; 45084 if (el) { 45085 el = (0, _utils.m)(el); 45086 el.forEach(function (subEl) { 45087 subEl.classList.remove(params.hiddenClass); 45088 subEl.classList.remove(params.modifierClass + params.type); 45089 subEl.classList.remove(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass); 45090 if (params.clickable) { 45091 var _subEl$classList2; 45092 (_subEl$classList2 = subEl.classList).remove.apply(_subEl$classList2, (0, _toConsumableArray2["default"])((params.clickableClass || '').split(' '))); 45093 subEl.removeEventListener('click', onBulletClick); 45094 } 45095 }); 45096 } 45097 if (swiper.pagination.bullets) swiper.pagination.bullets.forEach(function (subEl) { 45098 var _subEl$classList3; 45099 return (_subEl$classList3 = subEl.classList).remove.apply(_subEl$classList3, (0, _toConsumableArray2["default"])(params.bulletActiveClass.split(' '))); 45100 }); 45101 } 45102 on('changeDirection', function () { 45103 if (!swiper.pagination || !swiper.pagination.el) return; 45104 var params = swiper.params.pagination; 45105 var el = swiper.pagination.el; 45106 el = (0, _utils.m)(el); 45107 el.forEach(function (subEl) { 45108 subEl.classList.remove(params.horizontalClass, params.verticalClass); 45109 subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass); 45110 }); 45111 }); 45112 on('init', function () { 45113 if (swiper.params.pagination.enabled === false) { 45114 // eslint-disable-next-line 45115 disable(); 45116 } else { 45117 init(); 45118 render(); 45119 update(); 45120 } 45121 }); 45122 on('activeIndexChange', function () { 45123 if (typeof swiper.snapIndex === 'undefined') { 45124 update(); 45125 } 45126 }); 45127 on('snapIndexChange', function () { 45128 update(); 45129 }); 45130 on('snapGridLengthChange', function () { 45131 render(); 45132 update(); 45133 }); 45134 on('destroy', function () { 45135 destroy(); 45136 }); 45137 on('enable disable', function () { 45138 var el = swiper.pagination.el; 45139 if (el) { 45140 el = (0, _utils.m)(el); 45141 el.forEach(function (subEl) { 45142 return subEl.classList[swiper.enabled ? 'remove' : 'add'](swiper.params.pagination.lockClass); 45143 }); 45144 } 45145 }); 45146 on('lock unlock', function () { 45147 update(); 45148 }); 45149 on('click', function (_s, e) { 45150 var targetEl = e.target; 45151 var el = (0, _utils.m)(swiper.pagination.el); 45152 if (swiper.params.pagination.el && swiper.params.pagination.hideOnClick && el && el.length > 0 && !targetEl.classList.contains(swiper.params.pagination.bulletClass)) { 45153 if (swiper.navigation && (swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl || swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl)) return; 45154 var isHidden = el[0].classList.contains(swiper.params.pagination.hiddenClass); 45155 if (isHidden === true) { 45156 emit('paginationShow'); 45157 } else { 45158 emit('paginationHide'); 45159 } 45160 el.forEach(function (subEl) { 45161 return subEl.classList.toggle(swiper.params.pagination.hiddenClass); 45162 }); 45163 } 45164 }); 45165 var enable = function enable() { 45166 swiper.el.classList.remove(swiper.params.pagination.paginationDisabledClass); 45167 var el = swiper.pagination.el; 45168 if (el) { 45169 el = (0, _utils.m)(el); 45170 el.forEach(function (subEl) { 45171 return subEl.classList.remove(swiper.params.pagination.paginationDisabledClass); 45172 }); 45173 } 45174 init(); 45175 render(); 45176 update(); 45177 }; 45178 var disable = function disable() { 45179 swiper.el.classList.add(swiper.params.pagination.paginationDisabledClass); 45180 var el = swiper.pagination.el; 45181 if (el) { 45182 el = (0, _utils.m)(el); 45183 el.forEach(function (subEl) { 45184 return subEl.classList.add(swiper.params.pagination.paginationDisabledClass); 45185 }); 45186 } 45187 destroy(); 45188 }; 45189 Object.assign(swiper.pagination, { 45190 enable: enable, 45191 disable: disable, 45192 render: render, 45193 update: update, 45194 init: init, 45195 destroy: destroy 45196 }); 45197} 45198 45199},{"../shared/classes-to-selector.mjs":133,"../shared/create-element-if-not-defined.mjs":134,"../shared/utils.mjs":141,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/toConsumableArray":105}],128:[function(require,module,exports){ 45200"use strict"; 45201 45202var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 45203Object.defineProperty(exports, "__esModule", { 45204 value: true 45205}); 45206exports["default"] = Parallax; 45207var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); 45208var _utils = require("../shared/utils.mjs"); 45209function Parallax(_ref) { 45210 var swiper = _ref.swiper, 45211 extendParams = _ref.extendParams, 45212 on = _ref.on; 45213 extendParams({ 45214 parallax: { 45215 enabled: false 45216 } 45217 }); 45218 var elementsSelector = '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]'; 45219 var setTransform = function setTransform(el, progress) { 45220 var rtl = swiper.rtl; 45221 var rtlFactor = rtl ? -1 : 1; 45222 var p = el.getAttribute('data-swiper-parallax') || '0'; 45223 var x = el.getAttribute('data-swiper-parallax-x'); 45224 var y = el.getAttribute('data-swiper-parallax-y'); 45225 var scale = el.getAttribute('data-swiper-parallax-scale'); 45226 var opacity = el.getAttribute('data-swiper-parallax-opacity'); 45227 var rotate = el.getAttribute('data-swiper-parallax-rotate'); 45228 if (x || y) { 45229 x = x || '0'; 45230 y = y || '0'; 45231 } else if (swiper.isHorizontal()) { 45232 x = p; 45233 y = '0'; 45234 } else { 45235 y = p; 45236 x = '0'; 45237 } 45238 if (x.indexOf('%') >= 0) { 45239 x = "".concat(parseInt(x, 10) * progress * rtlFactor, "%"); 45240 } else { 45241 x = "".concat(x * progress * rtlFactor, "px"); 45242 } 45243 if (y.indexOf('%') >= 0) { 45244 y = "".concat(parseInt(y, 10) * progress, "%"); 45245 } else { 45246 y = "".concat(y * progress, "px"); 45247 } 45248 if (typeof opacity !== 'undefined' && opacity !== null) { 45249 var currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress)); 45250 el.style.opacity = currentOpacity; 45251 } 45252 var transform = "translate3d(".concat(x, ", ").concat(y, ", 0px)"); 45253 if (typeof scale !== 'undefined' && scale !== null) { 45254 var currentScale = scale - (scale - 1) * (1 - Math.abs(progress)); 45255 transform += " scale(".concat(currentScale, ")"); 45256 } 45257 if (rotate && typeof rotate !== 'undefined' && rotate !== null) { 45258 var currentRotate = rotate * progress * -1; 45259 transform += " rotate(".concat(currentRotate, "deg)"); 45260 } 45261 el.style.transform = transform; 45262 }; 45263 var setTranslate = function setTranslate() { 45264 var el = swiper.el, 45265 slides = swiper.slides, 45266 progress = swiper.progress, 45267 snapGrid = swiper.snapGrid, 45268 isElement = swiper.isElement; 45269 var elements = (0, _utils.e)(el, elementsSelector); 45270 if (swiper.isElement) { 45271 elements.push.apply(elements, (0, _toConsumableArray2["default"])((0, _utils.e)(swiper.hostEl, elementsSelector))); 45272 }
45273 elements.forEach(function (subEl) { 45274 setTransform(subEl, progress); 45275 }); 45276 slides.forEach(function (slideEl, slideIndex) { 45277 var slideProgress = slideEl.progress; 45278 if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') { 45279 slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1); 45280 } 45281 slideProgress = Math.min(Math.max(slideProgress, -1), 1); 45282 slideEl.querySelectorAll("".concat(elementsSelector, ", [data-swiper-parallax-rotate]")).forEach(function (subEl) { 45283 setTransform(subEl, slideProgress); 45284 }); 45285 }); 45286 }; 45287 var setTransition = function setTransition() { 45288 var duration = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : swiper.params.speed; 45289 var el = swiper.el, 45290 hostEl = swiper.hostEl; 45291 var elements = (0, _toConsumableArray2["default"])(el.querySelectorAll(elementsSelector)); 45292 if (swiper.isElement) { 45293 elements.push.apply(elements, (0, _toConsumableArray2["default"])(hostEl.querySelectorAll(elementsSelector))); 45294 } 45295 elements.forEach(function (parallaxEl) { 45296 var parallaxDuration = parseInt(parallaxEl.getAttribute('data-swiper-parallax-duration'), 10) || duration; 45297 if (duration === 0) parallaxDuration = 0; 45298 parallaxEl.style.transitionDuration = "".concat(parallaxDuration, "ms"); 45299 }); 45300 }; 45301 on('beforeInit', function () { 45302 if (!swiper.params.parallax.enabled) return; 45303 swiper.params.watchSlidesProgress = true; 45304 swiper.originalParams.watchSlidesProgress = true; 45305 }); 45306 on('init', function () { 45307 if (!swiper.params.parallax.enabled) return; 45308 setTranslate(); 45309 }); 45310 on('setTranslate', function () { 45311 if (!swiper.params.parallax.enabled) return; 45312 setTranslate(); 45313 }); 45314 on('setTransition', function (_swiper, duration) { 45315 if (!swiper.params.parallax.enabled) return; 45316 setTransition(duration); 45317 }); 45318} 45319 45320},{"../shared/utils.mjs":141,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/toConsumableArray":105}],129:[function(require,module,exports){ 45321"use strict"; 45322 45323var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 45324Object.defineProperty(exports, "__esModule", { 45325 value: true 45326}); 45327exports["default"] = Scrollbar; 45328var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); 45329var _ssrWindowEsm = require("../shared/ssr-window.esm.mjs"); 45330var _utils = require("../shared/utils.mjs"); 45331var _createElementIfNotDefined = require("../shared/create-element-if-not-defined.mjs"); 45332var _classesToSelector = require("../shared/classes-to-selector.mjs"); 45333function Scrollbar(_ref) { 45334 var swiper = _ref.swiper, 45335 extendParams = _ref.extendParams, 45336 on = _ref.on, 45337 emit = _ref.emit; 45338 var document = (0, _ssrWindowEsm.g)(); 45339 var isTouched = false; 45340 var timeout = null; 45341 var dragTimeout = null; 45342 var dragStartPos; 45343 var dragSize; 45344 var trackSize; 45345 var divider; 45346 extendParams({ 45347 scrollbar: { 45348 el: null, 45349 dragSize: 'auto', 45350 hide: false, 45351 draggable: false, 45352 snapOnRelease: true, 45353 lockClass: 'swiper-scrollbar-lock', 45354 dragClass: 'swiper-scrollbar-drag', 45355 scrollbarDisabledClass: 'swiper-scrollbar-disabled', 45356 horizontalClass: "swiper-scrollbar-horizontal", 45357 verticalClass: "swiper-scrollbar-vertical" 45358 } 45359 }); 45360 swiper.scrollbar = { 45361 el: null, 45362 dragEl: null 45363 }; 45364 function setTranslate() { 45365 if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; 45366 var scrollbar = swiper.scrollbar, 45367 rtl = swiper.rtlTranslate; 45368 var dragEl = scrollbar.dragEl, 45369 el = scrollbar.el; 45370 var params = swiper.params.scrollbar; 45371 var progress = swiper.params.loop ? swiper.progressLoop : swiper.progress; 45372 var newSize = dragSize; 45373 var newPos = (trackSize - dragSize) * progress; 45374 if (rtl) { 45375 newPos = -newPos; 45376 if (newPos > 0) { 45377 newSize = dragSize - newPos; 45378 newPos = 0; 45379 } else if (-newPos + dragSize > trackSize) { 45380 newSize = trackSize + newPos; 45381 } 45382 } else if (newPos < 0) { 45383 newSize = dragSize + newPos; 45384 newPos = 0; 45385 } else if (newPos + dragSize > trackSize) { 45386 newSize = trackSize - newPos; 45387 } 45388 if (swiper.isHorizontal()) { 45389 dragEl.style.transform = "translate3d(".concat(newPos, "px, 0, 0)"); 45390 dragEl.style.width = "".concat(newSize, "px"); 45391 } else { 45392 dragEl.style.transform = "translate3d(0px, ".concat(newPos, "px, 0)"); 45393 dragEl.style.height = "".concat(newSize, "px"); 45394 } 45395 if (params.hide) { 45396 clearTimeout(timeout); 45397 el.style.opacity = 1; 45398 timeout = setTimeout(function () { 45399 el.style.opacity = 0; 45400 el.style.transitionDuration = '400ms'; 45401 }, 1000); 45402 } 45403 } 45404 function setTransition(duration) { 45405 if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; 45406 swiper.scrollbar.dragEl.style.transitionDuration = "".concat(duration, "ms"); 45407 } 45408 function updateSize() { 45409 if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; 45410 var scrollbar = swiper.scrollbar; 45411 var dragEl = scrollbar.dragEl, 45412 el = scrollbar.el; 45413 dragEl.style.width = ''; 45414 dragEl.style.height = ''; 45415 trackSize = swiper.isHorizontal() ? el.offsetWidth : el.offsetHeight; 45416 divider = swiper.size / (swiper.virtualSize + swiper.params.slidesOffsetBefore - (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0)); 45417 if (swiper.params.scrollbar.dragSize === 'auto') { 45418 dragSize = trackSize * divider; 45419 } else { 45420 dragSize = parseInt(swiper.params.scrollbar.dragSize, 10); 45421 } 45422 if (swiper.isHorizontal()) { 45423 dragEl.style.width = "".concat(dragSize, "px"); 45424 } else { 45425 dragEl.style.height = "".concat(dragSize, "px"); 45426 } 45427 if (divider >= 1) { 45428 el.style.display = 'none'; 45429 } else { 45430 el.style.display = ''; 45431 } 45432 if (swiper.params.scrollbar.hide) { 45433 el.style.opacity = 0; 45434 } 45435 if (swiper.params.watchOverflow && swiper.enabled) { 45436 scrollbar.el.classList[swiper.isLocked ? 'add' : 'remove'](swiper.params.scrollbar.lockClass); 45437 } 45438 } 45439 function getPointerPosition(e) { 45440 return swiper.isHorizontal() ? e.clientX : e.clientY; 45441 } 45442 function setDragPosition(e) { 45443 var scrollbar = swiper.scrollbar, 45444 rtl = swiper.rtlTranslate; 45445 var el = scrollbar.el; 45446 var positionRatio; 45447 positionRatio = (getPointerPosition(e) - (0, _utils.f)(el)[swiper.isHorizontal() ? 'left' : 'top'] - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize); 45448 positionRatio = Math.max(Math.min(positionRatio, 1), 0); 45449 if (rtl) { 45450 positionRatio = 1 - positionRatio; 45451 } 45452 var position = swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio; 45453 swiper.updateProgress(position); 45454 swiper.setTranslate(position); 45455 swiper.updateActiveIndex(); 45456 swiper.updateSlidesClasses(); 45457 } 45458 function onDragStart(e) { 45459 var params = swiper.params.scrollbar; 45460 var scrollbar = swiper.scrollbar, 45461 wrapperEl = swiper.wrapperEl; 45462 var el = scrollbar.el, 45463 dragEl = scrollbar.dragEl; 45464 isTouched = true; 45465 dragStartPos = e.target === dragEl ? getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null; 45466 e.preventDefault(); 45467 e.stopPropagation(); 45468 wrapperEl.style.transitionDuration = '100ms'; 45469 dragEl.style.transitionDuration = '100ms'; 45470 setDragPosition(e); 45471 clearTimeout(dragTimeout); 45472 el.style.transitionDuration = '0ms'; 45473 if (params.hide) { 45474 el.style.opacity = 1; 45475 } 45476 if (swiper.params.cssMode) {
45477 swiper.wrapperEl.style['scroll-snap-type'] = 'none'; 45478 } 45479 emit('scrollbarDragStart', e); 45480 } 45481 function onDragMove(e) { 45482 var scrollbar = swiper.scrollbar, 45483 wrapperEl = swiper.wrapperEl; 45484 var el = scrollbar.el, 45485 dragEl = scrollbar.dragEl; 45486 if (!isTouched) return; 45487 if (e.preventDefault && e.cancelable) e.preventDefault();else e.returnValue = false; 45488 setDragPosition(e); 45489 wrapperEl.style.transitionDuration = '0ms'; 45490 el.style.transitionDuration = '0ms'; 45491 dragEl.style.transitionDuration = '0ms'; 45492 emit('scrollbarDragMove', e); 45493 } 45494 function onDragEnd(e) { 45495 var params = swiper.params.scrollbar; 45496 var scrollbar = swiper.scrollbar, 45497 wrapperEl = swiper.wrapperEl; 45498 var el = scrollbar.el; 45499 if (!isTouched) return; 45500 isTouched = false; 45501 if (swiper.params.cssMode) { 45502 swiper.wrapperEl.style['scroll-snap-type'] = ''; 45503 wrapperEl.style.transitionDuration = ''; 45504 } 45505 if (params.hide) { 45506 clearTimeout(dragTimeout); 45507 dragTimeout = (0, _utils.n)(function () { 45508 el.style.opacity = 0; 45509 el.style.transitionDuration = '400ms'; 45510 }, 1000); 45511 } 45512 emit('scrollbarDragEnd', e); 45513 if (params.snapOnRelease) { 45514 swiper.slideToClosest(); 45515 } 45516 } 45517 function events(method) { 45518 var scrollbar = swiper.scrollbar, 45519 params = swiper.params; 45520 var el = scrollbar.el; 45521 if (!el) return; 45522 var target = el; 45523 var activeListener = params.passiveListeners ? { 45524 passive: false, 45525 capture: false 45526 } : false; 45527 var passiveListener = params.passiveListeners ? { 45528 passive: true, 45529 capture: false 45530 } : false; 45531 if (!target) return; 45532 var eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener'; 45533 target[eventMethod]('pointerdown', onDragStart, activeListener); 45534 document[eventMethod]('pointermove', onDragMove, activeListener); 45535 document[eventMethod]('pointerup', onDragEnd, passiveListener); 45536 } 45537 function enableDraggable() { 45538 if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; 45539 events('on'); 45540 } 45541 function disableDraggable() { 45542 if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; 45543 events('off'); 45544 } 45545 function init() { 45546 var scrollbar = swiper.scrollbar, 45547 swiperEl = swiper.el; 45548 swiper.params.scrollbar = (0, _createElementIfNotDefined.c)(swiper, swiper.originalParams.scrollbar, swiper.params.scrollbar, { 45549 el: 'swiper-scrollbar' 45550 }); 45551 var params = swiper.params.scrollbar; 45552 if (!params.el) return; 45553 var el; 45554 if (typeof params.el === 'string' && swiper.isElement) { 45555 el = swiper.el.querySelector(params.el); 45556 } 45557 if (!el && typeof params.el === 'string') { 45558 el = document.querySelectorAll(params.el); 45559 if (!el.length) return; 45560 } else if (!el) { 45561 el = params.el; 45562 } 45563 if (swiper.params.uniqueNavElements && typeof params.el === 'string' && el.length > 1 && swiperEl.querySelectorAll(params.el).length === 1) { 45564 el = swiperEl.querySelector(params.el); 45565 } 45566 if (el.length > 0) el = el[0]; 45567 el.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass); 45568 var dragEl; 45569 if (el) { 45570 dragEl = el.querySelector((0, _classesToSelector.c)(swiper.params.scrollbar.dragClass)); 45571 if (!dragEl) { 45572 dragEl = (0, _utils.c)('div', swiper.params.scrollbar.dragClass); 45573 el.append(dragEl); 45574 } 45575 } 45576 Object.assign(scrollbar, { 45577 el: el, 45578 dragEl: dragEl 45579 }); 45580 if (params.draggable) { 45581 enableDraggable(); 45582 } 45583 if (el) { 45584 var _el$classList; 45585 (_el$classList = el.classList)[swiper.enabled ? 'remove' : 'add'].apply(_el$classList, (0, _toConsumableArray2["default"])((0, _utils.k)(swiper.params.scrollbar.lockClass))); 45586 } 45587 } 45588 function destroy() { 45589 var params = swiper.params.scrollbar; 45590 var el = swiper.scrollbar.el; 45591 if (el) { 45592 var _el$classList2; 45593 (_el$classList2 = el.classList).remove.apply(_el$classList2, (0, _toConsumableArray2["default"])((0, _utils.k)(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass))); 45594 } 45595 disableDraggable(); 45596 } 45597 on('changeDirection', function () { 45598 if (!swiper.scrollbar || !swiper.scrollbar.el) return; 45599 var params = swiper.params.scrollbar; 45600 var el = swiper.scrollbar.el; 45601 el = (0, _utils.m)(el); 45602 el.forEach(function (subEl) { 45603 subEl.classList.remove(params.horizontalClass, params.verticalClass); 45604 subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass); 45605 }); 45606 }); 45607 on('init', function () { 45608 if (swiper.params.scrollbar.enabled === false) { 45609 // eslint-disable-next-line 45610 disable(); 45611 } else { 45612 init(); 45613 updateSize(); 45614 setTranslate(); 45615 } 45616 }); 45617 on('update resize observerUpdate lock unlock changeDirection', function () { 45618 updateSize(); 45619 }); 45620 on('setTranslate', function () { 45621 setTranslate(); 45622 }); 45623 on('setTransition', function (_s, duration) { 45624 setTransition(duration); 45625 }); 45626 on('enable disable', function () { 45627 var el = swiper.scrollbar.el; 45628 if (el) { 45629 var _el$classList3; 45630 (_el$classList3 = el.classList)[swiper.enabled ? 'remove' : 'add'].apply(_el$classList3, (0, _toConsumableArray2["default"])((0, _utils.k)(swiper.params.scrollbar.lockClass))); 45631 } 45632 }); 45633 on('destroy', function () { 45634 destroy(); 45635 }); 45636 var enable = function enable() { 45637 var _swiper$el$classList; 45638 (_swiper$el$classList = swiper.el.classList).remove.apply(_swiper$el$classList, (0, _toConsumableArray2["default"])((0, _utils.k)(swiper.params.scrollbar.scrollbarDisabledClass))); 45639 if (swiper.scrollbar.el) { 45640 var _swiper$scrollbar$el$; 45641 (_swiper$scrollbar$el$ = swiper.scrollbar.el.classList).remove.apply(_swiper$scrollbar$el$, (0, _toConsumableArray2["default"])((0, _utils.k)(swiper.params.scrollbar.scrollbarDisabledClass))); 45642 } 45643 init(); 45644 updateSize(); 45645 setTranslate(); 45646 }; 45647 var disable = function disable() { 45648 var _swiper$el$classList2; 45649 (_swiper$el$classList2 = swiper.el.classList).add.apply(_swiper$el$classList2, (0, _toConsumableArray2["default"])((0, _utils.k)(swiper.params.scrollbar.scrollbarDisabledClass))); 45650 if (swiper.scrollbar.el) { 45651 var _swiper$scrollbar$el$2; 45652 (_swiper$scrollbar$el$2 = swiper.scrollbar.el.classList).add.apply(_swiper$scrollbar$el$2, (0, _toConsumableArray2["default"])((0, _utils.k)(swiper.params.scrollbar.scrollbarDisabledClass))); 45653 } 45654 destroy(); 45655 }; 45656 Object.assign(swiper.scrollbar, { 45657 enable: enable, 45658 disable: disable, 45659 updateSize: updateSize, 45660 setTranslate: setTranslate, 45661 init: init, 45662 destroy: destroy 45663 }); 45664} 45665 45666},{"../shared/classes-to-selector.mjs":133,"../shared/create-element-if-not-defined.mjs":134,"../shared/ssr-window.esm.mjs":139,"../shared/utils.mjs":141,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/toConsumableArray":105}],130:[function(require,module,exports){ 45667"use strict"; 45668 45669Object.defineProperty(exports, "__esModule", { 45670 value: true 45671}); 45672exports["default"] = Thumb; 45673var _ssrWindowEsm = require("../shared/ssr-window.esm.mjs"); 45674var _utils = require("../shared/utils.mjs"); 45675function Thumb(_ref) { 45676 var swiper = _ref.swiper, 45677 extendParams = _ref.extendParams, 45678 on = _ref.on; 45679 extendParams({ 45680 thumbs: { 45681 swiper: null, 45682 multipleActiveThumbs: true, 45683 autoScrollOffset: 0, 45684 slideThumbActiveClass: 'swiper-slide-thumb-active', 45685 thumbsContainerClass: 'swiper-thumbs' 45686 } 45687 }); 45688 var initialized = false;
45689 var swiperCreated = false; 45690 swiper.thumbs = { 45691 swiper: null 45692 }; 45693 function isVirtualEnabled() { 45694 var thumbsSwiper = swiper.thumbs.swiper; 45695 if (!thumbsSwiper || thumbsSwiper.destroyed) return false; 45696 return thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled; 45697 } 45698 function onThumbClick() { 45699 var thumbsSwiper = swiper.thumbs.swiper; 45700 if (!thumbsSwiper || thumbsSwiper.destroyed) return; 45701 var clickedIndex = thumbsSwiper.clickedIndex; 45702 var clickedSlide = thumbsSwiper.clickedSlide; 45703 if (clickedSlide && clickedSlide.classList.contains(swiper.params.thumbs.slideThumbActiveClass)) return; 45704 if (typeof clickedIndex === 'undefined' || clickedIndex === null) return; 45705 var slideToIndex; 45706 if (thumbsSwiper.params.loop) { 45707 slideToIndex = parseInt(thumbsSwiper.clickedSlide.getAttribute('data-swiper-slide-index'), 10); 45708 } else { 45709 slideToIndex = clickedIndex; 45710 } 45711 if (swiper.params.loop) { 45712 swiper.slideToLoop(slideToIndex); 45713 } else { 45714 swiper.slideTo(slideToIndex); 45715 } 45716 } 45717 function init() { 45718 var thumbsParams = swiper.params.thumbs; 45719 if (initialized) return false; 45720 initialized = true; 45721 var SwiperClass = swiper.constructor; 45722 if (thumbsParams.swiper instanceof SwiperClass) { 45723 if (thumbsParams.swiper.destroyed) { 45724 initialized = false; 45725 return false; 45726 } 45727 swiper.thumbs.swiper = thumbsParams.swiper; 45728 Object.assign(swiper.thumbs.swiper.originalParams, { 45729 watchSlidesProgress: true, 45730 slideToClickedSlide: false 45731 }); 45732 Object.assign(swiper.thumbs.swiper.params, { 45733 watchSlidesProgress: true, 45734 slideToClickedSlide: false 45735 }); 45736 swiper.thumbs.swiper.update(); 45737 } else if ((0, _utils.p)(thumbsParams.swiper)) { 45738 var thumbsSwiperParams = Object.assign({}, thumbsParams.swiper); 45739 Object.assign(thumbsSwiperParams, { 45740 watchSlidesProgress: true, 45741 slideToClickedSlide: false 45742 }); 45743 swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams); 45744 swiperCreated = true; 45745 } 45746 swiper.thumbs.swiper.el.classList.add(swiper.params.thumbs.thumbsContainerClass); 45747 swiper.thumbs.swiper.on('tap', onThumbClick); 45748 if (isVirtualEnabled()) { 45749 swiper.thumbs.swiper.on('virtualUpdate', function () { 45750 update(false, { 45751 autoScroll: false 45752 }); 45753 }); 45754 } 45755 return true; 45756 } 45757 function update(initial, p) { 45758 var _p$autoScroll; 45759 var thumbsSwiper = swiper.thumbs.swiper; 45760 if (!thumbsSwiper || thumbsSwiper.destroyed) return; 45761 45762 // Activate thumbs 45763 var thumbsToActivate = 1; 45764 var thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass; 45765 if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) { 45766 thumbsToActivate = swiper.params.slidesPerView; 45767 } 45768 if (!swiper.params.thumbs.multipleActiveThumbs) { 45769 thumbsToActivate = 1; 45770 } 45771 thumbsToActivate = Math.floor(thumbsToActivate); 45772 thumbsSwiper.slides.forEach(function (slideEl) { 45773 return slideEl.classList.remove(thumbActiveClass); 45774 }); 45775 if (thumbsSwiper.params.loop || isVirtualEnabled()) { 45776 for (var i = 0; i < thumbsToActivate; i += 1) { 45777 (0, _utils.e)(thumbsSwiper.slidesEl, "[data-swiper-slide-index=\"".concat(swiper.realIndex + i, "\"]")).forEach(function (slideEl) { 45778 slideEl.classList.add(thumbActiveClass); 45779 }); 45780 } 45781 } else { 45782 for (var _i = 0; _i < thumbsToActivate; _i += 1) { 45783 if (thumbsSwiper.slides[swiper.realIndex + _i]) { 45784 thumbsSwiper.slides[swiper.realIndex + _i].classList.add(thumbActiveClass); 45785 } 45786 } 45787 } 45788 if ((_p$autoScroll = p === null || p === void 0 ? void 0 : p.autoScroll) !== null && _p$autoScroll !== void 0 ? _p$autoScroll : true) { 45789 autoScroll(initial ? 0 : undefined); 45790 } 45791 } 45792 function autoScroll(slideSpeed) { 45793 var thumbsSwiper = swiper.thumbs.swiper; 45794 if (!thumbsSwiper || thumbsSwiper.destroyed) return; 45795 var slidesPerView = thumbsSwiper.params.slidesPerView === 'auto' ? thumbsSwiper.slidesPerViewDynamic() : thumbsSwiper.params.slidesPerView; 45796 var autoScrollOffset = swiper.params.thumbs.autoScrollOffset; 45797 var useOffset = autoScrollOffset && !thumbsSwiper.params.loop; 45798 if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) { 45799 var currentThumbsIndex = thumbsSwiper.activeIndex; 45800 var newThumbsIndex; 45801 var direction; 45802 if (thumbsSwiper.params.loop) { 45803 var newThumbsSlide = thumbsSwiper.slides.find(function (slideEl) { 45804 return slideEl.getAttribute('data-swiper-slide-index') === "".concat(swiper.realIndex); 45805 }); 45806 newThumbsIndex = thumbsSwiper.slides.indexOf(newThumbsSlide); 45807 direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev'; 45808 } else { 45809 newThumbsIndex = swiper.realIndex; 45810 direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev'; 45811 } 45812 if (useOffset) { 45813 newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset; 45814 } 45815 if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) { 45816 if (thumbsSwiper.params.centeredSlides) { 45817 if (newThumbsIndex > currentThumbsIndex) { 45818 newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1; 45819 } else { 45820 newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1; 45821 } 45822 } else if (newThumbsIndex > currentThumbsIndex && thumbsSwiper.params.slidesPerGroup === 1) ; 45823 thumbsSwiper.slideTo(newThumbsIndex, slideSpeed); 45824 } 45825 } 45826 } 45827 on('beforeInit', function () { 45828 var thumbs = swiper.params.thumbs; 45829 if (!thumbs || !thumbs.swiper) return; 45830 if (typeof thumbs.swiper === 'string' || thumbs.swiper instanceof HTMLElement) { 45831 var document = (0, _ssrWindowEsm.g)(); 45832 var getThumbsElementAndInit = function getThumbsElementAndInit() { 45833 var thumbsElement = typeof thumbs.swiper === 'string' ? document.querySelector(thumbs.swiper) : thumbs.swiper; 45834 if (thumbsElement && thumbsElement.swiper) { 45835 thumbs.swiper = thumbsElement.swiper; 45836 init(); 45837 update(true); 45838 } else if (thumbsElement) { 45839 var eventName = "".concat(swiper.params.eventsPrefix, "init"); 45840 var _onThumbsSwiper = function onThumbsSwiper(e) { 45841 thumbs.swiper = e.detail[0]; 45842 thumbsElement.removeEventListener(eventName, _onThumbsSwiper); 45843 init(); 45844 update(true);
45845 thumbs.swiper.update(); 45846 swiper.update(); 45847 }; 45848 thumbsElement.addEventListener(eventName, _onThumbsSwiper); 45849 } 45850 return thumbsElement; 45851 }; 45852 var _watchForThumbsToAppear = function watchForThumbsToAppear() { 45853 if (swiper.destroyed) return; 45854 var thumbsElement = getThumbsElementAndInit(); 45855 if (!thumbsElement) { 45856 requestAnimationFrame(_watchForThumbsToAppear); 45857 } 45858 }; 45859 requestAnimationFrame(_watchForThumbsToAppear); 45860 } else { 45861 init(); 45862 update(true); 45863 } 45864 }); 45865 on('slideChange update resize observerUpdate', function () { 45866 update(); 45867 }); 45868 on('setTransition', function (_s, duration) { 45869 var thumbsSwiper = swiper.thumbs.swiper; 45870 if (!thumbsSwiper || thumbsSwiper.destroyed) return; 45871 thumbsSwiper.setTransition(duration); 45872 }); 45873 on('beforeDestroy', function () { 45874 var thumbsSwiper = swiper.thumbs.swiper; 45875 if (!thumbsSwiper || thumbsSwiper.destroyed) return; 45876 if (swiperCreated) { 45877 thumbsSwiper.destroy(); 45878 } 45879 }); 45880 Object.assign(swiper.thumbs, { 45881 init: init, 45882 update: update 45883 }); 45884} 45885 45886},{"../shared/ssr-window.esm.mjs":139,"../shared/utils.mjs":141}],131:[function(require,module,exports){ 45887"use strict"; 45888 45889var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 45890Object.defineProperty(exports, "__esModule", { 45891 value: true 45892}); 45893exports["default"] = Virtual; 45894var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); 45895var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); 45896var _ssrWindowEsm = require("../shared/ssr-window.esm.mjs"); 45897var _utils = require("../shared/utils.mjs"); 45898function Virtual(_ref) { 45899 var swiper = _ref.swiper, 45900 extendParams = _ref.extendParams, 45901 on = _ref.on, 45902 emit = _ref.emit; 45903 extendParams({ 45904 virtual: { 45905 enabled: false, 45906 slides: [], 45907 cache: true, 45908 slidesPerViewAutoSlideSize: 320, 45909 renderSlide: null, 45910 renderExternal: null, 45911 renderExternalUpdate: true, 45912 addSlidesBefore: 0, 45913 addSlidesAfter: 0 45914 } 45915 }); 45916 var cssModeTimeout; 45917 var document = (0, _ssrWindowEsm.g)(); 45918 swiper.virtual = { 45919 cache: {}, 45920 from: undefined, 45921 to: undefined, 45922 slides: [], 45923 offset: 0, 45924 slidesGrid: [] 45925 }; 45926 var tempDOM = document.createElement('div');
45927 function renderSlide(slide, index) { 45928 var params = swiper.params.virtual; 45929 if (params.cache && swiper.virtual.cache[index]) { 45930 return swiper.virtual.cache[index]; 45931 } 45932 // eslint-disable-next-line 45933 var slideEl; 45934 if (params.renderSlide) { 45935 slideEl = params.renderSlide.call(swiper, slide, index); 45936 if (typeof slideEl === 'string') { 45937 (0, _utils.s)(tempDOM, slideEl); 45938 slideEl = tempDOM.children[0]; 45939 } 45940 } else if (swiper.isElement) { 45941 slideEl = (0, _utils.c)('swiper-slide'); 45942 } else { 45943 slideEl = (0, _utils.c)('div', swiper.params.slideClass); 45944 } 45945 slideEl.setAttribute('data-swiper-slide-index', index); 45946 if (!params.renderSlide) { 45947 (0, _utils.s)(slideEl, slide); 45948 } 45949 if (params.cache) { 45950 swiper.virtual.cache[index] = slideEl; 45951 } 45952 return slideEl; 45953 } 45954 function update(force, beforeInit, forceActiveIndex) { 45955 var _swiper$params = swiper.params, 45956 slidesPerGroup = _swiper$params.slidesPerGroup, 45957 centeredSlides = _swiper$params.centeredSlides, 45958 slidesPerView = _swiper$params.slidesPerView, 45959 isLoop = _swiper$params.loop, 45960 initialSlide = _swiper$params.initialSlide; 45961 if (beforeInit && !isLoop && initialSlide > 0) { 45962 return; 45963 } 45964 var _swiper$params$virtua = swiper.params.virtual, 45965 addSlidesBefore = _swiper$params$virtua.addSlidesBefore, 45966 addSlidesAfter = _swiper$params$virtua.addSlidesAfter, 45967 slidesPerViewAutoSlideSize = _swiper$params$virtua.slidesPerViewAutoSlideSize; 45968 var _swiper$virtual = swiper.virtual, 45969 previousFrom = _swiper$virtual.from, 45970 previousTo = _swiper$virtual.to, 45971 slides = _swiper$virtual.slides, 45972 previousSlidesGrid = _swiper$virtual.slidesGrid, 45973 previousOffset = _swiper$virtual.offset; 45974 if (!swiper.params.cssMode) { 45975 swiper.updateActiveIndex(); 45976 } 45977 var activeIndex = typeof forceActiveIndex === 'undefined' ? swiper.activeIndex || 0 : forceActiveIndex; 45978 var offsetProp; 45979 if (swiper.rtlTranslate) offsetProp = 'right';else offsetProp = swiper.isHorizontal() ? 'left' : 'top'; 45980 var slidesPerViewNumeric; 45981 if (slidesPerView === 'auto') { 45982 if (slidesPerViewAutoSlideSize) { 45983 var swiperSize = swiper.size; 45984 if (!swiperSize) { 45985 swiperSize = swiper.isHorizontal() ? swiper.el.getBoundingClientRect().width : swiper.el.getBoundingClientRect().height; 45986 } 45987 slidesPerViewNumeric = Math.max(1, Math.ceil(swiperSize / slidesPerViewAutoSlideSize)); 45988 } else { 45989 slidesPerViewNumeric = 1; 45990 } 45991 } else { 45992 slidesPerViewNumeric = slidesPerView; 45993 } 45994 var slidesAfter; 45995 var slidesBefore; 45996 if (centeredSlides) { 45997 slidesAfter = Math.floor(slidesPerViewNumeric / 2) + slidesPerGroup + addSlidesAfter; 45998 slidesBefore = Math.floor(slidesPerViewNumeric / 2) + slidesPerGroup + addSlidesBefore; 45999 } else { 46000 slidesAfter = slidesPerViewNumeric + (slidesPerGroup - 1) + addSlidesAfter; 46001 slidesBefore = (isLoop ? slidesPerViewNumeric : slidesPerGroup) + addSlidesBefore; 46002 } 46003 var from = activeIndex - slidesBefore; 46004 var to = activeIndex + slidesAfter; 46005 if (!isLoop) { 46006 from = Math.max(from, 0); 46007 to = Math.min(to, slides.length - 1); 46008 } 46009 var offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0); 46010 if (isLoop && activeIndex >= slidesBefore) { 46011 from -= slidesBefore; 46012 if (!centeredSlides) offset += swiper.slidesGrid[0]; 46013 } else if (isLoop && activeIndex < slidesBefore) { 46014 from = -slidesBefore; 46015 if (centeredSlides) offset += swiper.slidesGrid[0]; 46016 } 46017 Object.assign(swiper.virtual, { 46018 from: from, 46019 to: to, 46020 offset: offset, 46021 slidesGrid: swiper.slidesGrid, 46022 slidesBefore: slidesBefore, 46023 slidesAfter: slidesAfter 46024 }); 46025 function onRendered() { 46026 swiper.updateSlides(); 46027 swiper.updateProgress(); 46028 swiper.updateSlidesClasses(); 46029 emit('virtualUpdate'); 46030 } 46031 if (previousFrom === from && previousTo === to && !force) { 46032 if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {
46033 swiper.slides.forEach(function (slideEl) { 46034 slideEl.style[offsetProp] = "".concat(offset - Math.abs(swiper.cssOverflowAdjustment()), "px"); 46035 }); 46036 } 46037 swiper.updateProgress(); 46038 emit('virtualUpdate'); 46039 return; 46040 } 46041 if (swiper.params.virtual.renderExternal) { 46042 swiper.params.virtual.renderExternal.call(swiper, { 46043 offset: offset, 46044 from: from, 46045 to: to, 46046 slides: function getSlides() { 46047 var slidesToRender = []; 46048 for (var i = from; i <= to; i += 1) { 46049 slidesToRender.push(slides[i]); 46050 } 46051 return slidesToRender; 46052 }() 46053 }); 46054 if (swiper.params.virtual.renderExternalUpdate) { 46055 onRendered(); 46056 } else { 46057 emit('virtualUpdate'); 46058 } 46059 return; 46060 } 46061 var prependIndexes = []; 46062 var appendIndexes = []; 46063 var getSlideIndex = function getSlideIndex(index) { 46064 var slideIndex = index; 46065 if (index < 0) { 46066 slideIndex = slides.length + index; 46067 } else if (slideIndex >= slides.length) { 46068 // eslint-disable-next-line 46069 slideIndex = slideIndex - slides.length; 46070 } 46071 return slideIndex; 46072 }; 46073 if (force) { 46074 swiper.slides.filter(function (el) { 46075 return el.matches(".".concat(swiper.params.slideClass, ", swiper-slide")); 46076 }
46076).forEach(function (slideEl) { 46077 slideEl.remove(); 46078 }); 46079 } else { 46080 var _loop = function _loop() { 46081 if (i < from || i > to) { 46082 var slideIndex = getSlideIndex(i); 46083 swiper.slides.filter(function (el) { 46084 return el.matches(".".concat(swiper.params.slideClass, "[data-swiper-slide-index=\"").concat(slideIndex, "\"], swiper-slide[data-swiper-slide-index=\"").concat(slideIndex, "\"]")); 46085 }).forEach(function (slideEl) { 46086 slideEl.remove(); 46087 }); 46088 } 46089 }; 46090 for (var i = previousFrom; i <= previousTo; i += 1) { 46091 _loop(); 46092 } 46093 } 46094 var loopFrom = isLoop ? -slides.length : 0; 46095 var loopTo = isLoop ? slides.length * 2 : slides.length; 46096 for (var _i = loopFrom; _i < loopTo; _i += 1) { 46097 if (_i >= from && _i <= to) { 46098 var slideIndex = getSlideIndex(_i); 46099 if (typeof previousTo === 'undefined' || force) { 46100 appendIndexes.push(slideIndex); 46101 } else { 46102 if (_i > previousTo) appendIndexes.push(slideIndex); 46103 if (_i < previousFrom) prependIndexes.push(slideIndex); 46104 } 46105 } 46106 } 46107 appendIndexes.forEach(function (index) { 46108 swiper.slidesEl.append(renderSlide(slides[index], index)); 46109 }); 46110 if (isLoop) { 46111 for (var _i2 = prependIndexes.length - 1; _i2 >= 0; _i2 -= 1) { 46112 var index = prependIndexes[_i2]; 46113 swiper.slidesEl.prepend(renderSlide(slides[index], index)); 46114 } 46115 } else { 46116 prependIndexes.sort(function (a, b) { 46117 return b - a; 46118 }); 46119 prependIndexes.forEach(function (index) { 46120 swiper.slidesEl.prepend(renderSlide(slides[index], index)); 46121 }); 46122 } 46123 (0, _utils.e)(swiper.slidesEl, '.swiper-slide, swiper-slide').forEach(function (slideEl) { 46124 slideEl.style[offsetProp] = "".concat(offset - Math.abs(swiper.cssOverflowAdjustment()), "px"); 46125 }); 46126 onRendered(); 46127 } 46128 function appendSlide(slides) { 46129 if ((0, _typeof2["default"])(slides) === 'object' && 'length' in slides) { 46130 for (var i = 0; i < slides.length; i += 1) { 46131 if (slides[i]) swiper.virtual.slides.push(slides[i]); 46132 } 46133 } else { 46134 swiper.virtual.slides.push(slides); 46135 } 46136 update(true); 46137 } 46138 function prependSlide(slides) { 46139 var activeIndex = swiper.activeIndex; 46140 var newActiveIndex = activeIndex + 1; 46141 var numberOfNewSlides = 1; 46142 if (Array.isArray(slides)) { 46143 for (var i = 0; i < slides.length; i += 1) { 46144 if (slides[i]) swiper.virtual.slides.unshift(slides[i]); 46145 } 46146 newActiveIndex = activeIndex + slides.length; 46147 numberOfNewSlides = slides.length; 46148 } else { 46149 swiper.virtual.slides.unshift(slides); 46150 } 46151 if (swiper.params.virtual.cache) { 46152 var cache = swiper.virtual.cache; 46153 var newCache = {}; 46154 Object.keys(cache).forEach(function (cachedIndex) { 46155 var cachedEl = cache[cachedIndex]; 46156 var cachedElIndex = cachedEl.getAttribute('data-swiper-slide-index'); 46157 if (cachedElIndex) { 46158 cachedEl.setAttribute('data-swiper-slide-index', parseInt(cachedElIndex, 10) + numberOfNewSlides); 46159 } 46160 newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = cachedEl; 46161 }); 46162 swiper.virtual.cache = newCache; 46163 } 46164 update(true); 46165 swiper.slideTo(newActiveIndex, 0); 46166 } 46167 function removeSlide(slidesIndexes) { 46168 if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return; 46169 var activeIndex = swiper.activeIndex; 46170 if (Array.isArray(slidesIndexes)) { 46171 for (var i = slidesIndexes.length - 1; i >= 0; i -= 1) { 46172 if (swiper.params.virtual.cache) { 46173 delete swiper.virtual.cache[slidesIndexes[i]]; 46174 // shift cache indexes 46175 Object.keys(swiper.virtual.cache).forEach(function (key) { 46176 if (key > slidesIndexes) { 46177 swiper.virtual.cache[key - 1] = swiper.virtual.cache[key]; 46178 swiper.virtual.cache[key - 1].setAttribute('data-swiper-slide-index', key - 1); 46179 delete swiper.virtual.cache[key]; 46180 } 46181 }); 46182 } 46183 swiper.virtual.slides.splice(slidesIndexes[i], 1); 46184 if (slidesIndexes[i] < activeIndex) activeIndex -= 1; 46185 activeIndex = Math.max(activeIndex, 0); 46186 } 46187 } else { 46188 if (swiper.params.virtual.cache) { 46189 delete swiper.virtual.cache[slidesIndexes]; 46190 // shift cache indexes 46191 Object.keys(swiper.virtual.cache).forEach(function (key) { 46192 if (key > slidesIndexes) { 46193 swiper.virtual.cache[key - 1] = swiper.virtual.cache[key]; 46194 swiper.virtual.cache[key - 1].setAttribute('data-swiper-slide-index', key - 1); 46195 delete swiper.virtual.cache[key]; 46196 } 46197 }); 46198 } 46199 swiper.virtual.slides.splice(slidesIndexes, 1); 46200 if (slidesIndexes < activeIndex) activeIndex -= 1; 46201 activeIndex = Math.max(activeIndex, 0); 46202 } 46203 update(true); 46204 swiper.slideTo(activeIndex, 0); 46205 } 46206 function removeAllSlides() { 46207 swiper.virtual.slides = []; 46208 if (swiper.params.virtual.cache) { 46209 swiper.virtual.cache = {}; 46210 } 46211 update(true); 46212 swiper.slideTo(0, 0); 46213 } 46214 on('beforeInit', function () { 46215 if (!swiper.params.virtual.enabled) return; 46216 var domSlidesAssigned; 46217 if (typeof swiper.passedParams.virtual.slides === 'undefined') { 46218 var slides = (0, _toConsumableArray2["default"])(swiper.slidesEl.children).filter(function (el) { 46219 return el.matches(".".concat(swiper.params.slideClass, ", swiper-slide")); 46220 }); 46221 if (slides && slides.length) { 46222 swiper.virtual.slides = (0, _toConsumableArray2["default"])(slides); 46223 domSlidesAssigned = true;
46224 slides.forEach(function (slideEl, slideIndex) { 46225 slideEl.setAttribute('data-swiper-slide-index', slideIndex); 46226 swiper.virtual.cache[slideIndex] = slideEl; 46227 slideEl.remove(); 46228 }); 46229 } 46230 } 46231 if (!domSlidesAssigned) { 46232 swiper.virtual.slides = swiper.params.virtual.slides; 46233 } 46234 swiper.classNames.push("".concat(swiper.params.containerModifierClass, "virtual")); 46235 swiper.params.watchSlidesProgress = true; 46236 swiper.originalParams.watchSlidesProgress = true; 46237 update(false, true); 46238 }); 46239 on('setTranslate', function () { 46240 if (!swiper.params.virtual.enabled) return; 46241 if (swiper.params.cssMode && !swiper._immediateVirtual) { 46242 clearTimeout(cssModeTimeout); 46243 cssModeTimeout = setTimeout(function () { 46244 update(); 46245 }, 100); 46246 } else { 46247 update(); 46248 } 46249 }); 46250 on('init update resize', function () { 46251 if (!swiper.params.virtual.enabled) return; 46252 if (swiper.params.cssMode) { 46253 (0, _utils.b)(swiper.wrapperEl, '--swiper-virtual-size', "".concat(swiper.virtualSize, "px")); 46254 } 46255 }); 46256 Object.assign(swiper.virtual, { 46257 appendSlide: appendSlide, 46258 prependSlide: prependSlide, 46259 removeSlide: removeSlide, 46260 removeAllSlides: removeAllSlides, 46261 update: update 46262 }); 46263} 46264 46265},{"../shared/ssr-window.esm.mjs":139,"../shared/utils.mjs":141,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/toConsumableArray":105,"@babel/runtime/helpers/typeof":108}],132:[function(require,module,exports){ 46266"use strict"; 46267 46268var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 46269Object.defineProperty(exports, "__esModule", { 46270 value: true 46271}); 46272exports["default"] = Zoom; 46273var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); 46274var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); 46275var _ssrWindowEsm = require("../shared/ssr-window.esm.mjs"); 46276var _utils = require("../shared/utils.mjs"); 46277function Zoom(_ref) { 46278 var swiper = _ref.swiper, 46279 extendParams = _ref.extendParams, 46280 on = _ref.on, 46281 emit = _ref.emit; 46282 var window = (0, _ssrWindowEsm.a)(); 46283 extendParams({ 46284 zoom: { 46285 enabled: false, 46286 limitToOriginalSize: false, 46287 maxRatio: 3, 46288 minRatio: 1, 46289 panOnMouseMove: false, 46290 toggle: true, 46291 containerClass: 'swiper-zoom-container', 46292 zoomedSlideClass: 'swiper-slide-zoomed' 46293 } 46294 }); 46295 swiper.zoom = { 46296 enabled: false 46297 }; 46298 var currentScale = 1; 46299 var isScaling = false; 46300 var isPanningWithMouse = false; 46301 var mousePanStart = { 46302 x: 0, 46303 y: 0 46304 }; 46305 var mousePanSensitivity = -3; // Negative to invert pan direction 46306 var fakeGestureTouched; 46307 var fakeGestureMoved; 46308 var evCache = []; 46309 var gesture = { 46310 originX: 0, 46311 originY: 0, 46312 slideEl: undefined, 46313 slideWidth: undefined, 46314 slideHeight: undefined, 46315 imageEl: undefined, 46316 imageWrapEl: undefined, 46317 maxRatio: 3 46318 }; 46319 var image = { 46320 isTouched: undefined, 46321 isMoved: undefined, 46322 currentX: undefined, 46323 currentY: undefined, 46324 minX: undefined, 46325 minY: undefined, 46326 maxX: undefined, 46327 maxY: undefined, 46328 width: undefined, 46329 height: undefined, 46330 startX: undefined, 46331 startY: undefined, 46332 touchesStart: {}, 46333 touchesCurrent: {} 46334 }; 46335 var velocity = { 46336 x: undefined, 46337 y: undefined, 46338 prevPositionX: undefined, 46339 prevPositionY: undefined, 46340 prevTime: undefined 46341 }; 46342 var scale = 1; 46343 Object.defineProperty(swiper.zoom, 'scale', { 46344 get: function get() { 46345 return scale; 46346 }, 46347 set: function set(value) { 46348 if (scale !== value) { 46349 var imageEl = gesture.imageEl; 46350 var slideEl = gesture.slideEl; 46351 emit('zoomChange', value, imageEl, slideEl); 46352 } 46353 scale = value; 46354 } 46355 }); 46356 function getDistanceBetweenTouches() { 46357 if (evCache.length < 2) return 1; 46358 var x1 = evCache[0].pageX; 46359 var y1 = evCache[0].pageY; 46360 var x2 = evCache[1].pageX; 46361 var y2 = evCache[1].pageY; 46362 var distance = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); 46363 return distance; 46364 } 46365 function getMaxRatio() { 46366 var params = swiper.params.zoom; 46367 var maxRatio = gesture.imageWrapEl.getAttribute('data-swiper-zoom') || params.maxRatio; 46368 if (params.limitToOriginalSize && gesture.imageEl && gesture.imageEl.naturalWi
46368dth) { 46369 var imageMaxRatio = gesture.imageEl.naturalWidth / gesture.imageEl.offsetWidth; 46370 return Math.min(imageMaxRatio, maxRatio); 46371 } 46372 return maxRatio; 46373 } 46374 function getScaleOrigin() { 46375 if (evCache.length < 2) return { 46376 x: null, 46377 y: null 46378 }; 46379 var box = gesture.imageEl.getBoundingClientRect(); 46380 return [(evCache[0].pageX + (evCache[1].pageX - evCache[0].pageX) / 2 - box.x - window.scrollX) / currentScale, (evCache[0].pageY + (evCache[1].pageY - evCache[0].pageY) / 2 - box.y - window.scrollY) / currentScale]; 46381 } 46382 function getSlideSelector() { 46383 return swiper.isElement ? "swiper-slide" : ".".concat(swiper.params.slideClass); 46384 } 46385 function eventWithinSlide(e) { 46386 var slideSelector = getSlideSelector(); 46387 if (e.target.matches(slideSelector)) return true; 46388 if (swiper.slides.filter(function (slideEl) { 46389 return slideEl.contains(e.target); 46390 }).length > 0) return true; 46391 return false; 46392 } 46393 function eventWithinZoomContainer(e) { 46394 var selector = ".".concat(swiper.params.zoom.containerClass); 46395 if (e.target.matches(selector)) return true; 46396 if ((0, _toConsumableArray2["default"])(swiper.hostEl.querySelectorAll(selector)).filter(function (containerEl) { 46397 return containerEl.contains(e.target); 46398 }).length > 0) return true; 46399 return false; 46400 } 46401 46402 // Events 46403 function onGestureStart(e) { 46404 if (e.pointerType === 'mouse') { 46405 evCache.splice(0, evCache.length); 46406 } 46407 if (!eventWithinSlide(e)) return; 46408 var params = swiper.params.zoom; 46409 fakeGestureTouched = false; 46410 fakeGestureMoved = false; 46411 evCache.push(e); 46412 if (evCache.length < 2) { 46413 return; 46414 } 46415 fakeGestureTouched = true; 46416 gesture.scaleStart = getDistanceBetweenTouches(); 46417 if (!gesture.slideEl) { 46418 gesture.slideEl = e.target.closest(".".concat(swiper.params.slideClass, ", swiper-slide")); 46419 if (!gesture.slideEl) gesture.slideEl = swiper.slides[swiper.activeIndex]; 46420 var imageEl = gesture.slideEl.querySelector(".".concat(params.containerClass)); 46421 if (imageEl) { 46422 imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0]; 46423 } 46424 gesture.imageEl = imageEl; 46425 if (imageEl) { 46426 gesture.imageWrapEl = (0, _utils.d)(gesture.imageEl, ".".concat(params.containerClass))[0]; 46427 } else { 46428 gesture.imageWrapEl = undefined; 46429 } 46430 if (!gesture.imageWrapEl) { 46431 gesture.imageEl = undefined; 46432 return; 46433 } 46434 gesture.maxRatio = getMaxRatio(); 46435 } 46436 if (gesture.imageEl) { 46437 var _getScaleOrigin = getScaleOrigin(), 46438 _getScaleOrigin2 = (0, _slicedToArray2["default"])(_getScaleOrigin, 2), 46439 originX = _getScaleOrigin2[0], 46440 originY = _getScaleOrigin2[1]; 46441 gesture.originX = originX; 46442 gesture.originY = originY; 46443 gesture.imageEl.style.transitionDuration = '0ms'; 46444 } 46445 isScaling = true; 46446 } 46447 function onGestureChange(e) { 46448 if (!eventWithinSlide(e)) return; 46449 var params = swiper.params.zoom; 46450 var zoom = swiper.zoom; 46451 var pointerIndex = evCache.findIndex(function (cachedEv) { 46452 return cachedEv.pointerId === e.pointerId; 46453 }); 46454 if (pointerIndex >= 0) evCache[pointerIndex] = e; 46455 if (evCache.length < 2) { 46456 return; 46457 } 46458 fakeGestureMoved = true; 46459 gesture.scaleMove = getDistanceBetweenTouches(); 46460 if (!gesture.imageEl) { 46461 return; 46462 } 46463 zoom.scale = gesture.scaleMove / gesture.scaleStart * currentScale; 46464 if (zoom.scale > gesture.maxRatio) { 46465 zoom.scale = gesture.maxRatio - 1 + Math.pow(zoom.scale - gesture.maxRatio + 1, 0.5); 46466 } 46467 if (zoom.scale < params.minRatio) { 46468 zoom.scale = params.minRatio + 1 - Math.pow(params.minRatio - zoom.scale + 1, 0.5); 46469 } 46470 gesture.imageEl.style.transform = "translate3d(0,0,0) scale(".concat(zoom.scale, ")"); 46471 } 46472 function onGestureEnd(e) { 46473 if (!eventWithinSlide(e)) return; 46474 if (e.pointerType === 'mouse' && e.type === 'pointerout') return; 46475 var params = swiper.params.zoom; 46476 var zoom = swiper.zoom; 46477 var pointerIndex = evCache.findIndex(function (cachedEv) { 46478 return cachedEv.pointerId === e.pointerId; 46479 }); 46480 if (pointerIndex >= 0) evCache.splice(pointerIndex, 1); 46481 if (!fakeGestureTouched || !fakeGestureMoved) { 46482 return; 46483 } 46484 fakeGestureTouched = false;
46485 fakeGestureMoved = false; 46486 if (!gesture.imageEl) return; 46487 zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio); 46488 gesture.imageEl.style.transitionDuration = "".concat(swiper.params.speed, "ms"); 46489 gesture.imageEl.style.transform = "translate3d(0,0,0) scale(".concat(zoom.scale, ")"); 46490 currentScale = zoom.scale; 46491 isScaling = false; 46492 if (zoom.scale > 1 && gesture.slideEl) { 46493 gesture.slideEl.classList.add("".concat(params.zoomedSlideClass)); 46494 } else if (zoom.scale <= 1 && gesture.slideEl) { 46495 gesture.slideEl.classList.remove("".concat(params.zoomedSlideClass)); 46496 } 46497 if (zoom.scale === 1) { 46498 gesture.originX = 0; 46499 gesture.originY = 0; 46500 gesture.slideEl = undefined; 46501 } 46502 } 46503 var allowTouchMoveTimeout; 46504 function allowTouchMove() { 46505 swiper.touchEventsData.preventTouchMoveFromPointerMove = false; 46506 } 46507 function preventTouchMove() { 46508 clearTimeout(allowTouchMoveTimeout); 46509 swiper.touchEventsData.preventTouchMoveFromPointerMove = true; 46510 allowTouchMoveTimeout = setTimeout(function () { 46511 if (swiper.destroyed) return; 46512 allowTouchMove(); 46513 }); 46514 } 46515 function onTouchStart(e) { 46516 var device = swiper.device; 46517 if (!gesture.imageEl) return; 46518 if (image.isTouched) return; 46519 if (device.android && e.cancelable) e.preventDefault(); 46520 image.isTouched = true; 46521 var event = evCache.length > 0 ? evCache[0] : e; 46522 image.touchesStart.x = event.pageX; 46523 image.touchesStart.y = event.pageY; 46524 } 46525 function onTouchMove(e) { 46526 var isMouseEvent = e.pointerType === 'mouse'; 46527 var isMousePan = isMouseEvent && swiper.params.zoom.panOnMouseMove; 46528 if (!eventWithinSlide(e) || !eventWithinZoomContainer(e)) { 46529 return; 46530 } 46531 var zoom = swiper.zoom; 46532 if (!gesture.imageEl) { 46533 return; 46534 } 46535 if (!image.isTouched || !gesture.slideEl) { 46536 if (isMousePan) onMouseMove(e); 46537 return; 46538 } 46539 if (isMousePan) { 46540 onMouseMove(e); 46541 return; 46542 } 46543 if (!image.isMoved) { 46544 image.width = gesture.imageEl.offsetWidth || gesture.imageEl.clientWidth; 46545 image.height = gesture.imageEl.offsetHeight || gesture.imageEl.clientHeight; 46546 image.startX = (0, _utils.l)(gesture.imageWrapEl, 'x') || 0; 46547 image.startY = (0, _utils.l)(gesture.imageWrapEl, 'y') || 0; 46548 gesture.slideWidth = gesture.slideEl.offsetWidth; 46549 gesture.slideHeight = gesture.slideEl.offsetHeight; 46550 gesture.imageWrapEl.style.transitionDuration = '0ms'; 46551 } 46552 // Define if we need image drag 46553 var scaledWidth = image.width * zoom.scale; 46554 var scaledHeight = image.height * zoom.scale; 46555 image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0); 46556 image.maxX = -image.minX; 46557 image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0); 46558 image.maxY = -image.minY; 46559 image.touchesCurrent.x = evCache.length > 0 ? evCache[0].pageX : e.pageX; 46560 image.touchesCurrent.y = evCache.length > 0 ? evCache[0].pageY : e.pageY; 46561 var touchesDiff = Math.max(Math.abs(image.touchesCurrent.x - image.touchesStart.x), Math.abs(image.touchesCurrent.y - image.touchesStart.y)); 46562 if (touchesDiff > 5) { 46563 swiper.allowClick = false; 46564 } 46565 if (!image.isMoved && !isScaling) { 46566 if (swiper.isHorizontal() && (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x || Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)) { 46567 image.isTouched = false; 46568 allowTouchMove(); 46569 return; 46570 } 46571 if (!swiper.isHorizontal() && (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y || Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)) { 46572 image.isTouched = false; 46573 allowTouchMove(); 46574 return; 46575 } 46576 } 46577 if (e.cancelable) { 46578 e.preventDefault(); 46579 } 46580 e.stopPropagation(); 46581 preventTouchMove(); 46582 image.isMoved = true; 46583 var scaleRatio = (zoom.scale - currentScale) / (gesture.maxRatio - swiper.params.zoom.minRatio); 46584 var originX = gesture.originX, 46585 originY = gesture.originY; 46586 image.currentX = image.touchesCurrent.x - image.touchesStart.x + image.startX + scaleRatio * (image.
46586width - originX * 2); 46587 image.currentY = image.touchesCurrent.y - image.touchesStart.y + image.startY + scaleRatio * (image.height - originY * 2); 46588 if (image.currentX < image.minX) { 46589 image.currentX = image.minX + 1 - Math.pow(image.minX - image.currentX + 1, 0.8); 46590 } 46591 if (image.currentX > image.maxX) { 46592 image.currentX = image.maxX - 1 + Math.pow(image.currentX - image.maxX + 1, 0.8); 46593 } 46594 if (image.currentY < image.minY) { 46595 image.currentY = image.minY + 1 - Math.pow(image.minY - image.currentY + 1, 0.8); 46596 } 46597 if (image.currentY > image.maxY) { 46598 image.currentY = image.maxY - 1 + Math.pow(image.currentY - image.maxY + 1, 0.8); 46599 } 46600 46601 // Velocity 46602 if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x; 46603 if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y; 46604 if (!velocity.prevTime) velocity.prevTime = Date.now(); 46605 velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2; 46606 velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2; 46607 if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0; 46608 if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0; 46609 velocity.prevPositionX = image.touchesCurrent.x; 46610 velocity.prevPositionY = image.touchesCurrent.y; 46611 velocity.prevTime = Date.now(); 46612 gesture.imageWrapEl.style.transform = "translate3d(".concat(image.currentX, "px, ").concat(image.currentY, "px,0)"); 46613 } 46614 function onTouchEnd() { 46615 var zoom = swiper.zoom; 46616 evCache.length = 0; 46617 if (!gesture.imageEl) return; 46618 if (!image.isTouched || !image.isMoved) { 46619 image.isTouched = false; 46620 image.isMoved = false; 46621 return; 46622 } 46623 image.isTouched = false; 46624 image.isMoved = false; 46625 var momentumDurationX = 300; 46626 var momentumDurationY = 300; 46627 var momentumDistanceX = velocity.x * momentumDurationX; 46628 var newPositionX = image.currentX + momentumDistanceX; 46629 var momentumDistanceY = velocity.y * momentumDurationY; 46630 var newPositionY = image.currentY + momentumDistanceY; 46631 46632 // Fix duration 46633 if (velocity.x !== 0) momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x); 46634 if (velocity.y !== 0) momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y); 46635 var momentumDuration = Math.max(momentumDurationX, momentumDurationY); 46636 image.currentX = newPositionX; 46637 image.currentY = newPositionY; 46638 // Define if we need image drag 46639 var scaledWidth = image.width * zoom.scale; 46640 var scaledHeight = image.height * zoom.scale; 46641 image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0); 46642 image.maxX = -image.minX; 46643 image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0); 46644 image.maxY = -image.minY; 46645 image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX); 46646 image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY); 46647 gesture.imageWrapEl.style.transitionDuration = "".concat(momentumDuration, "ms"); 46648 gesture.imageWrapEl.style.transform = "translate3d(".concat(image.currentX, "px, ").concat(image.currentY, "px,0)"); 46649 } 46650 function onTransitionEnd() { 46651 var zoom = swiper.zoom; 46652 if (gesture.slideEl && swiper.activeIndex !== swiper.slides.indexOf(gesture.slideEl)) { 46653 if (gesture.imageEl) { 46654 gesture.imageEl.style.transform = 'translate3d(0,0,0) scale(1)'; 46655 } 46656 if (gesture.imageWrapEl) { 46657 gesture.imageWrapEl.style.transform = 'translate3d(0,0,0)'; 46658 } 46659 gesture.slideEl.classList.remove("".concat(swiper.params.zoom.zoomedSlideClass)); 46660 zoom.scale = 1; 46661 currentScale = 1; 46662 gesture.slideEl = undefined; 46663 gesture.imageEl = undefined; 46664 gesture.imageWrapEl = undefined; 46665 gesture.originX = 0; 46666 gesture.originY = 0; 46667 } 46668 } 46669 function onMouseMove(e) { 46670 // Only pan if zoomed in and mouse panning is enabled 46671 if (currentScale <= 1 || !gesture.imageWrapEl) return; 46672 if (!eventWithinSlide(e) || !eventWithinZoomContainer(e)) return; 46673 var currentTransform = window.getComputedStyle(gesture.imageWrapEl).transform; 46674 var matrix = new window.DOMMatrix(currentTransform); 46675 if (!isPanningWithMouse) { 46676 isPanningWithMouse = true; 46677 mousePanStart.x = e.clientX; 46678 mousePanStart.y = e.clientY; 46679 image.startX = matrix.e; 46680 image.startY = matrix.f; 46681 image.width = gesture.imageEl.offsetWidth || gesture.imageEl.clientWidth; 46682 image.height = gesture.imageEl.offsetHeight || gesture.imageEl.clientHeight; 46683 gesture.slideWidth = gesture.slideEl.offsetWidth; 46684 gesture.slideHeight = gesture.slideEl.offsetHeight; 46685 return; 46686 } 46687 var deltaX = (e.clientX - mousePanStart.x) * mousePanSensitivity; 46688 var deltaY = (e.clientY - mousePanStart.y) * mousePanSensitivity; 46689 var scaledWidth = image.width * currentScale; 46690 var scaledHeight = image.height * currentScale; 46691 var slideWidth = gesture.slideWidth; 46692 var slideHeight = gesture.slideHeight; 46693 var minX = Math.min(slideWidth / 2 - scaledWidth / 2, 0); 46694 var maxX = -minX; 46695 var minY = Math.min(slideHeight / 2 - scaledHeight / 2, 0); 46696 var maxY = -minY; 46697 var newX = Math.max(Math.min(image.startX + deltaX, maxX), minX); 46698 var newY = Math.max(Math.min(image.startY + deltaY, maxY), minY); 46699 gesture.imageWrapEl.style.transitionDuration = '0ms'; 46700 gesture.imageWrapEl.style.transform = "translate3d(".concat(newX, "px, ").concat(newY, "px, 0)"); 46701 mousePanStart.x = e.clientX; 46702 mousePanStart.y = e.clientY; 46703 image.startX = newX; 46704 image.startY = newY; 46705 image.currentX = newX; 46706 image.currentY = newY; 46707 } 46708 function zoomIn(e) { 46709 var zoom = swiper.zoom; 46710 var params = swiper.params.zoom; 46711 if (!gesture.slideEl) { 46712 if (e && e.target) { 46713 gesture.slideEl = e.target.closest(".".concat(swiper.params.slideClass, ", swiper-slide")); 46714 } 46715 if (!gesture.slideEl) { 46716 if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) { 46717 gesture.slideEl = (0, _utils.e)(swiper.slidesEl, ".".concat(swiper.params.slideActiveClass))[0]; 46718 } else { 46719 gesture.slideEl = swiper.slides[swiper.activeIndex]; 46720 } 46721 } 46722 var imageEl = gesture.slideEl.querySelector(".".concat(params.containerClass)); 46723 if (imageEl) { 46724 imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0]; 46725 } 46726 gesture.imageEl = imageEl; 46727 if (imageEl) { 46728 gesture.imageWrapEl = (0, _utils.d)(gesture.imageEl, ".".concat(params.containerClass))[0]; 46729 } else { 46730 gesture.imageWrapEl = undefined; 46731 } 46732 } 46733 if (!gesture.imageEl || !gesture.imageWrapEl) return; 46734 gesture.maxRatio = getMaxRatio(); 46735 if (swiper.params.cssMode) { 46736 swiper.wrapperEl.style.overflow = 'hidden';
46737 swiper.wrapperEl.style.touchAction = 'none'; 46738 } 46739 gesture.slideEl.classList.add("".concat(params.zoomedSlideClass)); 46740 var touchX; 46741 var touchY; 46742 var offsetX; 46743 var offsetY; 46744 var diffX; 46745 var diffY; 46746 var translateX; 46747 var translateY; 46748 var imageWidth; 46749 var imageHeight; 46750 var scaledWidth; 46751 var scaledHeight; 46752 var translateMinX; 46753 var translateMinY; 46754 var translateMaxX; 46755 var translateMaxY; 46756 var slideWidth; 46757 var slideHeight; 46758 if (typeof image.touchesStart.x === 'undefined' && e) { 46759 touchX = e.pageX; 46760 touchY = e.pageY; 46761 } else { 46762 touchX = image.touchesStart.x; 46763 touchY = image.touchesStart.y; 46764 } 46765 var prevScale = currentScale; 46766 var forceZoomRatio = typeof e === 'number' ? e : null; 46767 if (currentScale === 1 && forceZoomRatio) { 46768 touchX = undefined; 46769 touchY = undefined; 46770 image.touchesStart.x = undefined; 46771 image.touchesStart.y = undefined; 46772 } 46773 var maxRatio = getMaxRatio(); 46774 zoom.scale = forceZoomRatio || maxRatio; 46775 currentScale = forceZoomRatio || maxRatio; 46776 if (e && !(currentScale === 1 && forceZoomRatio)) { 46777 slideWidth = gesture.slideEl.offsetWidth; 46778 slideHeight = gesture.slideEl.offsetHeight; 46779 offsetX = (0, _utils.f)(gesture.slideEl).left + window.scrollX; 46780 offsetY = (0, _utils.f)(gesture.slideEl).top + window.scrollY; 46781 diffX = offsetX + slideWidth / 2 - touchX; 46782 diffY = offsetY + slideHeight / 2 - touchY; 46783 imageWidth = gesture.imageEl.offsetWidth || gesture.imageEl.clientWidth; 46784 imageHeight = gesture.imageEl.offsetHeight || gesture.imageEl.clientHeight; 46785 scaledWidth = imageWidth * zoom.scale; 46786 scaledHeight = imageHeight * zoom.scale; 46787 translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0); 46788 translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0); 46789 translateMaxX = -translateMinX; 46790 translateMaxY = -translateMinY; 46791 if (prevScale > 0 && forceZoomRatio && typeof image.currentX === 'number' && typeof image.currentY === 'number') { 46792 translateX = image.currentX * zoom.scale / prevScale; 46793 translateY = image.currentY * zoom.scale / prevScale; 46794 } else { 46795 translateX = diffX * zoom.scale; 46796 translateY = diffY * zoom.scale; 46797 } 46798 if (translateX < translateMinX) { 46799 translateX = translateMinX; 46800 } 46801 if (translateX > translateMaxX) { 46802 translateX = translateMaxX; 46803 } 46804 if (translateY < translateMinY) { 46805 translateY = translateMinY; 46806 } 46807 if (translateY > translateMaxY) { 46808 translateY = translateMaxY; 46809 } 46810 } else { 46811 translateX = 0; 46812 translateY = 0; 46813 } 46814 if (forceZoomRatio && zoom.scale === 1) { 46815 gesture.originX = 0; 46816 gesture.originY = 0; 46817 } 46818 image.currentX = translateX; 46819 image.currentY = translateY; 46820 gesture.imageWrapEl.style.transitionDuration = '300ms'; 46821 gesture.imageWrapEl.style.transform = "translate3d(".concat(translateX, "px, ").concat(translateY, "px,0)"); 46822 gesture.imageEl.style.transitionDuration = '300ms'; 46823 gesture.imageEl.style.transform = "translate3d(0,0,0) scale(".concat(zoom.scale, ")"); 46824 } 46825 function zoomOut() { 46826 var zoom = swiper.zoom; 46827 var params = swiper.params.zoom; 46828 if (!gesture.slideEl) { 46829 if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) { 46830 gesture.slideEl = (0, _utils.e)(swiper.slidesEl, ".".concat(swiper.params.slideActiveClass))[0]; 46831 } else { 46832 gesture.slideEl = swiper.slides[swiper.activeIndex]; 46833 } 46834 var imageEl = gesture.slideEl.querySelector(".".concat(params.containerClass)); 46835 if (imageEl) { 46836 imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0]; 46837 } 46838 gesture.imageEl = imageEl; 46839 if (imageEl) { 46840 gesture.imageWrapEl = (0, _utils.d)(gesture.imageEl, ".".concat(params.containerClass))[0]; 46841 } else { 46842 gesture.imageWrapEl = undefined; 46843 } 46844 } 46845 if (!gesture.imageEl || !gesture.imageWrapEl) return; 46846 gesture.maxRatio = getMaxRatio(); 46847 if (swiper.params.cssMode) { 46848 swiper.wrapperEl.style.overflow = ''; 46849 swiper.wrapperEl.style.touchAction = ''; 46850 } 46851 zoom.scale = 1; 46852 currentScale = 1; 46853 image.currentX = undefined; 46854 image.currentY = undefined; 46855 image.touchesStart.x = undefined; 46856 image.touchesStart.y = undefined; 46857 gesture.imageWrapEl.style.transitionDuration = '300ms';
46858 gesture.imageWrapEl.style.transform = 'translate3d(0,0,0)'; 46859 gesture.imageEl.style.transitionDuration = '300ms'; 46860 gesture.imageEl.style.transform = 'translate3d(0,0,0) scale(1)'; 46861 gesture.slideEl.classList.remove("".concat(params.zoomedSlideClass)); 46862 gesture.slideEl = undefined; 46863 gesture.originX = 0; 46864 gesture.originY = 0; 46865 if (swiper.params.zoom.panOnMouseMove) { 46866 mousePanStart = { 46867 x: 0, 46868 y: 0 46869 }; 46870 if (isPanningWithMouse) { 46871 isPanningWithMouse = false; 46872 image.startX = 0; 46873 image.startY = 0; 46874 } 46875 } 46876 } 46877 46878 // Toggle Zoom 46879 function zoomToggle(e) { 46880 var zoom = swiper.zoom; 46881 if (zoom.scale && zoom.scale !== 1) { 46882 // Zoom Out 46883 zoomOut(); 46884 } else { 46885 // Zoom In 46886 zoomIn(e); 46887 } 46888 } 46889 function getListeners() { 46890 var passiveListener = swiper.params.passiveListeners ? { 46891 passive: true, 46892 capture: false 46893 } : false; 46894 var activeListenerWithCapture = swiper.params.passiveListeners ? { 46895 passive: false, 46896 capture: true 46897 } : true; 46898 return { 46899 passiveListener: passiveListener, 46900 activeListenerWithCapture: activeListenerWithCapture 46901 }; 46902 } 46903 46904 // Attach/Detach Events 46905 function enable() { 46906 var zoom = swiper.zoom; 46907 if (zoom.enabled) return; 46908 zoom.enabled = true; 46909 var _getListeners = getListeners(), 46910 passiveListener = _getListeners.passiveListener, 46911 activeListenerWithCapture = _getListeners.activeListenerWithCapture; 46912 46913 // Scale image 46914 swiper.wrapperEl.addEventListener('pointerdown', onGestureStart, passiveListener); 46915 swiper.wrapperEl.addEventListener('pointermove', onGestureChange, activeListenerWithCapture); 46916 ['pointerup', 'pointercancel', 'pointerout'].forEach(function (eventName) { 46917 swiper.wrapperEl.addEventListener(eventName, onGestureEnd, passiveListener); 46918 }); 46919 46920 // Move image 46921 swiper.wrapperEl.addEventListener('pointermove', onTouchMove, activeListenerWithCapture); 46922 } 46923 function disable() { 46924 var zoom = swiper.zoom; 46925 if (!zoom.enabled) return; 46926 zoom.enabled = false; 46927 var _getListeners2 = getListeners(), 46928 passiveListener = _getListeners2.passiveListener, 46929 activeListenerWithCapture = _getListeners2.activeListenerWithCapture; 46930 46931 // Scale image 46932 swiper.wrapperEl.removeEventListener('pointerdown', onGestureStart, passiveListener); 46933 swiper.wrapperEl.removeEventListener('pointermove', onGestureChange, activeListenerWithCapture); 46934 ['pointerup', 'pointercancel', 'pointerout'].forEach(function (eventName) { 46935 swiper.wrapperEl.removeEventListener(eventName, onGestureEnd, passiveListener); 46936 }); 46937 46938 // Move image 46939 swiper.wrapperEl.removeEventListener('pointermove', onTouchMove, activeListenerWithCapture); 46940 } 46941 on('init', function () { 46942 if (swiper.params.zoom.enabled) { 46943 enable(); 46944 } 46945 }); 46946 on('destroy', function () { 46947 disable(); 46948 }); 46949 on('touchStart', function (_s, e) { 46950 if (!swiper.zoom.enabled) return; 46951 onTouchStart(e); 46952 }); 46953 on('touchEnd', function (_s, e) { 46954 if (!swiper.zoom.enabled) return; 46955 onTouchEnd(); 46956 }); 46957 on('doubleTap', function (_s, e) { 46958 if (!swiper.animating && swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) { 46959 zoomToggle(e); 46960 } 46961 }); 46962 on('transitionEnd', function () { 46963 if (swiper.zoom.enabled && swiper.params.zoom.enabled) { 46964 onTransitionEnd(); 46965 } 46966 }); 46967 on('slideChange', function () { 46968 if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) { 46969 onTransitionEnd(); 46970 } 46971 }); 46972 Object.assign(swiper.zoom, { 46973 enable: enable, 46974 disable: disable, 46975 "in": zoomIn, 46976 out: zoomOut, 46977 toggle: zoomToggle 46978 }); 46979} 46980 46981},{"../shared/ssr-window.esm.mjs":139,"../shared/utils.mjs":141,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/slicedToArray":104,"@babel/runtime/helpers/toConsumableArray":105}],133:[function(require,module,exports){ 46982"use strict"; 46983 46984Object.defineProperty(exports, "__esModule", { 46985 value: true 46986}); 46987exports.c = classesToSelector; 46988function classesToSelector() { 46989 var classes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; 46990 // Escape all CSS selector special characters 46991 return ".".concat(classes.trim().replace(/([\.:!+\/()[\]#>~*^$|=,'"@{}\\])/g, '\\$1') // eslint-disable-line 46992 .replace(/ /g, '.')); 46993} 46994 46995},{}],134:[function(require,module,exports){ 46996"use strict"; 46997 46998Object.defineProperty(exports, "__esModule", { 46999 value: true 47000}); 47001exports.c = createElementIfNotDefined; 47002var _utils = require("./utils.mjs"); 47003function createElementIfNotDefined(swiper, originalParams, params, checkProps) { 47004 if (swiper.params.createElements) {
47005 Object.keys(checkProps).forEach(function (key) { 47006 if (!params[key] && params.auto === true) { 47007 var element = (0, _utils.e)(swiper.el, ".".concat(checkProps[key]))[0]; 47008 if (!element) { 47009 element = (0, _utils.c)('div', checkProps[key]); 47010 element.className = checkProps[key]; 47011 swiper.el.append(element); 47012 } 47013 params[key] = element; 47014 originalParams[key] = element; 47015 } 47016 }); 47017 } 47018 return params; 47019} 47020 47021},{"./utils.mjs":141}],135:[function(require,module,exports){ 47022"use strict"; 47023 47024Object.defineProperty(exports, "__esModule", { 47025 value: true 47026}); 47027exports.c = createShadow; 47028var _utils = require("./utils.mjs"); 47029function createShadow(suffix, slideEl, side) { 47030 var shadowClass = "swiper-slide-shadow".concat(side ? "-".concat(side) : '').concat(suffix ? " swiper-slide-shadow-".concat(suffix) : ''); 47031 var shadowContainer = (0, _utils.g)(slideEl); 47032 var shadowEl = shadowContainer.querySelector(".".concat(shadowClass.split(' ').join('.'))); 47033 if (!shadowEl) { 47034 shadowEl = (0, _utils.c)('div', shadowClass.split(' ')); 47035 shadowContainer.append(shadowEl); 47036 } 47037 return shadowEl; 47038} 47039 47040},{"./utils.mjs":141}],136:[function(require,module,exports){ 47041"use strict"; 47042 47043Object.defineProperty(exports, "__esModule", { 47044 value: true 47045}); 47046exports.e = effectInit; 47047function effectInit(params) { 47048 var effect = params.effect, 47049 swiper = params.swiper, 47050 on = params.on, 47051 setTranslate = params.setTranslate, 47052 setTransition = params.setTransition, 47053 overwriteParams = params.overwriteParams, 47054 perspective = params.perspective, 47055 recreateShadows = params.recreateShadows, 47056 getEffectParams = params.getEffectParams; 47057 on('beforeInit', function () { 47058 if (swiper.params.effect !== effect) return; 47059 swiper.classNames.push("".concat(swiper.params.containerModifierClass).concat(effect)); 47060 if (perspective && perspective()) { 47061 swiper.classNames.push("".concat(swiper.params.containerModifierClass, "3d")); 47062 } 47063 var overwriteParamsResult = overwriteParams ? overwriteParams() : {}; 47064 Object.assign(swiper.params, overwriteParamsResult); 47065 Object.assign(swiper.originalParams, overwriteParamsResult); 47066 }); 47067 on('setTranslate _virtualUpdated', function () { 47068 if (swiper.params.effect !== effect) return; 47069 setTranslate(); 47070 }); 47071 on('setTransition', function (_s, duration) { 47072 if (swiper.params.effect !== effect) return; 47073 setTransition(duration); 47074 }); 47075 on('transitionEnd', function () { 47076 if (swiper.params.effect !== effect) return; 47077 if (recreateShadows) { 47078 if (!getEffectParams || !getEffectParams().slideShadows) return; 47079 // remove shadows 47080 swiper.slides.forEach(function (slideEl) { 47081 slideEl.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(function (shadowEl) { 47082 return shadowEl.remove(); 47083 }); 47084 }); 47085 // create new one 47086 recreateShadows(); 47087 } 47088 }); 47089 var requireUpdateOnVirtual; 47090 on('virtualUpdate', function () { 47091 if (swiper.params.effect !== effect) return; 47092 if (!swiper.slides.length) { 47093 requireUpdateOnVirtual = true; 47094 } 47095 requestAnimationFrame(function () { 47096 if (requireUpdateOnVirtual && swiper.slides && swiper.slides.length) { 47097 setTranslate(); 47098 requireUpdateOnVirtual = false; 47099 } 47100 }); 47101 }); 47102} 47103 47104},{}],137:[function(require,module,exports){ 47105"use strict"; 47106 47107Object.defineProperty(exports, "__esModule", { 47108 value: true 47109}); 47110exports.e = effectTarget; 47111var _utils = require("./utils.mjs"); 47112function effectTarget(effectParams, slideEl) { 47113 var transformEl = (0, _utils.g)(slideEl); 47114 if (transformEl !== slideEl) { 47115 transformEl.style.backfaceVisibility = 'hidden'; 47116 transformEl.style['-webkit-backface-visibility'] = 'hidden'; 47117 } 47118 return transformEl; 47119} 47120 47121},{"./utils.mjs":141}],138:[function(require,module,exports){ 47122"use strict"; 47123 47124Object.defineProperty(exports, "__esModule", { 47125 value: true 47126}); 47127exports.e = effectVirtualTransitionEnd; 47128var _utils = require("./utils.mjs"); 47129function effectVirtualTransitionEnd(_ref) { 47130 var swiper = _ref.swiper, 47131 duration = _ref.duration, 47132 transformElements = _ref.transformElements, 47133 allSlides = _ref.allSlides; 47134 var activeIndex = swiper.activeIndex; 47135 var getSlide = function getSlide(el) { 47136 if (!el.parentElement) { 47137 // assume shadow root 47138 var slide = swiper.slides.find(function (slideEl) { 47139 return slideEl.shadowRoot && slideEl.shadowRoot === el.parentNode; 47140 }); 47141 return slide; 47142 } 47143 return el.parentElement; 47144 }; 47145 if (swiper.params.virtualTranslate && duration !== 0) { 47146 var eventTriggered = false;
47147 var transitionEndTarget; 47148 if (allSlides) { 47149 transitionEndTarget = transformElements; 47150 } else { 47151 transitionEndTarget = transformElements.filter(function (transformEl) { 47152 var el = transformEl.classList.contains('swiper-slide-transform') ? getSlide(transformEl) : transformEl; 47153 return swiper.getSlideIndex(el) === activeIndex; 47154 }); 47155 } 47156 transitionEndTarget.forEach(function (el) { 47157 (0, _utils.o)(el, function () { 47158 if (eventTriggered) return; 47159 if (!swiper || swiper.destroyed) return; 47160 eventTriggered = true; 47161 swiper.animating = false; 47162 var evt = new window.CustomEvent('transitionend', { 47163 bubbles: true, 47164 cancelable: true 47165 }); 47166 swiper.wrapperEl.dispatchEvent(evt); 47167 }); 47168 }); 47169 } 47170} 47171 47172},{"./utils.mjs":141}],139:[function(require,module,exports){ 47173"use strict"; 47174 47175var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 47176Object.defineProperty(exports, "__esModule", { 47177 value: true 47178}); 47179exports.a = getWindow; 47180exports.g = getDocument; 47181var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); 47182/** 47183 * SSR Window 5.0.1 47184 * Better handling for window object in SSR environment 47185 * https://github.com/nolimits4web/ssr-window 47186 * 47187 * Copyright 2025, Vladimir Kharlampidi 47188 * 47189 * Licensed under MIT 47190 * 47191 * Released on: June 27, 2025 47192 */ 47193/* eslint-disable no-param-reassign */ 47194function isObject(obj) { 47195 return obj !== null && (0, _typeof2["default"])(obj) === 'object' && 'constructor' in obj && obj.constructor === Object; 47196} 47197function extend() { 47198 var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 47199 var src = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 47200 var noExtend = ['__proto__', 'constructor', 'prototype']; 47201 Object.keys(src).filter(function (key) { 47202 return noExtend.indexOf(key) < 0; 47203 }).forEach(function (key) { 47204 if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) { 47205 extend(target[key], src[key]); 47206 } 47207 }); 47208} 47209var ssrDocument = { 47210 body: {}, 47211 addEventListener: function addEventListener() {}, 47212 removeEventListener: function removeEventListener() {}, 47213 activeElement: { 47214 blur: function blur() {}, 47215 nodeName: '' 47216 }, 47217 querySelector: function querySelector() { 47218 return null; 47219 }, 47220 querySelectorAll: function querySelectorAll() { 47221 return []; 47222 }, 47223 getElementById: function getElementById() { 47224 return null; 47225 }, 47226 createEvent: function createEvent() { 47227 return { 47228 initEvent: function initEvent() {} 47229 }; 47230 }, 47231 createElement: function createElement() { 47232 return { 47233 children: [], 47234 childNodes: [], 47235 style: {}, 47236 setAttribute: function setAttribute() {}, 47237 getElementsByTagName: function getElementsByTagName() { 47238 return []; 47239 } 47240 }; 47241 }, 47242 createElementNS: function createElementNS() { 47243 return {}; 47244 }, 47245 importNode: function importNode() { 47246 return null; 47247 }, 47248 location: { 47249 hash: '', 47250 host: '', 47251 hostname: '', 47252 href: '', 47253 origin: '', 47254 pathname: '', 47255 protocol: '', 47256 search: '' 47257 } 47258}; 47259function getDocument() { 47260 var doc = typeof document !== 'undefined' ? document : {}; 47261 extend(doc, ssrDocument); 47262 return doc; 47263} 47264var ssrWindow = { 47265 document: ssrDocument, 47266 navigator: { 47267 userAgent: '' 47268 }, 47269 location: { 47270 hash: '', 47271 host: '', 47272 hostname: '', 47273 href: '', 47274 origin: '', 47275 pathname: '', 47276 protocol: '', 47277 search: '' 47278 }, 47279 history: { 47280 replaceState: function replaceState() {}, 47281 pushState: function pushState() {}, 47282 go: function go() {}, 47283 back: function back() {} 47284 }, 47285 CustomEvent: function CustomEvent() { 47286 return this; 47287 }, 47288 addEventListener: function addEventListener() {}, 47289 removeEventListener: function removeEventListener() {}, 47290 getComputedStyle: function getComputedStyle() { 47291 return { 47292 getPropertyValue: function getPropertyValue() { 47293 return ''; 47294 } 47295 }; 47296 }, 47297 Image: function Image() {}, 47298 Date: function Date() {}, 47299 screen: {}, 47300 setTimeout: function setTimeout() {},
47301 clearTimeout: function clearTimeout() {}, 47302 matchMedia: function matchMedia() { 47303 return {}; 47304 }, 47305 requestAnimationFrame: function requestAnimationFrame(callback) { 47306 if (typeof setTimeout === 'undefined') { 47307 callback(); 47308 return null; 47309 } 47310 return setTimeout(callback, 0); 47311 }, 47312 cancelAnimationFrame: function cancelAnimationFrame(id) { 47313 if (typeof setTimeout === 'undefined') { 47314 return; 47315 } 47316 clearTimeout(id); 47317 } 47318}; 47319function getWindow() { 47320 var win = typeof window !== 'undefined' ? window : {}; 47321 extend(win, ssrWindow); 47322 return win; 47323} 47324 47325},{"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/typeof":108}],140:[function(require,module,exports){ 47326"use strict"; 47327 47328var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 47329Object.defineProperty(exports, "__esModule", { 47330 value: true 47331}); 47332exports.d = exports.S = void 0; 47333var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); 47334var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); 47335var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); 47336var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); 47337var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); 47338var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); 47339var _ssrWindowEsm = require("./ssr-window.esm.mjs"); 47340var _utils = require("./utils.mjs"); 47341function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } 47342function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } 47343var support; 47344function calcSupport() { 47345 var window = (0, _ssrWindowEsm.a)(); 47346 var document = (0, _ssrWindowEsm.g)(); 47347 return { 47348 smoothScroll: document.documentElement && document.documentElement.style && 'scrollBehavior' in document.documentElement.style, 47349 touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch) 47350 }; 47351} 47352function getSupport() { 47353 if (!support) { 47354 support = calcSupport(); 47355 } 47356 return support; 47357} 47358var deviceCached; 47359function calcDevice() { 47360 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, 47361 userAgent = _ref.userAgent;
47362 var support = getSupport(); 47363 var window = (0, _ssrWindowEsm.a)(); 47364 var platform = window.navigator.platform; 47365 var ua = userAgent || window.navigator.userAgent; 47366 var device = { 47367 ios: false, 47368 android: false 47369 }; 47370 var screenWidth = window.screen.width; 47371 var screenHeight = window.screen.height; 47372 var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line 47373 var ipad = ua.match(/(iPad)(?!\1).*OS\s([\d_]+)/); 47374 var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); 47375 var iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/); 47376 var windows = platform === 'Win32'; 47377 var macos = platform === 'MacIntel'; 47378 47379 // iPadOs 13 fix 47380 var iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810']; 47381 if (!ipad && macos && support.touch && iPadScreens.indexOf("".concat(screenWidth, "x").concat(screenHeight)) >= 0) { 47382 ipad = ua.match(/(Version)\/([\d.]+)/); 47383 if (!ipad) ipad = [0, 1, '13_0_0']; 47384 macos = false; 47385 } 47386 47387 // Android 47388 if (android && !windows) { 47389 device.os = 'android'; 47390 device.android = true; 47391 } 47392 if (ipad || iphone || ipod) { 47393 device.os = 'ios'; 47394 device.ios = true; 47395 } 47396 47397 // Export object 47398 return device; 47399} 47400function getDevice() { 47401 var overrides = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 47402 if (!deviceCached) { 47403 deviceCached = calcDevice(overrides); 47404 } 47405 return deviceCached; 47406} 47407var browser; 47408function calcBrowser() { 47409 var window = (0, _ssrWindowEsm.a)(); 47410 var device = getDevice(); 47411 var needPerspectiveFix = false; 47412 function isSafari() { 47413 var ua = window.navigator.userAgent.toLowerCase(); 47414 return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0; 47415 } 47416 if (isSafari()) { 47417 var ua = String(window.navigator.userAgent); 47418 if (ua.includes('Version/')) { 47419 var _ua$split$1$split$0$s = ua.split('Version/')[1].split(' ')[0].split('.').map(function (num) { 47420 return Number(num); 47421 }), 47422 _ua$split$1$split$0$s2 = (0, _slicedToArray2["default"])(_ua$split$1$split$0$s, 2), 47423 major = _ua$split$1$split$0$s2[0], 47424 minor = _ua$split$1$split$0$s2[1]; 47425 needPerspectiveFix = major < 16 || major === 16 && minor < 2; 47426 } 47427 } 47428 var isWebView = /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent); 47429 var isSafariBrowser = isSafari(); 47430 var need3dFix = isSafariBrowser || isWebView && device.ios; 47431 return { 47432 isSafari: needPerspectiveFix || isSafariBrowser, 47433 needPerspectiveFix: needPerspectiveFix, 47434 need3dFix: need3dFix, 47435 isWebView: isWebView 47436 }; 47437} 47438function getBrowser() { 47439 if (!browser) { 47440 browser = calcBrowser(); 47441 } 47442 return browser; 47443} 47444function Resize(_ref2) { 47445 var swiper = _ref2.swiper, 47446 on = _ref2.on, 47447 emit = _ref2.emit; 47448 var window = (0, _ssrWindowEsm.a)(); 47449 var observer = null; 47450 var animationFrame = null; 47451 var resizeHandler = function resizeHandler() { 47452 if (!swiper || swiper.destroyed || !swiper.initialized) return; 47453 emit('beforeResize'); 47454 emit('resize'); 47455 }; 47456 var createObserver = function createObserver() { 47457 if (!swiper || swiper.destroyed || !swiper.initialized) return; 47458 observer = new ResizeObserver(function (entries) { 47459 animationFrame = window.requestAnimationFrame(function () { 47460 var width = swiper.width, 47461 height = swiper.height; 47462 var newWidth = width; 47463 var newHeight = height; 47464 entries.forEach(function (_ref3) { 47465 var contentBoxSize = _ref3.contentBoxSize, 47466 contentRect = _ref3.contentRect, 47467 target = _ref3.target; 47468 if (target && target !== swiper.el) return; 47469 newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize; 47470 newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize; 47471 }); 47472 if (newWidth !== width || newHeight !== height) { 47473 resizeHandler(); 47474 } 47475 }); 47476 }); 47477 observer.observe(swiper.el); 47478 }; 47479 var removeObserver = function removeObserver() { 47480 if (animationFrame) { 47481 window.cancelAnimationFrame(animationFrame); 47482 } 47483 if (observer && observer.unobserve && swiper.el) { 47484 observer.unobserve(swiper.el); 47485 observer = null; 47486 } 47487 }; 47488 var orientationChangeHandler = function orientationChangeHandler() { 47489 if (!swiper || swiper.destroyed || !swiper.initialized) return; 47490 emit('orientationchange'); 47491 }; 47492 on('init', function () { 47493 if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') { 47494 createObserver(); 47495 return; 47496 } 47497 window.addEventListener('resize', resizeHandler); 47498 window.addEventListener('orientationchange', orientationChangeHandler); 47499 }); 47500 on('destroy', function () { 47501 removeObserver(); 47502 window.removeEventListener('resize', resizeHandler); 47503 window.removeEventListener('orientationchange', orientationChangeHandler); 47504 }); 47505} 47506function Observer(_ref4) { 47507 var swiper = _ref4.swiper, 47508 extendParams = _ref4.extendParams, 47509 on = _ref4.on, 47510 emit = _ref4.emit; 47511 var observers = []; 47512 var window = (0, _ssrWindowEsm.a)(); 47513 var attach = function attach(target) { 47514 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 47515 var ObserverFunc = window.MutationObserver || window.WebkitMutationObserver; 47516 var observer = new ObserverFunc(function (mutations) { 47517 // The observerUpdate event should only be triggered 47518 // once despite the number of mutations. Additional 47519 // triggers are redundant and are very costly 47520 if (swiper.__preventObserver__) return; 47521 if (mutations.length === 1) { 47522 emit('observerUpdate', mutations[0]); 47523 return; 47524 } 47525 var observerUpdate = function observerUpdate() { 47526 emit('observerUpdate', mutations[0]); 47527 }; 47528 if (window.requestAnimationFrame) { 47529 window.requestAnimationFrame(observerUpdate); 47530 } else { 47531 window.setTimeout(observerUpdate, 0); 47532 } 47533 }); 47534 observer.observe(target, { 47535 attributes: typeof options.attributes === 'undefined' ? true : options.attributes, 47536 childList: swiper.isElement || (typeof options.childList === 'undefined' ? true : options).childList, 47537 characterData: typeof options.characterData === 'undefined' ? true : options.characterData 47538 }); 47539 observers.push(observer); 47540 };
47541 var init = function init() { 47542 if (!swiper.params.observer) return; 47543 if (swiper.params.observeParents) { 47544 var containerParents = (0, _utils.d)(swiper.hostEl); 47545 for (var i = 0; i < containerParents.length; i += 1) { 47546 attach(containerParents[i]); 47547 } 47548 } 47549 // Observe container 47550 attach(swiper.hostEl, { 47551 childList: swiper.params.observeSlideChildren 47552 }); 47553 47554 // Observe wrapper 47555 attach(swiper.wrapperEl, { 47556 attributes: false 47557 }); 47558 }; 47559 var destroy = function destroy() { 47560 observers.forEach(function (observer) { 47561 observer.disconnect(); 47562 }); 47563 observers.splice(0, observers.length); 47564 }; 47565 extendParams({ 47566 observer: false, 47567 observeParents: false, 47568 observeSlideChildren: false 47569 }); 47570 on('init', init); 47571 on('destroy', destroy); 47572} 47573 47574/* eslint-disable no-underscore-dangle */ 47575 47576var eventsEmitter = { 47577 on: function on(events, handler, priority) { 47578 var self = this; 47579 if (!self.eventsListeners || self.destroyed) return self; 47580 if (typeof handler !== 'function') return self; 47581 var method = priority ? 'unshift' : 'push'; 47582 events.split(' ').forEach(function (event) { 47583 if (!self.eventsListeners[event]) self.eventsListeners[event] = []; 47584 self.eventsListeners[event][method](handler); 47585 }); 47586 return self; 47587 }, 47588 once: function once(events, handler, priority) { 47589 var self = this; 47590 if (!self.eventsListeners || self.destroyed) return self; 47591 if (typeof handler !== 'function') return self; 47592 function onceHandler() { 47593 self.off(events, onceHandler); 47594 if (onceHandler.__emitterProxy) { 47595 delete onceHandler.__emitterProxy; 47596 } 47597 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { 47598 args[_key] = arguments[_key]; 47599 } 47600 handler.apply(self, args); 47601 } 47602 onceHandler.__emitterProxy = handler; 47603 return self.on(events, onceHandler, priority); 47604 }, 47605 onAny: function onAny(handler, priority) { 47606 var self = this; 47607 if (!self.eventsListeners || self.destroyed) return self; 47608 if (typeof handler !== 'function') return self; 47609 var method = priority ? 'unshift' : 'push'; 47610 if (self.eventsAnyListeners.indexOf(handler) < 0) { 47611 self.eventsAnyListeners[method](handler); 47612 } 47613 return self; 47614 }, 47615 offAny: function offAny(handler) { 47616 var self = this; 47617 if (!self.eventsListeners || self.destroyed) return self; 47618 if (!self.eventsAnyListeners) return self; 47619 var index = self.eventsAnyListeners.indexOf(handler); 47620 if (index >= 0) { 47621 self.eventsAnyListeners.splice(index, 1); 47622 } 47623 return self; 47624 }, 47625 off: function off(events, handler) { 47626 var self = this; 47627 if (!self.eventsListeners || self.destroyed) return self; 47628 if (!self.eventsListeners) return self; 47629 events.split(' ').forEach(function (event) { 47630 if (typeof handler === 'undefined') { 47631 self.eventsListeners[event] = []; 47632 } else if (self.eventsListeners[event]) { 47633 self.eventsListeners[event].forEach(function (eventHandler, index) { 47634 if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) { 47635 self.eventsListeners[event].splice(index, 1); 47636 } 47637 }); 47638 } 47639 }); 47640 return self; 47641 }, 47642 emit: function emit() { 47643 var self = this; 47644 if (!self.eventsListeners || self.destroyed) return self; 47645 if (!self.eventsListeners) return self; 47646 var events; 47647 var data; 47648 var context; 47649 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { 47650 args[_key2] = arguments[_key2]; 47651 } 47652 if (typeof args[0] === 'string' || Array.isArray(args[0])) { 47653 events = args[0]; 47654 data = args.slice(1, args.length); 47655 context = self; 47656 } else { 47657 events = args[0].events; 47658 data = args[0].data; 47659 context = args[0].context || self; 47660 } 47661 data.unshift(context); 47662 var eventsArray = Array.isArray(events) ? events : events.split(' '); 47663 eventsArray.forEach(function (event) { 47664 if (self.eventsAnyListeners && self.eventsAnyListeners.length) {
47665 self.eventsAnyListeners.forEach(function (eventHandler) { 47666 eventHandler.apply(context, [event].concat((0, _toConsumableArray2["default"])(data))); 47667 }); 47668 } 47669 if (self.eventsListeners && self.eventsListeners[event]) { 47670 self.eventsListeners[event].forEach(function (eventHandler) { 47671 eventHandler.apply(context, data); 47672 }); 47673 } 47674 }); 47675 return self; 47676 } 47677}; 47678function updateSize() { 47679 var swiper = this; 47680 var width; 47681 var height; 47682 var el = swiper.el; 47683 if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) { 47684 width = swiper.params.width; 47685 } else { 47686 width = el.clientWidth; 47687 } 47688 if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) { 47689 height = swiper.params.height; 47690 } else { 47691 height = el.clientHeight; 47692 } 47693 if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) { 47694 return; 47695 } 47696 47697 // Subtract paddings 47698 width = width - parseInt((0, _utils.q)(el, 'padding-left') || 0, 10) - parseInt((0, _utils.q)(el, 'padding-right') || 0, 10); 47699 height = height - parseInt((0, _utils.q)(el, 'padding-top') || 0, 10) - parseInt((0, _utils.q)(el, 'padding-bottom') || 0, 10); 47700 if (Number.isNaN(width)) width = 0; 47701 if (Number.isNaN(height)) height = 0; 47702 Object.assign(swiper, { 47703 width: width, 47704 height: height, 47705 size: swiper.isHorizontal() ? width : height 47706 }); 47707} 47708function updateSlides() { 47709 var swiper = this; 47710 function getDirectionPropertyValue(node, label) { 47711 return parseFloat(node.getPropertyValue(swiper.getDirectionLabel(label)) || 0); 47712 } 47713 var params = swiper.params; 47714 var wrapperEl = swiper.wrapperEl, 47715 slidesEl = swiper.slidesEl, 47716 rtl = swiper.rtlTranslate, 47717 wrongRTL = swiper.wrongRTL; 47718 var isVirtual = swiper.virtual && params.virtual.enabled; 47719 var previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length; 47720 var slides = (0, _utils.e)(slidesEl, ".".concat(swiper.params.slideClass, ", swiper-slide")); 47721 var slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length; 47722 var snapGrid = []; 47723 var slidesGrid = []; 47724 var slidesSizesGrid = []; 47725 var offsetBefore = params.slidesOffsetBefore; 47726 if (typeof offsetBefore === 'function') { 47727 offsetBefore = params.slidesOffsetBefore.call(swiper); 47728 } 47729 var offsetAfter = params.slidesOffsetAfter; 47730 if (typeof offsetAfter === 'function') { 47731 offsetAfter = params.slidesOffsetAfter.call(swiper); 47732 } 47733 var previousSnapGridLength = swiper.snapGrid.length; 47734 var previousSlidesGridLength = swiper.slidesGrid.length; 47735 var swiperSize = swiper.size - offsetBefore - offsetAfter; 47736 var spaceBetween = params.spaceBetween; 47737 var slidePosition = -offsetBefore; 47738 var prevSlideSize = 0; 47739 var index = 0; 47740 if (typeof swiperSize === 'undefined') { 47741 return; 47742 } 47743 if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) { 47744 spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiperSize; 47745 } else if (typeof spaceBetween === 'string') { 47746 spaceBetween = parseFloat(spaceBetween); 47747 } 47748 swiper.virtualSize = -spaceBetween - offsetBefore - offsetAfter; 47749 47750 // reset margins 47751 slides.forEach(function (slideEl) { 47752 if (rtl) { 47753 slideEl.style.marginLeft = ''; 47754 } else { 47755 slideEl.style.marginRight = ''; 47756 } 47757 slideEl.style.marginBottom = ''; 47758 slideEl.style.marginTop = ''; 47759 }); 47760 47761 // reset cssMode offsets 47762 if (params.centeredSlides && params.cssMode) { 47763 (0, _utils.b)(wrapperEl, '--swiper-centered-offset-before', ''); 47764 (0, _utils.b)(wrapperEl, '--swiper-centered-offset-after', ''); 47765 } 47766 47767 // set cssMode offsets 47768 if (params.cssMode) { 47769 (0, _utils.b)(wrapperEl, '--swiper-slides-offset-before', "".concat(offsetBefore, "px")); 47770 (0, _utils.b)(wrapperEl, '--swiper-slides-offset-after', "".concat(offsetAfter, "px")); 47771 } 47772 var gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid; 47773 if (gridEnabled) { 47774 swiper.grid.initSlides(slides); 47775 } else if (swiper.grid) { 47776 swiper.grid.unsetSlides(); 47777 } 47778 47779 // Calc slides 47780 var slideSize; 47781 var shouldResetSlideSize = params.slidesPerView === 'auto' && params.breakpoints && Object.keys(params.breakpoints).filter(function (key) { 47782 return typeof params.breakpoints[key].slidesPerView !== 'undefined'; 47783 }).length > 0; 47784 for (var i = 0; i < slidesLength; i += 1) { 47785 slideSize = 0; 47786 var _slide = slides[i]; 47787 if (_slide) { 47788 if (gridEnabled) { 47789 swiper.grid.updateSlide(i, _slide, slides); 47790 } 47791 if ((0, _utils.q)(_slide, 'display') === 'none') continue; // eslint-disable-line 47792 } 47793 if (isVirtual && params.slidesPerView === 'auto') { 47794 if (params.virtual.slidesPerViewAutoSlideSize) { 47795 slideSize = params.virtual.slidesPerViewAutoSlideSize; 47796 } 47797 if (slideSize && _slide) { 47798 if (params.roundLengths) slideSize = Math.floor(slideSize); 47799 _slide.style[swiper.getDirectionLabel('width')] = "".concat(slideSize, "px"); 47800 } 47801 } else if (params.slidesPerView === 'auto') { 47802 if (shouldResetSlideSize) { 47803 _slide.style[swiper.getDirectionLabel('width')] = ""; 47804 } 47805 var slideStyles = getComputedStyle(_slide); 47806 var currentTransform = _slide.style.transform; 47807 var currentWebKitTransform = _slide.style.webkitTransform; 47808 if (currentTransform) { 47809 _slide.style.transform = 'none'; 47810 } 47811 if (currentWebKitTransform) { 47812 _slide.style.webkitTransform = 'none'; 47813 } 47814 if (params.roundLengths) { 47815 slideSize = swiper.isHorizontal() ? (0, _utils.i)(_slide, 'width', true) : (0, _utils.i)(_slide, 'height', true); 47816 } else { 47817 // eslint-disable-next-line 47818 var width = getDirectionPropertyValue(slideStyles, 'width'); 47819 var paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left'); 47820 var paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right'); 47821 var marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left'); 47822 var marginRight = getDirectionPropertyValue(slideStyles, 'margin-right'); 47823 var boxSizing = slideStyles.getPropertyValue('box-sizing'); 47824 if (boxSizing && boxSizing === 'border-box') { 47825 slideSize = width + marginLeft + marginRight; 47826 } else { 47827 var clientWidth = _slide.clientWidth, 47828 offsetWidth = _slide.offsetWidth; 47829 slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth); 47830 } 47831 } 47832 if (currentTransform) { 47833 _slide.style.transform = currentTransform; 47834 } 47835 if (currentWebKitTransform) { 47836 _slide.style.webkitTransform = currentWebKitTransform; 47837 } 47838 if (params.roundLengths) slideSize = Math.floor(slideSize); 47839 } else { 47840 slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView; 47841 if (params.roundLengths) slideSize = Math.floor(slideSize); 47842 if (_slide) { 47843 _slide.style[swiper.getDirectionLabel('width')] = "".concat(slideSize, "px"); 47844 } 47845 } 47846 if (_slide) { 47847 _slide.swiperSlideSize = slideSize; 47848 } 47849 slidesSizesGrid.push(slideSize); 47850 if (params.centeredSlides) { 47851 slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween; 47852 if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween; 47853 if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween; 47854 if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0; 47855 if (params.roundLengths) slidePosition = Math.floor(slidePosition); 47856 if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition); 47857 slidesGrid.push(slidePosition); 47858 } else { 47859 if (params.roundLengths) slidePosition = Math.floor(slidePosition); 47860 if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) snapGrid.push(slidePosition); 47861 slidesGrid.push(slidePosition); 47862 slidePosition = slidePosition + slideSize + spaceBetween; 47863 } 47864 swiper.virtualSize += slideSize + spaceBetween; 47865 prevSlideSize = slideSize; 47866 index += 1; 47867 } 47868 swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter; 47869 if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) { 47870 wrapperEl.style.width = "".concat(swiper.virtualSize + spaceBetween, "px"); 47871 } 47872 if (params.setWrapperSize) { 47873 wrapperEl.style[swiper.getDirectionLabel('width')] = "".concat(swiper.virtualSize + spaceBetween, "px"); 47874 } 47875 if (gridEnabled) { 47876 swiper.grid.updateWrapperSize(slideSize, snapGrid); 47877 } 47878 47879 // Remove last grid elements depending on width 47880 if (!params.centeredSlides) { 47881 // Check if snapToSlideEdge should be applied 47882 var isFractionalSlidesPerView = params.slidesPerView !== 'auto' && params.slidesPerView % 1 !== 0; 47883 var shouldSnapToSlideEdge = params.snapToSlideEdge && !params.loop && (params.slidesPerView === 'auto' || isFractionalSlidesPerView); 47884 47885 // Calculate the last allowed snap index when snapToSlideEdge is enabled 47886 // This ensures minimum slides are visible at the end 47887 var lastAllowedSnapIndex = snapGrid.length; 47888 if (shouldSnapToSlideEdge) { 47889 var minVisibleSlides; 47890 if (params.slidesPerView === 'auto') { 47891 // For 'auto' mode, calculate how many slides fit based on actual sizes 47892 minVisibleSlides = 1; 47893 var accumulatedSize = 0; 47894 for (var _i = slidesSizesGrid.length - 1; _i >= 0; _i -= 1) { 47895 accumulatedSize += slidesSizesGrid[_i] + (_i < slidesSizesGrid.length - 1 ? spaceBetween : 0); 47896 if (accumulatedSize <= swiperSize) { 47897 minVisibleSlides = slidesSizesGrid.length - _i; 47898 } else { 47899 break; 47900 } 47901 } 47902 } else { 47903 minVisibleSlides = Math.floor(params.slidesPerView); 47904 } 47905 lastAllowedSnapIndex = Math.max(slidesLength - minVisibleSlides, 0); 47906 } 47907 var newSlidesGrid = []; 47908 for (var _i2 = 0; _i2 < snapGrid.length; _i2 += 1) { 47909 var slidesGridItem = snapGrid[_i2]; 47910 if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem); 47911 if (shouldSnapToSlideEdge) { 47912 // When snapToSlideEdge is enabled, only keep snaps up to lastAllowedSnapIndex 47913 if (_i2 <= lastAllowedSnapIndex) { 47914 newSlidesGrid.push(slidesGridItem); 47915 } 47916 }
47916 else if (snapGrid[_i2] <= swiper.virtualSize - swiperSize) { 47917 // When snapToSlideEdge is disabled, keep snaps that fit within scrollable area 47918 newSlidesGrid.push(slidesGridItem); 47919 } 47920 } 47921 snapGrid = newSlidesGrid; 47922 if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) { 47923 // Only add edge-aligned snap if snapToSlideEdge is not enabled 47924 if (!shouldSnapToSlideEdge) { 47925 snapGrid.push(swiper.virtualSize - swiperSize); 47926 } 47927 } 47928 } 47929 if (isVirtual && params.loop) { 47930 var size = slidesSizesGrid[0] + spaceBetween; 47931 if (params.slidesPerGroup > 1) { 47932 var groups = Math.ceil((swiper.virtual.slidesBefore + swiper.virtual.slidesAfter) / params.slidesPerGroup); 47933 var groupSize = size * params.slidesPerGroup; 47934 for (var _i3 = 0; _i3 < groups; _i3 += 1) { 47935 snapGrid.push(snapGrid[snapGrid.length - 1] + groupSize); 47936 } 47937 } 47938 for (var _i4 = 0; _i4 < swiper.virtual.slidesBefore + swiper.virtual.slidesAfter; _i4 += 1) { 47939 if (params.slidesPerGroup === 1) { 47940 snapGrid.push(snapGrid[snapGrid.length - 1] + size); 47941 } 47942 slidesGrid.push(slidesGrid[slidesGrid.length - 1] + size); 47943 swiper.virtualSize += size; 47944 } 47945 } 47946 if (snapGrid.length === 0) snapGrid = [0]; 47947 if (spaceBetween !== 0) { 47948 var key = swiper.isHorizontal() && rtl ? 'marginLeft' : swiper.getDirectionLabel('marginRight'); 47949 slides.filter(function (_, slideIndex) { 47950 if (!params.cssMode || params.loop) return true; 47951 if (slideIndex === slides.length - 1) { 47952 return false; 47953 } 47954 return true; 47955 }
47955).forEach(function (slideEl) { 47956 slideEl.style[key] = "".concat(spaceBetween, "px"); 47957 }); 47958 } 47959 if (params.centeredSlides && params.centeredSlidesBounds) { 47960 var allSlidesSize = 0; 47961 slidesSizesGrid.forEach(function (slideSizeValue) { 47962 allSlidesSize += slideSizeValue + (spaceBetween || 0); 47963 }); 47964 allSlidesSize -= spaceBetween; 47965 var maxSnap = allSlidesSize > swiperSize ? allSlidesSize - swiperSize : 0; 47966 snapGrid = snapGrid.map(function (snap) { 47967 if (snap <= 0) return -offsetBefore; 47968 if (snap > maxSnap) return maxSnap + offsetAfter; 47969 return snap; 47970 }); 47971 } 47972 if (params.centerInsufficientSlides) { 47973 var _allSlidesSize = 0; 47974 slidesSizesGrid.forEach(function (slideSizeValue) { 47975 _allSlidesSize += slideSizeValue + (spaceBetween || 0); 47976 }); 47977 _allSlidesSize -= spaceBetween; 47978 if (_allSlidesSize < swiperSize) { 47979 var allSlidesOffset = (swiperSize - _allSlidesSize) / 2; 47980 snapGrid.forEach(function (snap, snapIndex) { 47981 snapGrid[snapIndex] = snap - allSlidesOffset; 47982 }); 47983 slidesGrid.forEach(function (snap, snapIndex) { 47984 slidesGrid[snapIndex] = snap + allSlidesOffset; 47985 }); 47986 } 47987 } 47988 Object.assign(swiper, { 47989 slides: slides, 47990 snapGrid: snapGrid, 47991 slidesGrid: slidesGrid, 47992 slidesSizesGrid: slidesSizesGrid 47993 }); 47994 if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) { 47995 (0, _utils.b)(wrapperEl, '--swiper-centered-offset-before', "".concat(-snapGrid[0], "px")); 47996 (0, _utils.b)(wrapperEl, '--swiper-centered-offset-after', "".concat(swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2, "px")); 47997 var addToSnapGrid = -swiper.snapGrid[0]; 47998 var addToSlidesGrid = -swiper.slidesGrid[0]; 47999 swiper.snapGrid = swiper.snapGrid.map(function (v) { 48000 return v + addToSnapGrid; 48001 }); 48002 swiper.slidesGrid = swiper.slidesGrid.map(function (v) { 48003 return v + addToSlidesGrid; 48004 }); 48005 } 48006 if (slidesLength !== previousSlidesLength) { 48007 swiper.emit('slidesLengthChange'); 48008 } 48009 if (snapGrid.length !== previousSnapGridLength) { 48010 if (swiper.params.watchOverflow) swiper.checkOverflow(); 48011 swiper.emit('snapGridLengthChange'); 48012 } 48013 if (slidesGrid.length !== previousSlidesGridLength) { 48014 swiper.emit('slidesGridLengthChange'); 48015 } 48016 if (params.watchSlidesProgress) { 48017 swiper.updateSlidesOffset(); 48018 } 48019 swiper.emit('slidesUpdated'); 48020 if (!isVirtual && !params.cssMode && (params.effect === 'slide' || params.effect === 'fade')) { 48021 var backFaceHiddenClass = "".concat(params.containerModifierClass, "backface-hidden"); 48022 var hasClassBackfaceClassAdded = swiper.el.classList.contains(backFaceHiddenClass); 48023 if (slidesLength <= params.maxBackfaceHiddenSlides) { 48024 if (!hasClassBackfaceClassAdded) swiper.el.classList.add(backFaceHiddenClass); 48025 } else if (hasClassBackfaceClassAdded) { 48026 swiper.el.classList.remove(backFaceHiddenClass); 48027 } 48028 } 48029} 48030function updateAutoHeight(speed) { 48031 var swiper = this; 48032 var activeSlides = []; 48033 var isVirtual = swiper.virtual && swiper.params.virtual.enabled; 48034 var newHeight = 0; 48035 var i; 48036 if (typeof speed === 'number') { 48037 swiper.setTransition(speed); 48038 } else if (speed === true) { 48039 swiper.setTransition(swiper.params.speed); 48040 } 48041 var getSlideByIndex = function getSlideByIndex(index) { 48042 if (isVirtual) { 48043 return swiper.slides[swiper.getSlideIndexByData(index)]; 48044 } 48045 return swiper.slides[index]; 48046 }; 48047 // Find slides currently in view 48048 if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) { 48049 if (swiper.params.centeredSlides) { 48050 (swiper.visibleSlides || []).forEach(function (slide) { 48051 activeSlides.push(slide); 48052 }); 48053 } else { 48054 for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) { 48055 var index = swiper.activeIndex + i; 48056 if (index > swiper.slides.length && !isVirtual) break; 48057 activeSlides.push(getSlideByIndex(index)); 48058 } 48059 } 48060 } else { 48061 activeSlides.push(getSlideByIndex(swiper.activeIndex)); 48062 } 48063 48064 // Find new height from highest slide in view 48065 for (i = 0; i < activeSlides.length; i += 1) { 48066 if (typeof activeSlides[i] !== 'undefined') { 48067 var height = activeSlides[i].offsetHeight; 48068 newHeight = height > newHeight ? height : newHeight; 48069 } 48070 } 48071 48072 // Update Height 48073 if (newHeight || newHeight === 0) swiper.wrapperEl.style.height = "".concat(newHeight, "px"); 48074} 48075function updateSlidesOffset() { 48076 var swiper = this; 48077 var slides = swiper.slides; 48078 // eslint-disable-next-line 48079 var minusOffset = swiper.isElement ? swiper.isHorizontal() ? swiper.wrapperEl.offsetLeft : swiper.wrapperEl.offsetTop : 0; 48080 for (var i = 0; i < slides.length; i += 1) { 48081 slides[i].swiperSlideOffset = (swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop) - minu
48081sOffset - swiper.cssOverflowAdjustment(); 48082 } 48083} 48084var toggleSlideClasses$1 = function toggleSlideClasses$1(slideEl, condition, className) { 48085 if (condition && !slideEl.classList.contains(className)) { 48086 slideEl.classList.add(className); 48087 } else if (!condition && slideEl.classList.contains(className)) { 48088 slideEl.classList.remove(className); 48089 } 48090}; 48091function updateSlidesProgress() { 48092 var translate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this && this.translate || 0; 48093 var swiper = this; 48094 var params = swiper.params; 48095 var slides = swiper.slides, 48096 rtl = swiper.rtlTranslate, 48097 snapGrid = swiper.snapGrid; 48098 if (slides.length === 0) return; 48099 if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset(); 48100 var offsetCenter = -translate; 48101 if (rtl) offsetCenter = translate; 48102 swiper.visibleSlidesIndexes = []; 48103 swiper.visibleSlides = []; 48104 var spaceBetween = params.spaceBetween; 48105 if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) { 48106 spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiper.size; 48107 } else if (typeof spaceBetween === 'string') { 48108 spaceBetween = parseFloat(spaceBetween); 48109 } 48110 for (var i = 0; i < slides.length; i += 1) { 48111 var _slide2 = slides[i]; 48112 var slideOffset = _slide2.swiperSlideOffset; 48113 if (params.cssMode && params.centeredSlides) { 48114 slideOffset -= slides[0].swiperSlideOffset; 48115 } 48116 var slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (_slide2.swiperSlideSize + spaceBetween); 48117 var originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (_slide2.swiperSlideSize + spaceBetween); 48118 var slideBefore = -(offsetCenter - slideOffset); 48119 var slideAfter = slideBefore + swiper.slidesSizesGrid[i]; 48120 var isFullyVisible = slideBefore >= 0 && slideBefore <= swiper.size - swiper.slidesSizesGrid[i]; 48121 var isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size; 48122 if (isVisible) { 48123 swiper.visibleSlides.push(_slide2); 48124 swiper.visibleSlidesIndexes.push(i); 48125 } 48126 toggleSlideClasses$1(_slide2, isVisible, params.slideVisibleClass); 48127 toggleSlideClasses$1(_slide2, isFullyVisible, params.slideFullyVisibleClass); 48128 _slide2.progress = rtl ? -slideProgress : slideProgress; 48129 _slide2.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress; 48130 } 48131} 48132function updateProgress(translate) { 48133 var swiper = this; 48134 if (typeof translate === 'undefined') { 48135 var multiplier = swiper.rtlTranslate ? -1 : 1; 48136 // eslint-disable-next-line 48137 translate = swiper && swiper.translate && swiper.translate * multiplier || 0; 48138 } 48139 var params = swiper.params; 48140 var translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); 48141 var progress = swiper.progress, 48142 isBeginning = swiper.isBeginning, 48143 isEnd = swiper.isEnd, 48144 progressLoop = swiper.progressLoop; 48145 var wasBeginning = isBeginning; 48146 var wasEnd = isEnd; 48147 if (translatesDiff === 0) { 48148 progress = 0; 48149 isBeginning = true; 48150 isEnd = true; 48151 } else { 48152 progress = (translate - swiper.minTranslate()) / translatesDiff; 48153 var isBeginningRounded = Math.abs(translate - swiper.minTranslate()) < 1; 48154 var isEndRounded = Math.abs(translate - swiper.maxTranslate()) < 1; 48155 isBeginning = isBeginningRounded || progress <= 0; 48156 isEnd = isEndRounded || progress >= 1; 48157 if (isBeginningRounded) progress = 0; 48158 if (isEndRounded) progress = 1; 48159 } 48160 if (params.loop) { 48161 var firstSlideIndex = swiper.getSlideIndexByData(0); 48162 var lastSlideIndex = swiper.getSlideIndexByData(swiper.slides.length - 1); 48163 var firstSlideTranslate = swiper.slidesGrid[firstSlideIndex]; 48164 var lastSlideTranslate = swiper.slidesGrid[lastSlideIndex]; 48165 var translateMax = swiper.slidesGrid[swiper.slidesGrid.length - 1]; 48166 var translateAbs = Math.abs(translate); 48167 if (translateAbs >= firstSlideTranslate) { 48168 progressLoop = (translateAbs - firstSlideTranslate) / translateMax; 48169 } else { 48170 progressLoop = (translateAbs + translateMax - lastSlideTranslate) / translateMax; 48171 } 48172 if (progressLoop > 1) progressLoop -= 1; 48173 } 48174 Object.assign(swiper, { 48175 progress: progress, 48176 progressLoop: progressLoop, 48177 isBeginning: isBeginning, 48178 isEnd: isEnd 48179 }); 48180 if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight) swiper.updateSlidesProgress(translate); 48181 if (isBeginning && !wasBeginning) { 48182 swiper.emit('reachBeginning toEdge'); 48183 } 48184 if (isEnd && !wasEnd) { 48185 swiper.emit('reachEnd toEdge'); 48186 } 48187 if (wasBeginning && !isBeginning || wasEnd && !isEnd) { 48188 swiper.emit('fromEdge'); 48189 } 48190 swiper.emit('progress', progress); 48191}
48192var toggleSlideClasses = function toggleSlideClasses(slideEl, condition, className) { 48193 if (condition && !slideEl.classList.contains(className)) { 48194 slideEl.classList.add(className); 48195 } else if (!condition && slideEl.classList.contains(className)) { 48196 slideEl.classList.remove(className); 48197 } 48198}; 48199function updateSlidesClasses() { 48200 var swiper = this; 48201 var slides = swiper.slides, 48202 params = swiper.params, 48203 slidesEl = swiper.slidesEl, 48204 activeIndex = swiper.activeIndex; 48205 var isVirtual = swiper.virtual && params.virtual.enabled; 48206 var gridEnabled = swiper.grid && params.grid && params.grid.rows > 1; 48207 var getFilteredSlide = function getFilteredSlide(selector) { 48208 return (0, _utils.e)(slidesEl, ".".concat(params.slideClass).concat(selector, ", swiper-slide").concat(selector))[0]; 48209 }; 48210 var activeSlide; 48211 var prevSlide; 48212 var nextSlide; 48213 if (isVirtual) { 48214 if (params.loop) { 48215 var slideIndex = activeIndex - swiper.virtual.slidesBefore; 48216 if (slideIndex < 0) slideIndex = swiper.virtual.slides.length + slideIndex; 48217 if (slideIndex >= swiper.virtual.slides.length) slideIndex -= swiper.virtual.slides.length; 48218 activeSlide = getFilteredSlide("[data-swiper-slide-index=\"".concat(slideIndex, "\"]")); 48219 } else { 48220 activeSlide = getFilteredSlide("[data-swiper-slide-index=\"".concat(activeIndex, "\"]")); 48221 } 48222 } else { 48223 if (gridEnabled) { 48224 activeSlide = slides.find(function (slideEl) { 48225 return slideEl.column === activeIndex; 48226 }); 48227 nextSlide = slides.find(function (slideEl) { 48228 return slideEl.column === activeIndex + 1; 48229 }); 48230 prevSlide = slides.find(function (slideEl) { 48231 return slideEl.column === activeIndex - 1; 48232 }); 48233 } else { 48234 activeSlide = slides[activeIndex]; 48235 } 48236 } 48237 if (activeSlide) { 48238 if (!gridEnabled) { 48239 // Next Slide 48240 nextSlide = (0, _utils.r)(activeSlide, ".".concat(params.slideClass, ", swiper-slide"))[0]; 48241 if (params.loop && !nextSlide) { 48242 nextSlide = slides[0]; 48243 } 48244 48245 // Prev Slide 48246 prevSlide = (0, _utils.t)(activeSlide, ".".concat(params.slideClass, ", swiper-slide"))[0]; 48247 if (params.loop && !prevSlide === 0) { 48248 prevSlide = slides[slides.length - 1]; 48249 } 48250 } 48251 } 48252 slides.forEach(function (slideEl) { 48253 toggleSlideClasses(slideEl, slideEl === activeSlide, params.slideActiveClass); 48254 toggleSlideClasses(slideEl, slideEl === nextSlide, params.slideNextClass); 48255 toggleSlideClasses(slideEl, slideEl === prevSlide, params.slidePrevClass); 48256 }); 48257 swiper.emitSlidesClasses(); 48258} 48259var processLazyPreloader = function processLazyPreloader(swiper, imageEl) { 48260 if (!swiper || swiper.destroyed || !swiper.params) return; 48261 var slideSelector = function slideSelector() { 48262 return swiper.isElement ? "swiper-slide" : ".".concat(swiper.params.slideClass); 48263 }; 48264 var slideEl = imageEl.closest(slideSelector()); 48265 if (slideEl) { 48266 var lazyEl = slideEl.querySelector(".".concat(swiper.params.lazyPreloaderClass)); 48267 if (!lazyEl && swiper.isElement) { 48268 if (slideEl.shadowRoot) { 48269 lazyEl = slideEl.shadowRoot.querySelector(".".concat(swiper.params.lazyPreloaderClass)); 48270 } else { 48271 // init later 48272 requestAnimationFrame(function () { 48273 if (slideEl.shadowRoot) { 48274 lazyEl = slideEl.shadowRoot.querySelector(".".concat(swiper.params.lazyPreloaderClass)); 48275 if (lazyEl && !lazyEl.lazyPreloaderManaged) lazyEl.remove(); 48276 } 48277 }); 48278 } 48279 } 48280 // Skip removal if managed by React/Vue component 48281 if (lazyEl && !lazyEl.lazyPreloaderManaged) lazyEl.remove(); 48282 } 48283}; 48284var unlazy = function unlazy(swiper, index) { 48285 if (!swiper.slides[index]) return; 48286 var imageEl = swiper.slides[index].querySelector('[loading="lazy"]'); 48287 if (imageEl) imageEl.removeAttribute('loading'); 48288}; 48289var preload = function preload(swiper) { 48290 if (!swiper || swiper.destroyed || !swiper.params) return; 48291 var amount = swiper.params.lazyPreloadPrevNext; 48292 var len = swiper.slides.length; 48293 if (!len || !amount || amount < 0) return; 48294 amount = Math.min(amount, len); 48295 var slidesPerView = swiper.params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(swiper.params.slidesPerView); 48296 var activeIndex = swiper.activeIndex; 48297 if (swiper.params.grid && swiper.params.grid.rows > 1) { 48298 var activeColumn = activeIndex; 48299 var preloadColumns = [activeColumn - amount];
48300 preloadColumns.push.apply(preloadColumns, (0, _toConsumableArray2["default"])(Array.from({ 48301 length: amount 48302 }).map(function (_, i) { 48303 return activeColumn + slidesPerView + i; 48304 }))); 48305 swiper.slides.forEach(function (slideEl, i) { 48306 if (preloadColumns.includes(slideEl.column)) unlazy(swiper, i); 48307 }); 48308 return; 48309 } 48310 var slideIndexLastInView = activeIndex + slidesPerView - 1; 48311 if (swiper.params.rewind || swiper.params.loop) { 48312 for (var i = activeIndex - amount; i <= slideIndexLastInView + amount; i += 1) { 48313 var realIndex = (i % len + len) % len; 48314 if (realIndex < activeIndex || realIndex > slideIndexLastInView) unlazy(swiper, realIndex); 48315 } 48316 } else { 48317 for (var _i5 = Math.max(activeIndex - amount, 0); _i5 <= Math.min(slideIndexLastInView + amount, len - 1); _i5 += 1) { 48318 if (_i5 !== activeIndex && (_i5 > slideIndexLastInView || _i5 < activeIndex)) { 48319 unlazy(swiper, _i5); 48320 } 48321 } 48322 } 48323}; 48324function getActiveIndexByTranslate(swiper) { 48325 var slidesGrid = swiper.slidesGrid, 48326 params = swiper.params; 48327 var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate; 48328 var activeIndex; 48329 for (var i = 0; i < slidesGrid.length; i += 1) { 48330 if (typeof slidesGrid[i + 1] !== 'undefined') { 48331 if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) { 48332 activeIndex = i; 48333 } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) { 48334 activeIndex = i + 1; 48335 } 48336 } else if (translate >= slidesGrid[i]) { 48337 activeIndex = i; 48338 } 48339 } 48340 // Normalize slideIndex 48341 if (params.normalizeSlideIndex) { 48342 if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0; 48343 } 48344 return activeIndex; 48345} 48346function updateActiveIndex(newActiveIndex) { 48347 var swiper = this; 48348 var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate; 48349 var snapGrid = swiper.snapGrid, 48350 params = swiper.params, 48351 previousIndex = swiper.activeIndex, 48352 previousRealIndex = swiper.realIndex, 48353 previousSnapIndex = swiper.snapIndex; 48354 var activeIndex = newActiveIndex; 48355 var snapIndex; 48356 var getVirtualRealIndex = function getVirtualRealIndex(aIndex) { 48357 var realIndex = aIndex - swiper.virtual.slidesBefore; 48358 if (realIndex < 0) { 48359 realIndex = swiper.virtual.slides.length + realIndex; 48360 } 48361 if (realIndex >= swiper.virtual.slides.length) { 48362 realIndex -= swiper.virtual.slides.length; 48363 } 48364 return realIndex; 48365 }; 48366 if (typeof activeIndex === 'undefined') { 48367 activeIndex = getActiveIndexByTranslate(swiper); 48368 } 48369 if (snapGrid.indexOf(translate) >= 0) { 48370 snapIndex = snapGrid.indexOf(translate); 48371 } else { 48372 var skip = Math.min(params.slidesPerGroupSkip, activeIndex); 48373 snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup); 48374 } 48375 if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1; 48376 if (activeIndex === previousIndex && !swiper.params.loop) { 48377 if (snapIndex !== previousSnapIndex) { 48378 swiper.snapIndex = snapIndex; 48379 swiper.emit('snapIndexChange'); 48380 } 48381 return; 48382 } 48383 if (activeIndex === previousIndex && swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) { 48384 swiper.realIndex = getVirtualRealIndex(activeIndex); 48385 return; 48386 } 48387 var gridEnabled = swiper.grid && params.grid && params.grid.rows > 1; 48388 48389 // Get real index 48390 var realIndex; 48391 if (swiper.virtual && params.virtual.enabled) { 48392 if (params.loop) { 48393 realIndex = getVirtualRealIndex(activeIndex); 48394 } else { 48395 realIndex = activeIndex; 48396 } 48397 } else if (gridEnabled) { 48398 var firstSlideInColumn = swiper.slides.find(function (slideEl) { 48399 return slideEl.column === activeIndex; 48400 }); 48401 var activeSlideIndex = parseInt(firstSlideInColumn.getAttribute('data-swiper-slide-index'), 10); 48402 if (Number.isNaN(activeSlideIndex)) { 48403 activeSlideIndex = Math.max(swiper.slides.indexOf(firstSlideInColumn), 0); 48404 } 48405 realIndex = Math.floor(activeSlideIndex / params.grid.rows); 48406 } else if (swiper.slides[activeIndex]) { 48407 var slideIndex = swiper.slides[activeIndex].getAttribute('data-swiper-slide-index'); 48408 if (slideIndex) { 48409 realIndex = parseInt(slideIndex, 10); 48410 } else { 48411 realIndex = activeIndex; 48412 } 48413 } else { 48414 realIndex = activeIndex; 48415 } 48416 Object.assign(swiper, { 48417 previousSnapIndex: previousSnapIndex,
48418 snapIndex: snapIndex, 48419 previousRealIndex: previousRealIndex, 48420 realIndex: realIndex, 48421 previousIndex: previousIndex, 48422 activeIndex: activeIndex 48423 }); 48424 if (swiper.initialized) { 48425 preload(swiper); 48426 } 48427 swiper.emit('activeIndexChange'); 48428 swiper.emit('snapIndexChange'); 48429 if (swiper.initialized || swiper.params.runCallbacksOnInit) { 48430 if (previousRealIndex !== realIndex) { 48431 swiper.emit('realIndexChange'); 48432 } 48433 swiper.emit('slideChange'); 48434 } 48435} 48436function updateClickedSlide(el, path) { 48437 var swiper = this; 48438 var params = swiper.params; 48439 var slide = el.closest(".".concat(params.slideClass, ", swiper-slide")); 48440 if (!slide && swiper.isElement && path && path.length > 1 && path.includes(el)) { 48441 (0, _toConsumableArray2["default"])(path.slice(path.indexOf(el) + 1, path.length)).forEach(function (pathEl) { 48442 if (!slide && pathEl.matches && pathEl.matches(".".concat(params.slideClass, ", swiper-slide"))) { 48443 slide = pathEl; 48444 } 48445 }); 48446 } 48447 var slideFound = false; 48448 var slideIndex; 48449 if (slide) { 48450 for (var i = 0; i < swiper.slides.length; i += 1) { 48451 if (swiper.slides[i] === slide) { 48452 slideFound = true; 48453 slideIndex = i; 48454 break; 48455 } 48456 } 48457 } 48458 if (slide && slideFound) { 48459 swiper.clickedSlide = slide; 48460 if (swiper.virtual && swiper.params.virtual.enabled) { 48461 swiper.clickedIndex = parseInt(slide.getAttribute('data-swiper-slide-index'), 10); 48462 } else { 48463 swiper.clickedIndex = slideIndex; 48464 } 48465 } else { 48466 swiper.clickedSlide = undefined; 48467 swiper.clickedIndex = undefined; 48468 return; 48469 } 48470 if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) { 48471 swiper.slideToClickedSlide(); 48472 } 48473} 48474var update = { 48475 updateSize: updateSize, 48476 updateSlides: updateSlides, 48477 updateAutoHeight: updateAutoHeight, 48478 updateSlidesOffset: updateSlidesOffset, 48479 updateSlidesProgress: updateSlidesProgress, 48480 updateProgress: updateProgress, 48481 updateSlidesClasses: updateSlidesClasses, 48482 updateActiveIndex: updateActiveIndex, 48483 updateClickedSlide: updateClickedSlide 48484}; 48485function getSwiperTranslate() { 48486 var axis = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.isHorizontal() ? 'x' : 'y'; 48487 var swiper = this; 48488 var params = swiper.params, 48489 rtl = swiper.rtlTranslate, 48490 translate = swiper.translate, 48491 wrapperEl = swiper.wrapperEl; 48492 if (params.virtualTranslate) { 48493 return rtl ? -translate : translate; 48494 } 48495 if (params.cssMode) { 48496 return translate; 48497 } 48498 var currentTranslate = (0, _utils.l)(wrapperEl, axis); 48499 currentTranslate += swiper.cssOverflowAdjustment(); 48500 if (rtl) currentTranslate = -currentTranslate; 48501 return currentTranslate || 0; 48502} 48503function setTranslate(translate, byController) { 48504 var swiper = this; 48505 var rtl = swiper.rtlTranslate, 48506 params = swiper.params, 48507 wrapperEl = swiper.wrapperEl, 48508 progress = swiper.progress; 48509 var x = 0; 48510 var y = 0; 48511 var z = 0; 48512 if (swiper.isHorizontal()) { 48513 x = rtl ? -translate : translate; 48514 } else { 48515 y = translate; 48516 } 48517 if (params.roundLengths) { 48518 x = Math.floor(x); 48519 y = Math.floor(y); 48520 } 48521 swiper.previousTranslate = swiper.translate; 48522 swiper.translate = swiper.isHorizontal() ? x : y; 48523 if (params.cssMode) { 48524 wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y; 48525 } else if (!params.virtualTranslate) { 48526 if (swiper.isHorizontal()) { 48527 x -= swiper.cssOverflowAdjustment(); 48528 } else { 48529 y -= swiper.cssOverflowAdjustment(); 48530 } 48531 wrapperEl.style.transform = "translate3d(".concat(x, "px, ").concat(y, "px, ").concat(z, "px)"); 48532 } 48533 48534 // Check if we need to update progress 48535 var newProgress; 48536 var translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); 48537 if (translatesDiff === 0) { 48538 newProgress = 0; 48539 } else { 48540 newProgress = (translate - swiper.minTranslate()) / translatesDiff; 48541 } 48542 if (newProgress !== progress) { 48543 swiper.updateProgress(translate); 48544 } 48545 swiper.emit('setTranslate', swiper.translate, byController); 48546} 48547function minTranslate() { 48548 return -this.snapGrid[0]; 48549} 48550function maxTranslate() { 48551 return -this.snapGrid[this.snapGrid.length - 1]; 48552} 48553function translateTo() { 48554 var translate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; 48555 var speed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.params.speed; 48556 var runCallbacks = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; 48557 var translateBounds = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; 48558 var internal = arguments.length > 4 ? arguments[4] : undefined; 48559 var swiper = this; 48560 var params = swiper.params, 48561 wrapperEl = swiper.wrapperEl; 48562 if (swiper.animating && params.preventInteractionOnTransition) { 48563 return false;
48564 } 48565 var minTranslate = swiper.minTranslate(); 48566 var maxTranslate = swiper.maxTranslate(); 48567 var newTranslate; 48568 if (translateBounds && translate > minTranslate) newTranslate = minTranslate;else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;else newTranslate = translate; 48569 48570 // Update progress 48571 swiper.updateProgress(newTranslate); 48572 if (params.cssMode) { 48573 var isH = swiper.isHorizontal(); 48574 if (speed === 0) { 48575 wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate; 48576 } else { 48577 if (!swiper.support.smoothScroll) { 48578 (0, _utils.u)({ 48579 swiper: swiper, 48580 targetPosition: -newTranslate, 48581 side: isH ? 'left' : 'top' 48582 }); 48583 return true; 48584 } 48585 wrapperEl.scrollTo((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, isH ? 'left' : 'top', -newTranslate), "behavior", 'smooth')); 48586 } 48587 return true; 48588 } 48589 if (speed === 0) { 48590 swiper.setTransition(0); 48591 swiper.setTranslate(newTranslate); 48592 if (runCallbacks) { 48593 swiper.emit('beforeTransitionStart', speed, internal); 48594 swiper.emit('transitionEnd'); 48595 } 48596 } else { 48597 swiper.setTransition(speed); 48598 swiper.setTranslate(newTranslate); 48599 if (runCallbacks) { 48600 swiper.emit('beforeTransitionStart', speed, internal); 48601 swiper.emit('transitionStart'); 48602 } 48603 if (!swiper.animating) { 48604 swiper.animating = true; 48605 if (!swiper.onTranslateToWrapperTransitionEnd) { 48606 swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) { 48607 if (!swiper || swiper.destroyed) return; 48608 if (e.target !== this) return; 48609 swiper.wrapperEl.removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd); 48610 swiper.onTranslateToWrapperTransitionEnd = null; 48611 delete swiper.onTranslateToWrapperTransitionEnd; 48612 swiper.animating = false; 48613 if (runCallbacks) { 48614 swiper.emit('transitionEnd'); 48615 } 48616 }; 48617 } 48618 swiper.wrapperEl.addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd); 48619 } 48620 } 48621 return true; 48622} 48623var translate = { 48624 getTranslate: getSwiperTranslate, 48625 setTranslate: setTranslate, 48626 minTranslate: minTranslate, 48627 maxTranslate: maxTranslate, 48628 translateTo: translateTo 48629}; 48630function setTransition(duration, byController) { 48631 var swiper = this; 48632 if (!swiper.params.cssMode) { 48633 swiper.wrapperEl.style.transitionDuration = "".concat(duration, "ms"); 48634 swiper.wrapperEl.style.transitionDelay = duration === 0 ? "0ms" : ''; 48635 } 48636 swiper.emit('setTransition', duration, byController); 48637} 48638function transitionEmit(_ref5) { 48639 var swiper = _ref5.swiper, 48640 runCallbacks = _ref5.runCallbacks, 48641 direction = _ref5.direction, 48642 step = _ref5.step; 48643 var activeIndex = swiper.activeIndex, 48644 previousIndex = swiper.previousIndex; 48645 var dir = direction; 48646 if (!dir) { 48647 if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset'; 48648 } 48649 swiper.emit("transition".concat(step)); 48650 if (runCallbacks && dir === 'reset') { 48651 swiper.emit("slideResetTransition".concat(step)); 48652 } else if (runCallbacks && activeIndex !== previousIndex) { 48653 swiper.emit("slideChangeTransition".concat(step)); 48654 if (dir === 'next') { 48655 swiper.emit("slideNextTransition".concat(step)); 48656 } else { 48657 swiper.emit("slidePrevTransition".concat(step)); 48658 } 48659 } 48660} 48661function transitionStart() { 48662 var runCallbacks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; 48663 var direction = arguments.length > 1 ? arguments[1] : undefined; 48664 var swiper = this; 48665 var params = swiper.params; 48666 if (params.cssMode) return; 48667 if (params.autoHeight) { 48668 swiper.updateAutoHeight(); 48669 } 48670 transitionEmit({ 48671 swiper: swiper, 48672 runCallbacks: runCallbacks, 48673 direction: direction, 48674 step: 'Start' 48675 }); 48676} 48677function transitionEnd() { 48678 var runCallbacks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; 48679 var direction = arguments.length > 1 ? arguments[1] : undefined; 48680 var swiper = this; 48681 var params = swiper.params; 48682 swiper.animating = false;
48683 if (params.cssMode) return; 48684 swiper.setTransition(0); 48685 transitionEmit({ 48686 swiper: swiper, 48687 runCallbacks: runCallbacks, 48688 direction: direction, 48689 step: 'End' 48690 }); 48691} 48692var transition = { 48693 setTransition: setTransition, 48694 transitionStart: transitionStart, 48695 transitionEnd: transitionEnd 48696}; 48697function slideTo() { 48698 var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; 48699 var speed = arguments.length > 1 ? arguments[1] : undefined; 48700 var runCallbacks = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; 48701 var internal = arguments.length > 3 ? arguments[3] : undefined; 48702 var initial = arguments.length > 4 ? arguments[4] : undefined; 48703 if (typeof index === 'string') { 48704 index = parseInt(index, 10); 48705 } 48706 var swiper = this; 48707 var slideIndex = index; 48708 if (slideIndex < 0) slideIndex = 0; 48709 var params = swiper.params, 48710 snapGrid = swiper.snapGrid, 48711 slidesGrid = swiper.slidesGrid, 48712 previousIndex = swiper.previousIndex, 48713 activeIndex = swiper.activeIndex, 48714 rtl = swiper.rtlTranslate, 48715 wrapperEl = swiper.wrapperEl, 48716 enabled = swiper.enabled; 48717 if (!enabled && !internal && !initial || swiper.destroyed || swiper.animating && params.preventInteractionOnTransition) { 48718 return false; 48719 } 48720 if (typeof speed === 'undefined') { 48721 speed = swiper.params.speed; 48722 } 48723 var skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex); 48724 var snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup); 48725 if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1; 48726 var translate = -snapGrid[snapIndex]; 48727 // Normalize slideIndex 48728 if (params.normalizeSlideIndex) { 48729 for (var i = 0; i < slidesGrid.length; i += 1) { 48730 var normalizedTranslate = -Math.floor(translate * 100); 48731 var normalizedGrid = Math.floor(slidesGrid[i] * 100); 48732 var normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100); 48733 if (typeof slidesGrid[i + 1] !== 'undefined') { 48734 if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) { 48735 slideIndex = i; 48736 } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) { 48737 slideIndex = i + 1; 48738 } 48739 } else if (normalizedTranslate >= normalizedGrid) { 48740 slideIndex = i; 48741 } 48742 } 48743 } 48744 // Directions locks 48745 if (swiper.initialized && slideIndex !== activeIndex) { 48746 if (!swiper.allowSlideNext && (rtl ? translate > swiper.translate && translate > swiper.minTranslate() : translate < swiper.translate && translate < swiper.minTranslate())) { 48747 return false; 48748 } 48749 if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) { 48750 if ((activeIndex || 0) !== slideIndex) { 48751 return false; 48752 } 48753 } 48754 } 48755 if (slideIndex !== (previousIndex || 0) && runCallbacks) { 48756 swiper.emit('beforeSlideChangeStart'); 48757 } 48758 48759 // Update progress 48760 swiper.updateProgress(translate); 48761 var direction; 48762 if (slideIndex > activeIndex) direction = 'next';else if (slideIndex < activeIndex) direction = 'prev';else direction = 'reset'; 48763 48764 // initial virtual 48765 var isVirtual = swiper.virtual && swiper.params.virtual.enabled; 48766 var isInitialVirtual = isVirtual && initial; 48767 // Update Index 48768 if (!isInitialVirtual && (rtl && -translate === swiper.translate || !rtl && translate === swiper.translate)) { 48769 swiper.updateActiveIndex(slideIndex); 48770 // Update Height 48771 if (params.autoHeight) { 48772 swiper.updateAutoHeight(); 48773 } 48774 swiper.updateSlidesClasses(); 48775 if (params.effect !== 'slide') { 48776 swiper.setTranslate(translate); 48777 } 48778 if (direction !== 'reset') { 48779 swiper.transitionStart(runCallbacks, direction); 48780 swiper.transitionEnd(runCallbacks, direction); 48781 } 48782 return false; 48783 } 48784 if (params.cssMode) { 48785 var isH = swiper.isHorizontal(); 48786 var t = rtl ? translate : -translate; 48787 if (speed === 0) { 48788 if (isVirtual) { 48789 swiper.wrapperEl.style.scrollSnapType = 'none'; 48790 swiper._immediateVirtual = true; 48791 } 48792 if (isVirtual && !swiper._cssModeVirtualInitialSet && swiper.params.initialSlide > 0) { 48793 swiper._cssModeVirtualInitialSet = true; 48794 requestAnimationFrame(function () { 48795 wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t; 48796 }); 48797 } else { 48798 wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t; 48799 } 48800 if (isVirtual) { 48801 requestAnimationFrame(function () { 48802 swiper.wrapperEl.style.scrollSnapType = ''; 48803 swiper._immediateVirtual = false;
48804 }); 48805 } 48806 } else { 48807 if (!swiper.support.smoothScroll) { 48808 (0, _utils.u)({ 48809 swiper: swiper, 48810 targetPosition: t, 48811 side: isH ? 'left' : 'top' 48812 }); 48813 return true; 48814 } 48815 wrapperEl.scrollTo((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, isH ? 'left' : 'top', t), "behavior", 'smooth')); 48816 } 48817 return true; 48818 } 48819 var browser = getBrowser(); 48820 var isSafari = browser.isSafari; 48821 if (isVirtual && !initial && isSafari && swiper.isElement) { 48822 swiper.virtual.update(false, false, slideIndex); 48823 } 48824 swiper.setTransition(speed); 48825 swiper.setTranslate(translate); 48826 swiper.updateActiveIndex(slideIndex); 48827 swiper.updateSlidesClasses(); 48828 swiper.emit('beforeTransitionStart', speed, internal); 48829 swiper.transitionStart(runCallbacks, direction); 48830 if (speed === 0) { 48831 swiper.transitionEnd(runCallbacks, direction); 48832 } else if (!swiper.animating) { 48833 swiper.animating = true; 48834 if (!swiper.onSlideToWrapperTransitionEnd) { 48835 swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) { 48836 if (!swiper || swiper.destroyed) return; 48837 if (e.target !== this) return; 48838 swiper.wrapperEl.removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd); 48839 swiper.onSlideToWrapperTransitionEnd = null; 48840 delete swiper.onSlideToWrapperTransitionEnd; 48841 swiper.transitionEnd(runCallbacks, direction); 48842 }; 48843 } 48844 swiper.wrapperEl.addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd); 48845 } 48846 return true; 48847} 48848function slideToLoop() { 48849 var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; 48850 var speed = arguments.length > 1 ? arguments[1] : undefined; 48851 var runCallbacks = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; 48852 var internal = arguments.length > 3 ? arguments[3] : undefined; 48853 if (typeof index === 'string') { 48854 var indexAsNumber = parseInt(index, 10); 48855 index = indexAsNumber; 48856 } 48857 var swiper = this; 48858 if (swiper.destroyed) return; 48859 if (typeof speed === 'undefined') { 48860 speed = swiper.params.speed; 48861 } 48862 var gridEnabled = swiper.grid && swiper.params.grid && swiper.params.grid.rows > 1; 48863 var newIndex = index; 48864 if (swiper.params.loop) { 48865 if (swiper.virtual && swiper.params.virtual.enabled) { 48866 // eslint-disable-next-line 48867 newIndex = newIndex + swiper.virtual.slidesBefore; 48868 } else { 48869 var targetSlideIndex; 48870 if (gridEnabled) { 48871 var slideIndex = newIndex * swiper.params.grid.rows; 48872 targetSlideIndex = swiper.slides.find(function (slideEl) { 48873 return slideEl.getAttribute('data-swiper-slide-index') * 1 === slideIndex; 48874 }).column; 48875 } else { 48876 targetSlideIndex = swiper.getSlideIndexByData(newIndex); 48877 } 48878 var cols = gridEnabled ? Math.ceil(swiper.slides.length / swiper.params.grid.rows) : swiper.slides.length; 48879 var _swiper$params = swiper.params, 48880 centeredSlides = _swiper$params.centeredSlides, 48881 slidesOffsetBefore = _swiper$params.slidesOffsetBefore, 48882 slidesOffsetAfter = _swiper$params.slidesOffsetAfter; 48883 var bothDirections = centeredSlides || !!slidesOffsetBefore || !!slidesOffsetAfter; 48884 var slidesPerView = swiper.params.slidesPerView; 48885 if (slidesPerView === 'auto') { 48886 slidesPerView = swiper.slidesPerViewDynamic(); 48887 } else { 48888 slidesPerView = Math.ceil(parseFloat(swiper.params.slidesPerView, 10)); 48889 if (bothDirections && slidesPerView % 2 === 0) { 48890 slidesPerView = slidesPerView + 1; 48891 } 48892 } 48893 var needLoopFix = cols - targetSlideIndex < slidesPerView; 48894 if (bothDirections) { 48895 needLoopFix = needLoopFix || targetSlideIndex < Math.ceil(slidesPerView / 2); 48896 } 48897 if (internal && bothDirections && swiper.params.slidesPerView !== 'auto' && !gridEnabled) { 48898 needLoopFix = false; 48899 } 48900 if (needLoopFix) { 48901 var direction = bothDirections ? targetSlideIndex < swiper.activeIndex ? 'prev' : 'next' : targetSlideIndex - swiper.activeIndex - 1 < swiper.params.slidesPerView ? 'next' : 'prev'; 48902 swiper.loopFix({ 48903 direction: direction, 48904 slideTo: true, 48905 activeSlideIndex: direction === 'next' ? targetSlideIndex + 1 : targetSlideIndex - cols + 1, 48906 slideRealIndex: direction === 'next' ? swiper.realIndex : undefined 48907 }); 48908 } 48909 if (gridEnabled) { 48910 var _slideIndex = newIndex * swiper.params.grid.rows; 48911 newIndex = swiper.slides.find(function (slideEl) { 48912 return slideEl.getAttribute('data-swiper-slide-index') * 1 === _slideIndex; 48913 }).column; 48914 } else { 48915 newIndex = swiper.getSlideIndexByData(newIndex); 48916 } 48917 } 48918 } 48919 requestAnimationFrame(function () { 48920 swiper.slideTo(newIndex, speed, runCallbacks, internal); 48921 }); 48922 return swiper; 48923} 48924 48925/* eslint no-unused-vars: "off" */ 48926function slideNext(speed) { 48927 var runCallbacks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; 48928 var internal = arguments.length > 2 ? arguments[2] : undefined; 48929 var swiper = this; 48930 var enabled = swiper.enabled, 48931 params = swiper.params, 48932 animating = swiper.animating; 48933 if (!enabled || swiper.destroyed) return swiper; 48934 if (typeof speed === 'undefined') { 48935 speed = swiper.params.speed; 48936 } 48937 var perGroup = params.slidesPerGroup; 48938 if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) { 48939 perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1); 48940 } 48941 var increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup; 48942 var isVirtual = swiper.virtual && params.virtual.enabled; 48943 if (params.loop) { 48944 if (animating && !isVirtual && params.loopPreventsSliding) return false;
48945 swiper.loopFix({ 48946 direction: 'next' 48947 }); 48948 // eslint-disable-next-line 48949 swiper._clientLeft = swiper.wrapperEl.clientLeft; 48950 if (swiper.activeIndex === swiper.slides.length - 1 && params.cssMode) { 48951 requestAnimationFrame(function () { 48952 swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal); 48953 }); 48954 return true; 48955 } 48956 } 48957 if (params.rewind && swiper.isEnd) { 48958 return swiper.slideTo(0, speed, runCallbacks, internal); 48959 } 48960 return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal); 48961} 48962 48963/* eslint no-unused-vars: "off" */ 48964function slidePrev(speed) { 48965 var runCallbacks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; 48966 var internal = arguments.length > 2 ? arguments[2] : undefined; 48967 var swiper = this; 48968 var params = swiper.params, 48969 snapGrid = swiper.snapGrid, 48970 slidesGrid = swiper.slidesGrid, 48971 rtlTranslate = swiper.rtlTranslate, 48972 enabled = swiper.enabled, 48973 animating = swiper.animating; 48974 if (!enabled || swiper.destroyed) return swiper; 48975 if (typeof speed === 'undefined') { 48976 speed = swiper.params.speed; 48977 } 48978 var isVirtual = swiper.virtual && params.virtual.enabled; 48979 if (params.loop) { 48980 if (animating && !isVirtual && params.loopPreventsSliding) return false; 48981 swiper.loopFix({ 48982 direction: 'prev' 48983 }); 48984 // eslint-disable-next-line 48985 swiper._clientLeft = swiper.wrapperEl.clientLeft; 48986 } 48987 var translate = rtlTranslate ? swiper.translate : -swiper.translate; 48988 function normalize(val) { 48989 if (val < 0) return -Math.floor(Math.abs(val)); 48990 return Math.floor(val); 48991 } 48992 var normalizedTranslate = normalize(translate); 48993 var normalizedSnapGrid = snapGrid.map(function (val) { 48994 return normalize(val); 48995 }); 48996 var isFreeMode = params.freeMode && params.freeMode.enabled; 48997 var prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1]; 48998 if (typeof prevSnap === 'undefined' && (params.cssMode || isFreeMode)) { 48999 var prevSnapIndex; 49000 snapGrid.forEach(function (snap, snapIndex) { 49001 if (normalizedTranslate >= snap) { 49002 // prevSnap = snap; 49003 prevSnapIndex = snapIndex; 49004 } 49005 }); 49006 if (typeof prevSnapIndex !== 'undefined') { 49007 prevSnap = isFreeMode ? snapGrid[prevSnapIndex] : snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex]; 49008 } 49009 } 49010 var prevIndex = 0; 49011 if (typeof prevSnap !== 'undefined') { 49012 prevIndex = slidesGrid.indexOf(prevSnap); 49013 if (prevIndex < 0) prevIndex = swiper.activeIndex - 1; 49014 if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) { 49015 prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1; 49016 prevIndex = Math.max(prevIndex, 0); 49017 } 49018 } 49019 if (params.rewind && swiper.isBeginning) { 49020 var lastIndex = swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1; 49021 return swiper.slideTo(lastIndex, speed, runCallbacks, internal); 49022 } else if (params.loop && swiper.activeIndex === 0 && params.cssMode) { 49023 requestAnimationFrame(function () { 49024 swiper.slideTo(prevIndex, speed, runCallbacks, internal); 49025 }); 49026 return true; 49027 } 49028 return swiper.slideTo(prevIndex, speed, runCallbacks, internal); 49029} 49030 49031/* eslint no-unused-vars: "off" */ 49032function slideReset(speed) { 49033 var runCallbacks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; 49034 var internal = arguments.length > 2 ? arguments[2] : undefined; 49035 var swiper = this; 49036 if (swiper.destroyed) return; 49037 if (typeof speed === 'undefined') { 49038 speed = swiper.params.speed; 49039 } 49040 return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal); 49041} 49042 49043/* eslint no-unused-vars: "off" */ 49044function slideToClosest(speed) { 49045 var runCallbacks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; 49046 var internal = arguments.length > 2 ? arguments[2] : undefined; 49047 var threshold = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0.5; 49048 var swiper = this; 49049 if (swiper.destroyed) return; 49050 if (typeof speed === 'undefined') { 49051 speed = swiper.params.speed; 49052 } 49053 var index = swiper.activeIndex; 49054 var skip = Math.min(swiper.params.slidesPerGroupSkip, index); 49055 var snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);
49056 var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate; 49057 if (translate >= swiper.snapGrid[snapIndex]) { 49058 // The current translate is on or after the current snap index, so the choice 49059 // is between the current index and the one after it. 49060 var currentSnap = swiper.snapGrid[snapIndex]; 49061 var nextSnap = swiper.snapGrid[snapIndex + 1]; 49062 if (translate - currentSnap > (nextSnap - currentSnap) * threshold) { 49063 index += swiper.params.slidesPerGroup; 49064 } 49065 } else { 49066 // The current translate is before the current snap index, so the choice 49067 // is between the current index and the one before it. 49068 var prevSnap = swiper.snapGrid[snapIndex - 1]; 49069 var _currentSnap = swiper.snapGrid[snapIndex]; 49070 if (translate - prevSnap <= (_currentSnap - prevSnap) * threshold) { 49071 index -= swiper.params.slidesPerGroup; 49072 } 49073 } 49074 index = Math.max(index, 0); 49075 index = Math.min(index, swiper.slidesGrid.length - 1); 49076 return swiper.slideTo(index, speed, runCallbacks, internal); 49077} 49078function slideToClickedSlide() { 49079 var swiper = this; 49080 if (swiper.destroyed) return; 49081 var params = swiper.params, 49082 slidesEl = swiper.slidesEl; 49083 var slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView; 49084 var slideToIndex = swiper.getSlideIndexWhenGrid(swiper.clickedIndex); 49085 var realIndex; 49086 var slideSelector = swiper.isElement ? "swiper-slide" : ".".concat(params.slideClass); 49087 var isGrid = swiper.grid && swiper.params.grid && swiper.params.grid.rows > 1; 49088 if (params.loop) { 49089 if (swiper.animating) return; 49090 realIndex = parseInt(swiper.clickedSlide.getAttribute('data-swiper-slide-index'), 10); 49091 if (params.centeredSlides) { 49092 swiper.slideToLoop(realIndex); 49093 } else if (slideToIndex > (isGrid ? (swiper.slides.length - slidesPerView) / 2 - (swiper.params.grid.rows - 1) : swiper.slides.length - slidesPerView)) { 49094 swiper.loopFix(); 49095 slideToIndex = swiper.getSlideIndex((0, _utils.e)(slidesEl, "".concat(slideSelector, "[data-swiper-slide-index=\"").concat(realIndex, "\"]"))[0]); 49096 (0, _utils.n)(function () { 49097 swiper.slideTo(slideToIndex); 49098 }); 49099 } else { 49100 swiper.slideTo(slideToIndex); 49101 } 49102 } else { 49103 swiper.slideTo(slideToIndex); 49104 } 49105} 49106var slide = { 49107 slideTo: slideTo, 49108 slideToLoop: slideToLoop, 49109 slideNext: slideNext, 49110 slidePrev: slidePrev, 49111 slideReset: slideReset, 49112 slideToClosest: slideToClosest, 49113 slideToClickedSlide: slideToClickedSlide 49114}; 49115function loopCreate(slideRealIndex, initial) { 49116 var swiper = this; 49117 var params = swiper.params, 49118 slidesEl = swiper.slidesEl; 49119 if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) return; 49120 var initSlides = function initSlides() { 49121 var slides = (0, _utils.e)(slidesEl, ".".concat(params.slideClass, ", swiper-slide")); 49122 slides.forEach(function (el, index) { 49123 el.setAttribute('data-swiper-slide-index', index); 49124 }); 49125 }; 49126 var clearBlankSlides = function clearBlankSlides() { 49127 var slides = (0, _utils.e)(slidesEl, ".".concat(params.slideBlankClass)); 49128 slides.forEach(function (el) { 49129 el.remove(); 49130 }); 49131 if (slides.length > 0) { 49132 swiper.recalcSlides(); 49133 swiper.updateSlides(); 49134 } 49135 }; 49136 var gridEnabled = swiper.grid && params.grid && params.grid.rows > 1; 49137 if (params.loopAddBlankSlides && (params.slidesPerGroup > 1 || gridEnabled)) { 49138 clearBlankSlides(); 49139 } 49140 var slidesPerGroup = params.slidesPerGroup * (gridEnabled ? params.grid.rows : 1); 49141 var shouldFillGroup = swiper.slides.length % slidesPerGroup !== 0; 49142 var shouldFillGrid = gridEnabled && swiper.slides.length % params.grid.rows !== 0; 49143 var addBlankSlides = function addBlankSlides(amountOfSlides) { 49144 for (var i = 0; i < amountOfSlides; i += 1) { 49145 var slideEl = swiper.isElement ? (0, _utils.c)('swiper-slide', [params.slideBlankClass]) : (0, _utils.c)('div', [params.slideClass, params.slideBlankClass]); 49146 swiper.slidesEl.append(slideEl); 49147 } 49148 }; 49149 if (shouldFillGroup) { 49150 if (params.loopAddBlankSlides) { 49151 var slidesToAdd = slidesPerGroup - swiper.slides.length % slidesPerGroup; 49152 addBlankSlides(slidesToAdd); 49153 swiper.recalcSlides(); 49154 swiper.updateSlides(); 49155 } else { 49156 (0, _utils.v)('Swiper Loop Warning: The number of slides is not even to slidesPerGroup, loop mode may
49156not function properly. You need to add more slides (or make duplicates, or empty slides)'); 49157 } 49158 initSlides(); 49159 } else if (shouldFillGrid) { 49160 if (params.loopAddBlankSlides) { 49161 var _slidesToAdd = params.grid.rows - swiper.slides.length % params.grid.rows; 49162 addBlankSlides(_slidesToAdd); 49163 swiper.recalcSlides(); 49164 swiper.updateSlides(); 49165 } else { 49166 (0, _utils.v)('Swiper Loop Warning: The number of slides is not even to grid.rows, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)'); 49167 } 49168 initSlides(); 49169 } else { 49170 initSlides(); 49171 } 49172 var bothDirections = params.centeredSlides || !!params.slidesOffsetBefore || !!params.slidesOffsetAfter; 49173 swiper.loopFix({ 49174 slideRealIndex: slideRealIndex, 49175 direction: bothDirections ? undefined : 'next', 49176 initial: initial 49177 }); 49178} 49179function loopFix() { 49180 var _ref6 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, 49181 slideRealIndex = _ref6.slideRealIndex, 49182 _ref6$slideTo = _ref6.slideTo, 49183 slideTo = _ref6$slideTo === void 0 ? true : _ref6$slideTo, 49184 direction = _ref6.direction, 49185 setTranslate = _ref6.setTranslate, 49186 activeSlideIndex = _ref6.activeSlideIndex, 49187 initial = _ref6.initial, 49188 byController = _ref6.byController, 49189 byMousewheel = _ref6.byMousewheel; 49190 var swiper = this; 49191 if (!swiper.params.loop) return; 49192 swiper.emit('beforeLoopFix'); 49193 var slides = swiper.slides, 49194 allowSlidePrev = swiper.allowSlidePrev, 49195 allowSlideNext = swiper.allowSlideNext, 49196 slidesEl = swiper.slidesEl, 49197 params = swiper.params; 49198 var centeredSlides = params.centeredSlides, 49199 slidesOffsetBefore = params.slidesOffsetBefore, 49200 slidesOffsetAfter = params.slidesOffsetAfter, 49201 initialSlide = params.initialSlide; 49202 var bothDirections = centeredSlides || !!slidesOffsetBefore || !!slidesOffsetAfter; 49203 swiper.allowSlidePrev = true; 49204 swiper.allowSlideNext = true; 49205 if (swiper.virtual && params.virtual.enabled) { 49206 if (slideTo) { 49207 if (!bothDirections && swiper.snapIndex === 0) { 49208 swiper.slideTo(swiper.virtual.slides.length, 0, false, true); 49209 } else if (bothDirections && swiper.snapIndex < params.slidesPerView) { 49210 swiper.slideTo(swiper.virtual.slides.length + swiper.snapIndex, 0, false, true); 49211 } else if (swiper.snapIndex === swiper.snapGrid.length - 1) { 49212 swiper.slideTo(swiper.virtual.slidesBefore, 0, false, true); 49213 } 49214 } 49215 swiper.allowSlidePrev = allowSlidePrev; 49216 swiper.allowSlideNext = allowSlideNext; 49217 swiper.emit('loopFix'); 49218 return; 49219 } 49220 var slidesPerView = params.slidesPerView; 49221 if (slidesPerView === 'auto') { 49222 slidesPerView = swiper.slidesPerViewDynamic(); 49223 } else { 49224 slidesPerView = Math.ceil(parseFloat(params.slidesPerView, 10)); 49225 if (bothDirections && slidesPerView % 2 === 0) { 49226 slidesPerView = slidesPerView + 1; 49227 } 49228 } 49229 var slidesPerGroup = params.slidesPerGroupAuto ? slidesPerView : params.slidesPerGroup; 49230 var loopedSlides = bothDirections ? Math.max(slidesPerGroup, Math.ceil(slidesPerView / 2)) : slidesPerGroup; 49231 if (loopedSlides % slidesPerGroup !== 0) { 49232 loopedSlides += slidesPerGroup - loopedSlides % slidesPerGroup; 49233 } 49234 loopedSlides += params.loopAdditionalSlides; 49235 swiper.loopedSlides = loopedSlides; 49236 var gridEnabled = swiper.grid && params.grid && params.grid.rows > 1; 49237 if (slides.length < slidesPerView + loopedSlides || swiper.params.effect === 'cards' && slides.length < slidesPerView + loopedSlides * 2) { 49238 (0, _utils.v)('Swiper Loop Warning: The number of slides is not enough for loop mode, it will be disabled or not function properly. You need to add more slides (or make duplicates) or lower the values of slidesPerView and slidesPerGroup parameters'); 49239 } else if (gridEnabled && params.grid.fill === 'row') { 49240 (0, _utils.v)('Swiper Loop Warning: Loop mode is not compatible with grid.fill = `row`'); 49241 } 49242 var prependSlidesIndexes = []; 49243 var appendSlidesIndexes = []; 49244 var cols = gridEnabled ? Math.ceil(slides.length / params.grid.rows) : slides.length; 49245 var isInitialOverflow = initial && cols - initialSlide < slidesPerView && !bothDirections; 49246 var activeIndex = isInitialOverflow ? initialSlide : swiper.activeIndex; 49247 if (typeof activeSlideIndex === 'undefined') { 49248 activeSlideIndex = swiper.getSlideIndex(slides.find(function (el) { 49249 return el.classList.contains(params.slideActiveClass); 49250 })); 49251 } else { 49252 activeIndex = activeSlideIndex; 49253 } 49254 var isNext = direction === 'next' || !direction; 49255 var isPrev = direction === 'prev' || !direction; 49256 var slidesPrepended = 0; 49257 var slidesAppended = 0; 49258 var activeColIndex = gridEnabled ? slides[activeSlideIndex].column : activeSlideIndex; 49259 var activeColIndexWithShift = activeColIndex + (bothDirections && typeof setTranslate === 'undefined' ? -slidesPerView / 2 + 0.5 : 0); 49260 // prepend last slides before start 49261 if (activeColIndexWithShift < loopedSlides) { 49262 slidesPrepended = Math.max(loopedSlides - activeColIndexWithShift, slidesPerGroup); 49263 for (var i = 0; i < loopedSlides - activeColIndexWithShift; i += 1) {
49264 var index = i - Math.floor(i / cols) * cols; 49265 if (gridEnabled) { 49266 var colIndexToPrepend = cols - index - 1; 49267 for (var _i6 = slides.length - 1; _i6 >= 0; _i6 -= 1) { 49268 if (slides[_i6].column === colIndexToPrepend) prependSlidesIndexes.push(_i6); 49269 } 49270 // slides.forEach((slide, slideIndex) => { 49271 // if (slide.column === colIndexToPrepend) prependSlidesIndexes.push(slideIndex); 49272 // }); 49273 } else { 49274 prependSlidesIndexes.push(cols - index - 1); 49275 } 49276 } 49277 } else if (activeColIndexWithShift + slidesPerView > cols - loopedSlides) { 49278 slidesAppended = Math.max(activeColIndexWithShift - (cols - loopedSlides * 2), slidesPerGroup); 49279 if (isInitialOverflow) { 49280 slidesAppended = Math.max(slidesAppended, slidesPerView - cols + initialSlide + 1); 49281 } 49282 var _loop = function _loop() { 49283 var index = _i7 - Math.floor(_i7 / cols) * cols; 49284 if (gridEnabled) { 49285 slides.forEach(function (slide, slideIndex) { 49286 if (slide.column === index) appendSlidesIndexes.push(slideIndex); 49287 }); 49288 } else { 49289 appendSlidesIndexes.push(index); 49290 } 49291 }; 49292 for (var _i7 = 0; _i7 < slidesAppended; _i7 += 1) { 49293 _loop(); 49294 } 49295 } 49296 swiper.__preventObserver__ = true; 49297 requestAnimationFrame(function () { 49298 swiper.__preventObserver__ = false; 49299 }); 49300 if (swiper.params.effect === 'cards' && slides.length < slidesPerView + loopedSlides * 2) { 49301 if (appendSlidesIndexes.includes(activeSlideIndex)) { 49302 appendSlidesIndexes.splice(appendSlidesIndexes.indexOf(activeSlideIndex), 1); 49303 } 49304 if (prependSlidesIndexes.includes(activeSlideIndex)) { 49305 prependSlidesIndexes.splice(prependSlidesIndexes.indexOf(activeSlideIndex), 1); 49306 } 49307 } 49308 if (isPrev) { 49309 prependSlidesIndexes.forEach(function (index) { 49310 slides[index].swiperLoopMoveDOM = true; 49311 slidesEl.prepend(slides[index]); 49312 slides[index].swiperLoopMoveDOM = false; 49313 }); 49314 } 49315 if (isNext) { 49316 appendSlidesIndexes.forEach(function (index) { 49317 slides[index].swiperLoopMoveDOM = true; 49318 slidesEl.append(slides[index]); 49319 slides[index].swiperLoopMoveDOM = false; 49320 }); 49321 } 49322 swiper.recalcSlides(); 49323 if (params.slidesPerView === 'auto') { 49324 swiper.updateSlides(); 49325 } else if (gridEnabled && (prependSlidesIndexes.length > 0 && isPrev || appendSlidesIndexes.length > 0 && isNext)) { 49326 swiper.slides.forEach(function (slide, slideIndex) { 49327 swiper.grid.updateSlide(slideIndex, slide, swiper.slides); 49328 }); 49329 } 49330 if (params.watchSlidesProgress) { 49331 swiper.updateSlidesOffset(); 49332 } 49333 if (slideTo) { 49334 if (prependSlidesIndexes.length > 0 && isPrev) { 49335 if (typeof slideRealIndex === 'undefined') { 49336 var currentSlideTranslate = swiper.slidesGrid[activeIndex]; 49337 var newSlideTranslate = swiper.slidesGrid[activeIndex + slidesPrepended]; 49338 var diff = newSlideTranslate - currentSlideTranslate; 49339 if (byMousewheel) { 49340 swiper.setTranslate(swiper.translate - diff); 49341 } else { 49342 swiper.slideTo(activeIndex + Math.ceil(slidesPrepended), 0, false, true); 49343 if (setTranslate) { 49344 swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - diff; 49345 swiper.touchEventsData.currentTranslate = swiper.touchEventsData.currentTranslate - diff; 49346 } 49347 } 49348 } else { 49349 if (setTranslate) { 49350 var shift = gridEnabled ? prependSlidesIndexes.length / params.grid.rows : prependSlidesIndexes.length; 49351 swiper.slideTo(swiper.activeIndex + shift, 0, false, true); 49352 swiper.touchEventsData.currentTranslate = swiper.translate; 49353 } 49354 } 49355 } else if (appendSlidesIndexes.length > 0 && isNext) { 49356 if (typeof slideRealIndex === 'undefined') { 49357 var _currentSlideTranslate = swiper.slidesGrid[activeIndex]; 49358 var _newSlideTranslate = swiper.slidesGrid[activeIndex - slidesAppended]; 49359 var _diff = _newSlideTranslate - _currentSlideTranslate; 49360 if (byMousewheel) { 49361 swiper.setTranslate(swiper.translate - _diff); 49362 } else { 49363 swiper.slideTo(activeIndex - slidesAppended, 0, false, true); 49364 if (setTranslate) { 49365 swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - _diff; 49366 swiper.touchEventsData.currentTranslate = swiper.touchEventsData.currentTranslate - _diff; 49367 } 49368 } 49369 } else { 49370 var _shift = gridEnabled ? appendSlidesIndexes.length / params.grid.rows : appendSlidesIndexes.length; 49371 swiper.slideTo(swiper.activeIndex - _shift, 0, false, true); 49372 } 49373 } 49374 } 49375 swiper.allowSlidePrev = allowSlidePrev; 49376 swiper.allowSlideNext = allowSlideNext; 49377 if (swiper.controller && swiper.controller.control && !byController) { 49378 var loopParams = { 49379 slideRealIndex: slideRealIndex, 49380 direction: direction, 49381 setTranslate: setTranslate, 49382 activeSlideIndex: activeSlideIndex, 49383 byController: true 49384 }; 49385 if (Array.isArray(swiper.controller.control)) { 49386 swiper.controller.control.forEach(function (c) { 49387 if (!c.destroyed && c.params.loop) c.loopFix(_objectSpread(_objectSpread({}, loopParams), {}, { 49388 slideTo: c.params.slidesPerView === params.slidesPerView ? slideTo : false 49389 })); 49390 }); 49391 } else if (swiper.controller.control instanceof swiper.constructor && swiper.controller.control.params.loop) { 49392 swiper.controller.control.loopFix(_objectSpread(_objectSpread({}, loopParams), {}, { 49393 slideTo: swiper.controller.control.params.slidesPerView === params.slidesPerView ? slideTo : false 49394 })); 49395 } 49396 } 49397 swiper.emit('loopFix'); 49398} 49399function loopDestroy() { 49400 var swiper = this; 49401 var params = swiper.params, 49402 slidesEl = swiper.slidesEl; 49403 if (!params.loop || !slidesEl || swiper.virtual && swiper.params.virtual.enabled) return; 49404 swiper.recalcSlides(); 49405 var newSlidesOrder = [];
49406 swiper.slides.forEach(function (slideEl) { 49407 var index = typeof slideEl.swiperSlideIndex === 'undefined' ? slideEl.getAttribute('data-swiper-slide-index') * 1 : slideEl.swiperSlideIndex; 49408 newSlidesOrder[index] = slideEl; 49409 }); 49410 swiper.slides.forEach(function (slideEl) { 49411 slideEl.removeAttribute('data-swiper-slide-index'); 49412 }); 49413 newSlidesOrder.forEach(function (slideEl) { 49414 slidesEl.append(slideEl); 49415 }); 49416 swiper.recalcSlides(); 49417 swiper.slideTo(swiper.realIndex, 0); 49418} 49419var loop = { 49420 loopCreate: loopCreate, 49421 loopFix: loopFix, 49422 loopDestroy: loopDestroy 49423}; 49424function setGrabCursor(moving) { 49425 var swiper = this; 49426 if (!swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) return; 49427 var el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl; 49428 if (swiper.isElement) { 49429 swiper.__preventObserver__ = true; 49430 } 49431 el.style.cursor = 'move'; 49432 el.style.cursor = moving ? 'grabbing' : 'grab'; 49433 if (swiper.isElement) { 49434 requestAnimationFrame(function () { 49435 swiper.__preventObserver__ = false; 49436 }); 49437 } 49438} 49439function unsetGrabCursor() { 49440 var swiper = this; 49441 if (swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) { 49442 return; 49443 } 49444 if (swiper.isElement) { 49445 swiper.__preventObserver__ = true; 49446 } 49447 swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = ''; 49448 if (swiper.isElement) { 49449 requestAnimationFrame(function () { 49450 swiper.__preventObserver__ = false; 49451 }); 49452 } 49453} 49454var grabCursor = { 49455 setGrabCursor: setGrabCursor, 49456 unsetGrabCursor: unsetGrabCursor 49457}; 49458 49459// Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd 49460function closestElement(selector) { 49461 var base = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this; 49462 function __closestFrom(el) { 49463 if (!el || el === (0, _ssrWindowEsm.g)() || el === (0, _ssrWindowEsm.a)()) return null; 49464 if (el.assignedSlot) el = el.assignedSlot; 49465 var found = el.closest(selector); 49466 if (!found && !el.getRootNode) { 49467 return null; 49468 } 49469 return found || __closestFrom(el.getRootNode().host); 49470 } 49471 return __closestFrom(base); 49472} 49473function preventEdgeSwipe(swiper, event, startX) { 49474 var window = (0, _ssrWindowEsm.a)(); 49475 var params = swiper.params; 49476 var edgeSwipeDetection = params.edgeSwipeDetection; 49477 var edgeSwipeThreshold = params.edgeSwipeThreshold; 49478 if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) { 49479 if (edgeSwipeDetection === 'prevent') { 49480 event.preventDefault(); 49481 return true; 49482 } 49483 return false; 49484 } 49485 return true; 49486} 49487function onTouchStart(event) { 49488 var swiper = this; 49489 var document = (0, _ssrWindowEsm.g)(); 49490 var e = event; 49491 if (e.originalEvent) e = e.originalEvent; 49492 var data = swiper.touchEventsData; 49493 if (e.type === 'pointerdown') { 49494 if (data.pointerId !== null && data.pointerId !== e.pointerId) { 49495 return; 49496 } 49497 data.pointerId = e.pointerId; 49498 } else if (e.type === 'touchstart' && e.targetTouches.length === 1) { 49499 data.touchId = e.targetTouches[0].identifier; 49500 } 49501 if (e.type === 'touchstart') { 49502 // don't proceed touch event 49503 preventEdgeSwipe(swiper, e, e.targetTouches[0].pageX); 49504 return; 49505 } 49506 var params = swiper.params, 49507 touches = swiper.touches, 49508 enabled = swiper.enabled; 49509 if (!enabled) return; 49510 if (!params.simulateTouch && e.pointerType === 'mouse') return; 49511 if (swiper.animating && params.preventInteractionOnTransition) { 49512 return; 49513 } 49514 if (!swiper.animating && params.cssMode && params.loop) { 49515 swiper.loopFix(); 49516 } 49517 var targetEl = e.target; 49518 if (params.touchEventsTarget === 'wrapper') { 49519 if (!(0, _utils.w)(targetEl, swiper.wrapperEl)) return; 49520 } 49521 if ('which' in e && e.which === 3) return; 49522 if ('button' in e && e.button > 0) return; 49523 if (data.isTouched && data.isMoved) return; 49524 49525 // change target el for shadow root component 49526 var swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== ''; 49527 // eslint-disable-next-line 49528 var eventPath = e.composedPath ? e.composedPath() : e.path; 49529 if (swipingClassHasValue && e.target && e.target.shadowRoot && eventPath) { 49530 targetEl = eventPath[0]; 49531 } 49532 var noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : ".".concat(params.noSwipingClass); 49533 var isTargetShadow = !!(e.target && e.target.shadowRoot); 49534 49535 // use closestElement for shadow root element to get the actual closest for nested shadow root element 49536 if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, targetEl) : targetEl.closest(noSwipingSelector))) { 49537 swiper.allowClick = true; 49538 return; 49539 } 49540 if (params.swipeHandler) { 49541 if (!targetEl.closest(params.swipeHandler)) return; 49542 } 49543 touches.currentX = e.pageX; 49544 touches.currentY = e.pageY; 49545 var startX = touches.currentX; 49546 var startY = touches.currentY; 49547 49548 // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore 49549 49550 if (!preventEdgeSwipe(swiper, e, startX)) { 49551 return; 49552 } 49553 Object.assign(data, { 49554 isTouched: true, 49555 isMoved: false, 49556 allowTouchCallbacks: true, 49557 isScrolling: undefined, 49558 startMoving: undefined 49559 }); 49560 touches.startX = startX; 49561 touches.startY = startY; 49562 data.touchStartTime = (0, _utils.h)(); 49563 swiper.allowClick = true; 49564 swiper.updateSize(); 49565 swiper.swipeDirection = undefined; 49566 if (params.threshold > 0) data.allowThresholdMove = false;
49567 var preventDefault = true; 49568 if (targetEl.matches(data.focusableElements)) { 49569 preventDefault = false; 49570 if (targetEl.nodeName === 'SELECT') { 49571 data.isTouched = false; 49572 } 49573 } 49574 if (document.activeElement && document.activeElement.matches(data.focusableElements) && document.activeElement !== targetEl && (e.pointerType === 'mouse' || e.pointerType !== 'mouse' && !targetEl.matches(data.focusableElements))) { 49575 document.activeElement.blur(); 49576 } 49577 var shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault; 49578 if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !targetEl.isContentEditable) { 49579 e.preventDefault(); 49580 } 49581 if (params.freeMode && params.freeMode.enabled && swiper.freeMode && swiper.animating && !params.cssMode) { 49582 swiper.freeMode.onTouchStart(); 49583 } 49584 swiper.emit('touchStart', e); 49585} 49586function onTouchMove(event) { 49587 var document = (0, _ssrWindowEsm.g)(); 49588 var swiper = this; 49589 var data = swiper.touchEventsData; 49590 var params = swiper.params, 49591 touches = swiper.touches, 49592 rtl = swiper.rtlTranslate, 49593 enabled = swiper.enabled; 49594 if (!enabled) return; 49595 if (!params.simulateTouch && event.pointerType === 'mouse') return; 49596 var e = event; 49597 if (e.originalEvent) e = e.originalEvent; 49598 if (e.type === 'pointermove') { 49599 if (data.touchId !== null) return; // return from pointer if we use touch 49600 var id = e.pointerId; 49601 if (id !== data.pointerId) return; 49602 } 49603 var targetTouch; 49604 if (e.type === 'touchmove') { 49605 targetTouch = (0, _toConsumableArray2["default"])(e.changedTouches).find(function (t) { 49606 return t.identifier === data.touchId; 49607 }); 49608 if (!targetTouch || targetTouch.identifier !== data.touchId) return; 49609 } else { 49610 targetTouch = e; 49611 } 49612 if (!data.isTouched) { 49613 if (data.startMoving && data.isScrolling) { 49614 swiper.emit('touchMoveOpposite', e); 49615 } 49616 return; 49617 } 49618 var pageX = targetTouch.pageX; 49619 var pageY = targetTouch.pageY; 49620 if (e.preventedByNestedSwiper) { 49621 touches.startX = pageX; 49622 touches.startY = pageY; 49623 return; 49624 } 49625 if (!swiper.allowTouchMove) { 49626 if (!e.target.matches(data.focusableElements)) { 49627 swiper.allowClick = false; 49628 } 49629 if (data.isTouched) { 49630 Object.assign(touches, { 49631 startX: pageX, 49632 startY: pageY, 49633 currentX: pageX, 49634 currentY: pageY 49635 }); 49636 data.touchStartTime = (0, _utils.h)(); 49637 } 49638 return; 49639 } 49640 if (params.touchReleaseOnEdges && !params.loop) { 49641 if (swiper.isVertical()) { 49642 // Vertical 49643 if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) { 49644 data.isTouched = false; 49645 data.isMoved = false; 49646 return; 49647 } 49648 } else if (rtl && (pageX > touches.startX && -swiper.translate <= swiper.maxTranslate() || pageX < touches.startX && -swiper.translate >= swiper.minTranslate())) { 49649 return; 49650 } else if (!rtl && (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate())) { 49651 return; 49652 } 49653 } 49654 if (document.activeElement && document.activeElement.matches(data.focusableElements) && document.activeElement !== e.target && e.pointerType !== 'mouse') { 49655 document.activeElement.blur(); 49656 } 49657 if (document.activeElement) { 49658 if (e.target === document.activeElement && e.target.matches(data.focusableElements)) { 49659 data.isMoved = true; 49660 swiper.allowClick = false; 49661 return; 49662 } 49663 } 49664 if (data.allowTouchCallbacks) { 49665 swiper.emit('touchMove', e); 49666 } 49667 touches.previousX = touches.currentX; 49668 touches.previousY = touches.currentY; 49669 touches.currentX = pageX; 49670 touches.currentY = pageY; 49671 var diffX = touches.currentX - touches.startX; 49672 var diffY = touches.currentY - touches.startY; 49673 if (swiper.params.threshold && Math.sqrt(Math.pow(diffX, 2) + Math.pow(diffY, 2)) < swiper.params.threshold) return; 49674 if (typeof data.isScrolling === 'undefined') { 49675 var touchAngle; 49676 if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) { 49677 data.isScrolling = false;
vendor: 3,840 bytes, lines 49678-49781
49678 } else { 49679 // eslint-disable-next-line 49680 if (diffX * diffX + diffY * diffY >= 25) { 49681 touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI; 49682 data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle; 49683 } 49684 } 49685 } 49686 if (data.isScrolling) { 49687 swiper.emit('touchMoveOpposite', e); 49688 } 49689 if (typeof data.startMoving === 'undefined') { 49690 if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) { 49691 data.startMoving = true; 49692 } 49693 } 49694 if (data.isScrolling || e.type === 'touchmove' && data.preventTouchMoveFromPointerMove) { 49695 data.isTouched = false; 49696 return; 49697 } 49698 if (!data.startMoving) { 49699 return; 49700 } 49701 swiper.allowClick = false; 49702 if (!params.cssMode && e.cancelable) { 49703 e.preventDefault(); 49704 } 49705 if (params.touchMoveStopPropagation && !params.nested) { 49706 e.stopPropagation(); 49707 } 49708 var diff = swiper.isHorizontal() ? diffX : diffY; 49709 var touchesDiff = swiper.isHorizontal() ? touches.currentX - touches.previousX : touches.currentY - touches.previousY; 49710 if (params.oneWayMovement) { 49711 diff = Math.abs(diff) * (rtl ? 1 : -1); 49712 touchesDiff = Math.abs(touchesDiff) * (rtl ? 1 : -1); 49713 } 49714 touches.diff = diff; 49715 diff *= params.touchRatio; 49716 if (rtl) { 49717 diff = -diff; 49718 touchesDiff = -touchesDiff; 49719 } 49720 var prevTouchesDirection = swiper.touchesDirection; 49721 swiper.swipeDirection = diff > 0 ? 'prev' : 'next'; 49722 swiper.touchesDirection = touchesDiff > 0 ? 'prev' : 'next'; 49723 var isLoop = swiper.params.loop && !params.cssMode; 49724 var allowLoopFix = swiper.touchesDirection === 'next' && swiper.allowSlideNext || swiper.touchesDirection === 'prev' && swiper.allowSlidePrev; 49725 if (!data.isMoved) { 49726 if (isLoop && allowLoopFix) { 49727 swiper.loopFix({ 49728 direction: swiper.swipeDirection 49729 }); 49730 } 49731 data.startTranslate = swiper.getTranslate(); 49732 swiper.setTransition(0); 49733 if (swiper.animating) { 49734 var evt = new window.CustomEvent('transitionend', { 49735 bubbles: true, 49736 cancelable: true, 49737 detail: { 49738 bySwiperTouchMove: true 49739 } 49740 }); 49741 swiper.wrapperEl.dispatchEvent(evt); 49742 } 49743 data.allowMomentumBounce = false; 49744 // Grab Cursor 49745 if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) { 49746 swiper.setGrabCursor(true); 49747 } 49748 swiper.emit('sliderFirstMove', e); 49749 } 49750 var loopFixed; 49751 new Date().getTime(); 49752 if (params._loopSwapReset !== false && data.isMoved && data.allowThresholdMove && prevTouchesDirection !== swiper.touchesDirection && isLoop && allowLoopFix && Math.abs(diff) >= 1) { 49753 Object.assign(touches, { 49754 startX: pageX, 49755 startY: pageY, 49756 currentX: pageX, 49757 currentY: pageY, 49758 startTranslate: data.currentTranslate 49759 }); 49760 data.loopSwapReset = true; 49761 data.startTranslate = data.currentTranslate; 49762 return; 49763 } 49764 swiper.emit('sliderMove', e); 49765 data.isMoved = true; 49766 data.currentTranslate = diff + data.startTranslate; 49767 var disableParentSwiper = true; 49768 var resistanceRatio = params.resistanceRatio; 49769 if (params.touchReleaseOnEdges) { 49770 resistanceRatio = 0; 49771 } 49772 if (diff > 0) { 49773 if (isLoop && allowLoopFix && !loopFixed && data.allowThresholdMove && data.currentTranslate > (params.centeredSlides ? swiper.minTranslate() - swiper.slidesSizesGrid[swiper.activeIndex + 1] - (params.slidesPerView !== 'auto' && swiper.slides.length - params.slidesPerView >= 2 ? swiper.slidesSizesGrid[swiper.activeIndex + 1] + swiper.params.spaceBetween : 0) - swiper.params.spaceBetween : swiper.minTranslate())) { 49774 swiper.loopFix({ 49775 direction: 'prev', 49776 setTranslate: true, 49777 activeSlideIndex: 0 49778 }); 49779 } 49780 if (data.currentTranslate > swiper.minTranslate()) { 49781 disableParentSwiper = false;
49782 if (params.resistance) { 49783 data.currentTranslate = swiper.minTranslate() - 1 + Math.pow(-swiper.minTranslate() + data.startTranslate + diff, resistanceRatio); 49784 } 49785 } 49786 } else if (diff < 0) { 49787 if (isLoop && allowLoopFix && !loopFixed && data.allowThresholdMove && data.currentTranslate < (params.centeredSlides ? swiper.maxTranslate() + swiper.slidesSizesGrid[swiper.slidesSizesGrid.length - 1] + swiper.params.spaceBetween + (params.slidesPerView !== 'auto' && swiper.slides.length - params.slidesPerView >= 2 ? swiper.slidesSizesGrid[swiper.slidesSizesGrid.length - 1] + swiper.params.spaceBetween : 0) : swiper.maxTranslate())) { 49788 swiper.loopFix({ 49789 direction: 'next', 49790 setTranslate: true, 49791 activeSlideIndex: swiper.slides.length - (params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10))) 49792 }); 49793 } 49794 if (data.currentTranslate < swiper.maxTranslate()) { 49795 disableParentSwiper = false; 49796 if (params.resistance) { 49797 data.currentTranslate = swiper.maxTranslate() + 1 - Math.pow(swiper.maxTranslate() - data.startTranslate - diff, resistanceRatio); 49798 } 49799 } 49800 } 49801 if (disableParentSwiper) { 49802 e.preventedByNestedSwiper = true; 49803 } 49804 49805 // Directions locks 49806 if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) { 49807 data.currentTranslate = data.startTranslate; 49808 } 49809 if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) { 49810 data.currentTranslate = data.startTranslate; 49811 } 49812 if (!swiper.allowSlidePrev && !swiper.allowSlideNext) { 49813 data.currentTranslate = data.startTranslate; 49814 } 49815 49816 // Threshold 49817 if (params.threshold > 0) { 49818 if (Math.abs(diff) > params.threshold || data.allowThresholdMove) { 49819 if (!data.allowThresholdMove) { 49820 data.allowThresholdMove = true; 49821 touches.startX = touches.currentX; 49822 touches.startY = touches.currentY; 49823 data.currentTranslate = data.startTranslate; 49824 touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY; 49825 return; 49826 } 49827 } else { 49828 data.currentTranslate = data.startTranslate; 49829 return; 49830 } 49831 } 49832 if (!params.followFinger || params.cssMode) return; 49833 49834 // Update active index in free mode 49835 if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) { 49836 swiper.updateActiveIndex(); 49837 swiper.updateSlidesClasses(); 49838 } 49839 if (params.freeMode && params.freeMode.enabled && swiper.freeMode) { 49840 swiper.freeMode.onTouchMove(); 49841 } 49842 // Update progress 49843 swiper.updateProgress(data.currentTranslate); 49844 // Update translate 49845 swiper.setTranslate(data.currentTranslate); 49846} 49847function onTouchEnd(event) { 49848 var swiper = this; 49849 var data = swiper.touchEventsData; 49850 var e = event; 49851 if (e.originalEvent) e = e.originalEvent; 49852 var targetTouch; 49853 var isTouchEvent = e.type === 'touchend' || e.type === 'touchcancel'; 49854 if (!isTouchEvent) { 49855 if (data.touchId !== null) return; // return from pointer if we use touch 49856 if (e.pointerId !== data.pointerId) return; 49857 targetTouch = e; 49858 } else { 49859 targetTouch = (0, _toConsumableArray2["default"])(e.changedTouches).find(function (t) { 49860 return t.identifier === data.touchId; 49861 }); 49862 if (!targetTouch || targetTouch.identifier !== data.touchId) return; 49863 } 49864 if (['pointercancel', 'pointerout', 'pointerleave', 'contextmenu'].includes(e.type)) { 49865 var proceed = ['pointercancel', 'contextmenu'].includes(e.type) && (swiper.browser.isSafari || swiper.browser.isWebView); 49866 if (!proceed) { 49867 return; 49868 } 49869 } 49870 data.pointerId = null; 49871 data.touchId = null; 49872 var params = swiper.params, 49873 touches = swiper.touches, 49874 rtl = swiper.rtlTranslate, 49875 slidesGrid = swiper.slidesGrid, 49876 enabled = swiper.enabled; 49877 if (!enabled) return; 49878 if (!params.simulateTouch && e.pointerType === 'mouse') return; 49879 if (data.allowTouchCallbacks) { 49880 swiper.emit('touchEnd', e); 49881 } 49882 data.allowTouchCallbacks = false;
49883 if (!data.isTouched) { 49884 if (data.isMoved && params.grabCursor) { 49885 swiper.setGrabCursor(false); 49886 } 49887 data.isMoved = false; 49888 data.startMoving = false; 49889 return; 49890 } 49891 49892 // Return Grab Cursor 49893 if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) { 49894 swiper.setGrabCursor(false); 49895 } 49896 49897 // Time diff 49898 var touchEndTime = (0, _utils.h)(); 49899 var timeDiff = touchEndTime - data.touchStartTime; 49900 49901 // Tap, doubleTap, Click 49902 if (swiper.allowClick) { 49903 var pathTree = e.path || e.composedPath && e.composedPath(); 49904 swiper.updateClickedSlide(pathTree && pathTree[0] || e.target, pathTree); 49905 swiper.emit('tap click', e); 49906 if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) { 49907 swiper.emit('doubleTap doubleClick', e); 49908 } 49909 } 49910 data.lastClickTime = (0, _utils.h)(); 49911 (0, _utils.n)(function () { 49912 if (!swiper.destroyed) swiper.allowClick = true; 49913 }); 49914 if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 && !data.loopSwapReset || data.currentTranslate === data.startTranslate && !data.loopSwapReset) { 49915 data.isTouched = false; 49916 data.isMoved = false; 49917 data.startMoving = false; 49918 return; 49919 } 49920 data.isTouched = false; 49921 data.isMoved = false; 49922 data.startMoving = false; 49923 var currentPos; 49924 if (params.followFinger) { 49925 currentPos = rtl ? swiper.translate : -swiper.translate; 49926 } else { 49927 currentPos = -data.currentTranslate; 49928 } 49929 if (params.cssMode) { 49930 return; 49931 } 49932 if (params.freeMode && params.freeMode.enabled) { 49933 swiper.freeMode.onTouchEnd({ 49934 currentPos: currentPos 49935 }); 49936 return; 49937 } 49938 49939 // Find current slide 49940 var swipeToLast = currentPos >= -swiper.maxTranslate() && !swiper.params.loop; 49941 var stopIndex = 0; 49942 var groupSize = swiper.slidesSizesGrid[0]; 49943 for (var i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) { 49944 var _increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup; 49945 if (typeof slidesGrid[i + _increment] !== 'undefined') { 49946 if (swipeToLast || currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + _increment]) { 49947 stopIndex = i; 49948 groupSize = slidesGrid[i + _increment] - slidesGrid[i]; 49949 } 49950 } else if (swipeToLast || currentPos >= slidesGrid[i]) { 49951 stopIndex = i; 49952 groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2]; 49953 } 49954 } 49955 var rewindFirstIndex = null; 49956 var rewindLastIndex = null; 49957 if (params.rewind) { 49958 if (swiper.isBeginning) { 49959 rewindLastIndex = params.virtual && params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1; 49960 } else if (swiper.isEnd) { 49961 rewindFirstIndex = 0; 49962 } 49963 } 49964 // Find current slide size 49965 var ratio = (currentPos - slidesGrid[stopIndex]) / groupSize; 49966 var increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup; 49967 if (timeDiff > params.longSwipesMs) { 49968 // Long touches 49969 if (!params.longSwipes) { 49970 swiper.slideTo(swiper.activeIndex); 49971 return; 49972 } 49973 if (swiper.swipeDirection === 'next') { 49974 if (ratio >= params.longSwipesRatio) swiper.slideTo(params.rewind && swiper.isEnd ? rewindFirstIndex : stopIndex + increment);else swiper.slideTo(stopIndex); 49975 } 49976 if (swiper.swipeDirection === 'prev') { 49977 if (ratio > 1 - params.longSwipesRatio) { 49978 swiper.slideTo(stopIndex + increment); 49979 } else if (rewindLastIndex !== null && ratio < 0 && Math.abs(ratio) > params.longSwipesRatio) { 49980 swiper.slideTo(rewindLastIndex); 49981 } else { 49982 swiper.slideTo(stopIndex); 49983 } 49984 } 49985 } else { 49986 // Short swipes 49987 if (!params.shortSwipes) { 49988 swiper.slideTo(swiper.activeIndex); 49989 return; 49990 } 49991 var isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl); 49992 if (!isNavButtonTarget) { 49993 if (swiper.swipeDirection === 'next') { 49994 swiper.slideTo(rewindFirstIndex !== null ? rewindFirstIndex : stopIndex + increment); 49995 } 49996 if (swiper.swipeDirection === 'prev') { 49997 swiper.slideTo(rewindLastIndex !== null ? rewindLastIndex : stopIndex); 49998 } 49999 } else if (e.target === swiper.navigation.nextEl) { 50000 swiper.slideTo(stopIndex + increment); 50001 } else { 50002 swiper.slideTo(stopIndex); 50003 } 50004 } 50005} 50006function onResize() { 50007 var swiper = this; 50008 var params = swiper.params, 50009 el = swiper.el; 50010 if (el && el.offsetWidth === 0) return; 50011
50012 // Breakpoints 50013 if (params.breakpoints) { 50014 swiper.setBreakpoint(); 50015 } 50016 50017 // Save locks 50018 var allowSlideNext = swiper.allowSlideNext, 50019 allowSlidePrev = swiper.allowSlidePrev, 50020 snapGrid = swiper.snapGrid; 50021 var isVirtual = swiper.virtual && swiper.params.virtual.enabled; 50022 50023 // Disable locks on resize 50024 swiper.allowSlideNext = true; 50025 swiper.allowSlidePrev = true; 50026 swiper.updateSize(); 50027 swiper.updateSlides(); 50028 swiper.updateSlidesClasses(); 50029 var isVirtualLoop = isVirtual && params.loop; 50030 if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides && !isVirtualLoop) { 50031 var slides = isVirtual ? swiper.virtual.slides : swiper.slides; 50032 swiper.slideTo(slides.length - 1, 0, false, true); 50033 } else { 50034 if (swiper.params.loop && !isVirtual) { 50035 swiper.slideToLoop(swiper.realIndex, 0, false, true); 50036 } else { 50037 swiper.slideTo(swiper.activeIndex, 0, false, true); 50038 } 50039 } 50040 if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) { 50041 clearTimeout(swiper.autoplay.resizeTimeout); 50042 swiper.autoplay.resizeTimeout = setTimeout(function () { 50043 if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) { 50044 swiper.autoplay.resume(); 50045 } 50046 }, 500); 50047 } 50048 // Return locks after resize 50049 swiper.allowSlidePrev = allowSlidePrev; 50050 swiper.allowSlideNext = allowSlideNext; 50051 if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) { 50052 swiper.checkOverflow(); 50053 } 50054} 50055function onClick(e) { 50056 var swiper = this; 50057 if (!swiper.enabled) return; 50058 if (!swiper.allowClick) { 50059 if (swiper.params.preventClicks) e.preventDefault(); 50060 if (swiper.params.preventClicksPropagation && swiper.animating) { 50061 e.stopPropagation(); 50062 e.stopImmediatePropagation(); 50063 } 50064 } 50065} 50066function onScroll() { 50067 var swiper = this; 50068 var wrapperEl = swiper.wrapperEl, 50069 rtlTranslate = swiper.rtlTranslate, 50070 enabled = swiper.enabled; 50071 if (!enabled) return; 50072 swiper.previousTranslate = swiper.translate; 50073 if (swiper.isHorizontal()) { 50074 swiper.translate = -wrapperEl.scrollLeft; 50075 } else { 50076 swiper.translate = -wrapperEl.scrollTop; 50077 } 50078 // eslint-disable-next-line 50079 if (swiper.translate === 0) swiper.translate = 0; 50080 swiper.updateActiveIndex(); 50081 swiper.updateSlidesClasses(); 50082 var newProgress; 50083 var translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); 50084 if (translatesDiff === 0) { 50085 newProgress = 0; 50086 } else { 50087 newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff; 50088 } 50089 if (newProgress !== swiper.progress) { 50090 swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate); 50091 } 50092 swiper.emit('setTranslate', swiper.translate, false); 50093} 50094function onLoad(e) { 50095 var swiper = this; 50096 processLazyPreloader(swiper, e.target); 50097 if (swiper.params.cssMode || swiper.params.slidesPerView !== 'auto' && !swiper.params.autoHeight) { 50098 return; 50099 } 50100 swiper.update(); 50101} 50102function onDocumentTouchStart() { 50103 var swiper = this; 50104 if (swiper.documentTouchHandlerProceeded) return; 50105 swiper.documentTouchHandlerProceeded = true; 50106 if (swiper.params.touchReleaseOnEdges) { 50107 swiper.el.style.touchAction = 'auto'; 50108 } 50109} 50110var events = function events(swiper, method) { 50111 var document = (0, _ssrWindowEsm.g)(); 50112 var params = swiper.params, 50113 el = swiper.el, 50114 wrapperEl = swiper.wrapperEl, 50115 device = swiper.device; 50116 var capture = !!params.nested; 50117 var domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener'; 50118 var swiperMethod = method; 50119 if (!el || typeof el === 'string') return; 50120 50121 // Touch Events 50122 document[domMethod]('touchstart', swiper.onDocumentTouchStart, { 50123 passive: false, 50124 capture: capture 50125 }); 50126 el[domMethod]('touchstart', swiper.onTouchStart, { 50127 passive: false 50128 }); 50129 el[domMethod]('pointerdown', swiper.onTouchStart, { 50130 passive: false 50131 }); 50132 document[domMethod]('touchmove', swiper.onTouchMove, { 50133 passive: false, 50134 capture: capture 50135 }); 50136 document[domMethod]('pointermove', swiper.onTouchMove, { 50137 passive: false, 50138 capture: capture 50139 }); 50140 document[domMethod]('touchend', swiper.onTouchEnd, { 50141 passive: true 50142 }); 50143 document[domMethod]('pointerup', swiper.onTouchEnd, { 50144 passive: true 50145 }); 50146 document[domMethod]('pointercancel', swiper.onTouchEnd, { 50147 passive: true 50148 }); 50149 document[domMethod]('touchcancel', swiper.onTouchEnd, { 50150 passive: true 50151 }); 50152 document[domMethod]('pointerout', swiper.onTouchEnd, { 50153 passive: true 50154 }); 50155 document[domMethod]('pointerleave', swiper.onTouchEnd, { 50156 passive: true 50157 }); 50158 document[domMethod]('contextmenu', swiper.onTouchEnd, { 50159 passive: true 50160 }); 50161 50162 // Prevent Links Clicks 50163 if (params.preventClicks || params.preventClicksPropagation) { 50164 el[domMethod]('click', swiper.onClick, true); 50165 } 50166 if (params.cssMode) { 50167 wrapperEl[domMethod]('scroll', swiper.onScroll); 50168 } 50169 50170 // Resize handler 50171 if (params.updateOnWindowResize) { 50172 swiper[swiperMethod](device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', onResize, true); 50173 } else { 50174 swiper[swiperMethod]('observerUpdate', onResize, true); 50175 } 50176 50177 // Images loader 50178 el[domMethod]('load', swiper.onLoad, { 50179 capture: true 50180 }); 50181}; 50182function attachEvents() { 50183 var swiper = this; 50184 var params = swiper.params; 50185 swiper.onTouchStart = onTouchStart.bind(swiper); 50186 swiper.onTouchMove = onTouchMove.bind(swiper); 50187 swiper.onTouchEnd = onTouchEnd.bind(swiper); 50188 swiper.onDocumentTouchStart = onDocumentTouchStart.bind(swiper); 50189 if (params.cssMode) { 50190 swiper.onScroll = onScroll.bind(swiper); 50191 } 50192 swiper.onClick = onClick.bind(swiper); 50193 swiper.onLoad = onLoad.bind(swiper); 50194 events(swiper, 'on'); 50195} 50196function detachEvents() { 50197 var swiper = this; 50198 events(swiper, 'off'); 50199} 50200var events$1 = { 50201 attachEvents: attachEvents, 50202 detachEvents: detachEvents 50203}; 50204var isGridEnabled = function isGridEnabled(swiper, params) { 50205 return swiper.grid && params.grid && params.grid.rows > 1; 50206}; 50207function setBreakpoint() { 50208 var swiper = this; 50209 var realIndex = swiper.realIndex, 50210 initialized = swiper.initialized, 50211 params = swiper.params, 50212 el = swiper.el; 50213 var breakpoints = params.breakpoints; 50214 if (!breakpoints || breakpoints && Object.keys(breakpoints).length === 0) return; 50215 var document = (0, _ssrWindowEsm.g)(); 50216 50217 // Get breakpoint for window/container width and update parameters 50218 var breakpointsBase = params.breakpointsBase === 'window' || !params.breakpointsBase ? params.breakpointsBase : 'container'; 50219 var breakpointContainer = ['window', 'container'].includes(params.breakpointsBase) || !params.breakpointsBase ? swiper.el : document.querySelector(params.breakpointsBase);
50220 var breakpoint = swiper.getBreakpoint(breakpoints, breakpointsBase, breakpointContainer); 50221 if (!breakpoint || swiper.currentBreakpoint === breakpoint) return; 50222 var breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined; 50223 var breakpointParams = breakpointOnlyParams || swiper.originalParams; 50224 var wasMultiRow = isGridEnabled(swiper, params); 50225 var isMultiRow = isGridEnabled(swiper, breakpointParams); 50226 var wasGrabCursor = swiper.params.grabCursor; 50227 var isGrabCursor = breakpointParams.grabCursor; 50228 var wasEnabled = params.enabled; 50229 if (wasMultiRow && !isMultiRow) { 50230 el.classList.remove("".concat(params.containerModifierClass, "grid"), "".concat(params.containerModifierClass, "grid-column")); 50231 swiper.emitContainerClasses(); 50232 } else if (!wasMultiRow && isMultiRow) { 50233 el.classList.add("".concat(params.containerModifierClass, "grid")); 50234 if (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column' || !breakpointParams.grid.fill && params.grid.fill === 'column') { 50235 el.classList.add("".concat(params.containerModifierClass, "grid-column")); 50236 } 50237 swiper.emitContainerClasses(); 50238 } 50239 if (wasGrabCursor && !isGrabCursor) { 50240 swiper.unsetGrabCursor(); 50241 } else if (!wasGrabCursor && isGrabCursor) { 50242 swiper.setGrabCursor(); 50243 } 50244 50245 // Toggle navigation, pagination, scrollbar 50246 ['navigation', 'pagination', 'scrollbar'].forEach(function (prop) { 50247 if (typeof breakpointParams[prop] === 'undefined') return; 50248 var wasModuleEnabled = params[prop] && params[prop].enabled; 50249 var isModuleEnabled = breakpointParams[prop] && breakpointParams[prop].enabled; 50250 if (wasModuleEnabled && !isModuleEnabled) { 50251 swiper[prop].disable(); 50252 } 50253 if (!wasModuleEnabled && isModuleEnabled) { 50254 swiper[prop].enable(); 50255 } 50256 }); 50257 var directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction; 50258 var needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged); 50259 var wasLoop = params.loop; 50260 if (directionChanged && initialized) { 50261 swiper.changeDirection(); 50262 } 50263 (0, _utils.x)(swiper.params, breakpointParams); 50264 var isEnabled = swiper.params.enabled; 50265 var hasLoop = swiper.params.loop; 50266 Object.assign(swiper, { 50267 allowTouchMove: swiper.params.allowTouchMove, 50268 allowSlideNext: swiper.params.allowSlideNext, 50269 allowSlidePrev: swiper.params.allowSlidePrev 50270 }); 50271 if (wasEnabled && !isEnabled) { 50272 swiper.disable(); 50273 } else if (!wasEnabled && isEnabled) { 50274 swiper.enable(); 50275 } 50276 swiper.currentBreakpoint = breakpoint; 50277 swiper.emit('_beforeBreakpoint', breakpointParams); 50278 if (initialized) { 50279 if (needsReLoop) { 50280 swiper.loopDestroy(); 50281 swiper.loopCreate(realIndex); 50282 swiper.updateSlides(); 50283 } else if (!wasLoop && hasLoop) { 50284 swiper.loopCreate(realIndex); 50285 swiper.updateSlides(); 50286 } else if (wasLoop && !hasLoop) { 50287 swiper.loopDestroy(); 50288 } 50289 } 50290 swiper.emit('breakpoint', breakpointParams); 50291} 50292function getBreakpoint(breakpoints) { 50293 var base = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'window'; 50294 var containerEl = arguments.length > 2 ? arguments[2] : undefined; 50295 if (!breakpoints || base === 'container' && !containerEl) return undefined; 50296 var breakpoint = false; 50297 var window = (0, _ssrWindowEsm.a)(); 50298 var currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight; 50299 var points = Object.keys(breakpoints).map(function (point) { 50300 if (typeof point === 'string' && point.indexOf('@') === 0) { 50301 var minRatio = parseFloat(point.substr(1)); 50302 var value = currentHeight * minRatio; 50303 return { 50304 value: value, 50305 point: point 50306 }; 50307 } 50308 return { 50309 value: point, 50310 point: point 50311 }; 50312 }); 50313 points.sort(function (a, b) { 50314 return parseInt(a.value, 10) - parseInt(b.value, 10); 50315 }); 50316 for (var i = 0; i < points.length; i += 1) { 50317 var _points$i = points[i], 50318 point = _points$i.point, 50319 value = _points$i.value; 50320 if (base === 'window') { 50321 if (window.matchMedia("(min-width: ".concat(value, "px)")).matches) { 50322 breakpoint = point; 50323 } 50324 } else if (value <= containerEl.clientWidth) { 50325 breakpoint = point; 50326 } 50327 } 50328 return breakpoint || 'max'; 50329} 50330var breakpoints = { 50331 setBreakpoint: setBreakpoint,
50332 getBreakpoint: getBreakpoint 50333}; 50334function prepareClasses(entries, prefix) { 50335 var resultClasses = []; 50336 entries.forEach(function (item) { 50337 if ((0, _typeof2["default"])(item) === 'object') { 50338 Object.keys(item).forEach(function (classNames) { 50339 if (item[classNames]) { 50340 resultClasses.push(prefix + classNames); 50341 } 50342 }); 50343 } else if (typeof item === 'string') { 50344 resultClasses.push(prefix + item); 50345 } 50346 }); 50347 return resultClasses; 50348} 50349function addClasses() { 50350 var _el$classList; 50351 var swiper = this; 50352 var classNames = swiper.classNames, 50353 params = swiper.params, 50354 rtl = swiper.rtl, 50355 el = swiper.el, 50356 device = swiper.device; 50357 // prettier-ignore 50358 var suffixes = prepareClasses(['initialized', params.direction, { 50359 'free-mode': swiper.params.freeMode && params.freeMode.enabled 50360 }, { 50361 'autoheight': params.autoHeight 50362 }, { 50363 'rtl': rtl 50364 }, { 50365 'grid': params.grid && params.grid.rows > 1 50366 }, { 50367 'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column' 50368 }, { 50369 'android': device.android 50370 }, { 50371 'ios': device.ios 50372 }, { 50373 'css-mode': params.cssMode 50374 }, { 50375 'centered': params.cssMode && params.centeredSlides 50376 }, { 50377 'watch-progress': params.watchSlidesProgress 50378 }], params.containerModifierClass); 50379 classNames.push.apply(classNames, (0, _toConsumableArray2["default"])(suffixes)); 50380 (_el$classList = el.classList).add.apply(_el$classList, (0, _toConsumableArray2["default"])(classNames)); 50381 swiper.emitContainerClasses(); 50382} 50383function removeClasses() { 50384 var _el$classList2; 50385 var swiper = this; 50386 var el = swiper.el, 50387 classNames = swiper.classNames; 50388 if (!el || typeof el === 'string') return; 50389 (_el$classList2 = el.classList).remove.apply(_el$classList2, (0, _toConsumableArray2["default"])(classNames)); 50390 swiper.emitContainerClasses(); 50391} 50392var classes = { 50393 addClasses: addClasses, 50394 removeClasses: removeClasses 50395}; 50396function checkOverflow() { 50397 var swiper = this; 50398 var wasLocked = swiper.isLocked, 50399 params = swiper.params; 50400 var slidesOffsetBefore = params.slidesOffsetBefore; 50401 if (slidesOffsetBefore) { 50402 var lastSlideIndex = swiper.slides.length - 1; 50403 var lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2; 50404 swiper.isLocked = swiper.size > lastSlideRightEdge; 50405 } else { 50406 swiper.isLocked = swiper.snapGrid.length === 1; 50407 } 50408 if (params.allowSlideNext === true) { 50409 swiper.allowSlideNext = !swiper.isLocked; 50410 } 50411 if (params.allowSlidePrev === true) { 50412 swiper.allowSlidePrev = !swiper.isLocked; 50413 } 50414 if (wasLocked && wasLocked !== swiper.isLocked) { 50415 swiper.isEnd = false; 50416 } 50417 if (wasLocked !== swiper.isLocked) { 50418 swiper.emit(swiper.isLocked ? 'lock' : 'unlock'); 50419 } 50420} 50421var checkOverflow$1 = { 50422 checkOverflow: checkOverflow 50423}; 50424var defaults = exports.d = { 50425 init: true, 50426 direction: 'horizontal', 50427 oneWayMovement: false, 50428 swiperElementNodeName: 'SWIPER-CONTAINER', 50429 touchEventsTarget: 'wrapper', 50430 initialSlide: 0, 50431 speed: 300, 50432 cssMode: false, 50433 updateOnWindowResize: true, 50434 resizeObserver: true, 50435 nested: false, 50436 createElements: false, 50437 eventsPrefix: 'swiper', 50438 enabled: true, 50439 focusableElements: 'input, select, option, textarea, button, video, label', 50440 // Overrides 50441 width: null, 50442 height: null, 50443 // 50444 preventInteractionOnTransition: false, 50445 // ssr 50446 userAgent: null, 50447 url: null, 50448 // To support iOS's swipe-to-go-back gesture (when being used in-app). 50449 edgeSwipeDetection: false, 50450 edgeSwipeThreshold: 20, 50451 // Autoheight 50452 autoHeight: false, 50453 // Set wrapper width 50454 setWrapperSize: false, 50455 // Virtual Translate 50456 virtualTranslate: false, 50457 // Effects 50458 effect: 'slide', 50459 // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip' 50460 50461 // Breakpoints 50462 breakpoints: undefined, 50463 breakpointsBase: 'window', 50464 // Slides grid 50465 spaceBetween: 0, 50466 slidesPerView: 1, 50467 slidesPerGroup: 1, 50468 slidesPerGroupSkip: 0, 50469 slidesPerGroupAuto: false, 50470 centeredSlides: false, 50471 centeredSlidesBounds: false, 50472 slidesOffsetBefore: 0, 50473 // in px 50474 slidesOffsetAfter: 0, 50475 // in px 50476 normalizeSlideIndex: true, 50477 centerInsufficientSlides: false, 50478 snapToSlideEdge: false, 50479 // Disable swiper and hide navigation when container not overflow 50480 watchOverflow: true, 50481 // Round length 50482 roundLengths: false, 50483 // Touches 50484 touchRatio: 1, 50485 touchAngle: 45, 50486 simulateTouch: true, 50487 shortSwipes: true, 50488 longSwipes: true, 50489 longSwipesRatio: 0.5, 50490 longSwipesMs: 300, 50491 followFinger: true, 50492 allowTouchMove: true, 50493 threshold: 5, 50494 touchMoveStopPropagation: false, 50495 touchStartPreventDefault: true, 50496 touchStartForcePreventDefault: false, 50497 touchReleaseOnEdges: false, 50498 // Unique Navigation Elements 50499 uniqueNavElements: true, 50500 // Resistance 50501 resistance: true, 50502 resistanceRatio: 0.85, 50503 // Progress 50504 watchSlidesProgress: false, 50505 // Cursor 50506 grabCursor: false, 50507 // Clicks 50508 preventClicks: true, 50509 preventClicksPropagation: true, 50510 slideToClickedSlide: false, 50511 // loop 50512 loop: false, 50513 loopAddBlankSlides: true, 50514 loopAdditionalSlides: 0, 50515 loopPreventsSliding: true, 50516 // rewind 50517 rewind: false, 50518 // Swiping/no swiping 50519 allowSlidePrev: true, 50520 allowSlideNext: true, 50521 swipeHandler: null, 50522 // '.swipe-handler', 50523 noSwiping: true, 50524 noSwipingClass: 'swiper-no-swiping', 50525 noSwipingSelector: null, 50526 // Passive Listeners 50527 passiveListeners: true, 50528 maxBackfaceHiddenSlides: 10, 50529 // NS 50530 containerModifierClass: 'swiper-', 50531 // NEW 50532 slideClass: 'swiper-slide', 50533 slideBlankClass: 'swiper-slide-blank', 50534 slideActiveClass: 'swiper-slide-active', 50535 slideVisibleClass: 'swiper-slide-visible', 50536 slideFullyVisibleClass: 'swiper-slide-fully-visible', 50537 slideNextClass: 'swiper-slide-next', 50538 slidePrevClass: 'swiper-slide-prev', 50539 wrapperClass: 'swiper-wrapper', 50540 lazyPreloaderClass: 'swiper-lazy-preloader', 50541 lazyPreloadPrevNext: 0, 50542 // Callbacks 50543 runCallbacksOnInit: true, 50544 // Internals 50545 _emitClasses: false 50546}; 50547function moduleExtendParams(params, allModulesParams) { 50548 return function extendParams() { 50549 var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 50550 var moduleParamName = Object.keys(obj)[0]; 50551 var moduleParams = obj[moduleParamName]; 50552 if ((0, _typeof2["default"])(moduleParams) !== 'object' || moduleParams === null) { 50553 (0, _utils.x)(allModulesParams, obj); 50554 return; 50555 } 50556 if (params[moduleParamName] === true) { 50557 params[moduleParamName] = { 50558 enabled: true 50559 }; 50560 } 50561 if (moduleParamName === 'navigation' && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].prevEl && !params[moduleParamName].nextEl) { 50562 params[moduleParamName].auto = true; 50563 } 50564 if (['pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].el) { 50565 params[moduleParamName].auto = true; 50566 } 50567 if (!(moduleParamName in params && 'enabled' in moduleParams)) { 50568 (0, _utils.x)(allModulesParams, obj); 50569 return; 50570 } 50571 if ((0, _typeof2["default"])(params[moduleParamName]) === 'object' && !('enabled' in params[moduleParamName])) { 50572 params[moduleParamName].enabled = true; 50573 } 50574 if (!params[moduleParamName]) params[moduleParamName] = { 50575 enabled: false 50576 }; 50577 (0, _utils.x)(allModulesParams, obj); 50578 }; 50579} 50580 50581/* eslint no-param-reassign: "off" */ 50582var prototypes = { 50583 eventsEmitter: eventsEmitter, 50584 update: update, 50585 translate: translate, 50586 transition: transition, 50587 slide: slide, 50588 loop: loop, 50589 grabCursor: grabCursor, 50590 events: events$1, 50591 breakpoints: breakpoints, 50592 checkOverflow: checkOverflow$1, 50593 classes: classes 50594}; 50595var extendedDefaults = {}; 50596var Swiper = exports.S = /*#__PURE__*/function () { 50597 function Swiper() { 50598 (0, _classCallCheck2["default"])(this, Swiper); 50599 var el; 50600 var params; 50601 for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { 50602 args[_key3] = arguments[_key3]; 50603 }
50604 if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object') { 50605 params = args[0]; 50606 } else { 50607 el = args[0]; 50608 params = args[1]; 50609 } 50610 if (!params) params = {}; 50611 params = (0, _utils.x)({}, params); 50612 if (el && !params.el) params.el = el; 50613 var document = (0, _ssrWindowEsm.g)(); 50614 if (params.el && typeof params.el === 'string' && document.querySelectorAll(params.el).length > 1) { 50615 var swipers = []; 50616 document.querySelectorAll(params.el).forEach(function (containerEl) { 50617 var newParams = (0, _utils.x)({}, params, { 50618 el: containerEl 50619 }); 50620 swipers.push(new Swiper(newParams)); 50621 }); 50622 // eslint-disable-next-line no-constructor-return 50623 return swipers; 50624 } 50625 50626 // Swiper Instance 50627 var swiper = this; 50628 swiper.__swiper__ = true; 50629 swiper.support = getSupport(); 50630 swiper.device = getDevice({ 50631 userAgent: params.userAgent 50632 }); 50633 swiper.browser = getBrowser(); 50634 swiper.eventsListeners = {}; 50635 swiper.eventsAnyListeners = []; 50636 swiper.modules = (0, _toConsumableArray2["default"])(swiper.__modules__); 50637 if (params.modules && Array.isArray(params.modules)) { 50638 params.modules.forEach(function (mod) { 50639 if (typeof mod === 'function' && swiper.modules.indexOf(mod) < 0) { 50640 swiper.modules.push(mod); 50641 } 50642 }); 50643 } 50644 var allModulesParams = {}; 50645 swiper.modules.forEach(function (mod) { 50646 mod({ 50647 params: params, 50648 swiper: swiper, 50649 extendParams: moduleExtendParams(params, allModulesParams), 50650 on: swiper.on.bind(swiper), 50651 once: swiper.once.bind(swiper), 50652 off: swiper.off.bind(swiper), 50653 emit: swiper.emit.bind(swiper) 50654 }); 50655 }); 50656 50657 // Extend defaults with modules params 50658 var swiperParams = (0, _utils.x)({}, defaults, allModulesParams); 50659 50660 // Extend defaults with passed params 50661 swiper.params = (0, _utils.x)({}, swiperParams, extendedDefaults, params); 50662 swiper.originalParams = (0, _utils.x)({}, swiper.params); 50663 swiper.passedParams = (0, _utils.x)({}, params); 50664 50665 // add event listeners 50666 if (swiper.params && swiper.params.on) {
50667 Object.keys(swiper.params.on).forEach(function (eventName) { 50668 swiper.on(eventName, swiper.params.on[eventName]); 50669 }); 50670 } 50671 if (swiper.params && swiper.params.onAny) { 50672 swiper.onAny(swiper.params.onAny); 50673 } 50674 50675 // Extend Swiper 50676 Object.assign(swiper, { 50677 enabled: swiper.params.enabled, 50678 el: el, 50679 // Classes 50680 classNames: [], 50681 // Slides 50682 slides: [], 50683 slidesGrid: [], 50684 snapGrid: [], 50685 slidesSizesGrid: [], 50686 // isDirection 50687 isHorizontal: function isHorizontal() { 50688 return swiper.params.direction === 'horizontal'; 50689 }, 50690 isVertical: function isVertical() { 50691 return swiper.params.direction === 'vertical'; 50692 }, 50693 // Indexes 50694 activeIndex: 0, 50695 realIndex: 0, 50696 // 50697 isBeginning: true, 50698 isEnd: false, 50699 // Props 50700 translate: 0, 50701 previousTranslate: 0, 50702 progress: 0, 50703 velocity: 0, 50704 animating: false, 50705 cssOverflowAdjustment: function cssOverflowAdjustment() { 50706 // Returns 0 unless `translate` is > 2**23 50707 // Should be subtracted from css values to prevent overflow 50708 return Math.trunc(this.translate / Math.pow(2, 23)) * Math.pow(2, 23); 50709 }, 50710 // Locks 50711 allowSlideNext: swiper.params.allowSlideNext, 50712 allowSlidePrev: swiper.params.allowSlidePrev, 50713 // Touch Events 50714 touchEventsData: { 50715 isTouched: undefined, 50716 isMoved: undefined, 50717 allowTouchCallbacks: undefined, 50718 touchStartTime: undefined, 50719 isScrolling: undefined, 50720 currentTranslate: undefined, 50721 startTranslate: undefined, 50722 allowThresholdMove: undefined, 50723 // Form elements to match 50724 focusableElements: swiper.params.focusableElements, 50725 // Last click time 50726 lastClickTime: 0, 50727 clickTimeout: undefined, 50728 // Velocities 50729 velocities: [], 50730 allowMomentumBounce: undefined, 50731 startMoving: undefined, 50732 pointerId: null, 50733 touchId: null 50734 }, 50735 // Clicks 50736 allowClick: true, 50737 // Touches 50738 allowTouchMove: swiper.params.allowTouchMove, 50739 touches: { 50740 startX: 0, 50741 startY: 0, 50742 currentX: 0, 50743 currentY: 0, 50744 diff: 0 50745 }, 50746 // Images 50747 imagesToLoad: [], 50748 imagesLoaded: 0 50749 }); 50750 swiper.emit('_swiper'); 50751 50752 // Init 50753 if (swiper.params.init) { 50754 swiper.init(); 50755 } 50756 50757 // Return app instance 50758 // eslint-disable-next-line no-constructor-return 50759 return swiper; 50760 } 50761 return (0, _createClass2["default"])(Swiper, [{ 50762 key: "getDirectionLabel", 50763 value: function getDirectionLabel(property) { 50764 if (this.isHorizontal()) { 50765 return property; 50766 } 50767 // prettier-ignore 50768 return { 50769 'width': 'height', 50770 'margin-top': 'margin-left', 50771 'margin-bottom ': 'margin-right', 50772 'margin-left': 'margin-top', 50773 'margin-right': 'margin-bottom', 50774 'padding-left': 'padding-top', 50775 'padding-right': 'padding-bottom', 50776 'marginRight': 'marginBottom' 50777 }[property]; 50778 } 50779 }, { 50780 key: "getSlideIndex", 50781 value: function getSlideIndex(slideEl) { 50782 var slidesEl = this.slidesEl, 50783 params = this.params; 50784 var slides = (0, _utils.e)(slidesEl, ".".concat(params.slideClass, ", swiper-slide")); 50785 var firstSlideIndex = (0, _utils.j)(slides[0]); 50786 return (0, _utils.j)(slideEl) - firstSlideIndex; 50787 } 50788 }, { 50789 key: "getSlideIndexByData", 50790 value: function getSlideIndexByData(index) { 50791 return this.getSlideIndex(this.slides.find(function (slideEl) { 50792 return slideEl.getAttribute('data-swiper-slide-index') * 1 === index; 50793 })); 50794 } 50795 }, { 50796 key: "getSlideIndexWhenGrid", 50797 value: function getSlideIndexWhenGrid(index) { 50798 if (this.grid && this.params.grid && this.params.grid.rows > 1) { 50799 if (this.params.grid.fill === 'column') { 50800 index = Math.floor(index / this.params.grid.rows); 50801 } else if (this.params.grid.fill === 'row') {
50802 index = index % Math.ceil(this.slides.length / this.params.grid.rows); 50803 } 50804 } 50805 return index; 50806 } 50807 }, { 50808 key: "recalcSlides", 50809 value: function recalcSlides() { 50810 var swiper = this; 50811 var slidesEl = swiper.slidesEl, 50812 params = swiper.params; 50813 swiper.slides = (0, _utils.e)(slidesEl, ".".concat(params.slideClass, ", swiper-slide")); 50814 } 50815 }, { 50816 key: "enable", 50817 value: function enable() { 50818 var swiper = this; 50819 if (swiper.enabled) return; 50820 swiper.enabled = true; 50821 if (swiper.params.grabCursor) { 50822 swiper.setGrabCursor(); 50823 } 50824 swiper.emit('enable'); 50825 } 50826 }, { 50827 key: "disable", 50828 value: function disable() { 50829 var swiper = this; 50830 if (!swiper.enabled) return; 50831 swiper.enabled = false; 50832 if (swiper.params.grabCursor) { 50833 swiper.unsetGrabCursor(); 50834 } 50835 swiper.emit('disable'); 50836 } 50837 }, { 50838 key: "setProgress", 50839 value: function setProgress(progress, speed) { 50840 var swiper = this; 50841 progress = Math.min(Math.max(progress, 0), 1); 50842 var min = swiper.minTranslate(); 50843 var max = swiper.maxTranslate(); 50844 var current = (max - min) * progress + min; 50845 swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed); 50846 swiper.updateActiveIndex(); 50847 swiper.updateSlidesClasses(); 50848 } 50849 }, { 50850 key: "emitContainerClasses", 50851 value: function emitContainerClasses() { 50852 var swiper = this; 50853 if (!swiper.params._emitClasses || !swiper.el) return; 50854 var cls = swiper.el.className.split(' ').filter(function (className) { 50855 return className.indexOf('swiper') === 0 || className.indexOf(swiper.params.containerModifierClass) === 0; 50856 }); 50857 swiper.emit('_containerClasses', cls.join(' ')); 50858 } 50859 }, { 50860 key: "getSlideClasses", 50861 value: function getSlideClasses(slideEl) { 50862 var swiper = this; 50863 if (swiper.destroyed) return ''; 50864 return slideEl.className.split(' ').filter(function (className) { 50865 return className.indexOf('swiper-slide') === 0 || className.indexOf(swiper.params.slideClass) === 0; 50866 }).join(' '); 50867 } 50868 }, { 50869 key: "emitSlidesClasses", 50870 value: function emitSlidesClasses() { 50871 var swiper = this; 50872 if (!swiper.params._emitClasses || !swiper.el) return; 50873 var updates = []; 50874 swiper.slides.forEach(function (slideEl) { 50875 var classNames = swiper.getSlideClasses(slideEl); 50876 updates.push({ 50877 slideEl: slideEl, 50878 classNames: classNames 50879 }); 50880 swiper.emit('_slideClass', slideEl, classNames); 50881 }); 50882 swiper.emit('_slideClasses', updates); 50883 } 50884 }, { 50885 key: "slidesPerViewDynamic", 50886 value: function slidesPerViewDynamic() { 50887 var view = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'current'; 50888 var exact = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; 50889 var swiper = this; 50890 var params = swiper.params, 50891 slides = swiper.slides, 50892 slidesGrid = swiper.slidesGrid, 50893 slidesSizesGrid = swiper.slidesSizesGrid, 50894 swiperSize = swiper.size, 50895 activeIndex = swiper.activeIndex; 50896 var spv = 1; 50897 if (typeof params.slidesPerView === 'number') return params.slidesPerView; 50898 if (params.centeredSlides) { 50899 var slideSize = slides[activeIndex] ? Math.ceil(slides[activeIndex].swiperSlideSize) : 0; 50900 var breakLoop; 50901 for (var i = activeIndex + 1; i < slides.length; i += 1) { 50902 if (slides[i] && !breakLoop) { 50903 slideSize += Math.ceil(slides[i].swiperSlideSize); 50904 spv += 1; 50905 if (slideSize > swiperSize) breakLoop = true; 50906 } 50907 } 50908 for (var _i8 = activeIndex - 1; _i8 >= 0; _i8 -= 1) { 50909 if (slides[_i8] && !breakLoop) { 50910 slideSize += slides[_i8].swiperSlideSize; 50911 spv += 1; 50912 if (slideSize > swiperSize) breakLoop = true; 50913 } 50914 } 50915 } else { 50916 // eslint-disable-next-line 50917 if (view === 'current') { 50918 for (var _i9 = activeIndex + 1; _i9 < slides.length; _i9 += 1) { 50919 var slideInView = exact ? slidesGrid[_i9] + slidesSizesGrid[_i9] - slidesGrid[activeIndex] < swiperSize : slidesGrid[_i9] - slidesGrid[activeIndex] < swiperSize; 50920 if (slideInView) { 50921 spv += 1; 50922 } 50923 } 50924 } else { 50925 // previous 50926 for (var _i0 = activeIndex - 1; _i0 >= 0; _i0 -= 1) { 50927 var _slideInView = slidesGrid[activeIndex] - slidesGrid[_i0] < swiperSize; 50928 if (_slideInView) { 50929 spv += 1; 50930 } 50931 } 50932 } 50933 } 50934 return spv; 50935 } 50936 }, { 50937 key: "update",
50938 value: function update() { 50939 var swiper = this; 50940 if (!swiper || swiper.destroyed) return; 50941 var snapGrid = swiper.snapGrid, 50942 params = swiper.params; 50943 // Breakpoints 50944 if (params.breakpoints) { 50945 swiper.setBreakpoint(); 50946 } 50947 (0, _toConsumableArray2["default"])(swiper.el.querySelectorAll('[loading="lazy"]')).forEach(function (imageEl) { 50948 if (imageEl.complete) { 50949 processLazyPreloader(swiper, imageEl); 50950 } 50951 }); 50952 swiper.updateSize(); 50953 swiper.updateSlides(); 50954 swiper.updateProgress(); 50955 swiper.updateSlidesClasses(); 50956 function setTranslate() { 50957 var translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate; 50958 var newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate()); 50959 swiper.setTranslate(newTranslate); 50960 swiper.updateActiveIndex(); 50961 swiper.updateSlidesClasses(); 50962 } 50963 var translated; 50964 if (params.freeMode && params.freeMode.enabled && !params.cssMode) { 50965 setTranslate(); 50966 if (params.autoHeight) { 50967 swiper.updateAutoHeight(); 50968 } 50969 } else { 50970 if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !params.centeredSlides) { 50971 var slides = swiper.virtual && params.virtual.enabled ? swiper.virtual.slides : swiper.slides; 50972 translated = swiper.slideTo(slides.length - 1, 0, false, true); 50973 } else { 50974 translated = swiper.slideTo(swiper.activeIndex, 0, false, true); 50975 } 50976 if (!translated) { 50977 setTranslate(); 50978 } 50979 } 50980 if (params.watchOverflow && snapGrid !== swiper.snapGrid) { 50981 swiper.checkOverflow(); 50982 } 50983 swiper.emit('update'); 50984 } 50985 }, { 50986 key: "changeDirection", 50987 value: function changeDirection(newDirection) { 50988 var needUpdate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; 50989 var swiper = this; 50990 var currentDirection = swiper.params.direction; 50991 if (!newDirection) { 50992 // eslint-disable-next-line 50993 newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal'; 50994 } 50995 if (newDirection === currentDirection || newDirection !== 'horizontal' && newDirection !== 'vertical') { 50996 return swiper; 50997 } 50998 swiper.el.classList.remove("".concat(swiper.params.containerModifierClass).concat(currentDirection)); 50999 swiper.el.classList.add("".concat(swiper.params.containerModifierClass).concat(newDirection)); 51000 swiper.emitContainerClasses(); 51001 swiper.params.direction = newDirection; 51002 swiper.slides.forEach(function (slideEl) { 51003 if (newDirection === 'vertical') { 51004 slideEl.style.width = ''; 51005 } else { 51006 slideEl.style.height = ''; 51007 } 51008 }); 51009 swiper.emit('changeDirection'); 51010 if (needUpdate) swiper.update(); 51011 return swiper; 51012 } 51013 }, { 51014 key: "changeLanguageDirection", 51015 value: function changeLanguageDirection(direction) { 51016 var swiper = this; 51017 if (swiper.rtl && direction === 'rtl' || !swiper.rtl && direction === 'ltr') return; 51018 swiper.rtl = direction === 'rtl'; 51019 swiper.rtlTranslate = swiper.params.direction === 'horizontal' && swiper.rtl; 51020 if (swiper.rtl) { 51021 swiper.el.classList.add("".concat(swiper.params.containerModifierClass, "rtl")); 51022 swiper.el.dir = 'rtl'; 51023 } else { 51024 swiper.el.classList.remove("".concat(swiper.params.containerModifierClass, "rtl")); 51025 swiper.el.dir = 'ltr'; 51026 } 51027 swiper.update(); 51028 } 51029 }, { 51030 key: "mount", 51031 value: function mount(element) { 51032 var swiper = this; 51033 if (swiper.mounted) return true; 51034 51035 // Find el 51036 var el = element || swiper.params.el; 51037 if (typeof el === 'string') { 51038 el = document.querySelector(el); 51039 } 51040 if (!el) { 51041 return false; 51042 } 51043 el.swiper = swiper; 51044 if (el.parentNode && el.parentNode.host && el.parentNode.host.nodeName === swiper.params.swiperElementNodeName.toUpperCase()) { 51045 swiper.isElement = true; 51046 } 51047 var getWrapperSelector = function getWrapperSelector() { 51048 return ".".concat((swiper.params.wrapperClass || '').trim().split(' ').join('.')); 51049 }; 51050 var getWrapper = function getWrapper() { 51051 if (el && el.shadowRoot && el.shadowRoot.querySelector) { 51052 var res = el.shadowRoot.querySelector(getWrapperSelector()); 51053 // Children needs to return slot items 51054 return res; 51055 } 51056 return (0, _utils.e)(el, getWrapperSelector())[0]; 51057 }; 51058 // Find Wrapper 51059 var wrapperEl = getWrapper(); 51060 if (!wrapperEl && swiper.params.createElements) { 51061 wrapperEl = (0, _utils.c)('div', swiper.params.wrapperClass); 51062 el.append(wrapperEl); 51063 (0, _utils.e)(el, ".".concat(swiper.params.slideClass)).forEac
51063h(function (slideEl) { 51064 wrapperEl.append(slideEl); 51065 }); 51066 } 51067 Object.assign(swiper, { 51068 el: el, 51069 wrapperEl: wrapperEl, 51070 slidesEl: swiper.isElement && !el.parentNode.host.slideSlots ? el.parentNode.host : wrapperEl, 51071 hostEl: swiper.isElement ? el.parentNode.host : el, 51072 mounted: true, 51073 // RTL 51074 rtl: el.dir.toLowerCase() === 'rtl' || (0, _utils.q)(el, 'direction') === 'rtl', 51075 rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || (0, _utils.q)(el, 'direction') === 'rtl'), 51076 wrongRTL: (0, _utils.q)(wrapperEl, 'display') === '-webkit-box' 51077 }); 51078 return true; 51079 } 51080 }, { 51081 key: "init", 51082 value: function init(el) { 51083 var swiper = this; 51084 if (swiper.initialized) return swiper; 51085 var mounted = swiper.mount(el); 51086 if (mounted === false) return swiper; 51087 swiper.emit('beforeInit'); 51088 51089 // Set breakpoint 51090 if (swiper.params.breakpoints) { 51091 swiper.setBreakpoint(); 51092 } 51093 51094 // Add Classes 51095 swiper.addClasses(); 51096 51097 // Update size 51098 swiper.updateSize(); 51099 51100 // Update slides 51101 swiper.updateSlides(); 51102 if (swiper.params.watchOverflow) { 51103 swiper.checkOverflow(); 51104 } 51105 51106 // Set Grab Cursor 51107 if (swiper.params.grabCursor && swiper.enabled) { 51108 swiper.setGrabCursor(); 51109 } 51110 51111 // Slide To Initial Slide 51112 if (swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) { 51113 swiper.slideTo(swiper.params.initialSlide + swiper.virtual.slidesBefore, 0, swiper.params.runCallbacksOnInit, false, true); 51114 } else { 51115 swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true); 51116 } 51117 51118 // Create loop 51119 if (swiper.params.loop) { 51120 swiper.loopCreate(undefined, true); 51121 } 51122 51123 // Attach events 51124 swiper.attachEvents(); 51125 var lazyElements = (0, _toConsumableArray2["default"])(swiper.el.querySelectorAll('[loading="lazy"]')); 51126 if (swiper.isElement) { 51127 lazyElements.push.apply(lazyElements, (0, _toConsumableArray2["default"])(swiper.hostEl.querySelectorAll('[loading="lazy"]'))); 51128 } 51129 lazyElements.forEach(function (imageEl) { 51130 if (imageEl.complete) { 51131 processLazyPreloader(swiper, imageEl); 51132 } else { 51133 imageEl.addEventListener('load', function (e) { 51134 processLazyPreloader(swiper, e.target); 51135 }); 51136 } 51137 }); 51138 preload(swiper); 51139 51140 // Init Flag 51141 swiper.initialized = true; 51142 preload(swiper); 51143 51144 // Emit 51145 swiper.emit('init'); 51146 swiper.emit('afterInit'); 51147 return swiper; 51148 } 51149 }, { 51150 key: "destroy", 51151 value: function destroy() { 51152 var deleteInstance = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; 51153 var cleanStyles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; 51154 var swiper = this; 51155 var params = swiper.params, 51156 el = swiper.el, 51157 wrapperEl = swiper.wrapperEl, 51158 slides = swiper.slides; 51159 if (typeof swiper.params === 'undefined' || swiper.destroyed) { 51160 return null; 51161 } 51162 swiper.emit('beforeDestroy'); 51163 51164 // Init Flag 51165 swiper.initialized = false; 51166 51167 // Detach events 51168 swiper.detachEvents(); 51169 51170 // Destroy loop 51171 if (params.loop) { 51172 swiper.loopDestroy(); 51173 } 51174 51175 // Cleanup styles 51176 if (cleanStyles) { 51177 swiper.removeClasses(); 51178 if (el && typeof el !== 'string') { 51179 el.removeAttribute('style'); 51180 } 51181 if (wrapperEl) { 51182 wrapperEl.removeAttribute('style'); 51183 } 51184 if (slides && slides.length) { 51185 slides.forEach(function (slideEl) { 51186 slideEl.classList.remove(params.slideVisibleClass, params.slideFullyVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass); 51187 slideEl.removeAttribute('style'); 51188 slideEl.removeAttribute('data-swiper-slide-index'); 51189 }); 51190 } 51191 } 51192 swiper.emit('destroy'); 51193 51194 // Detach emitter events
51195 Object.keys(swiper.eventsListeners).forEach(function (eventName) { 51196 swiper.off(eventName); 51197 }); 51198 if (deleteInstance !== false) { 51199 if (swiper.el && typeof swiper.el !== 'string') { 51200 swiper.el.swiper = null; 51201 } 51202 (0, _utils.y)(swiper); 51203 } 51204 swiper.destroyed = true; 51205 return null; 51206 } 51207 }], [{ 51208 key: "extendDefaults", 51209 value: function extendDefaults(newDefaults) { 51210 (0, _utils.x)(extendedDefaults, newDefaults); 51211 } 51212 }, { 51213 key: "extendedDefaults", 51214 get: function get() { 51215 return extendedDefaults; 51216 } 51217 }, { 51218 key: "defaults", 51219 get: function get() { 51220 return defaults; 51221 } 51222 }, { 51223 key: "installModule", 51224 value: function installModule(mod) { 51225 if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = []; 51226 var modules = Swiper.prototype.__modules__; 51227 if (typeof mod === 'function' && modules.indexOf(mod) < 0) { 51228 modules.push(mod); 51229 } 51230 } 51231 }, { 51232 key: "use", 51233 value: function use(module) { 51234 if (Array.isArray(module)) { 51235 module.forEach(function (m) { 51236 return Swiper.installModule(m); 51237 }); 51238 return Swiper; 51239 } 51240 Swiper.installModule(module); 51241 return Swiper; 51242 } 51243 }]); 51244}(); 51245Object.keys(prototypes).forEach(function (prototypeGroup) { 51246 Object.keys(prototypes[prototypeGroup]).forEach(function (protoMethod) { 51247 Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod]; 51248 }); 51249}); 51250Swiper.use([Resize, Observer]); 51251 51252},{"./ssr-window.esm.mjs":139,"./utils.mjs":141,"@babel/runtime/helpers/classCallCheck":96,"@babel/runtime/helpers/createClass":97,"@babel/runtime/helpers/defineProperty":98,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/slicedToArray":104,"@babel/runtime/helpers/toConsumableArray":105,"@babel/runtime/helpers/typeof":108}],141:[function(require,module,exports){ 51253"use strict"; 51254 51255var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 51256Object.defineProperty(exports, "__esModule", { 51257 value: true 51258}); 51259exports.a = getRotateFix; 51260exports.b = setCSSProperty; 51261exports.c = createElement; 51262exports.d = elementParents; 51263exports.e = elementChildren; 51264exports.f = elementOffset; 51265exports.g = getSlideTransformEl; 51266exports.h = now; 51267exports.i = elementOuterSize; 51268exports.j = elementIndex; 51269exports.k = classesToTokens; 51270exports.l = getTranslate; 51271exports.m = makeElementsArray; 51272exports.n = nextTick; 51273exports.o = elementTransitionEnd; 51274exports.p = isObject; 51275exports.q = elementStyle; 51276exports.r = elementNextAll; 51277exports.s = setInnerHTML; 51278exports.t = elementPrevAll; 51279exports.u = animateCSSModeScroll; 51280exports.v = showWarning; 51281exports.w = elementIsChildOf; 51282exports.x = extend; 51283exports.y = deleteProps; 51284var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); 51285var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); 51286var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); 51287var _ssrWindowEsm = require("./ssr-window.esm.mjs"); 51288function classesToTokens() { 51289 var classes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; 51290 return classes.trim().split(' ').filter(function (c) { 51291 return !!c.trim(); 51292 }); 51293} 51294function deleteProps(obj) { 51295 var object = obj; 51296 Object.keys(object).forEach(function (key) { 51297 try { 51298 object[key] = null; 51299 } catch (e) { 51300 // no getter for object 51301 } 51302 try { 51303 delete object[key]; 51304 } catch (e) { 51305 // something got wrong 51306 } 51307 }); 51308} 51309function nextTick(callback) { 51310 var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; 51311 return setTimeout(callback, delay); 51312} 51313function now() { 51314 return Date.now(); 51315} 51316function getComputedStyle(el) { 51317 var window = (0, _ssrWindowEsm.a)(); 51318 var style; 51319 if (window.getComputedStyle) { 51320 style = window.getComputedStyle(el, null); 51321 } 51322 if (!style && el.currentStyle) { 51323 style = el.currentStyle; 51324 } 51325 if (!style) { 51326 style = el.style; 51327 } 51328 return style; 51329} 51330function getTranslate(el) { 51331 var axis = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'x'; 51332 var window = (0, _ssrWindowEsm.a)(); 51333 var matrix; 51334 var curTransform; 51335 var transformMatrix; 51336 var curStyle = getComputedStyle(el); 51337 if (window.WebKitCSSMatrix) { 51338 curTransform = curStyle.transform || curStyle.webkitTransform; 51339 if (curTransform.split(',').length > 6) { 51340 curTransform = curTransform.split(', ').map(function (a) { 51341 return a.replace(',', '.'); 51342 }).join(', '); 51343 } 51344 // Some old versions of Webkit choke when 'none' is passed; pass 51345 // empty string instead in this case 51346 transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform); 51347 } else { 51348 transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,'); 51349 matrix = transformMatrix.toString().split(','); 51350 } 51351 if (axis === 'x') { 51352 // Latest Chrome and webkits Fix 51353 if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41; 51354 // Crazy IE10 Matrix 51355 else if (matrix.length === 16) curTransform = parseFloat(matrix[12]); 51356 // Normal Browsers 51357 else curTransform = parseFloat(matrix[4]); 51358 } 51359 if (axis === 'y') { 51360 // Latest Chrome and webkits Fix 51361 if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42; 51362 // Crazy IE10 Matrix 51363 else if (matrix.length === 16) curTransform = parseFloat(matrix[13]); 51364 // Normal Browsers 51365 else curTransform = parseFloat(matrix[5]); 51366 } 51367 return curTransform || 0; 51368} 51369function isObject(o) { 51370 return (0, _typeof2["default"])(o) === 'object' && o !== null && o.constructor && Ob
51370ject.prototype.toString.call(o).slice(8, -1) === 'Object'; 51371} 51372function isNode(node) { 51373 // eslint-disable-next-line 51374 if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') { 51375 return node instanceof HTMLElement; 51376 } 51377 return node && (node.nodeType === 1 || node.nodeType === 11); 51378} 51379function extend() { 51380 var to = Object(arguments.length <= 0 ? undefined : arguments[0]); 51381 for (var i = 1; i < arguments.length; i += 1) { 51382 var nextSource = i < 0 || arguments.length <= i ? undefined : arguments[i]; 51383 if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) { 51384 var keysArray = Object.keys(Object(nextSource)).filter(function (key) { 51385 return key !== '__proto__' && key !== 'constructor' && key !== 'prototype'; 51386 }); 51387 for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) { 51388 var nextKey = keysArray[nextIndex]; 51389 var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey); 51390 if (desc !== undefined && desc.enumerable) { 51391 if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) { 51392 if (nextSource[nextKey].__swiper__) { 51393 to[nextKey] = nextSource[nextKey]; 51394 } else { 51395 extend(to[nextKey], nextSource[nextKey]); 51396 } 51397 } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) { 51398 to[nextKey] = {}; 51399 if (nextSource[nextKey].__swiper__) { 51400 to[nextKey] = nextSource[nextKey]; 51401 } else { 51402 extend(to[nextKey], nextSource[nextKey]); 51403 } 51404 } else { 51405 to[nextKey] = nextSource[nextKey]; 51406 } 51407 } 51408 } 51409 } 51410 } 51411 return to; 51412} 51413function setCSSProperty(el, varName, varValue) { 51414 el.style.setProperty(varName, varValue); 51415} 51416function animateCSSModeScroll(_ref) { 51417 var swiper = _ref.swiper, 51418 targetPosition = _ref.targetPosition, 51419 side = _ref.side; 51420 var window = (0, _ssrWindowEsm.a)(); 51421 var startPosition = -swiper.translate; 51422 var startTime = null; 51423 var time; 51424 var duration = swiper.params.speed; 51425 swiper.wrapperEl.style.scrollSnapType = 'none'; 51426 window.cancelAnimationFrame(swiper.cssModeFrameID); 51427 var dir = targetPosition > startPosition ? 'next' : 'prev'; 51428 var isOutOfBound = function isOutOfBound(current, target) { 51429 return dir === 'next' && current >= target || dir === 'prev' && current <= target; 51430 }; 51431 var _animate = function animate() { 51432 time = new Date().getTime(); 51433 if (startTime === null) { 51434 startTime = time; 51435 } 51436 var progress = Math.max(Math.min((time - startTime) / duration, 1), 0); 51437 var easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2; 51438 var currentPosition = startPosition + easeProgress * (targetPosition - startPosition); 51439 if (isOutOfBound(currentPosition, targetPosition)) { 51440 currentPosition = targetPosition; 51441 } 51442 swiper.wrapperEl.scrollTo((0, _defineProperty2["default"])({}, side, currentPosition)); 51443 if (isOutOfBound(currentPosition, targetPosition)) { 51444 swiper.wrapperEl.style.overflow = 'hidden'; 51445 swiper.wrapperEl.style.scrollSnapType = ''; 51446 setTimeout(function () { 51447 swiper.wrapperEl.style.overflow = ''; 51448 swiper.wrapperEl.scrollTo((0, _defineProperty2["default"])({}, side, currentPosition)); 51449 }); 51450 window.cancelAnimationFrame(swiper.cssModeFrameID); 51451 return; 51452 } 51453 swiper.cssModeFrameID = window.requestAnimationFrame(_animate); 51454 }; 51455 _animate(); 51456} 51457function getSlideTransformEl(slideEl) { 51458 return slideEl.querySelector('.swiper-slide-transform') || slideEl.shadowRoot && slideEl.shadowRoot.querySelector('.swiper-slide-transform') || slideEl; 51459} 51460function elementChildren(element) { 51461 var selector = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; 51462 var window = (0, _ssrWindowEsm.a)(); 51463 var children = (0, _toConsumableArray2["default"])(element.children); 51464 if (window.HTMLSlotElement && element instanceof HTMLSlotElement) { 51465 children.push.apply(children, (0, _toConsumableArray2["default"])(element.assignedElements())); 51466 } 51467 if (!selector) { 51468 return children; 51469 } 51470 return children.filter(function (el) { 51471 return el.matches(selector); 51472 }); 51473} 51474function elementIsChildOfSlot(el, slot) { 51475 // Breadth-first search through all parent's children and assigned elements 51476 var elementsQueue = [slot]; 51477 while (elementsQueue.length > 0) { 51478 var elementToCheck = elementsQueue.shift(); 51479 if (el === elementToCheck) { 51480 return true; 51481 } 51482 elementsQueue.push.apply(elementsQueue, (0, _toConsumableArray2["default"])(elementToCheck.children).concat((0, _toConsumableArray2["default"])(elementToCheck.shadowRoot ? elementToCheck.shadowRoot.children : []), (0, _toConsumableArray2["default"])(elementToCheck.assignedElements ? elementToCheck.assignedElements() : []))); 51483 } 51484} 51485function elementIsChildOf(el, parent) { 51486 var window = (0, _ssrWindowEsm.a)(); 51487 var isChild = parent.contains(el); 51488 if (!isChild && window.HTMLSlotElement && parent instanceof HTMLSlotElement) { 51489 var children = (0, _toConsumableArray2["default"])(parent.assignedElements()); 51490 isChild = children.includes(el); 51491 if (!isChild) { 51492 isChild = elementIsChildOfSlot(el, parent); 51493 } 51494 } 51495 return isChild; 51496} 51497function showWarning(text) { 51498 try { 51499 console.warn(text); 51500 return; 51501 } catch (err) { 51502 // err 51503 } 51504} 51505function createElement(tag) { 51506 var _el$classList; 51507 var classes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; 51508 var el = document.createElement(tag); 51509 (_el$classList = el.classList).add.apply(_el$classList, (0, _toConsumableArray2["default"])(Array.isArray(classe
51509s) ? classes : classesToTokens(classes))); 51510 return el; 51511} 51512function elementOffset(el) { 51513 var window = (0, _ssrWindowEsm.a)(); 51514 var document = (0, _ssrWindowEsm.g)(); 51515 var box = el.getBoundingClientRect(); 51516 var body = document.body; 51517 var clientTop = el.clientTop || body.clientTop || 0; 51518 var clientLeft = el.clientLeft || body.clientLeft || 0; 51519 var scrollTop = el === window ? window.scrollY : el.scrollTop; 51520 var scrollLeft = el === window ? window.scrollX : el.scrollLeft; 51521 return { 51522 top: box.top + scrollTop - clientTop, 51523 left: box.left + scrollLeft - clientLeft 51524 }; 51525} 51526function elementPrevAll(el, selector) { 51527 var prevEls = []; 51528 while (el.previousElementSibling) { 51529 var prev = el.previousElementSibling; // eslint-disable-line 51530 if (selector) { 51531 if (prev.matches(selector)) prevEls.push(prev); 51532 } else prevEls.push(prev); 51533 el = prev; 51534 } 51535 return prevEls; 51536} 51537function elementNextAll(el, selector) { 51538 var nextEls = []; 51539 while (el.nextElementSibling) { 51540 var next = el.nextElementSibling; // eslint-disable-line 51541 if (selector) { 51542 if (next.matches(selector)) nextEls.push(next); 51543 } else nextEls.push(next); 51544 el = next; 51545 } 51546 return nextEls; 51547} 51548function elementStyle(el, prop) { 51549 var window = (0, _ssrWindowEsm.a)(); 51550 return window.getComputedStyle(el, null).getPropertyValue(prop); 51551} 51552function elementIndex(el) { 51553 var child = el; 51554 var i; 51555 if (child) { 51556 i = 0; 51557 // eslint-disable-next-line 51558 while ((child = child.previousSibling) !== null) { 51559 if (child.nodeType === 1) i += 1; 51560 } 51561 return i; 51562 } 51563 return undefined; 51564} 51565function elementParents(el, selector) { 51566 var parents = []; // eslint-disable-line 51567 var parent = el.parentElement; // eslint-disable-line 51568 while (parent) { 51569 if (selector) { 51570 if (parent.matches(selector)) parents.push(parent); 51571 } else { 51572 parents.push(parent); 51573 } 51574 parent = parent.parentElement; 51575 } 51576 return parents; 51577} 51578function elementTransitionEnd(el, callback) { 51579 function fireCallBack(e) { 51580 if (e.target !== el) return; 51581 callback.call(el, e); 51582 el.removeEventListener('transitionend', fireCallBack); 51583 } 51584 if (callback) { 51585 el.addEventListener('transitionend', fireCallBack); 51586 } 51587} 51588function elementOuterSize(el, size, includeMargins) { 51589 var window = (0, _ssrWindowEsm.a)(); 51590 if (includeMargins) { 51591 return el[size === 'width' ? 'offsetWidth' : 'offsetHeight'] + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-right' : 'margin-top')) + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-left' : 'margin-bottom')); 51592 } 51593 return el.offsetWidth; 51594} 51595function makeElementsArray(el) { 51596 return (Array.isArray(el) ? el : [el]).filter(function (e) { 51597 return !!e; 51598 }); 51599} 51600function getRotateFix(swiper) { 51601 return function (v) { 51602 if (Math.abs(v) > 0 && swiper.browser && swiper.browser.need3dFix && Math.abs(v) % 90 === 0) { 51603 return v + 0.001; 51604 } 51605 return v; 51606 }; 51607} 51608function setInnerHTML(el) { 51609 var html = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; 51610 if (typeof trustedTypes !== 'undefined') { 51611 el.innerHTML = trustedTypes.createPolicy('html', { 51612 createHTML: function createHTML(s) { 51613 return s; 51614 } 51615 }).createHTML(html); 51616 } else { 51617 el.innerHTML = html; 51618 } 51619} 51620 51621},{"./ssr-window.esm.mjs":139,"@babel/runtime/helpers/defineProperty":98,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/toConsumableArray":105,"@babel/runtime/helpers/typeof":108}],142:[function(require,module,exports){ 51622"use strict"; 51623 51624var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 51625Object.defineProperty(exports, "__esModule", { 51626 value: true 51627}); 51628Object.defineProperty(exports, "Swiper", { 51629 enumerable: true, 51630 get: function get() { 51631 return _swiperCore.S; 51632 } 51633}); 51634Object.defineProperty(exports, "default", { 51635 enumerable: true, 51636 get: function get() { 51637 return _swiperCore.S; 51638 } 51639}); 51640var _swiperCore = require("./shared/swiper-core.mjs"); 51641var _virtual = _interopRequireDefault(require("./modules/virtual.mjs")); 51642var _keyboard = _interopRequireDefault(require("./modules/keyboard.mjs")); 51643var _mousewheel = _interopRequireDefault(require("./modules/mousewheel.mjs")); 51644var _navigation = _interopRequireDefault(require("./modules/navigation.mjs")); 51645var _pagination = _interopRequireDefault(require("./modules/pagination.mjs")); 51646var _scrollbar = _interopRequireDefault(require("./modules/scrollbar.mjs")); 51647var _parallax = _interopRequireDefault(require("./modules/parallax.mjs")); 51648var _zoom = _interopRequireDefault(require("./modules/zoom.mjs")); 51649var _controller = _interopRequireDefault(require("./modules/controller.mjs")); 51650var _a11y = _interopRequireDefault(require("./modules/a11y.mjs")); 51651var _history = _interopRequireDefault(require("./modules/history.mjs")); 51652var _hashNavigation = _interopRequireDefault(require("./modules/hash-navigation.mjs")); 51653var _autoplay = _interopRequireDefault(require("./modules/autoplay.mjs")); 51654var _thumbs = _interopRequireDefault(require("./modules/thumbs.mjs")); 51655var _freeMode = _interopRequireDefault(require("./modules/free-mode.mjs")); 51656var _grid = _interopRequireDefault(require("./modules/grid.mjs")); 51657var _manipulation = _interopRequireDefault(require("./modules/manipulation.mjs")); 51658var _effectFade = _interopRequireDefault(require("./modules/effect-fade.mjs")); 51659var _effectCube = _interopRequireDefault(require("./modules/effect-cube.mjs")); 51660var _effectFlip = _interopRequireDefault(require("./modules/effect-flip.mjs")); 51661var _effectCoverflow = _interopRequireDefault(require("./modules/effect-coverflow.mjs")); 51662var _effectCreative = _interopRequireDefault(require("./modules/effect-creative.mjs")); 51663var _effectCards = _interopRequireDefault(require("./modules/effect-cards.mjs")); 51664/** 51665 * Swiper 12.1.4 51666 * Most modern mobile touch slider and framework with hardware accelerated transitions 51667 * https://swiperjs.com 51668 * 51669 * Copyright 2014-2026 Vladimir Kharlampidi 51670 * 51671 * Released under the MIT License 51672 * 51673 * Released on: April 29, 2026 51674 */ 51675 51676// Swiper Class 51677var modules = [_virtual["default"], _keyboard["default"], _mousewheel["default"], _navigation["default"], _pagination["default"], _scrollbar["default"], _parallax["default"], _zoom["default"], _controller["default"], _a11y["default"], _history["default"], _hashNavigation["default"], _autoplay["default"], _thumbs["default"], _freeMode["default"], _grid["default"], _manipulation["default"], _effectFade["default"], _effectCube["default"], _effectFlip["default"], _effectCoverflow["default"], _effectCreative["default"], _effectCards["default"]]; 51678_swiperCore.S.use(modules); 51679 51680},{"./modules/a11y.mjs":110,"./modules/autoplay.mjs":111,"./modules/controller.mjs":112,"./modules/effect-cards.mjs":113,"./modules/effect-coverflow.mjs":114,"./modules/effect-creative.mjs":115,"./modules/effect-cube.mjs":116,"./modules/effect-fade.mjs":117,"./modules/effect-flip.mjs":118,"./modules/free-mode.mjs":119,"./modules/grid.mjs":120,"./modules/hash-navigation.mjs":121,"./modules/history.mjs":122,"./modules/keyboard.mjs":123,"./modules/manipulation.mjs":124,"./modules/mousewheel.mjs":125,"./modules/navigation.mjs":126,"./modules/pagination.mjs":127,"./modules/parallax.mjs":128,"./modules/scrollbar.mjs":129,"./modules/thumbs.mjs":130,"./modules/virtual.mjs":131,"./modules/zoom.mjs":132,"./shared/swiper-core.mjs":140,"@babel/runtime/helpers/interopRequireDefault":99}]},{},[7]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.