{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///(webpack)/buildin/global.js","webpack:///./.tmp/app_sor_core/js/components/utils.js","webpack:///./.tmp/app_sor_core/js/components/processInclude.js","webpack:///./.tmp/app_sor_core/js/components/breakpoints.js","webpack:///./node_modules/underscore/modules/index.js","webpack:///./node_modules/lodash/isObject.js","webpack:///./node_modules/lodash/_root.js","webpack:///./node_modules/lodash/_Symbol.js","webpack:///./node_modules/lodash/debounce.js","webpack:///./node_modules/lodash/isSymbol.js","webpack:///./.tmp/app_sor_core/js/checkoutConstants.js","webpack:///./.tmp/app_sor_core/js/components/reservationTimer.js","webpack:///./node_modules/lodash/_baseGetTag.js","webpack:///./node_modules/lodash/now.js","webpack:///./node_modules/lodash/_freeGlobal.js","webpack:///./node_modules/lodash/toNumber.js","webpack:///./node_modules/lodash/_baseTrim.js","webpack:///./node_modules/lodash/_trimmedEndIndex.js","webpack:///./node_modules/lodash/_getRawTag.js","webpack:///./node_modules/lodash/_objectToString.js","webpack:///./node_modules/lodash/isObjectLike.js","webpack:///./.tmp/app_sor_core/js/components/minicartSaleItemAlertBadge.js","webpack:///./.tmp/app_sor_core/js/passwordChecker/passwordChecker.js","webpack:///./.tmp/app_sor_core/js/components/formValidation.js","webpack:///./.tmp/app_sor_core/js/components/clientSideValidation.js","webpack:///./.tmp/app_sor_core/js/adyen/constants.js","webpack:///./cartridges/app_storefront_base/cartridge/client/default/js/product/base.js","webpack:///./cartridges/app_storefront_base/cartridge/client/default/js/components/focus.js","webpack:///../node_modules/ssr-window/ssr-window.esm.js","webpack:///../node_modules/dom7/dom7.esm.js","webpack:///../src/shared/dom.js","webpack:///../src/shared/get-support.js","webpack:///../src/shared/get-device.js","webpack:///../src/shared/get-browser.js","webpack:///../src/shared/utils.js","webpack:///../src/core/transition/transitionEmit.js","webpack:///../src/core/events/onTouchStart.js","webpack:///../src/core/events/onTouchMove.js","webpack:///../src/core/events/onTouchEnd.js","webpack:///../src/core/events/onResize.js","webpack:///../src/core/events/onClick.js","webpack:///../src/core/events/onScroll.js","webpack:///../src/core/events/index.js","webpack:///../src/core/breakpoints/setBreakpoint.js","webpack:///../src/core/defaults.js","webpack:///../src/core/moduleExtendParams.js","webpack:///../src/core/core.js","webpack:///../src/core/events-emitter.js","webpack:///../src/core/update/index.js","webpack:///../src/core/update/updateSize.js","webpack:///../src/core/update/updateSlides.js","webpack:///../src/core/update/updateAutoHeight.js","webpack:///../src/core/update/updateSlidesOffset.js","webpack:///../src/core/update/updateSlidesProgress.js","webpack:///../src/core/update/updateProgress.js","webpack:///../src/core/update/updateSlidesClasses.js","webpack:///../src/core/update/updateActiveIndex.js","webpack:///../src/core/update/updateClickedSlide.js","webpack:///../src/core/translate/index.js","webpack:///../src/core/translate/getTranslate.js","webpack:///../src/core/translate/setTranslate.js","webpack:///../src/core/translate/minTranslate.js","webpack:///../src/core/translate/maxTranslate.js","webpack:///../src/core/translate/translateTo.js","webpack:///../src/core/transition/index.js","webpack:///../src/core/transition/setTransition.js","webpack:///../src/core/transition/transitionStart.js","webpack:///../src/core/transition/transitionEnd.js","webpack:///../src/core/slide/index.js","webpack:///../src/core/slide/slideTo.js","webpack:///../src/core/slide/slideToLoop.js","webpack:///../src/core/slide/slideNext.js","webpack:///../src/core/slide/slidePrev.js","webpack:///../src/core/slide/slideReset.js","webpack:///../src/core/slide/slideToClosest.js","webpack:///../src/core/slide/slideToClickedSlide.js","webpack:///../src/core/loop/index.js","webpack:///../src/core/loop/loopCreate.js","webpack:///../src/core/loop/loopFix.js","webpack:///../src/core/loop/loopDestroy.js","webpack:///../src/core/grab-cursor/index.js","webpack:///../src/core/grab-cursor/setGrabCursor.js","webpack:///../src/core/grab-cursor/unsetGrabCursor.js","webpack:///../src/core/breakpoints/index.js","webpack:///../src/core/breakpoints/getBreakpoint.js","webpack:///../src/core/check-overflow/index.js","webpack:///../src/core/classes/index.js","webpack:///../src/core/classes/addClasses.js","webpack:///../src/core/classes/removeClasses.js","webpack:///../src/core/images/index.js","webpack:///../src/core/images/loadImage.js","webpack:///../src/core/images/preloadImages.js","webpack:///../src/shared/create-element-if-not-defined.js","webpack:///../src/shared/classes-to-selector.js","webpack:///../src/modules/manipulation/methods/appendSlide.js","webpack:///../src/modules/manipulation/methods/prependSlide.js","webpack:///../src/modules/manipulation/methods/addSlide.js","webpack:///../src/modules/manipulation/methods/removeSlide.js","webpack:///../src/modules/manipulation/methods/removeAllSlides.js","webpack:///../src/shared/effect-init.js","webpack:///../src/shared/effect-target.js","webpack:///../src/shared/effect-virtual-transition-end.js","webpack:///../src/shared/create-shadow.js","webpack:///../src/core/modules/resize/resize.js","webpack:///../src/core/modules/observer/observer.js","webpack:///../src/swiper.js","webpack:///../src/modules/virtual/virtual.js","webpack:///../src/modules/keyboard/keyboard.js","webpack:///../src/modules/mousewheel/mousewheel.js","webpack:///../src/modules/navigation/navigation.js","webpack:///../src/modules/pagination/pagination.js","webpack:///../src/modules/scrollbar/scrollbar.js","webpack:///../src/modules/parallax/parallax.js","webpack:///../src/modules/zoom/zoom.js","webpack:///../src/modules/lazy/lazy.js","webpack:///../src/modules/controller/controller.js","webpack:///../src/modules/a11y/a11y.js","webpack:///../src/modules/history/history.js","webpack:///../src/modules/hash-navigation/hash-navigation.js","webpack:///../src/modules/autoplay/autoplay.js","webpack:///../src/modules/thumbs/thumbs.js","webpack:///../src/modules/free-mode/free-mode.js","webpack:///../src/modules/grid/grid.js","webpack:///../src/modules/manipulation/manipulation.js","webpack:///../src/modules/effect-fade/effect-fade.js","webpack:///../src/modules/effect-cube/effect-cube.js","webpack:///../src/modules/effect-flip/effect-flip.js","webpack:///../src/modules/effect-coverflow/effect-coverflow.js","webpack:///../src/modules/effect-creative/effect-creative.js","webpack:///../src/modules/effect-cards/effect-cards.js","webpack:///./.tmp/app_sor_core/js/product/onModelDescription.js","webpack:///./.tmp/app_sor_core/js/aem/tabbedContainer.js","webpack:///./node_modules/underscore/modules/index-default.js","webpack:///./.tmp/app_sor_core/js/checkout/formErrors.js","webpack:///./.tmp/app_sor_core/js/helper/basketHelper.js","webpack:///./.tmp/app_sor_core/js/product/base.js","webpack:///./.tmp/app_sor_core/js/product/imageGallery.js","webpack:///./.tmp/app_sor_core/js/product/loyalty.js","webpack:///./.tmp/app_sor_core/js/product/badge.js","webpack:///./.tmp/app_sor_core/js/product/overview.js","webpack:///./.tmp/app_sor_core/js/sizefit/sizefit.js","webpack:///./.tmp/app_sor_core/js/helper/giftCardHelper.js","webpack:///./.tmp/app_sor_core/js/aem/overflowSlider.js","webpack:///./cartridges/app_brand_core/cartridge/client/default/js/components/utils.js","webpack:///./.tmp/app_sor_core/js/checkout/loyalty.js","webpack:///./.tmp/app_sor_core/js/product/detail.js","webpack:///./.tmp/app_sor_core/js/giftcardDetails.js","webpack:///./node_modules/jquery-datepicker/jquery-datepicker.js","webpack:///./.tmp/app_sor_core/js/giftcard/checkBalance.js","webpack:///./.tmp/app_sor_core/js/giftcard/details.js","webpack:///./.tmp/app_sor_core/js/giftcard/giftCardCheckout.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","g","this","Function","e","window","keyValueArray","str","x","k","v","kvp","split","output","length","queryStringToObject","url","search","startIndex","indexOf","endIndex","substring","location","result","forEach","pair","nameVal","decodeURIComponent","JSON","parse","stringify","objectToQueryString","obj","urlString","path","hash","index","qsIndex","hashIndex","$","param","removeQueryParam","queryparam","URL","searchParams","delete","loadScript","src","callback","script","document","createElement","type","getElementsByTagName","appendChild","onload","loadJsAfterWindowLoad","readyState","addEventListener","heapify","list","ndx","heapSize","largest","left","right","global","cscUtils","appendParamToURL","encodeURIComponent","getParamsFromURL","arr","searchHash","postHash","arrHash","output2","keys","prop","updateURLParam","paramVal","newAdditionalURL","tempArray","baseURL","additionalURL","temp","arrayIntersection","a1","a2","map","inArray","createModalMarkup","content","options","defaults","title","showCloseBtn","enableLayeredDrawers","modalSizeClass","centeredClass","customClasses","modalId","buttons","settings","extend","dataAttributes","undefined","push","header","idAttribute","footer","footerBtns","btn","html","join","removeQueryParamFromCurrentUrl","href","history","replaceState","createBackdrop","customClass","append","removeBackdrop","selector","find","remove","setUrlKeyValue","val","qs","setUrlData","decodeQueryParam","replace","elementInViewport","el","offsetToTop","top","offsetTop","offsetLeft","width","offsetWidth","height","offsetHeight","offsetParent","pageXOffset","pageYOffset","innerHeight","innerWidth","compatMode","documentElement","scrollTop","clientHeight","scrollLeft","clientWidth","insertAtInputCursor","formInput","input","start","selectionStart","end","selectionEnd","stringToTitleCase","word","charAt","toUpperCase","slice","toLowerCase","getTimeAndHours","stageMessage","date","Date","hours","getHours","minutes","getMinutes","ampm","findNHighest","listToUse","arrayLength","Math","floor","firstListItem","heapifyMax","pop","deepEqual","obj1","obj2","reduce","isEqual","include","isCurrentBreakpointAbbreviation","breakpointAbbreviation","Error","$breakpointIndicator","css","isLowRes","isCurrentBreakpoint","isHighRes","arguments","len","abbreviation","getCurrentBreakpoint","currentBP","each","$bpIndicator","data","root","self","ArrayProto","Array","ObjProto","SymbolProto","toString","nativeIsArray","isArray","nativeKeys","nativeCreate","_isNaN","isNaN","_isFinite","isFinite","Ctor","_","_wrapped","VERSION","optimizeCb","func","context","argCount","collection","accumulator","apply","baseIteratee","identity","isFunction","isObject","matcher","iteratee","Infinity","cb","restArguments","max","rest","args","baseCreate","shallowProperty","_has","deepGet","MAX_ARRAY_INDEX","pow","getLength","isArrayLike","_keys","results","currentKey","createReduce","dir","reducer","memo","initial","reduceRight","predicate","findIndex","findKey","filter","reject","negate","every","some","contains","item","fromIndex","guard","values","invoke","contextPath","method","pluck","where","attrs","findWhere","computed","lastComputed","min","shuffle","sample","random","clone","last","rand","sortBy","criteria","sort","a","b","group","behavior","partition","groupBy","indexBy","countBy","reStrSymbol","toArray","isString","match","size","pass","first","array","compact","Boolean","_flatten","shallow","strict","idx","isArguments","j","flatten","without","otherArrays","difference","uniq","isSorted","isBoolean","seen","union","arrays","intersection","argsLength","unzip","zip","createPredicateIndexFinder","findLastIndex","sortedIndex","low","high","mid","createIndexFinder","predicateFind","lastIndexOf","range","stop","step","ceil","chunk","count","executeBound","sourceFunc","boundFunc","callingContext","TypeError","bound","callArgs","concat","partial","boundArgs","placeholder","position","bindAll","memoize","hasher","cache","address","delay","wait","setTimeout","defer","throttle","timeout","previous","later","leading","now","throttled","_now","remaining","clearTimeout","trailing","cancel","debounce","immediate","debounced","callNow","wrap","wrapper","compose","after","times","before","once","hasEnumBug","propertyIsEnumerable","nonEnumerableProps","collectNonEnumProps","nonEnumIdx","constructor","proto","allKeys","mapObject","pairs","invert","functions","names","createAssigner","keysFunc","source","extendOwn","keyInObj","pick","omit","String","props","tap","interceptor","isMatch","eq","aStack","bStack","className","valueOf","areArrays","aCtor","bCtor","deepEq","isEmpty","isElement","nodeType","tagTester","isNumber","isDate","isRegExp","isError","isSymbol","isMap","isWeakMap","isSet","isWeakSet","nodelist","childNodes","parseFloat","isNull","isUndefined","has","constant","noop","propertyOf","accum","Int8Array","getTime","escapeMap","unescapeMap","createEscaper","escaper","testRegexp","RegExp","replaceRegexp","string","test","escape","unescape","fallback","idCounter","uniqueId","prefix","id","templateSettings","evaluate","interpolate","noMatch","escapes","escapeRegExp","escapeChar","template","text","oldSettings","render","offset","variable","argument","chain","instance","_chain","chainResult","mixin","toJSON","freeGlobal","require","freeSelf","toNumber","nativeMax","nativeMin","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","maxing","invokeFunc","time","thisArg","leadingEdge","timerExpired","shouldInvoke","timeSinceLastCall","trailingEdge","timeWaiting","remainingWait","isInvoking","flush","baseGetTag","isObjectLike","adyenConstants","ADYEN","UPS","UPS_ADDR_VERIFY_NOT_CALLED","UPS_ADDR_VERIFY_FAILED","UPS_ADDR_VERIFY_EXACT_MATCH","UPS_ADDR_VERIFY_NO_RECOMMENDATIONS","UPS_ADDR_VERIFY_USER_IGNORED_REC","UPS_ADDR_VERIFY_USER_ACCEPTED_REC","SHIPPING_TYPES","HOME","ACCESS_POINT","BOPIS","WILL_CALL","SHIPPING_OPTION_PICK_UP","SELECTORS","accordions","adyenCreditCardHolderInput","sectionEmail","sectionShipping","sectionBilling","sectionReview","sectionHeadings","shippingForm","shippingSummary","billingForm","billingSummary","submitPaymentBtn","reviewSummary","orderSummary","STAGES","shipping","billing","review","PAYMENT_METHODS","GIFT_CERTIFICATE","LOYALTY","PROMOTION_ONLY_ORDER","ADYEN_COMPONENT","METHOD_ADYEN_COMPONENT","ADYEN_POS","METHOD_ADYEN_POS","PAYBYLINK","PAYPAL","CREDIT_CARD","SUPPORTED_PAYMENTS","reservationTimerIdSelector","getExpireTime","destroyTimer","$timerBanner","reservationInterval","clearInterval","resources","reservation","reservationSecondsRemaining","trigger","getRemainingSeconds","expireTime","secondsRemaining","parseInt","popBanners","messages","remainingSeconds","msgKeys","msgKey","msg","startTime","message","additionalContent","alert","placement","theme","containerId","timeToLive","createTimeString","mins","secs","updateReservationTimer","toggleClass","startTimer","initialTimeStr","timeRemainingMessage","setInterval","autoClose","init","not","getDestroyTimer","updateReservationData","response","getRawTag","objectToString","symToStringTag","baseTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","other","isBinary","trimmedEndIndex","reTrimStart","reWhitespace","objectProto","nativeObjectToString","isOwn","tag","unmasked","toggleAlertBadge","$icon","hasAlertWrapper","parent","hasClass","clientData","priceDropModalEnabled","sessionStorage","getItem","hasSaleItemInCart","digitalData","cart","isSaleItem","unwrap","showPasswordConstraint","passwordValue","constraintField","regexPattern","constraintMet","$constraintField","addClass","removeClass","checkPasswordValidity","$passwordField","isValid","constraintsMet","parents","$invalidPasswordField","hideConstraints","allowEmpty","constraintsJSON","minCharConstraint","minLengthRegex","lowerCaseConstraint","lowerCaseRegex","upperCaseConstraint","upperCaseRegex","minNumberConstraint","numberRegex","minSpecialCharConstraint","specialCharRegex","off","on","preventDefault","formElement","payload","fields","feedbackElement","children","siblings","error","$formElement","closest","attachment","passwordChecker","clearFieldInvalidState","formField","$formField","attr","setCustomValidity","show","updateFocusFillState","formFieldIsActive","is","activeElement","validateForm","event","valid","$form","$formFields","checkValidity","stopPropagation","stopImmediatePropagation","validity","$invalidFields","$firstInvalid","clearForm","form","handleNumericOnBlur","$formControl","rangeError","patternError","minLength","maxLength","handleOnFocus","handleOnBlur","mismatchError","$mismatchField","validationMessage","handleOnInput","quietValidation","empty","$forms","toggleSubmitButtonIfValid","$validSubmitForms","toggleSubmit","$submit","fn","invalid","tagName","regEx","valueMissing","getAttribute","tooLong","tooShort","rangeOverflow","rangeUnderflow","patternMismatch","hide","submit","buttonClick","isFullyCoveredByAny","paymentMethod","theForm","inlineLabels","toggleSubmitOnEmptyForm","isIncomplete","btnSelector","$submitBtn","isVisibleFieldValid","field","setSubmitButtonState","thisField","$button","constants","METHOD_ADYEN","RECEIVED","NOTENOUGHBALANCE","SUCCESS","GIFTCARD","KLARNA","GIROPAY","APPLE_PAY","ACTIONTYPE","QRCODE","DISABLED_SUBMIT_BUTTON_METHODS","APPLE_DOMAIN_URL","FIRST_PAYMENT_TO_SHOW","focusHelper","getPidValue","$el","getQuantitySelector","quantitySelected","quantitySelectedModal","quantitySelectedPDP","getQuantitySelected","handleVariantResponse","$productContainer","isVaraint","isChoiceOfBonusProducts","product","variationAttributes","msgs","attrsWithSwatches","attrValue","$attrValue","$swatchButton","selected","assistiveSelectedText","removeAttr","selectable","processSwatchValues","$attr","resetUrl","processNonSwatchValues","updateAttrs","productType","readyToOrder","imgs","carousel","carouselId","alt","appendTo","detach","createCarousel","images","large","replaceWith","price","promotionsHtml","availabilityValue","availabilityMessages","availability","info_selectforstock","updateAvailability","attributes","attributeGroup","ID","attribute","label","getAttributesHtml","attributeSelect","selectedValueUrl","container","ajax","success","optionsHtml","updateOptions","quantities","quantity","updateQuantities","spinner","parseHtml","$html","parseHTML","body","chooseBonusProducts","bonusUrl","bonusChoiceRuleBased","showProductsUrlRuleBased","showProductsUrlListBased","htmlString","maxBonusItems","uuid","pliUUID","addToCartUrl","pageSize","labels","selectprods","dataType","parsedHtml","renderedTemplate","enterDialogMessage","closeButtonText","modal","getOptions","$elOption","urlValue","selectedValueId","optionId","miniCartReportingUrl","methods","editBonusProducts","focusChooseBonusProductModal","focus","onClosingChooseBonusProductModal","trapChooseBonusProductModalFocus","focusParams","containerSelector","firstElementSelector","lastElementSelector","setTabNextFocus","colorAttribute","selectAttribute","currentTarget","addToCart","pid","pidsObj","setPids","qty","childProducts","messageType","newBonusDiscountLineItem","handlePostCartAdd","reportingURL","selectBonusProduct","$choiceOfBonusProduct","maxPids","submittedQty","totalQty","optionID","valueId","selectedBonusProductHtml","removeBonusProduct","$selected","enableBonusProductSelection","available","showMoreBonusProducts","addBonusProductsToCart","$readyToOrderBonusProducts","queryString","pidsObject","bonusProducts","qtyOption","option","productId","errorMessage","msgSuccess","reload","keyCode","firstFocusableEl","lastFocusableEl","nextToLastElementSelector","linkElements","shiftKey","target","ssrDocument","removeEventListener","blur","nodeName","querySelector","querySelectorAll","getElementById","createEvent","initEvent","style","setAttribute","createElementNS","importNode","host","hostname","origin","pathname","protocol","getDocument","doc","ssrWindow","navigator","userAgent","pushState","go","back","CustomEvent","getComputedStyle","getPropertyValue","Image","screen","matchMedia","requestAnimationFrame","cancelAnimationFrame","getWindow","win","Dom7","items","__proto__","set","makeReactive","super","arrayFlat","res","arrayFilter","trim","toCreate","tempParent","innerHTML","uniqueArray","support","deviceCached","browser","Methods","classes","classNames","classList","add","toggle","attrName","removeAttribute","transform","transition","duration","transitionDuration","eventType","targetSelector","listener","capture","handleLiveEvent","eventData","dom7EventData","unshift","handleEvent","events","dom7LiveListeners","proxyListener","dom7Listeners","handlers","handler","dom7proxy","splice","evt","detail","bubbles","cancelable","dataIndex","dispatchEvent","transitionEnd","dom","fireCallBack","outerWidth","includeMargins","styles","outerHeight","box","getBoundingClientRect","clientTop","clientLeft","scrollY","scrollX","textContent","compareWith","matches","webkitMatchesSelector","msMatchesSelector","child","previousSibling","returnIndex","newChild","els","tempDiv","firstChild","prepend","insertBefore","next","nextElementSibling","nextAll","nextEls","prev","previousElementSibling","prevAll","prevEls","parentNode","foundElements","found","removeChild","nextTick","getTranslate","matrix","curTransform","transformMatrix","axis","curStyle","currentStyle","WebKitCSSMatrix","webkitTransform","MozTransform","OTransform","MsTransform","msTransform","m41","m42","node","to","noExtend","nextSource","HTMLElement","keysArray","nextIndex","nextKey","desc","getOwnPropertyDescriptor","__swiper__","setCSSProperty","varName","varValue","setProperty","animateCSSModeScroll","side","swiper","targetPosition","startPosition","translate","params","speed","wrapperEl","scrollSnapType","cssModeFrameID","isOutOfBound","current","animate","progress","easeProgress","cos","PI","currentPosition","scrollTo","overflow","getSupport","smoothScroll","touch","DocumentTouch","passiveListener","supportsPassive","opts","gestures","getDevice","overrides","platform","ua","device","ios","android","screenWidth","screenHeight","ipad","ipod","iphone","windows","macos","os","getBrowser","isSafari","isWebView","transitionEmit","runCallbacks","direction","activeIndex","previousIndex","emit","onTouchStart","touchEventsData","touches","enabled","animating","preventInteractionOnTransition","cssMode","loop","loopFix","originalEvent","$targetEl","touchEventsTarget","isTouchEvent","which","button","isTouched","isMoved","noSwipingClass","shadowRoot","noSwipingSelector","isTargetShadow","noSwiping","base","__closestFrom","assignedSlot","getRootNode","allowClick","swipeHandler","currentX","targetTouches","pageX","currentY","pageY","startX","startY","edgeSwipeDetection","iOSEdgeSwipeDetection","edgeSwipeThreshold","iOSEdgeSwipeThreshold","assign","allowTouchCallbacks","isScrolling","startMoving","touchStartTime","updateSize","swipeDirection","threshold","allowThresholdMove","focusableElements","shouldPreventDefault","allowTouchMove","touchStartPreventDefault","touchStartForcePreventDefault","isContentEditable","onTouchMove","rtl","rtlTranslate","targetTouch","changedTouches","preventedByNestedSwiper","touchReleaseOnEdges","isVertical","maxTranslate","minTranslate","diffX","diffY","sqrt","touchAngle","isHorizontal","atan2","abs","touchMoveStopPropagation","nested","startTranslate","setTransition","$wrapperEl","allowMomentumBounce","grabCursor","allowSlideNext","allowSlidePrev","setGrabCursor","diff","touchRatio","currentTranslate","disableParentSwiper","resistanceRatio","resistance","followFinger","freeMode","watchSlidesProgress","updateActiveIndex","updateSlidesClasses","updateProgress","setTranslate","onTouchEnd","slidesGrid","currentPos","touchEndTime","timeDiff","updateClickedSlide","lastClickTime","destroyed","stopIndex","groupSize","slidesSizesGrid","slidesPerGroupSkip","slidesPerGroup","increment","ratio","longSwipesMs","longSwipes","slideTo","longSwipesRatio","shortSwipes","navigation","nextEl","prevEl","onResize","breakpoints","setBreakpoint","snapGrid","updateSlides","slidesPerView","isEnd","isBeginning","centeredSlides","slides","autoplay","running","paused","run","watchOverflow","checkOverflow","onClick","preventClicks","preventClicksPropagation","onScroll","previousTranslate","translatesDiff","methodName","writable","dummyEventAttached","dummyEventListener","touchEvents","domMethod","swiperMethod","passiveListeners","passive","move","updateOnWindowResize","isGridEnabled","grid","rows","initialSlide","resizeObserver","createElements","autoHeight","setWrapperSize","virtualTranslate","effect","breakpointsBase","spaceBetween","slidesPerGroupAuto","centeredSlidesBounds","slidesOffsetBefore","slidesOffsetAfter","normalizeSlideIndex","centerInsufficientSlides","roundLengths","simulateTouch","uniqueNavElements","slideToClickedSlide","preloadImages","updateOnImagesReady","loopAdditionalSlides","loopedSlides","loopFillGroupWithBlank","loopPreventsSlide","containerModifierClass","slideClass","slideBlankClass","slideActiveClass","slideDuplicateActiveClass","slideVisibleClass","slideDuplicateClass","slideNextClass","slideDuplicateNextClass","slidePrevClass","slideDuplicatePrevClass","wrapperClass","runCallbacksOnInit","_emitClasses","moduleExtendParams","allModulesParams","moduleParamName","moduleParams","auto","prototypes","eventsEmitter","priority","eventsListeners","onceHandler","__emitterProxy","onAny","eventsAnyListeners","offAny","eventHandler","update","Number","getDirectionLabel","marginRight","getDirectionPropertyValue","swiperSize","wrongRTL","isVirtual","virtual","previousSlidesLength","slidesLength","offsetBefore","offsetAfter","previousSnapGridLength","previousSlidesGridLength","slidePosition","prevSlideSize","virtualSize","marginLeft","marginBottom","marginTop","slideSize","gridEnabled","initSlides","shouldResetSlideSize","slide","updateSlide","slideStyles","currentTransform","currentWebKitTransform","paddingLeft","paddingRight","boxSizing","swiperSlideSize","updateWrapperSize","newSlidesGrid","slidesGridItem","slideIndex","allSlidesSize","slideSizeValue","maxSnap","snap","allSlidesOffset","snapIndex","addToSnapGrid","addToSlidesGrid","updateSlidesOffset","updateAutoHeight","activeSlides","newHeight","getSlideByIndex","visibleSlides","swiperSlideOffset","updateSlidesProgress","offsetCenter","visibleSlidesIndexes","slideOffset","slideProgress","slideBefore","slideAfter","multiplier","wasBeginning","wasEnd","activeSlide","realIndex","nextSlide","prevSlide","emitSlidesClasses","newActiveIndex","previousRealIndex","previousSnapIndex","skip","initialized","slideFound","clickedSlide","clickedIndex","byController","y","translateTo","internal","translateBounds","newTranslate","isH","onTranslateToWrapperTransitionEnd","transitionStart","indexAsNumber","normalizedTranslate","normalizedGrid","normalizedGridNext","_immediateVirtual","_swiperImmediateVirtual","onSlideToWrapperTransitionEnd","slideToLoop","newIndex","slideNext","perGroup","slidesPerViewDynamic","_clientLeft","slidePrev","normalize","prevSnapIndex","normalizedSnapGrid","prevSnap","prevIndex","slideReset","slideToClosest","currentSnap","slideToIndex","loopCreate","blankSlidesNum","blankNode","prependSlides","appendSlides","cloneNode","loopDestroy","moving","isLocked","cursor","unsetGrabCursor","attachEvents","detachEvents","breakpoint","getBreakpoint","currentBreakpoint","breakpointParams","originalParams","wasMultiRow","isMultiRow","wasEnabled","emitContainerClasses","fill","directionChanged","needsReLoop","changeDirection","isEnabled","disable","enable","containerEl","currentHeight","points","point","minRatio","substr","wasLocked","lastSlideIndex","lastSlideRightEdge","addClasses","suffixes","entries","resultClasses","autoheight","centered","removeClasses","loadImage","imageEl","srcset","sizes","checkForComplete","image","onReady","complete","onerror","imagesLoaded","imagesToLoad","currentSrc","extendedDefaults","Swiper","swipers","newParams","__modules__","mod","extendParams","swiperParams","passedParams","eventName","velocity","desktop","touchEventsTouch","touchEventsDesktop","clickTimeout","velocities","installModule","extendDefaults","newDefaults","use","setProgress","cls","getSlideClasses","slideEl","updates","view","exact","spv","breakLoop","translateValue","newDirection","needUpdate","currentDirection","mount","mounted","getWrapperSelector","destroy","deleteInstance","cleanStyles","createElementIfNotDefined","checkProps","element","classesToSelector","appendSlide","observer","prependSlide","addSlide","activeIndexBuffer","baseLength","slidesBuffer","currentSlide","removeSlide","slidesIndexes","indexToRemove","removeAllSlides","effectInit","overwriteParams","perspective","overwriteParamsResult","_s","effectTarget","effectParams","$slideEl","transformEl","effectVirtualTransitionEnd","allSlides","eventTriggered","triggerEvents","createShadow","shadowClass","$shadowContainer","$shadowEl","prototypeGroup","protoMethod","resizeHandler","orientationChangeHandler","ResizeObserver","newWidth","contentBoxSize","contentRect","inlineSize","blockSize","observe","unobserve","observers","attach","MutationObserver","WebkitMutationObserver","mutations","observerUpdate","childList","characterData","observeParents","observeSlideChildren","containerParents","disconnect","cssModeTimeout","renderSlide","force","addSlidesBefore","addSlidesAfter","previousFrom","from","previousTo","previousSlidesGrid","previousOffset","offsetProp","slidesAfter","slidesBefore","onRendered","lazy","load","renderExternal","slidesToRender","renderExternalUpdate","prependIndexes","appendIndexes","numberOfNewSlides","newCache","cachedIndex","$cachedEl","cachedElIndex","handle","kc","charCode","pageUpDown","keyboard","isPageUp","isPageDown","isArrowLeft","isArrowRight","isArrowUp","isArrowDown","altKey","ctrlKey","metaKey","onlyInViewport","inView","swiperWidth","swiperHeight","windowWidth","windowHeight","swiperOffset","swiperCoord","returnValue","mousewheel","releaseOnEdges","forceToAxis","sensitivity","eventsTarget","thresholdDelta","thresholdTime","lastEventBeforeSnap","lastScrollTime","recentWheelEvents","handleMouseEnter","mouseEntered","handleMouseLeave","animateSlider","newEvent","delta","raw","rtlFactor","sX","sY","pX","pY","wheelDelta","wheelDeltaY","wheelDeltaX","HORIZONTAL_AXIS","deltaY","deltaX","deltaMode","spinX","spinY","pixelX","pixelY","positions","sign","ignoreWheelEvents","sticky","shift","prevEvent","firstEvent","snapToThreshold","autoplayDisableOnInteraction","getEl","toggleEl","disabled","disabledClass","lockClass","$nextEl","$prevEl","onPrevClick","onNextClick","hideOnClick","hiddenClass","targetEl","pagination","clickable","isHidden","bulletSize","pfx","bulletElement","renderBullet","renderProgressbar","renderFraction","renderCustom","progressbarOpposite","dynamicBullets","dynamicMainBullets","formatFractionCurrent","number","formatFractionTotal","bulletClass","bulletActiveClass","modifierClass","currentClass","totalClass","progressbarFillClass","progressbarOppositeClass","clickableClass","horizontalClass","verticalClass","bullets","dynamicBulletIndex","isPaginationDisabled","setSideBullets","$bulletEl","total","paginationType","firstIndex","lastIndex","midIndex","suffix","bullet","$bullet","bulletIndex","$firstDisplayedBullet","$lastDisplayedBullet","dynamicBulletsLength","bulletsOffset","progressbarDirection","scale","scaleX","scaleY","paginationHTML","numberOfBullets","dragStartPos","dragSize","trackSize","divider","dragTimeout","scrollbar","$dragEl","newSize","newPos","opacity","display","getPointerPosition","clientX","clientY","setDragPosition","positionRatio","onDragStart","onDragMove","onDragEnd","snapOnRelease","activeListener","eventMethod","$swiperEl","dragClass","dragEl","draggable","parallax","setTransform","currentOpacity","currentScale","_swiper","parallaxEl","$parallaxEl","parallaxDuration","zoom","maxRatio","containerClass","zoomedSlideClass","gesturesEnabled","fakeGestureTouched","fakeGestureMoved","isScaling","gesture","slideWidth","slideHeight","$imageEl","$imageWrapEl","minX","minY","maxX","maxY","touchesStart","touchesCurrent","prevPositionX","prevPositionY","prevTime","getDistanceBetweenTouches","x1","y1","x2","y2","onGestureStart","scaleStart","onGestureChange","scaleMove","onGestureEnd","scaledWidth","scaledHeight","onTransitionEnd","zoomIn","touchX","touchY","translateX","translateY","imageWidth","imageHeight","translateMinX","translateMinY","translateMaxX","translateMaxY","touchAction","zoomOut","zoomToggle","getListeners","activeListenerWithCapture","getSlideSelector","toggleGestures","slideSelector","enableGestures","disableGestures","momentumDurationX","momentumDurationY","momentumDistanceX","newPositionX","momentumDistanceY","newPositionY","momentumDuration","in","out","checkInView","loadPrevNext","loadPrevNextAmount","loadOnTransitionStart","scrollingElement","elementClass","loadingClass","loadedClass","preloaderClass","scrollHandlerAttached","initialImageLoaded","loadInSlide","loadInDuplicate","$images","background","$pictureEl","sourceEl","$source","slideOriginalIndex","slideExist","amount","maxIndex","minIndex","checkInViewOnLoad","$scrollElement","isWindow","scrollElementWidth","scrollElementHeight","LinearSpline","i1","i3","binarySearch","guess","removeSpline","controller","control","spline","inverse","by","_t","controlledTranslate","controlled","setControlledTranslate","setControlledTransition","a11y","notificationClass","prevSlideMessage","nextSlideMessage","firstSlideMessage","lastSlideMessage","paginationBulletMessage","slideLabelMessage","containerMessage","containerRoleDescriptionMessage","itemRoleDescriptionMessage","slideRole","liveRegion","notify","notification","makeElFocusable","makeElNotFocusable","addElRole","role","addElRoleDescription","description","addElLabel","disableEl","enableEl","onEnterOrSpaceKey","click","updateNavigation","hasPagination","initNavEl","wrapperId","controls","$containerEl","repeat","round","live","bulletEl","paths","slugify","getPathValues","urlOverride","pathArray","part","setHistory","includes","currentState","state","scrollToSlide","setHistoryPopState","hashNavigation","watchState","onHashChange","newHash","setHash","$activeSlideEl","autoplayResult","reverseDirection","stopOnLastSlide","pause","waitForTransition","onVisibilityChange","visibilityState","onMouseEnter","disableOnInteraction","onMouseLeave","pauseOnMouseEnter","thumbs","multipleActiveThumbs","autoScrollOffset","slideThumbActiveClass","thumbsContainerClass","swiperCreated","onThumbClick","thumbsSwiper","currentIndex","thumbsParams","SwiperClass","thumbsSwiperParams","useOffset","newThumbsIndex","currentThumbsIndex","prevThumbsIndex","nextThumbsIndex","thumbsToActivate","thumbActiveClass","momentum","momentumRatio","momentumBounce","momentumBounceRatio","momentumVelocityRatio","minimumVelocity","lastMoveEvent","velocityEvent","distance","momentumDistance","newPosition","afterBouncePosition","needsLoopFix","doBounce","bounceAmount","moveDistance","currentSlideSize","slidesNumberEvenToRows","slidesPerRow","numFullColumns","newSlideOrderIndex","column","row","groupIndex","slideIndexInGroup","columnsInGroup","order","fadeEffect","crossFade","tx","ty","slideOpacity","cubeEffect","slideShadows","shadow","shadowOffset","shadowScale","$cubeShadowEl","wrapperRotate","slideAngle","tz","shadowBefore","shadowAfter","shadowAngle","sin","scale1","scale2","zFactor","flipEffect","limitRotation","rotateY","rotateX","zIndex","coverflowEffect","rotate","stretch","depth","modifier","center","offsetMultiplier","translateZ","slideTransform","$shadowBeforeEl","$shadowAfterEl","creativeEffect","limitProgress","shadowPerProgress","progressMultiplier","custom","getTranslateValue","translateString","rotateString","scaleString","opacityString","shadowOpacity","cardsEffect","tX","tY","tZ","tXAdd","isSwipeToNext","isSwipeToPrev","subProgress","prevY","utils","$mainPDPGallery","$modelDescription","getOnModelData","onModelValue","modelKey","modelObject","onModelObj","modelValue","variantUPC","modelDescription","imageModelData","modelDataValue","modelImg","triggerOnModelDescription","imageclick","reinitializeCarousels","$clickedItem","targetContentSelector","slick","$this","$hybridTabbedContainer","$thisItem","$clickedTab","$contentContainer","$targetContent","$ofs","slideToItem","allExports","loadFormErrors","formElem","fieldErrors","currIndex","ogformElem","isInvalidEmail","fieldName","headerOffset","clearPreviousErrors","parentSelector","minicartSaleItemAlertBadge","isCartPage","createErrorNotification","removeProductModal","productName","isBonusProduct","showSFL","removeButton","cancelButton","sflButton","saveForLater","modalContent","removeBonusProductBody","removeProductBody","$confirmModal","removeProduct","productID","urlParams","cartSource","done","Event","basket","toBeDeletedUUIDs","uuidToDelete","hasBonusProduct","numItems","reservationTimerHelper","reservableProductsInCart","dtmEvent","dtmLayer","pageInstanceID","page","user","fail","err","responseJSON","redirectUrl","deleteItemConfirmation","one","$qtyField","enableScroll","updateRewardsCardAndBanner","rewardsCard","basketMultiplier","loyaltyActive","appliedRewards","formatted","remainingRewards","rewardsBalance","numericValue","currencyFormattedString","cartWillEarnRewards","rewards","promoRewards","strikeThrough","baseRewards","emitCartEvents","action","_satellite","track","formData","removeFromCart","saveForLaterUrl","listSizeMsg","lineItemsTotalCount","alertMsg","couponCode","code","getPidFromQuickview","processOnloadEvents","cartOnloadEvents","onModel","Badge","Overview","oosData","$productObject","topLevelAttribute","$swatchSpan","$swatchAnchor","swatchOutOfStockText","enableNotifyMe","variantData","color","bisnflag","isNotifyMeEnabled","displayValue","preventScroll","masterSelectable","pdpUrl","getSkuValues","skuArray","attributeID","sku","attributeValue","getSelectedSwatchValue","variantID","swatchArrays","swatchKeys","markOOSColorVariants","colorVariantArrays","colorVariantKeys","colorVarKey","updateOOSColorVariants","masterID","productCache","variantMatrix","inventory","sizeVariantArrays","sizeVariantKeys","dimVariantArrays","dimension","dimVariantKeys","selectedSize","selectedDim","oosVariants","variant","productObject","topLevelArray","allAttributes","selectedCount","attrOutOfStockText","attributeId","masterId","hasSizeType","hasColor","hasSize","hasDimension","selectedAttributes","selectedSizeType","validSizes","validColors","skuColorArray","skuSizeArray","selectedColor","validDimensions","hideShowValidSwatches","groupVisible","hideColorPriceGroups","setVariantNotifyMeStatus","variantMaster","colorSwatchID","colorSwatchVariantArray","variantSize","variantNotifyMe","createSwiperAssets","assetData","assetType","$swiperSlide","$imageGallery","$wrapper","isThumbnail","modelId","createSketchfabAsset","$asset","$swiperContent","videoID","videoType","productVideoThumbnail","productVideoThumbnailAltText","createVideoAsset","createImagesAndVideo","$imageGalleries","retinaEnabled","hiresImgUrlParams","pdpImgUrlParams","pdpProductImgAppend","badgeData","pdpTechBadgeData","isQuickView","enableStylitics","stylitics","$swiperWrapper","swiperSlideStyle","imageAltIdx","imageData","badgeHTML","displayBadge","techBadgeHTML","displayTechBadge","swiperSlideClass","$swiperImg","$zoomControls","$styliticsLink","videoUrl","productVideoAltText","posterUrl","onModelAttribute","modelData","jumplinkCta","retinaUrl","onColorVariantHover","altText","productThumbnailAltText","product_VideoData","productVideoData","videoData","selectedAttributeID","isVariant","$omnibusPrice","enableServerSideGallery","primaryImage","variantUrl","updatedAttr","linkedSizesHtml","lowestPrice30Days","promotions","promotion","isExclusive","callOutMessageDisplayPages","displayPage","calloutMsg","details","getPromotionCalloutHtml","highlightClass","messageHighlight","calloutOpenAccount","getExclusivePromotionCalloutHtml","exclusivePromotion","instockBool","instock","velocityValue","velocityMessages","velocityMessage","sales","class","cssClass","outerHTML","colorValue","sizeValue","dimensionValue","getUserSelectedAttributes","galleryURL","$$productGalleryContainer","$productGallery","$productGalleryThumb","preQuickViewModalDigitalData","pageInfo","pageURL","attributeType","$existingOldChemistryListItem","oldChemistryText","$prop65ListItemElement","oldChemistryListItemHTMLString","updateOldChemistryMessaging","UUID","pageStart","moreURL","isEverythingSelected","$addToCartButton","$swatchAttributes","swatchGroupSelectors","allAttributesSelected","popupAlignment","$popup","viewportWidth","elementCenter","popupHalfWidth","showOutOfStockPopup","$sizeSwatch","thisSwatch","disabledAddToCartHandler","$dimElement","$sizeElement","$sizeSwatchSelected","onClickAddToCartButtonDisabled","updateSwatchAttributeLabel","$swatch","selectedValue","initExclusiveEvents","qvPid","setItem","removeItem","$swatchClicked","$selectedAttrUrl","selectedAttrUrl","$url","$dimensionSwatches","$selectedAttr","appendDimensionParams","$swatchEntered","currentLabelText","sizeSwatch","quickViewSwatchFunctionality","searchPID","isNumeric","quantityTotal","isReservable","reservableProduct","hasError","hideMinicartTimeout","restoreDTM","forceOOSNotifyMe","$notifymeVariant","hideForm","notifyme","overviewInit","$mainGallery","$thumbnailGallery","swiperMain","swiperThumb","player","initVideoPlayer","$videoSlide","playerHost","videoId","playerId","tagId","firstScriptTag","videoPlayerObserver","videoPlayers","subtree","pauseVideo","initGalleryEvents","$imageClicked","$selectedColorSwatch","basePid","modalHTML","$zoomModal","imageIndexToZoom","$modalBody","zoomViewerHeight","modalBodyPadding","zoomIndex","$zoomViewer","$bigImg","$elem","hiResImage","imgX","imgY","viewerWidth","viewerHeight","difWidth","difHeight","viewerOffset","$activeThumb","initZoom","setImageUrl","galleryConfig","galleryElements","config","hasThumbnails","isQuickview","gallerySelector","thumbnailSelector","galleryContainerSelector","$galleryContainer","$gallery","$thumbnail","getGalleryElements","$main","swiperGalleryMain","swiperConfigMain","swiperGalleryThumb","initSwiperGallery","highlightMultiplierReward","rewardsData","rewardsHtml","gridBadge","badgeType","gridBadgeValue","gridBadgeDisplay","hasSaleSwatchSelected","hideDynamicBadges","isStaticType","svg","svgClass","svgWidth","svgHeight","svgID","closeModal","buildModal","launchModal","disableScroll","tabbedContainer","showUnitToggle","selectCategory","$element","elementIdParts","categorySuffix","dataset","subcat","genderToShow","gendershow","sectionDiv","buttonText","gender","$categorySelected","$divSelected","$activeCategory","$activeSection","menuText","genderCategory","collapse","toggleCategorySizeFit","innerText","toggleMeasurements","useCentimeters","$toggleTable","$columnHeaders","nthIndex","$toggleCell","convertedValue","unit","toFixed","unitConversion","clearTableClasses","$tableElement","applyTableElementStyle","createScrollButtons","$activeContent","tableHeaderHeight","$rightScrollButton","$leftScrollButton","scrollButtonPosition","$container","$table","tableOverflow","initSizeFit","$sizeFitModal","fitAsset","$unitToggles","$activeTable","$currentScrollButton","$tdElement","containsTdElement","elementIndex","iterator","rowElement","$rowElement","columnIndex","childElement","$childElement","getSizeFitGuideContent","$modalContentWrapper","successHandler","overflowSlider","parentElement","checkoutConstants","SFCC_ADYEN_PAYMENT_NAME","updateCreditCardFieldsAsRequired","updateGiftCardlist","$giftCardContainer","paymentInstrumentsDetails","giftCardDetails","appliedGiftCards","giftCards","card","$tpl","piUUID","giftCardCode","giftCardAmount","updatePaymentsection","paymentInstruments","notFullyCoveredByAny","isNotFullyCoveredByAny","$loyaltyRewardsContainer","isRewardsAnyIncrement","slideDown","$billingPaymentOptionsBlock","totals","subTotalAfterOrderDiscounts","loyaltyRewards","loyaltyRewardDropDownOptions","checkedPaymentMethod","selectedPaymentOptionValue","isCcOrPbl","isPayPalAuthorized","isFullyCovered","loyaltyRewardsDetails","isLoyaltyRewardsApplied","slideUp","updateOrderSummary","$summaryContainer","freeShippingText","localizedFreeShippingText","isAdjustedShippingCostFree","adjustedShippingTotalCost","subTotal","orderLevelDiscountTotal","discountTotal","discounts","$discountDetailsContainer","discountDetailMarkup","discount","applied","relationship","discountRelationship","promotionID","formattedPrice","lineItemText","showLoyaltyTotal","loyalty","totalShippingCost","shippingLevelDiscountTotal","totalTax","grandTotal","showGiftCardTotal","giftCardTotal","amountDue","klarnaPriceValue","Klarna","OnsiteMessaging","refresh","updateCreditCardFields","updateProductSummary","basketItems","priceItem","renderedPrice","slideByAmount","slideToX","dragStart","dragging","dragEnd","toggleArrows","listenForArrowClicks","setHeight","clamp","windowResizeTimeoutId","sliderSelector","sliderClass","arrowLeftSelector","arrowLeftClass","arrowRightSelector","arrowRightClass","percentToSlide","newXPos","endX","startXPos","containerSize","sliderSize","always","$item","itemLeft","$slider","currentSliderXPos","sliderMargin","arrowSize","showArrows","itemRight","ofsWidth","ofs","mouseX","sliderX","isDragging","mouseDownXPos","slideAmount","instanceSettings","sliderHeight","$sliderContainer","expectedHeight","attrOptions","elem","imgLoadedTimeoutID","clickedTab","itemClass","arrowBtns","arrowLeftLabel","arrowClass","arrowRightLabel","alignArrowsToImgs","firstImg","imgHeight","$activeItem","activeItemClass","itemSelector","formHelpers","giftCardHelpers","basketHelper","errorModal","updateForecastedRewards","calculatedRewards","$forecastedRewardsMessage","rewardsBalanceBannerToggle","isRewardsApplied","textRemainingBalance","suppressActionButton","$rewardsBalanceRedemptionBanner","$redemptionBannerPrimaryText","$redemptionBannerSecondaryText","$applyRewardsButton","$removeRewardsButton","$loyaltyForm","shouldRedirectOnSignUp","loyaltySuccessMessage","serialize","$shippingForm","rewardsRedeemed","$availableCerts","$appliedRewardsAlert","$loyaltyOrderSummary","$paymentOptionsBlock","redeemedAmountText","rewardsAppliedMsg","toasterContent","$selectedPaymentOption","$loyaltyRemoveButton","ImageGallery","sizefitJs","pollCountMax","initialPageLoad","refreshKlarnaPlacements","displayedPrice","scrollToAccordionSection","sectionSelector","$productDetailsContainer","$productAccordianDrawer","headerHeight","initGallery","hideSizeFitModal","createSizeFitModal","modalConfig","modalMarkup","$modal","launchSizeGuide","sizeGuideUrl","unitType","ssp","sizefitSwitch","toggleHTML","setSelectedInventoryStatus","$attributeLabelValue","$auxSwatch","outOfStockText","$targetNode","$dimensionSwatchSelected","$colorValue","colorSelected","queryScOnLoad","mutationsList","$bvReviewRatings","scOnLoad","$swatchSelected","customValueUrl","initProcess","internalProcessValue","processCopy","process","processValue","env","processParam","stickyAddToCart","$stickyButton","stickyButtonOffsetTop","$discountPercentage","$pranaRating","updateAttributesAndDetails","attributesHtml","shortDescription","longDescription","$inStorePickupContainer","availableForInStorePickup","showSpinner","updateAttribute","updateAddToCart","disableAddToCart","$availabilityMsgContainer","dismissible","isMaster","allAvailable","allReady","onScrollToDetails","initLoyalty","onClickReviewStars","queryParamProductReviews","bvOpen","launchOmnibusReviewModal","modalTitle","launchSizeGuideModal","onSelectAttribute","attrType","attributeLabelValue","onWriteReviewButtonPoll","pollCallback","bvOpenWriteReview","processInclude","jqueryDatepicker","ready","default","datepicker_instActive","Datepicker","_curInst","_keyEvent","_disabledInputs","_datepickerShowing","_inDialog","_mainDivId","_inlineClass","_appendClass","_triggerClass","_dialogClass","_disableClass","_unselectableClass","_currentClass","_dayOverClass","regional","closeText","prevText","nextText","currentText","monthNames","monthNamesShort","dayNames","dayNamesShort","dayNamesMin","weekHeader","dateFormat","firstDay","isRTL","showMonthAfterYear","yearSuffix","_defaults","showOn","showAnim","showOptions","defaultDate","appendText","buttonImage","buttonImageOnly","hideIfNoPrevNext","navigationAsDateFormat","gotoCurrent","changeMonth","changeYear","yearRange","showOtherMonths","selectOtherMonths","showWeek","calculateWeek","iso8601Week","shortYearCutoff","minDate","maxDate","beforeShowDay","beforeShow","onSelect","onChangeMonthYear","onClose","numberOfMonths","showCurrentAtPos","stepMonths","stepBigMonths","altField","altFormat","constrainInput","showButtonPanel","autoSize","en","dpDiv","datepicker_bindHover","datepicker_handleMouseover","datepicker","_isDisabledDatepicker","inline","datepicker_extendRemove","ui","version","markerClassName","maxRows","_widgetDatepicker","setDefaults","_attachDatepicker","inst","_newInst","_connectDatepicker","_inlineDatepicker","selectedDay","selectedMonth","selectedYear","drawMonth","drawYear","_attachments","_doKeyDown","_doKeyPress","_doKeyUp","_autoSize","_disableDatepicker","_get","_showDatepicker","_lastInput","_hideDatepicker","findMax","maxI","setMonth","setDate","getDay","_formatDate","divSpan","_setDate","_getDefaultDate","_updateDatepicker","_updateAlternate","_dialogDatepicker","pos","browserWidth","browserHeight","_dialogInst","_dialogInput","_pos","blockUI","_destroyDatepicker","$target","removeData","_enableDatepicker","_getInst","_optionDatepicker","_getDateDatepicker","_getMinMaxDate","_changeDatepicker","_refreshDatepicker","_setDateDatepicker","noDefault","_setDateFromField","_getDate","dateStr","sel","handled","_selectDay","_adjustDate","_clearDate","_gotoToday","chars","chr","_possibleChars","fromCharCode","lastVal","parseDate","_getFormatConfig","beforeShowSettings","isFixed","_findPos","_checkOffset","datepicker_getZindex","effects","_shouldFocusInput","_generateHTML","_attachHandlers","origyearshtml","numMonths","_getNumberOfMonths","cols","activeCell","yearshtml","dpWidth","dpHeight","inputWidth","inputHeight","viewWidth","viewHeight","expr","filters","hidden","postProcess","_tidyDialog","unblockUI","_checkExternalClick","period","_adjustInstDate","currentDay","currentMonth","currentYear","getDate","getMonth","getFullYear","_notifyChange","_selectMonthYear","select","selectedIndex","month","year","td","_selectDate","formatDate","noWeekends","day","checkDate","format","iFormat","dim","extra","iValue","shortYearCutoffTemp","doy","literal","lookAhead","getNumber","isDoubled","digits","num","getName","shortNames","longNames","checkLiteral","_ticksTo1970","_getDaysInMonth","_daylightSavingAdjust","ATOM","COOKIE","ISO_8601","RFC_822","RFC_850","RFC_1036","RFC_1123","RFC_2822","RSS","TICKS","TIMESTAMP","W3C","formatNumber","formatName","dates","_restrictMinMax","_determineDate","newDate","pattern","exec","offsetString","offsetNumeric","setHours","setMinutes","setSeconds","setMilliseconds","noChange","clear","origMonth","origYear","today","selectDay","selectMonth","selectYear","maxDraw","gotoDate","buttonPanel","dow","col","selectedDate","cornerClass","calender","thead","daysInMonth","leadDays","curRows","numRows","printDate","dRow","tbody","daySettings","otherMonth","unselectable","tempDate","isMultiMonth","currentDate","_canAdjustMonth","_isInRange","_generateMonthYearHeader","_getFirstDayOfMonth","secondary","inMinYear","inMaxYear","years","thisYear","determineYear","endYear","monthHtml","onChange","minMax","curYear","curMonth","yearSplit","minYear","maxYear","otherArgs","$checkBalanceForm","actionURL","gcID","gcPin","inputError","dataResponse","responsePayload","giftCertificate","balanceMessage","cardNumber","totalHeightFromTop","giftCardNumber","giftCardBalance","formValidation","clientSideValidation","virtualCardFields","physicalCardFields","getSelectedGiftCardType","updateCardAttributesFormClass","selectedType","$attributesFormContainer","designType","isTypePhysicalSwatch","isCustomValueSwatch","swatch","processValues","updateDTM","setupDatepicker","$dpInput","setDatePickerDate","desiredDate","toLocaleDateString","ensurePickerHasCurrentOrFutureDate","todaysDate","handleCustomValue","handleCustomValueBlur","customAmount","productInfo","giftCardValue","giftMessageCount","invalidChars","paste","clipboardData","getData","textRemaining","$countMessage","updateAddToCartFormData","fieldsToProcess","formObj","gcdetailsFormData","fieldsData","getFieldsData","handleFormValidation","reset","$firstValueVariation","handleAddOrUpdateCardToCart","validationStatus","$field","getFieldsValidationStatus","updateCardAttributesForm","updateToCart","updateProductUrl","quickview","startSpinner","giftCardCustomAmountLength","keypress","giftCardInspirationModal","gcInspoModal","attrSelector","$attrElement","loyaltyHelpers","giftCard","addGiftCard","giftCardId","giftCardPin","csrfToken","addGCUrl","giftCertID","giftCertPin","csrf_token","successMsg","isFullCovered","status","removeGiftCard","removeGCUrl","$giftCardId","$giftCardPin","giftCardIdVal","giftCardPinVal","$removeBtn","stripInvalidChars"],"mappings":"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","file":"giftcardDetails.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 152);\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","'use strict';\n\n// TODO: https://columbia.atlassian.net/browse/GSD-16533 Update URL functions to use the JS URL API\n/**\n * Append a parameter to a url\n * @param {string} url - a url\n * @param {string} name - key\n * @param {string} value - value\n * @return {string} url with param appended\n */\nfunction appendParamToURL(url, name, value) {\n var c = '?';\n if (url.indexOf(c) !== -1) {\n c = '&';\n }\n return url + c + name + '=' + encodeURIComponent(value);\n}\n\n/**\n * Helper function for getParamsFromURL. Split a url string into key/value pairs.\n * @param {string} str - url parameter string\n * @return {Object} object with params split into key/value pairs\n */\nfunction keyValueArray(str) {\n var kvp = str.split('&');\n var x;\n var k;\n var v;\n var output = {};\n\n for (var i = kvp.length - 1; i >= 0; i--) {\n if (kvp[i].length) { // No empty strings...\n x = kvp[i].split('=');\n k = x[0];\n v = '';\n if (x.length > 1) {\n v = x[1];\n }\n output[k] = v;\n }\n }\n\n return output;\n}\n\n/**\n * Split a url string into key/value pairs.\n * @param {string} url - url parameter string\n * @return {Object} object with params split into key/value pairs\n */\nfunction getParamsFromURL(url) {\n var arr = url.split('?');\n var search = '';\n var searchHash = '';\n var postHash = false;\n\n if (arr.length > 1) {\n var arrHash = arr[1].split('#');\n search = arrHash[0];\n\n if (arrHash.length > 1) {\n postHash = true;\n searchHash = arrHash[1];\n }\n }\n\n var output = {};\n if (search.length) {\n output = keyValueArray(search);\n }\n if (postHash) {\n if (searchHash.length) {\n var output2 = keyValueArray(searchHash);\n Object.keys(output2).forEach(function (prop) {\n output[prop] = output2[prop]; // Merge them...\n });\n }\n }\n\n return output;\n}\n\n/**\n * Update an existing url param\n * https://stackoverflow.com/questions/1090948/change-url-parameters\n * @param {string} url - Url to be updated\n * @param {string} param - param to be updated\n * @param {string} paramVal - new parameter value\n * @returns {string} - updated url\n */\nfunction updateURLParam(url, param, paramVal) {\n var newAdditionalURL = '';\n var tempArray = url.split('?');\n var baseURL = tempArray[0];\n var additionalURL = tempArray[1];\n var temp = '';\n if (additionalURL) {\n tempArray = additionalURL.split('&');\n for (var i = 0; i < tempArray.length; i++) {\n if (tempArray[i].split('=')[0] !== param) {\n newAdditionalURL += temp + tempArray[i];\n temp = '&';\n }\n }\n }\n\n var rowsText = temp + '' + param + '=' + paramVal;\n return baseURL + '?' + newAdditionalURL + rowsText;\n}\n\n/**\n * Turn the URL query string into a JSON object to make it easier to add/update/delete key/value pairs.\n * @param {string} url the URL string from which to get the querystring. Null or empty string to use the location.href.\n * @returns {obejct} the query string as an object.\n */\nfunction queryStringToObject(url) {\n var search;\n if (!url) {\n // get the query string from window.location.search\n search = location.search.substring(1); // exclude the leading ?\n } else {\n // find the query string in the given url\n var startIndex = url.indexOf('?') + 1;\n var endIndex = url.indexOf('#');\n endIndex = endIndex >= startIndex ? endIndex : url.length;\n // examples:\n // 'key=val#hash', '/?key=val#hash' => 'key=val'\n // '?key#hash' => 'key'\n search = url.substring(startIndex, endIndex);\n if (startIndex === 0 && search.indexOf('=') === -1) {\n // this string doesn't look like a query string (no '?' and no '=')\n // examples: 'key#hash', '/#hash'\n search = '';\n }\n }\n\n var result = {};\n if (search) {\n var pairs = search.split('&');\n pairs.forEach(function (pair) {\n var nameVal = pair.split('=');\n result[nameVal[0]] = decodeURIComponent(nameVal[1] || '');\n });\n }\n\n return JSON.parse(JSON.stringify(result));\n}\n\n/**\n * Convert an object into a serialized string; the opposite of queryStringToObject().\n * @param {Object} obj The object to be serialized into a string\n * @param {string} urlString An optional url into which to insert the querystring. Any existing query string will be replaced.\n * @returns {string} The resulting query or URL string.\n */\nfunction objectToQueryString(obj, urlString) {\n var url = urlString || '';\n var path = '';\n var hash = '';\n if (url) {\n var qsIndex = url.indexOf('?');\n var hashIndex = url.indexOf('#');\n var index;\n if (hashIndex > -1) {\n index = hashIndex;\n hash = url.substring(hashIndex);\n }\n if (qsIndex > -1) {\n index = qsIndex;\n }\n path = url.substring(0, index); // if index is undefined, path is the entire string.\n }\n return path + '?' + $.param(obj) + hash;\n}\n\n/**\n * Update a URL with a key/value pair. This will insert or update a pair.\n * @param {string} url The url to be updated.\n * @param {string} name The key name to use in the query string.\n * @param {string} val The value of the key to be set.\n * @returns {string} The updated URL.\n */\nfunction setUrlKeyValue(url, name, val) {\n var qs = queryStringToObject(url);\n qs[name] = encodeURIComponent(val);\n return objectToQueryString(qs, url);\n}\n\n/**\n * Update a URL with multiple key/value pairs. This will insert new or update existing keys.\n * @param {string} url The url to be updated.\n * @param {Object} obj an object of name/value pairs to be inserted/updated in the url query string.\n * @returns {string} The updated URL.\n */\nfunction setUrlData(url, obj) {\n var qs = queryStringToObject(url);\n var mergedQs = $.extend({}, qs, obj);\n return objectToQueryString(mergedQs, url);\n}\n\n/**\n * DecodeURIComponent cannot be used directly to parse query parameters from a URL. It needs a bit of preparation.\n * reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent\n * @param {string} val The query param value to be decoded.\n * @returns {string} The decoded query param value.\n */\nfunction decodeQueryParam(val) {\n return decodeURIComponent(val.replace(/\\+/g, ' '));\n}\n\n/**\n * Remove the queryparam from the url\n * @param {string} queryparam queryparam to be removed\n * @param {string} urlString url to be manipulated\n * @returns {URL} new url without provided queryparam\n */\nfunction removeQueryParam(queryparam, urlString) {\n var url = new URL(urlString);\n url.searchParams.delete(queryparam);\n return url;\n}\n\n/**\n * Remove the queryparam from the url, and replace the state\n * @param {string} queryparam queryparam to be removed\n */\nfunction removeQueryParamFromCurrentUrl(queryparam) {\n var url = removeQueryParam(queryparam, window.location.href);\n history.replaceState(null, '', url);\n}\n\n/**\n * Returns an array with values that exist in both arrays\n * @param {array} a1 - Array\n * @param {array} a2 - Array\n * @return {array} - Values that appear in both arrays\n */\nfunction arrayIntersection(a1, a2) {\n var intersect = $.map(a1,\n function (v) {\n return $.inArray(v, a2) < 0 ? null : v;\n }\n );\n return intersect;\n}\n\n/**\n * Creates and returns the markup required to display a modal.\n * The calling script should then use the bootstrap $.modal() method to display the modal.\n * Example 1:\n * var modalMarkup = createModalMarkup('

Hello World

', {title: 'Greeting'});\n * var $modal = $(modalMarkup).modal();\n * Example 2:\n * var $modal = $(createModalMarkup('')); // create empty modal\n * $modal.find('.modal-body').html(data); // inject content into the returned markup\n * $modal.modal();\n * @param {string} content The content to put in the modal. Pass empty string to just get the modal markup.\n * @param {Object} options Additional settings.\n * @return {string} The completed markup.\n */\nfunction createModalMarkup(content = '', options = {}) {\n /* Bootstrap Modal documentation: https://getbootstrap.com/docs/4.0/components/modal/ */\n const defaults = {\n title: '',\n showCloseBtn: true,\n enableLayeredDrawers: false,\n modalSizeClass: 'modal-lg', // possible values: modal-sm, modal-md (or empty string), modal-lg, modal-fluid\n centeredClass: 'modal-dialog-centered', // pass empty string to top-align the modal\n customClasses: '', // additional classes to be added to the modal\n modalId: '', // Custom id for the modal\n buttons: [\n // example markup (this will also dismiss the modal on click):\n // ''\n ]\n };\n const settings = $.extend({}, defaults, options);\n\n // additional uncommon bootstrap options go into data attributes\n const dataAttributes = [];\n ['backdrop', 'keyboard', 'focus', 'show'].forEach(param => {\n if (settings[param] !== undefined) {\n dataAttributes.push(`data-${param}=\"${settings[param]}\"`);\n }\n });\n\n let header = '
';\n if (settings.title) {\n header += `
${settings.title}
`;\n }\n if (settings.showCloseBtn) {\n header += '';\n }\n header += '
';\n\n let idAttribute = '';\n if (settings.modalId) {\n idAttribute = `id=\"${settings.modalId}\"`;\n }\n\n let footer = '';\n let footerBtns = '';\n for (let btn of settings.buttons) {\n footerBtns += btn;\n }\n if (footerBtns) {\n footer = `
${footerBtns}
`;\n }\n\n // tabindex=\"-1\" is necessary to allow the modal to close when ESC key is pressed.\n // https://stackoverflow.com/questions/12630156/how-do-you-enable-the-escape-key-close-functionality-in-a-twitter-bootstrap-moda\n const html = `
\n
\n
\n ${header}\n
\n ${content}\n
\n ${footer}\n
\n
\n
`;\n\n return html;\n}\n/**\n * Creates a backdrop element and appends it to the body tag.\n * @param {string} customClass An optional class to apply to the backdrop.\n */\nfunction createBackdrop(customClass) {\n var cls = customClass || '';\n var html = '
';\n $('body').append(html);\n}\n\n/**\n * Removes from the page the backdrop with the passed in class, or all backdrops if nothing is passed.\n * @param {string} customClass An optional class for selecting a backdrop to be removed. All will be removed if this is null.\n */\nfunction removeBackdrop(customClass) {\n var selector = '.backdrop' + (customClass ? '.' + customClass : '');\n $('body').find(selector).remove();\n}\n\n/**\n * display element in viewport\n * @param {string} el element in viewport\n * @param {string} offsetToTop off set top position\n * @return {boolean} element view port\n */\nfunction elementInViewport(el, offsetToTop) {\n var top = el.offsetTop;\n var left = el.offsetLeft;\n var width = el.offsetWidth;\n var height = el.offsetHeight;\n\n while (el.offsetParent) {\n el = el.offsetParent; // eslint-disable-line no-param-reassign\n top += el.offsetTop;\n left += el.offsetLeft;\n }\n\n if (typeof offsetToTop !== 'undefined') {\n top -= offsetToTop;\n }\n\n if (window.pageXOffset !== null) {\n return (\n top < (window.pageYOffset + window.innerHeight) &&\n left < (window.pageXOffset + window.innerWidth) &&\n (top + height) > window.pageYOffset &&\n (left + width) > window.pageXOffset\n );\n }\n\n if (document.compatMode === 'CSS1Compat') {\n return (\n top < (window.document.documentElement.scrollTop + window.document.documentElement.clientHeight) &&\n left < (window.document.documentElement.scrollLeft + window.document.documentElement.clientWidth) &&\n (top + height) > window.document.documentElement.scrollTop &&\n (left + width) > window.document.documentElement.scrollLeft\n );\n }\n\n return false;\n}\n\n/**\n * append script to body tag\n * @param {string} src url of the script to append\n * @param {function} callback optional callback to fire after load\n */\nfunction loadScript(src, callback) {\n var script = document.createElement('script');\n script.type = 'text/javascript';\n script.src = src;\n document.getElementsByTagName('body')[0].appendChild(script);\n\n if (callback) {\n script.onload = callback;\n }\n}\n\n/**\n * load script to DOM if document ready state is complete or load after window load\n * @param {string} src url of the script to append\n * @param {function} callback optional callback to fire after load\n */\nfunction loadJsAfterWindowLoad(src, callback) {\n if (document.readyState === 'complete') {\n loadScript(src, callback);\n } else {\n window.addEventListener('load', function () {\n loadScript(src, callback);\n });\n }\n}\n\n/**\n * Inserts pasted text at cursor location in input or textarea elements.\n * If a range of text is selected in the input, that range will be replaced by the new text\n * If no text in the input is selected, the string will be inserted at the end\n * @param {selector} formInput - DOM element for the target form input\n * @param {string} str - string to insert into the form\n */\nfunction insertAtInputCursor(formInput, str) {\n var input = formInput;\n var start = input.selectionStart;\n var end = input.selectionEnd;\n\n // Inserts str between selection start and end positions\n input.value = input.value.substring(0, start) + str + input.value.substring(end);\n // Update cursor position\n input.selectionStart = start + str.length;\n input.selectionEnd = input.selectionStart;\n}\n\n/**\n * Returns validity of date\n * @param {string} stageMessage The name of the stage we're going to.\n * @returns {string} Returns true if the day is within the month. Returns false if it is an invalid date.\n */\nfunction getTimeAndHours(stageMessage) {\n var date = new Date();\n var hours = date.getHours();\n var minutes = date.getMinutes();\n var ampm = hours >= 12 ? 'PM' : 'AM';\n hours %= 12;\n hours = hours || 12; // the hour '0' should be '12'\n minutes = minutes < 10 ? '0' + minutes : minutes;\n var strTime = hours + ':' + minutes + ' ' + ampm;\n return stageMessage + ' ' + strTime;\n}\n// intentionally export loadJsAfterWindowLoad onto global scope\nglobal.cscUtils = global.cscUtils || {};\nglobal.cscUtils.loadJsAfterWindowLoad = loadJsAfterWindowLoad;\n\n/**\n * Converts a string to Title Case.\n * @example\n * 'fRiEnDsHiP is MAGIC' -> 'Friendship Is Magic'\n * 'don't uppercase contractions' -> 'Don't Uppercase Contractions'\n * 'hyphenated-strings work too' -> 'Hyphenated-Strings Work Too'\n * @param {string} str The string to be title cased.\n * @returns {string} The original string in title case.\n */\nfunction stringToTitleCase(str) {\n return str.replace(/[^\\s/-]+/g, function (word) {\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n });\n}\n\n/** Function to heapify a subtree rooted with node ndx\n * @param {Array} list - The array to heapify\n * @param {number} ndx - The index of the root of the subtree to heapify\n * @param {number} heapSize - The size of the heap\n * @param {string} key - The object key to find the highest numbers for\n */\nfunction heapify(list, ndx, heapSize, key) {\n let largest = ndx;\n // eslint-disable-next-line no-mixed-operators\n const left = 2 * ndx + 1;\n // eslint-disable-next-line no-mixed-operators\n const right = 2 * ndx + 2;\n\n // Check if left child is larger than root\n if (left < heapSize && list[left][key] > list[largest][key]) {\n largest = left;\n }\n\n // Check if right child is larger than root\n if (right < heapSize && list[right][key] > list[largest][key]) {\n largest = right;\n }\n\n // If largest is not root\n if (largest !== ndx) {\n // Swap array[i] and array[largest]\n // eslint-disable-next-line no-param-reassign\n [list[ndx], list[largest]] = [list[largest], list[ndx]];\n // Recursively heapify the affected sub-tree\n heapify(list, largest, heapSize, key);\n }\n}\n\n/** Function to heapify the array into max heap\n * @param {Array} list - The array to heapify\n * @param {string} key - The object key to find the highest numbers for\n */\nfunction heapifyMax(list, key) {\n const arrayLength = list.length;\n\n // Build max heap\n for (let ndx = Math.floor(arrayLength / 2) - 1; ndx >= 0; ndx--) {\n heapify(list, ndx, arrayLength, key);\n }\n\n for (let ndx = arrayLength - 1; ndx > 0; ndx--) {\n let firstListItem = list[0];\n // eslint-disable-next-line no-param-reassign\n list[0] = list[ndx];\n // eslint-disable-next-line no-param-reassign\n list[ndx] = firstListItem;\n\n heapify(list, 0, ndx, key);\n }\n}\n\n/** Function to find the n highest numbers in an array\n * @param {Array} list - The array to find the n highest numbers in\n * @param {number} n - The number of highest numbers to find\n * @param {string} key - The object key to find the highest numbers for\n * @returns {Array} The n highest numbers\n */\nfunction findNHighest(list, n, key) {\n if (list.length < n) {\n // eslint-disable-next-line no-param-reassign\n n = list.length;\n }\n\n const listToUse = JSON.parse(JSON.stringify(list)); // Deep copy the list\n const result = [];\n\n // Build max heap\n heapifyMax(listToUse, key);\n\n for (let i = 0; i < n; i++) {\n // Extract max element from the max heap\n result.push(listToUse.pop());\n }\n\n return result;\n}\n\n/** Function to compare two objects for deep equality\n * @param {Object} obj1 - The first object to compare\n * @param {Object} obj2 - The second object to compare\n * @returns {boolean} Whether the two objects are deep equal\n */\nfunction deepEqual(obj1, obj2) {\n return (obj1 && obj2 && typeof obj1 === 'object' && typeof obj2 === 'object') ?\n (Object.keys(obj1).length === Object.keys(obj2).length) &&\n Object.keys(obj1).reduce(function (isEqual, key) {\n return isEqual && deepEqual(obj1[key], obj2[key]);\n }, true) : (obj1 === obj2);\n}\n\nmodule.exports = {\n appendParamToURL: appendParamToURL,\n keyValueArray: keyValueArray,\n getParamsFromURL: getParamsFromURL,\n updateURLParam: updateURLParam,\n arrayIntersection: arrayIntersection,\n createModalMarkup: createModalMarkup,\n queryStringToObject: queryStringToObject,\n objectToQueryString: objectToQueryString,\n removeQueryParam: removeQueryParam,\n removeQueryParamFromCurrentUrl: removeQueryParamFromCurrentUrl,\n createBackdrop: createBackdrop,\n removeBackdrop: removeBackdrop,\n setUrlKeyValue: setUrlKeyValue,\n setUrlData: setUrlData,\n decodeQueryParam: decodeQueryParam,\n elementInViewport: elementInViewport,\n loadJsAfterWindowLoad: loadJsAfterWindowLoad,\n insertAtInputCursor: insertAtInputCursor,\n stringToTitleCase,\n getTimeAndHours: getTimeAndHours,\n findNHighest: findNHighest,\n deepEqual: deepEqual\n};\n","'use strict';\n\nmodule.exports = function (include) {\n if (typeof include === 'function') {\n include();\n } else if (typeof include === 'object') {\n Object.keys(include).forEach(function (key) {\n if (typeof include[key] === 'function') {\n include[key]();\n }\n });\n }\n};\n","'use strict';\n\n/**\n* Checks if the current bootstrap UI breakpoint matches the breakpoint abbreviation.\n* @param {string} breakpointAbbreviation Breakpoint abbreviations. Options are: xs, sm, md, lg, xl\n* @returns {boolean} True if the breakpoint abbreviation is the current breakpoint.\n*/\nfunction isCurrentBreakpointAbbreviation(breakpointAbbreviation) {\n if (\n breakpointAbbreviation !== 'xs' &&\n breakpointAbbreviation !== 'sm' &&\n breakpointAbbreviation !== 'md' &&\n breakpointAbbreviation !== 'lg' &&\n breakpointAbbreviation !== 'xl') {\n throw new Error('Invalid breakpoint abbreviation: ' + breakpointAbbreviation);\n }\n\n var selector = '.bootstrap-breakpoints-' + breakpointAbbreviation;\n var $breakpointIndicator = $(selector);\n\n if ($breakpointIndicator.length === 0) {\n throw new Error('Breakpoint indicator not found for: ' + breakpointAbbreviation);\n }\n return $breakpointIndicator.css('display') === 'block';\n}\n\n/**\n * Finds the current breakpoint from the hidden .bootstrap-breakpoints element.\n * @returns {string} The currently active breakpoint abbreviation. ('xs', 'sm', 'md', 'lg', or 'xl')\n */\nfunction getCurrentBreakpoint() {\n var $breakpointIndicators = $('.bootstrap-breakpoints > div');\n var currentBP;\n $breakpointIndicators.each(function () {\n var $bpIndicator = $(this);\n if ($bpIndicator.css('display') === 'block') {\n currentBP = $bpIndicator.data('bp');\n return false; // break out of the each loop\n }\n return true; // continue to next item in loop\n });\n return currentBP;\n}\n\nmodule.exports = {\n /**\n * This check is only for the resolution of the screen, it should\n * not be used to infer device type or user interaction (touch/click).\n * @returns {boolean} True if the screen is low resolution.\n */\n isLowRes: function () {\n return this.isCurrentBreakpoint('xs', 'sm', 'md');\n },\n /**\n * This check is only for the resolution of the screen, it should\n * not be used to infer device type or user interaction (touch/click).\n * @returns {boolean} True if the screen is high resolution.\n */\n isHighRes: function () {\n return this.isCurrentBreakpoint('lg', 'xl');\n },\n\n /**\n * Checks if the current bootstrap UI breakpoint matches a parameter.\n * @example isCurrentBreakpoint('xs', 'sm')\n * @param {arguments} breakpointAbbreviations One of more comma separated string breakpoint parameters. Options are: xs, sm, md, lg, xl\n * @returns {boolean} True if any of the breakpoint abbreviations are the current breakpoint.\n */\n isCurrentBreakpoint: function () {\n if (arguments.length === 0) {\n throw new Error('No breakpoint abbreviations specified.');\n }\n\n for (var i = 0, len = arguments.length; i < len; i++) {\n var abbreviation = arguments[i];\n\n if (isCurrentBreakpointAbbreviation(abbreviation)) {\n return true;\n }\n }\n\n /**\n * NOTE: it is explicitly intentional that this function accepts the breakpoint abbreviations and returns a boolean.\n * If the function was instead 'getCurrentBreakpoint' where it returns the breakpoint abbreviation...\n * then it might make future refactors and bootstrap updates more difficult if the abbreviations change\n * because the return value may not be consumed near the function call (difficult to track/update).\n */\n return false;\n },\n\n getCurrentBreakpoint: getCurrentBreakpoint\n};\n","// Underscore.js 1.10.2\n// https://underscorejs.org\n// (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n// Underscore may be freely distributed under the MIT license.\n\n// Baseline setup\n// --------------\n\n// Establish the root object, `window` (`self`) in the browser, `global`\n// on the server, or `this` in some virtual machines. We use `self`\n// instead of `window` for `WebWorker` support.\nvar root = typeof self == 'object' && self.self === self && self ||\n typeof global == 'object' && global.global === global && global ||\n Function('return this')() ||\n {};\n\n// Save bytes in the minified (but not gzipped) version:\nvar ArrayProto = Array.prototype, ObjProto = Object.prototype;\nvar SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;\n\n// Create quick reference variables for speed access to core prototypes.\nvar push = ArrayProto.push,\n slice = ArrayProto.slice,\n toString = ObjProto.toString,\n hasOwnProperty = ObjProto.hasOwnProperty;\n\n// All **ECMAScript 5** native function implementations that we hope to use\n// are declared here.\nvar nativeIsArray = Array.isArray,\n nativeKeys = Object.keys,\n nativeCreate = Object.create;\n\n// Create references to these builtin functions because we override them.\nvar _isNaN = root.isNaN,\n _isFinite = root.isFinite;\n\n// Naked function reference for surrogate-prototype-swapping.\nvar Ctor = function(){};\n\n// The Underscore object. All exported functions below are added to it in the\n// modules/index-all.js using the mixin function.\nexport default function _(obj) {\n if (obj instanceof _) return obj;\n if (!(this instanceof _)) return new _(obj);\n this._wrapped = obj;\n}\n\n// Current version.\nexport var VERSION = _.VERSION = '1.10.2';\n\n// Internal function that returns an efficient (for current engines) version\n// of the passed-in callback, to be repeatedly applied in other Underscore\n// functions.\nfunction optimizeCb(func, context, argCount) {\n if (context === void 0) return func;\n switch (argCount == null ? 3 : argCount) {\n case 1: return function(value) {\n return func.call(context, value);\n };\n // The 2-argument case is omitted because we’re not using it.\n case 3: return function(value, index, collection) {\n return func.call(context, value, index, collection);\n };\n case 4: return function(accumulator, value, index, collection) {\n return func.call(context, accumulator, value, index, collection);\n };\n }\n return function() {\n return func.apply(context, arguments);\n };\n}\n\n// An internal function to generate callbacks that can be applied to each\n// element in a collection, returning the desired result — either `identity`,\n// an arbitrary callback, a property matcher, or a property accessor.\nfunction baseIteratee(value, context, argCount) {\n if (value == null) return identity;\n if (isFunction(value)) return optimizeCb(value, context, argCount);\n if (isObject(value) && !isArray(value)) return matcher(value);\n return property(value);\n}\n\n// External wrapper for our callback generator. Users may customize\n// `_.iteratee` if they want additional predicate/iteratee shorthand styles.\n// This abstraction hides the internal-only argCount argument.\n_.iteratee = iteratee;\nexport function iteratee(value, context) {\n return baseIteratee(value, context, Infinity);\n}\n\n// The function we actually call internally. It invokes _.iteratee if\n// overridden, otherwise baseIteratee.\nfunction cb(value, context, argCount) {\n if (_.iteratee !== iteratee) return _.iteratee(value, context);\n return baseIteratee(value, context, argCount);\n}\n\n// Some functions take a variable number of arguments, or a few expected\n// arguments at the beginning and then a variable number of values to operate\n// on. This helper accumulates all remaining arguments past the function’s\n// argument length (or an explicit `startIndex`), into an array that becomes\n// the last argument. Similar to ES6’s \"rest parameter\".\nexport function restArguments(func, startIndex) {\n startIndex = startIndex == null ? func.length - 1 : +startIndex;\n return function() {\n var length = Math.max(arguments.length - startIndex, 0),\n rest = Array(length),\n index = 0;\n for (; index < length; index++) {\n rest[index] = arguments[index + startIndex];\n }\n switch (startIndex) {\n case 0: return func.call(this, rest);\n case 1: return func.call(this, arguments[0], rest);\n case 2: return func.call(this, arguments[0], arguments[1], rest);\n }\n var args = Array(startIndex + 1);\n for (index = 0; index < startIndex; index++) {\n args[index] = arguments[index];\n }\n args[startIndex] = rest;\n return func.apply(this, args);\n };\n}\n\n// An internal function for creating a new object that inherits from another.\nfunction baseCreate(prototype) {\n if (!isObject(prototype)) return {};\n if (nativeCreate) return nativeCreate(prototype);\n Ctor.prototype = prototype;\n var result = new Ctor;\n Ctor.prototype = null;\n return result;\n}\n\nfunction shallowProperty(key) {\n return function(obj) {\n return obj == null ? void 0 : obj[key];\n };\n}\n\nfunction _has(obj, path) {\n return obj != null && hasOwnProperty.call(obj, path);\n}\n\nfunction deepGet(obj, path) {\n var length = path.length;\n for (var i = 0; i < length; i++) {\n if (obj == null) return void 0;\n obj = obj[path[i]];\n }\n return length ? obj : void 0;\n}\n\n// Helper for collection methods to determine whether a collection\n// should be iterated as an array or as an object.\n// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094\nvar MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\nvar getLength = shallowProperty('length');\nfunction isArrayLike(collection) {\n var length = getLength(collection);\n return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;\n}\n\n// Collection Functions\n// --------------------\n\n// The cornerstone, an `each` implementation, aka `forEach`.\n// Handles raw objects in addition to array-likes. Treats all\n// sparse array-likes as if they were dense.\nexport function each(obj, iteratee, context) {\n iteratee = optimizeCb(iteratee, context);\n var i, length;\n if (isArrayLike(obj)) {\n for (i = 0, length = obj.length; i < length; i++) {\n iteratee(obj[i], i, obj);\n }\n } else {\n var _keys = keys(obj);\n for (i = 0, length = _keys.length; i < length; i++) {\n iteratee(obj[_keys[i]], _keys[i], obj);\n }\n }\n return obj;\n}\nexport { each as forEach };\n\n// Return the results of applying the iteratee to each element.\nexport function map(obj, iteratee, context) {\n iteratee = cb(iteratee, context);\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length,\n results = Array(length);\n for (var index = 0; index < length; index++) {\n var currentKey = _keys ? _keys[index] : index;\n results[index] = iteratee(obj[currentKey], currentKey, obj);\n }\n return results;\n}\nexport { map as collect };\n\n// Create a reducing function iterating left or right.\nfunction createReduce(dir) {\n // Wrap code that reassigns argument variables in a separate function than\n // the one that accesses `arguments.length` to avoid a perf hit. (#1991)\n var reducer = function(obj, iteratee, memo, initial) {\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length,\n index = dir > 0 ? 0 : length - 1;\n if (!initial) {\n memo = obj[_keys ? _keys[index] : index];\n index += dir;\n }\n for (; index >= 0 && index < length; index += dir) {\n var currentKey = _keys ? _keys[index] : index;\n memo = iteratee(memo, obj[currentKey], currentKey, obj);\n }\n return memo;\n };\n\n return function(obj, iteratee, memo, context) {\n var initial = arguments.length >= 3;\n return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);\n };\n}\n\n// **Reduce** builds up a single result from a list of values, aka `inject`,\n// or `foldl`.\nexport var reduce = createReduce(1);\nexport { reduce as foldl, reduce as inject };\n\n// The right-associative version of reduce, also known as `foldr`.\nexport var reduceRight = createReduce(-1);\nexport { reduceRight as foldr };\n\n// Return the first value which passes a truth test.\nexport function find(obj, predicate, context) {\n var keyFinder = isArrayLike(obj) ? findIndex : findKey;\n var key = keyFinder(obj, predicate, context);\n if (key !== void 0 && key !== -1) return obj[key];\n}\nexport { find as detect };\n\n// Return all the elements that pass a truth test.\nexport function filter(obj, predicate, context) {\n var results = [];\n predicate = cb(predicate, context);\n each(obj, function(value, index, list) {\n if (predicate(value, index, list)) results.push(value);\n });\n return results;\n}\nexport { filter as select };\n\n// Return all the elements for which a truth test fails.\nexport function reject(obj, predicate, context) {\n return filter(obj, negate(cb(predicate)), context);\n}\n\n// Determine whether all of the elements match a truth test.\nexport function every(obj, predicate, context) {\n predicate = cb(predicate, context);\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length;\n for (var index = 0; index < length; index++) {\n var currentKey = _keys ? _keys[index] : index;\n if (!predicate(obj[currentKey], currentKey, obj)) return false;\n }\n return true;\n}\nexport { every as all };\n\n// Determine if at least one element in the object matches a truth test.\nexport function some(obj, predicate, context) {\n predicate = cb(predicate, context);\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length;\n for (var index = 0; index < length; index++) {\n var currentKey = _keys ? _keys[index] : index;\n if (predicate(obj[currentKey], currentKey, obj)) return true;\n }\n return false;\n}\nexport { some as any };\n\n// Determine if the array or object contains a given item (using `===`).\nexport function contains(obj, item, fromIndex, guard) {\n if (!isArrayLike(obj)) obj = values(obj);\n if (typeof fromIndex != 'number' || guard) fromIndex = 0;\n return indexOf(obj, item, fromIndex) >= 0;\n}\nexport { contains as includes, contains as include };\n\n// Invoke a method (with arguments) on every item in a collection.\nexport var invoke = restArguments(function(obj, path, args) {\n var contextPath, func;\n if (isFunction(path)) {\n func = path;\n } else if (isArray(path)) {\n contextPath = path.slice(0, -1);\n path = path[path.length - 1];\n }\n return map(obj, function(context) {\n var method = func;\n if (!method) {\n if (contextPath && contextPath.length) {\n context = deepGet(context, contextPath);\n }\n if (context == null) return void 0;\n method = context[path];\n }\n return method == null ? method : method.apply(context, args);\n });\n});\n\n// Convenience version of a common use case of `map`: fetching a property.\nexport function pluck(obj, key) {\n return map(obj, property(key));\n}\n\n// Convenience version of a common use case of `filter`: selecting only objects\n// containing specific `key:value` pairs.\nexport function where(obj, attrs) {\n return filter(obj, matcher(attrs));\n}\n\n// Convenience version of a common use case of `find`: getting the first object\n// containing specific `key:value` pairs.\nexport function findWhere(obj, attrs) {\n return find(obj, matcher(attrs));\n}\n\n// Return the maximum element (or element-based computation).\nexport function max(obj, iteratee, context) {\n var result = -Infinity, lastComputed = -Infinity,\n value, computed;\n if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {\n obj = isArrayLike(obj) ? obj : values(obj);\n for (var i = 0, length = obj.length; i < length; i++) {\n value = obj[i];\n if (value != null && value > result) {\n result = value;\n }\n }\n } else {\n iteratee = cb(iteratee, context);\n each(obj, function(v, index, list) {\n computed = iteratee(v, index, list);\n if (computed > lastComputed || computed === -Infinity && result === -Infinity) {\n result = v;\n lastComputed = computed;\n }\n });\n }\n return result;\n}\n\n// Return the minimum element (or element-based computation).\nexport function min(obj, iteratee, context) {\n var result = Infinity, lastComputed = Infinity,\n value, computed;\n if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {\n obj = isArrayLike(obj) ? obj : values(obj);\n for (var i = 0, length = obj.length; i < length; i++) {\n value = obj[i];\n if (value != null && value < result) {\n result = value;\n }\n }\n } else {\n iteratee = cb(iteratee, context);\n each(obj, function(v, index, list) {\n computed = iteratee(v, index, list);\n if (computed < lastComputed || computed === Infinity && result === Infinity) {\n result = v;\n lastComputed = computed;\n }\n });\n }\n return result;\n}\n\n// Shuffle a collection.\nexport function shuffle(obj) {\n return sample(obj, Infinity);\n}\n\n// Sample **n** random values from a collection using the modern version of the\n// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n// If **n** is not specified, returns a single random element.\n// The internal `guard` argument allows it to work with `map`.\nexport function sample(obj, n, guard) {\n if (n == null || guard) {\n if (!isArrayLike(obj)) obj = values(obj);\n return obj[random(obj.length - 1)];\n }\n var sample = isArrayLike(obj) ? clone(obj) : values(obj);\n var length = getLength(sample);\n n = Math.max(Math.min(n, length), 0);\n var last = length - 1;\n for (var index = 0; index < n; index++) {\n var rand = random(index, last);\n var temp = sample[index];\n sample[index] = sample[rand];\n sample[rand] = temp;\n }\n return sample.slice(0, n);\n}\n\n// Sort the object's values by a criterion produced by an iteratee.\nexport function sortBy(obj, iteratee, context) {\n var index = 0;\n iteratee = cb(iteratee, context);\n return pluck(map(obj, function(value, key, list) {\n return {\n value: value,\n index: index++,\n criteria: iteratee(value, key, list)\n };\n }).sort(function(left, right) {\n var a = left.criteria;\n var b = right.criteria;\n if (a !== b) {\n if (a > b || a === void 0) return 1;\n if (a < b || b === void 0) return -1;\n }\n return left.index - right.index;\n }), 'value');\n}\n\n// An internal function used for aggregate \"group by\" operations.\nfunction group(behavior, partition) {\n return function(obj, iteratee, context) {\n var result = partition ? [[], []] : {};\n iteratee = cb(iteratee, context);\n each(obj, function(value, index) {\n var key = iteratee(value, index, obj);\n behavior(result, value, key);\n });\n return result;\n };\n}\n\n// Groups the object's values by a criterion. Pass either a string attribute\n// to group by, or a function that returns the criterion.\nexport var groupBy = group(function(result, value, key) {\n if (_has(result, key)) result[key].push(value); else result[key] = [value];\n});\n\n// Indexes the object's values by a criterion, similar to `groupBy`, but for\n// when you know that your index values will be unique.\nexport var indexBy = group(function(result, value, key) {\n result[key] = value;\n});\n\n// Counts instances of an object that group by a certain criterion. Pass\n// either a string attribute to count by, or a function that returns the\n// criterion.\nexport var countBy = group(function(result, value, key) {\n if (_has(result, key)) result[key]++; else result[key] = 1;\n});\n\nvar reStrSymbol = /[^\\ud800-\\udfff]|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff]/g;\n// Safely create a real, live array from anything iterable.\nexport function toArray(obj) {\n if (!obj) return [];\n if (isArray(obj)) return slice.call(obj);\n if (isString(obj)) {\n // Keep surrogate pair characters together\n return obj.match(reStrSymbol);\n }\n if (isArrayLike(obj)) return map(obj, identity);\n return values(obj);\n}\n\n// Return the number of elements in an object.\nexport function size(obj) {\n if (obj == null) return 0;\n return isArrayLike(obj) ? obj.length : keys(obj).length;\n}\n\n// Split a collection into two arrays: one whose elements all satisfy the given\n// predicate, and one whose elements all do not satisfy the predicate.\nexport var partition = group(function(result, value, pass) {\n result[pass ? 0 : 1].push(value);\n}, true);\n\n// Array Functions\n// ---------------\n\n// Get the first element of an array. Passing **n** will return the first N\n// values in the array. The **guard** check allows it to work with `map`.\nexport function first(array, n, guard) {\n if (array == null || array.length < 1) return n == null ? void 0 : [];\n if (n == null || guard) return array[0];\n return initial(array, array.length - n);\n}\nexport { first as head, first as take };\n\n// Returns everything but the last entry of the array. Especially useful on\n// the arguments object. Passing **n** will return all the values in\n// the array, excluding the last N.\nexport function initial(array, n, guard) {\n return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n}\n\n// Get the last element of an array. Passing **n** will return the last N\n// values in the array.\nexport function last(array, n, guard) {\n if (array == null || array.length < 1) return n == null ? void 0 : [];\n if (n == null || guard) return array[array.length - 1];\n return rest(array, Math.max(0, array.length - n));\n}\n\n// Returns everything but the first entry of the array. Especially useful on\n// the arguments object. Passing an **n** will return the rest N values in the\n// array.\nexport function rest(array, n, guard) {\n return slice.call(array, n == null || guard ? 1 : n);\n}\nexport { rest as tail, rest as drop };\n\n// Trim out all falsy values from an array.\nexport function compact(array) {\n return filter(array, Boolean);\n}\n\n// Internal implementation of a recursive `flatten` function.\nfunction _flatten(input, shallow, strict, output) {\n output = output || [];\n var idx = output.length;\n for (var i = 0, length = getLength(input); i < length; i++) {\n var value = input[i];\n if (isArrayLike(value) && (isArray(value) || isArguments(value))) {\n // Flatten current level of array or arguments object.\n if (shallow) {\n var j = 0, len = value.length;\n while (j < len) output[idx++] = value[j++];\n } else {\n _flatten(value, shallow, strict, output);\n idx = output.length;\n }\n } else if (!strict) {\n output[idx++] = value;\n }\n }\n return output;\n}\n\n// Flatten out an array, either recursively (by default), or just one level.\nexport function flatten(array, shallow) {\n return _flatten(array, shallow, false);\n}\n\n// Return a version of the array that does not contain the specified value(s).\nexport var without = restArguments(function(array, otherArrays) {\n return difference(array, otherArrays);\n});\n\n// Produce a duplicate-free version of the array. If the array has already\n// been sorted, you have the option of using a faster algorithm.\n// The faster algorithm will not work with an iteratee if the iteratee\n// is not a one-to-one function, so providing an iteratee will disable\n// the faster algorithm.\nexport function uniq(array, isSorted, iteratee, context) {\n if (!isBoolean(isSorted)) {\n context = iteratee;\n iteratee = isSorted;\n isSorted = false;\n }\n if (iteratee != null) iteratee = cb(iteratee, context);\n var result = [];\n var seen = [];\n for (var i = 0, length = getLength(array); i < length; i++) {\n var value = array[i],\n computed = iteratee ? iteratee(value, i, array) : value;\n if (isSorted && !iteratee) {\n if (!i || seen !== computed) result.push(value);\n seen = computed;\n } else if (iteratee) {\n if (!contains(seen, computed)) {\n seen.push(computed);\n result.push(value);\n }\n } else if (!contains(result, value)) {\n result.push(value);\n }\n }\n return result;\n}\nexport { uniq as unique };\n\n// Produce an array that contains the union: each distinct element from all of\n// the passed-in arrays.\nexport var union = restArguments(function(arrays) {\n return uniq(_flatten(arrays, true, true));\n});\n\n// Produce an array that contains every item shared between all the\n// passed-in arrays.\nexport function intersection(array) {\n var result = [];\n var argsLength = arguments.length;\n for (var i = 0, length = getLength(array); i < length; i++) {\n var item = array[i];\n if (contains(result, item)) continue;\n var j;\n for (j = 1; j < argsLength; j++) {\n if (!contains(arguments[j], item)) break;\n }\n if (j === argsLength) result.push(item);\n }\n return result;\n}\n\n// Take the difference between one array and a number of other arrays.\n// Only the elements present in just the first array will remain.\nexport var difference = restArguments(function(array, rest) {\n rest = _flatten(rest, true, true);\n return filter(array, function(value){\n return !contains(rest, value);\n });\n});\n\n// Complement of zip. Unzip accepts an array of arrays and groups\n// each array's elements on shared indices.\nexport function unzip(array) {\n var length = array && max(array, getLength).length || 0;\n var result = Array(length);\n\n for (var index = 0; index < length; index++) {\n result[index] = pluck(array, index);\n }\n return result;\n}\n\n// Zip together multiple lists into a single array -- elements that share\n// an index go together.\nexport var zip = restArguments(unzip);\n\n// Converts lists into objects. Pass either a single array of `[key, value]`\n// pairs, or two parallel arrays of the same length -- one of keys, and one of\n// the corresponding values. Passing by pairs is the reverse of pairs.\nexport function object(list, values) {\n var result = {};\n for (var i = 0, length = getLength(list); i < length; i++) {\n if (values) {\n result[list[i]] = values[i];\n } else {\n result[list[i][0]] = list[i][1];\n }\n }\n return result;\n}\n\n// Generator function to create the findIndex and findLastIndex functions.\nfunction createPredicateIndexFinder(dir) {\n return function(array, predicate, context) {\n predicate = cb(predicate, context);\n var length = getLength(array);\n var index = dir > 0 ? 0 : length - 1;\n for (; index >= 0 && index < length; index += dir) {\n if (predicate(array[index], index, array)) return index;\n }\n return -1;\n };\n}\n\n// Returns the first index on an array-like that passes a predicate test.\nexport var findIndex = createPredicateIndexFinder(1);\nexport var findLastIndex = createPredicateIndexFinder(-1);\n\n// Use a comparator function to figure out the smallest index at which\n// an object should be inserted so as to maintain order. Uses binary search.\nexport function sortedIndex(array, obj, iteratee, context) {\n iteratee = cb(iteratee, context, 1);\n var value = iteratee(obj);\n var low = 0, high = getLength(array);\n while (low < high) {\n var mid = Math.floor((low + high) / 2);\n if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;\n }\n return low;\n}\n\n// Generator function to create the indexOf and lastIndexOf functions.\nfunction createIndexFinder(dir, predicateFind, sortedIndex) {\n return function(array, item, idx) {\n var i = 0, length = getLength(array);\n if (typeof idx == 'number') {\n if (dir > 0) {\n i = idx >= 0 ? idx : Math.max(idx + length, i);\n } else {\n length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n }\n } else if (sortedIndex && idx && length) {\n idx = sortedIndex(array, item);\n return array[idx] === item ? idx : -1;\n }\n if (item !== item) {\n idx = predicateFind(slice.call(array, i, length), isNaN);\n return idx >= 0 ? idx + i : -1;\n }\n for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {\n if (array[idx] === item) return idx;\n }\n return -1;\n };\n}\n\n// Return the position of the first occurrence of an item in an array,\n// or -1 if the item is not included in the array.\n// If the array is large and already in sort order, pass `true`\n// for **isSorted** to use binary search.\nexport var indexOf = createIndexFinder(1, findIndex, sortedIndex);\nexport var lastIndexOf = createIndexFinder(-1, findLastIndex);\n\n// Generate an integer Array containing an arithmetic progression. A port of\n// the native Python `range()` function. See\n// [the Python documentation](https://docs.python.org/library/functions.html#range).\nexport function range(start, stop, step) {\n if (stop == null) {\n stop = start || 0;\n start = 0;\n }\n if (!step) {\n step = stop < start ? -1 : 1;\n }\n\n var length = Math.max(Math.ceil((stop - start) / step), 0);\n var range = Array(length);\n\n for (var idx = 0; idx < length; idx++, start += step) {\n range[idx] = start;\n }\n\n return range;\n}\n\n// Chunk a single array into multiple arrays, each containing `count` or fewer\n// items.\nexport function chunk(array, count) {\n if (count == null || count < 1) return [];\n var result = [];\n var i = 0, length = array.length;\n while (i < length) {\n result.push(slice.call(array, i, i += count));\n }\n return result;\n}\n\n// Function (ahem) Functions\n// ------------------\n\n// Determines whether to execute a function as a constructor\n// or a normal function with the provided arguments.\nfunction executeBound(sourceFunc, boundFunc, context, callingContext, args) {\n if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);\n var self = baseCreate(sourceFunc.prototype);\n var result = sourceFunc.apply(self, args);\n if (isObject(result)) return result;\n return self;\n}\n\n// Create a function bound to a given object (assigning `this`, and arguments,\n// optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if\n// available.\nexport var bind = restArguments(function(func, context, args) {\n if (!isFunction(func)) throw new TypeError('Bind must be called on a function');\n var bound = restArguments(function(callArgs) {\n return executeBound(func, bound, context, this, args.concat(callArgs));\n });\n return bound;\n});\n\n// Partially apply a function by creating a version that has had some of its\n// arguments pre-filled, without changing its dynamic `this` context. _ acts\n// as a placeholder by default, allowing any combination of arguments to be\n// pre-filled. Set `partial.placeholder` for a custom placeholder argument.\nexport var partial = restArguments(function(func, boundArgs) {\n var placeholder = partial.placeholder;\n var bound = function() {\n var position = 0, length = boundArgs.length;\n var args = Array(length);\n for (var i = 0; i < length; i++) {\n args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];\n }\n while (position < arguments.length) args.push(arguments[position++]);\n return executeBound(func, bound, this, this, args);\n };\n return bound;\n});\n\npartial.placeholder = _;\n\n// Bind a number of an object's methods to that object. Remaining arguments\n// are the method names to be bound. Useful for ensuring that all callbacks\n// defined on an object belong to it.\nexport var bindAll = restArguments(function(obj, _keys) {\n _keys = _flatten(_keys, false, false);\n var index = _keys.length;\n if (index < 1) throw new Error('bindAll must be passed function names');\n while (index--) {\n var key = _keys[index];\n obj[key] = bind(obj[key], obj);\n }\n});\n\n// Memoize an expensive function by storing its results.\nexport function memoize(func, hasher) {\n var memoize = function(key) {\n var cache = memoize.cache;\n var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n if (!_has(cache, address)) cache[address] = func.apply(this, arguments);\n return cache[address];\n };\n memoize.cache = {};\n return memoize;\n}\n\n// Delays a function for the given number of milliseconds, and then calls\n// it with the arguments supplied.\nexport var delay = restArguments(function(func, wait, args) {\n return setTimeout(function() {\n return func.apply(null, args);\n }, wait);\n});\n\n// Defers a function, scheduling it to run after the current call stack has\n// cleared.\nexport var defer = partial(delay, _, 1);\n\n// Returns a function, that, when invoked, will only be triggered at most once\n// during a given window of time. Normally, the throttled function will run\n// as much as it can, without ever going more than once per `wait` duration;\n// but if you'd like to disable the execution on the leading edge, pass\n// `{leading: false}`. To disable execution on the trailing edge, ditto.\nexport function throttle(func, wait, options) {\n var timeout, context, args, result;\n var previous = 0;\n if (!options) options = {};\n\n var later = function() {\n previous = options.leading === false ? 0 : now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n\n var throttled = function() {\n var _now = now();\n if (!previous && options.leading === false) previous = _now;\n var remaining = wait - (_now - previous);\n context = this;\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = _now;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n\n throttled.cancel = function() {\n clearTimeout(timeout);\n previous = 0;\n timeout = context = args = null;\n };\n\n return throttled;\n}\n\n// Returns a function, that, as long as it continues to be invoked, will not\n// be triggered. The function will be called after it stops being called for\n// N milliseconds. If `immediate` is passed, trigger the function on the\n// leading edge, instead of the trailing.\nexport function debounce(func, wait, immediate) {\n var timeout, result;\n\n var later = function(context, args) {\n timeout = null;\n if (args) result = func.apply(context, args);\n };\n\n var debounced = restArguments(function(args) {\n if (timeout) clearTimeout(timeout);\n if (immediate) {\n var callNow = !timeout;\n timeout = setTimeout(later, wait);\n if (callNow) result = func.apply(this, args);\n } else {\n timeout = delay(later, wait, this, args);\n }\n\n return result;\n });\n\n debounced.cancel = function() {\n clearTimeout(timeout);\n timeout = null;\n };\n\n return debounced;\n}\n\n// Returns the first function passed as an argument to the second,\n// allowing you to adjust arguments, run code before and after, and\n// conditionally execute the original function.\nexport function wrap(func, wrapper) {\n return partial(wrapper, func);\n}\n\n// Returns a negated version of the passed-in predicate.\nexport function negate(predicate) {\n return function() {\n return !predicate.apply(this, arguments);\n };\n}\n\n// Returns a function that is the composition of a list of functions, each\n// consuming the return value of the function that follows.\nexport function compose() {\n var args = arguments;\n var start = args.length - 1;\n return function() {\n var i = start;\n var result = args[start].apply(this, arguments);\n while (i--) result = args[i].call(this, result);\n return result;\n };\n}\n\n// Returns a function that will only be executed on and after the Nth call.\nexport function after(times, func) {\n return function() {\n if (--times < 1) {\n return func.apply(this, arguments);\n }\n };\n}\n\n// Returns a function that will only be executed up to (but not including) the Nth call.\nexport function before(times, func) {\n var memo;\n return function() {\n if (--times > 0) {\n memo = func.apply(this, arguments);\n }\n if (times <= 1) func = null;\n return memo;\n };\n}\n\n// Returns a function that will be executed at most one time, no matter how\n// often you call it. Useful for lazy initialization.\nexport var once = partial(before, 2);\n\n// Object Functions\n// ----------------\n\n// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\nvar hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');\nvar nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',\n 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\nfunction collectNonEnumProps(obj, _keys) {\n var nonEnumIdx = nonEnumerableProps.length;\n var constructor = obj.constructor;\n var proto = isFunction(constructor) && constructor.prototype || ObjProto;\n\n // Constructor is a special case.\n var prop = 'constructor';\n if (_has(obj, prop) && !contains(_keys, prop)) _keys.push(prop);\n\n while (nonEnumIdx--) {\n prop = nonEnumerableProps[nonEnumIdx];\n if (prop in obj && obj[prop] !== proto[prop] && !contains(_keys, prop)) {\n _keys.push(prop);\n }\n }\n}\n\n// Retrieve the names of an object's own properties.\n// Delegates to **ECMAScript 5**'s native `Object.keys`.\nexport function keys(obj) {\n if (!isObject(obj)) return [];\n if (nativeKeys) return nativeKeys(obj);\n var _keys = [];\n for (var key in obj) if (_has(obj, key)) _keys.push(key);\n // Ahem, IE < 9.\n if (hasEnumBug) collectNonEnumProps(obj, _keys);\n return _keys;\n}\n\n// Retrieve all the property names of an object.\nexport function allKeys(obj) {\n if (!isObject(obj)) return [];\n var _keys = [];\n for (var key in obj) _keys.push(key);\n // Ahem, IE < 9.\n if (hasEnumBug) collectNonEnumProps(obj, _keys);\n return _keys;\n}\n\n// Retrieve the values of an object's properties.\nexport function values(obj) {\n var _keys = keys(obj);\n var length = _keys.length;\n var values = Array(length);\n for (var i = 0; i < length; i++) {\n values[i] = obj[_keys[i]];\n }\n return values;\n}\n\n// Returns the results of applying the iteratee to each element of the object.\n// In contrast to map it returns an object.\nexport function mapObject(obj, iteratee, context) {\n iteratee = cb(iteratee, context);\n var _keys = keys(obj),\n length = _keys.length,\n results = {};\n for (var index = 0; index < length; index++) {\n var currentKey = _keys[index];\n results[currentKey] = iteratee(obj[currentKey], currentKey, obj);\n }\n return results;\n}\n\n// Convert an object into a list of `[key, value]` pairs.\n// The opposite of object.\nexport function pairs(obj) {\n var _keys = keys(obj);\n var length = _keys.length;\n var pairs = Array(length);\n for (var i = 0; i < length; i++) {\n pairs[i] = [_keys[i], obj[_keys[i]]];\n }\n return pairs;\n}\n\n// Invert the keys and values of an object. The values must be serializable.\nexport function invert(obj) {\n var result = {};\n var _keys = keys(obj);\n for (var i = 0, length = _keys.length; i < length; i++) {\n result[obj[_keys[i]]] = _keys[i];\n }\n return result;\n}\n\n// Return a sorted list of the function names available on the object.\nexport function functions(obj) {\n var names = [];\n for (var key in obj) {\n if (isFunction(obj[key])) names.push(key);\n }\n return names.sort();\n}\nexport { functions as methods };\n\n// An internal function for creating assigner functions.\nfunction createAssigner(keysFunc, defaults) {\n return function(obj) {\n var length = arguments.length;\n if (defaults) obj = Object(obj);\n if (length < 2 || obj == null) return obj;\n for (var index = 1; index < length; index++) {\n var source = arguments[index],\n _keys = keysFunc(source),\n l = _keys.length;\n for (var i = 0; i < l; i++) {\n var key = _keys[i];\n if (!defaults || obj[key] === void 0) obj[key] = source[key];\n }\n }\n return obj;\n };\n}\n\n// Extend a given object with all the properties in passed-in object(s).\nexport var extend = createAssigner(allKeys);\n\n// Assigns a given object with all the own properties in the passed-in object(s).\n// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\nexport var extendOwn = createAssigner(keys);\nexport { extendOwn as assign };\n\n// Returns the first key on an object that passes a predicate test.\nexport function findKey(obj, predicate, context) {\n predicate = cb(predicate, context);\n var _keys = keys(obj), key;\n for (var i = 0, length = _keys.length; i < length; i++) {\n key = _keys[i];\n if (predicate(obj[key], key, obj)) return key;\n }\n}\n\n// Internal pick helper function to determine if `obj` has key `key`.\nfunction keyInObj(value, key, obj) {\n return key in obj;\n}\n\n// Return a copy of the object only containing the whitelisted properties.\nexport var pick = restArguments(function(obj, _keys) {\n var result = {}, iteratee = _keys[0];\n if (obj == null) return result;\n if (isFunction(iteratee)) {\n if (_keys.length > 1) iteratee = optimizeCb(iteratee, _keys[1]);\n _keys = allKeys(obj);\n } else {\n iteratee = keyInObj;\n _keys = _flatten(_keys, false, false);\n obj = Object(obj);\n }\n for (var i = 0, length = _keys.length; i < length; i++) {\n var key = _keys[i];\n var value = obj[key];\n if (iteratee(value, key, obj)) result[key] = value;\n }\n return result;\n});\n\n// Return a copy of the object without the blacklisted properties.\nexport var omit = restArguments(function(obj, _keys) {\n var iteratee = _keys[0], context;\n if (isFunction(iteratee)) {\n iteratee = negate(iteratee);\n if (_keys.length > 1) context = _keys[1];\n } else {\n _keys = map(_flatten(_keys, false, false), String);\n iteratee = function(value, key) {\n return !contains(_keys, key);\n };\n }\n return pick(obj, iteratee, context);\n});\n\n// Fill in a given object with default properties.\nexport var defaults = createAssigner(allKeys, true);\n\n// Creates an object that inherits from the given prototype object.\n// If additional properties are provided then they will be added to the\n// created object.\nexport function create(prototype, props) {\n var result = baseCreate(prototype);\n if (props) extendOwn(result, props);\n return result;\n}\n\n// Create a (shallow-cloned) duplicate of an object.\nexport function clone(obj) {\n if (!isObject(obj)) return obj;\n return isArray(obj) ? obj.slice() : extend({}, obj);\n}\n\n// Invokes interceptor with the obj, and then returns obj.\n// The primary purpose of this method is to \"tap into\" a method chain, in\n// order to perform operations on intermediate results within the chain.\nexport function tap(obj, interceptor) {\n interceptor(obj);\n return obj;\n}\n\n// Returns whether an object has a given set of `key:value` pairs.\nexport function isMatch(object, attrs) {\n var _keys = keys(attrs), length = _keys.length;\n if (object == null) return !length;\n var obj = Object(object);\n for (var i = 0; i < length; i++) {\n var key = _keys[i];\n if (attrs[key] !== obj[key] || !(key in obj)) return false;\n }\n return true;\n}\n\n\n// Internal recursive comparison function for `isEqual`.\nfunction eq(a, b, aStack, bStack) {\n // Identical objects are equal. `0 === -0`, but they aren't identical.\n // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).\n if (a === b) return a !== 0 || 1 / a === 1 / b;\n // `null` or `undefined` only equal to itself (strict comparison).\n if (a == null || b == null) return false;\n // `NaN`s are equivalent, but non-reflexive.\n if (a !== a) return b !== b;\n // Exhaust primitive checks\n var type = typeof a;\n if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;\n return deepEq(a, b, aStack, bStack);\n}\n\n// Internal recursive comparison function for `isEqual`.\nfunction deepEq(a, b, aStack, bStack) {\n // Unwrap any wrapped objects.\n if (a instanceof _) a = a._wrapped;\n if (b instanceof _) b = b._wrapped;\n // Compare `[[Class]]` names.\n var className = toString.call(a);\n if (className !== toString.call(b)) return false;\n switch (className) {\n // Strings, numbers, regular expressions, dates, and booleans are compared by value.\n case '[object RegExp]':\n // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n case '[object String]':\n // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n // equivalent to `new String(\"5\")`.\n return '' + a === '' + b;\n case '[object Number]':\n // `NaN`s are equivalent, but non-reflexive.\n // Object(NaN) is equivalent to NaN.\n if (+a !== +a) return +b !== +b;\n // An `egal` comparison is performed for other numeric values.\n return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n case '[object Date]':\n case '[object Boolean]':\n // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n // millisecond representations. Note that invalid dates with millisecond representations\n // of `NaN` are not equivalent.\n return +a === +b;\n case '[object Symbol]':\n return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);\n }\n\n var areArrays = className === '[object Array]';\n if (!areArrays) {\n if (typeof a != 'object' || typeof b != 'object') return false;\n\n // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n // from different frames are.\n var aCtor = a.constructor, bCtor = b.constructor;\n if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor &&\n isFunction(bCtor) && bCtor instanceof bCtor)\n && ('constructor' in a && 'constructor' in b)) {\n return false;\n }\n }\n // Assume equality for cyclic structures. The algorithm for detecting cyclic\n // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n\n // Initializing stack of traversed objects.\n // It's done here since we only need them for objects and arrays comparison.\n aStack = aStack || [];\n bStack = bStack || [];\n var length = aStack.length;\n while (length--) {\n // Linear search. Performance is inversely proportional to the number of\n // unique nested structures.\n if (aStack[length] === a) return bStack[length] === b;\n }\n\n // Add the first object to the stack of traversed objects.\n aStack.push(a);\n bStack.push(b);\n\n // Recursively compare objects and arrays.\n if (areArrays) {\n // Compare array lengths to determine if a deep comparison is necessary.\n length = a.length;\n if (length !== b.length) return false;\n // Deep compare the contents, ignoring non-numeric properties.\n while (length--) {\n if (!eq(a[length], b[length], aStack, bStack)) return false;\n }\n } else {\n // Deep compare objects.\n var _keys = keys(a), key;\n length = _keys.length;\n // Ensure that both objects contain the same number of properties before comparing deep equality.\n if (keys(b).length !== length) return false;\n while (length--) {\n // Deep compare each member\n key = _keys[length];\n if (!(_has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;\n }\n }\n // Remove the first object from the stack of traversed objects.\n aStack.pop();\n bStack.pop();\n return true;\n}\n\n// Perform a deep comparison to check if two objects are equal.\nexport function isEqual(a, b) {\n return eq(a, b);\n}\n\n// Is a given array, string, or object empty?\n// An \"empty\" object has no enumerable own-properties.\nexport function isEmpty(obj) {\n if (obj == null) return true;\n if (isArrayLike(obj) && (isArray(obj) || isString(obj) || isArguments(obj))) return obj.length === 0;\n return keys(obj).length === 0;\n}\n\n// Is a given value a DOM element?\nexport function isElement(obj) {\n return !!(obj && obj.nodeType === 1);\n}\n\n// Internal function for creating a toString-based type tester.\nfunction tagTester(name) {\n return function(obj) {\n return toString.call(obj) === '[object ' + name + ']';\n };\n}\n\n// Is a given value an array?\n// Delegates to ECMA5's native Array.isArray\nexport var isArray = nativeIsArray || tagTester('Array');\n\n// Is a given variable an object?\nexport function isObject(obj) {\n var type = typeof obj;\n return type === 'function' || type === 'object' && !!obj;\n}\n\n// Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError, isMap, isWeakMap, isSet, isWeakSet.\nexport var isArguments = tagTester('Arguments');\nexport var isFunction = tagTester('Function');\nexport var isString = tagTester('String');\nexport var isNumber = tagTester('Number');\nexport var isDate = tagTester('Date');\nexport var isRegExp = tagTester('RegExp');\nexport var isError = tagTester('Error');\nexport var isSymbol = tagTester('Symbol');\nexport var isMap = tagTester('Map');\nexport var isWeakMap = tagTester('WeakMap');\nexport var isSet = tagTester('Set');\nexport var isWeakSet = tagTester('WeakSet');\n\n// Define a fallback version of the method in browsers (ahem, IE < 9), where\n// there isn't any inspectable \"Arguments\" type.\n(function() {\n if (!isArguments(arguments)) {\n isArguments = function(obj) {\n return _has(obj, 'callee');\n };\n }\n}());\n\n// Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,\n// IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).\nvar nodelist = root.document && root.document.childNodes;\nif (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {\n isFunction = function(obj) {\n return typeof obj == 'function' || false;\n };\n}\n\n// Is a given object a finite number?\nexport function isFinite(obj) {\n return !isSymbol(obj) && _isFinite(obj) && !_isNaN(parseFloat(obj));\n}\n\n// Is the given value `NaN`?\nexport function isNaN(obj) {\n return isNumber(obj) && _isNaN(obj);\n}\n\n// Is a given value a boolean?\nexport function isBoolean(obj) {\n return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n}\n\n// Is a given value equal to null?\nexport function isNull(obj) {\n return obj === null;\n}\n\n// Is a given variable undefined?\nexport function isUndefined(obj) {\n return obj === void 0;\n}\n\n// Shortcut function for checking if an object has a given property directly\n// on itself (in other words, not on a prototype).\nexport function has(obj, path) {\n if (!isArray(path)) {\n return _has(obj, path);\n }\n var length = path.length;\n for (var i = 0; i < length; i++) {\n var key = path[i];\n if (obj == null || !hasOwnProperty.call(obj, key)) {\n return false;\n }\n obj = obj[key];\n }\n return !!length;\n}\n\n// Utility Functions\n// -----------------\n\n// Keep the identity function around for default iteratees.\nexport function identity(value) {\n return value;\n}\n\n// Predicate-generating functions. Often useful outside of Underscore.\nexport function constant(value) {\n return function() {\n return value;\n };\n}\n\nexport function noop(){}\n\n// Creates a function that, when passed an object, will traverse that object’s\n// properties down the given `path`, specified as an array of keys or indexes.\nexport function property(path) {\n if (!isArray(path)) {\n return shallowProperty(path);\n }\n return function(obj) {\n return deepGet(obj, path);\n };\n}\n\n// Generates a function for a given object that returns a given property.\nexport function propertyOf(obj) {\n if (obj == null) {\n return function(){};\n }\n return function(path) {\n return !isArray(path) ? obj[path] : deepGet(obj, path);\n };\n}\n\n// Returns a predicate for checking whether an object has a given set of\n// `key:value` pairs.\nexport function matcher(attrs) {\n attrs = extendOwn({}, attrs);\n return function(obj) {\n return isMatch(obj, attrs);\n };\n}\nexport { matcher as matches };\n\n// Run a function **n** times.\nexport function times(n, iteratee, context) {\n var accum = Array(Math.max(0, n));\n iteratee = optimizeCb(iteratee, context, 1);\n for (var i = 0; i < n; i++) accum[i] = iteratee(i);\n return accum;\n}\n\n// Return a random integer between min and max (inclusive).\nexport function random(min, max) {\n if (max == null) {\n max = min;\n min = 0;\n }\n return min + Math.floor(Math.random() * (max - min + 1));\n}\n\n// A (possibly faster) way to get the current timestamp as an integer.\nexport var now = Date.now || function() {\n return new Date().getTime();\n};\n\n// List of HTML entities for escaping.\nvar escapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`'\n};\nvar unescapeMap = invert(escapeMap);\n\n// Functions for escaping and unescaping strings to/from HTML interpolation.\nfunction createEscaper(map) {\n var escaper = function(match) {\n return map[match];\n };\n // Regexes for identifying a key that needs to be escaped.\n var source = '(?:' + keys(map).join('|') + ')';\n var testRegexp = RegExp(source);\n var replaceRegexp = RegExp(source, 'g');\n return function(string) {\n string = string == null ? '' : '' + string;\n return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n };\n}\nexport var escape = createEscaper(escapeMap);\nexport var unescape = createEscaper(unescapeMap);\n\n// Traverses the children of `obj` along `path`. If a child is a function, it\n// is invoked with its parent as context. Returns the value of the final\n// child, or `fallback` if any child is undefined.\nexport function result(obj, path, fallback) {\n if (!isArray(path)) path = [path];\n var length = path.length;\n if (!length) {\n return isFunction(fallback) ? fallback.call(obj) : fallback;\n }\n for (var i = 0; i < length; i++) {\n var prop = obj == null ? void 0 : obj[path[i]];\n if (prop === void 0) {\n prop = fallback;\n i = length; // Ensure we don't continue iterating.\n }\n obj = isFunction(prop) ? prop.call(obj) : prop;\n }\n return obj;\n}\n\n// Generate a unique integer id (unique within the entire client session).\n// Useful for temporary DOM ids.\nvar idCounter = 0;\nexport function uniqueId(prefix) {\n var id = ++idCounter + '';\n return prefix ? prefix + id : id;\n}\n\n// By default, Underscore uses ERB-style template delimiters, change the\n// following template settings to use alternative delimiters.\nexport var templateSettings = _.templateSettings = {\n evaluate: /<%([\\s\\S]+?)%>/g,\n interpolate: /<%=([\\s\\S]+?)%>/g,\n escape: /<%-([\\s\\S]+?)%>/g\n};\n\n// When customizing `templateSettings`, if you don't want to define an\n// interpolation, evaluation or escaping regex, we need one that is\n// guaranteed not to match.\nvar noMatch = /(.)^/;\n\n// Certain characters need to be escaped so that they can be put into a\n// string literal.\nvar escapes = {\n \"'\": \"'\",\n '\\\\': '\\\\',\n '\\r': 'r',\n '\\n': 'n',\n '\\u2028': 'u2028',\n '\\u2029': 'u2029'\n};\n\nvar escapeRegExp = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\nvar escapeChar = function(match) {\n return '\\\\' + escapes[match];\n};\n\n// JavaScript micro-templating, similar to John Resig's implementation.\n// Underscore templating handles arbitrary delimiters, preserves whitespace,\n// and correctly escapes quotes within interpolated code.\n// NB: `oldSettings` only exists for backwards compatibility.\nexport function template(text, settings, oldSettings) {\n if (!settings && oldSettings) settings = oldSettings;\n settings = defaults({}, settings, _.templateSettings);\n\n // Combine delimiters into one regular expression via alternation.\n var matcher = RegExp([\n (settings.escape || noMatch).source,\n (settings.interpolate || noMatch).source,\n (settings.evaluate || noMatch).source\n ].join('|') + '|$', 'g');\n\n // Compile the template source, escaping string literals appropriately.\n var index = 0;\n var source = \"__p+='\";\n text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n source += text.slice(index, offset).replace(escapeRegExp, escapeChar);\n index = offset + match.length;\n\n if (escape) {\n source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n } else if (interpolate) {\n source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n } else if (evaluate) {\n source += \"';\\n\" + evaluate + \"\\n__p+='\";\n }\n\n // Adobe VMs need the match returned to produce the correct offset.\n return match;\n });\n source += \"';\\n\";\n\n // If a variable is not specified, place data values in local scope.\n if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n\n source = \"var __t,__p='',__j=Array.prototype.join,\" +\n \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n source + 'return __p;\\n';\n\n var render;\n try {\n render = new Function(settings.variable || 'obj', '_', source);\n } catch (e) {\n e.source = source;\n throw e;\n }\n\n var template = function(data) {\n return render.call(this, data, _);\n };\n\n // Provide the compiled source as a convenience for precompilation.\n var argument = settings.variable || 'obj';\n template.source = 'function(' + argument + '){\\n' + source + '}';\n\n return template;\n}\n\n// Add a \"chain\" function. Start chaining a wrapped Underscore object.\nexport function chain(obj) {\n var instance = _(obj);\n instance._chain = true;\n return instance;\n}\n\n// OOP\n// ---------------\n// If Underscore is called as a function, it returns a wrapped object that\n// can be used OO-style. This wrapper holds altered versions of all the\n// underscore functions. Wrapped objects may be chained.\n\n// Helper function to continue chaining intermediate results.\nfunction chainResult(instance, obj) {\n return instance._chain ? _(obj).chain() : obj;\n}\n\n// Add your own custom functions to the Underscore object.\nexport function mixin(obj) {\n each(functions(obj), function(name) {\n var func = _[name] = obj[name];\n _.prototype[name] = function() {\n var args = [this._wrapped];\n push.apply(args, arguments);\n return chainResult(this, func.apply(_, args));\n };\n });\n return _;\n}\n\n// Add all mutator Array functions to the wrapper.\neach(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n var method = ArrayProto[name];\n _.prototype[name] = function() {\n var obj = this._wrapped;\n method.apply(obj, arguments);\n if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];\n return chainResult(this, obj);\n };\n});\n\n// Add all accessor Array functions to the wrapper.\neach(['concat', 'join', 'slice'], function(name) {\n var method = ArrayProto[name];\n _.prototype[name] = function() {\n return chainResult(this, method.apply(this._wrapped, arguments));\n };\n});\n\n// Extracts the result from a wrapped and chained object.\n_.prototype.value = function() {\n return this._wrapped;\n};\n\n// Provide unwrapping proxy for some methods used in engine operations\n// such as arithmetic and JSON stringification.\n_.prototype.valueOf = _.prototype.toJSON = _.prototype.value;\n\n_.prototype.toString = function() {\n return String(this._wrapped);\n};\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","'use strict';\n// comes from int_adyen_custom/**/client/**/adyen/constants.js\nconst adyenConstants = require('./adyen/constants');\nlet result = {\n ADYEN: adyenConstants,\n UPS: {\n UPS_ADDR_VERIFY_NOT_CALLED: '0',\n UPS_ADDR_VERIFY_FAILED: '1',\n UPS_ADDR_VERIFY_EXACT_MATCH: '2',\n UPS_ADDR_VERIFY_NO_RECOMMENDATIONS: '3',\n UPS_ADDR_VERIFY_USER_IGNORED_REC: '4',\n UPS_ADDR_VERIFY_USER_ACCEPTED_REC: '5'\n },\n SHIPPING_TYPES: {\n HOME: 'address',\n ACCESS_POINT: 'accessPoint',\n BOPIS: 'buyOnlinePickupInStore',\n WILL_CALL: 'willCall',\n SHIPPING_OPTION_PICK_UP: 'pickUpAtLocation'\n },\n SELECTORS: {\n accordions: '.checkout-accordion',\n adyenCreditCardHolderInput: '.adyen-checkout__card__holderName__input',\n sectionEmail: '.email-section',\n sectionShipping: '.checkout-accordion.single-shipping',\n sectionBilling: '.checkout-accordion.payment-form',\n sectionReview: '.checkout-accordion.review',\n sectionHeadings: '.section-heading',\n shippingForm: '.checkout-accordion.single-shipping .checkout-accordion__form, .email-section, .account-banner-container, .express-payments-checkout',\n shippingSummary: '.checkout-accordion.single-shipping .checkout-accordion__summary',\n billingForm: '.checkout-accordion.payment-form .checkout-accordion__form',\n billingSummary: '.checkout-accordion.payment-form .checkout-accordion__summary',\n submitPaymentBtn: '.submit-payment',\n reviewSummary: '.checkout-accordion.review .checkout-accordion__summary',\n orderSummary: '.order-summary'\n },\n STAGES: {\n shipping: 'shipping',\n billing: 'billing',\n review: 'review'\n },\n PAYMENT_METHODS: {\n GIFT_CERTIFICATE: 'GIFT_CERTIFICATE',\n LOYALTY: 'LOYALTY',\n PROMOTION_ONLY_ORDER: 'PromotionOnlyOrder',\n ADYEN_COMPONENT: adyenConstants.METHOD_ADYEN_COMPONENT,\n ADYEN_POS: adyenConstants.METHOD_ADYEN_POS,\n PAYBYLINK: 'PayByLink',\n PAYPAL: 'PayPal',\n CREDIT_CARD: 'CREDIT_CARD'\n }\n};\n\nresult.ADYEN.SUPPORTED_PAYMENTS = ['scheme', 'klarna', 'storedCard'];\n\nmodule.exports = result;\n","let dangerZone = 60; // change to a danger theme at this time.\nlet messageBufferTime = 5; // time to account for page loading when time passes.\nconst reservationTimerId = 'reservationTimer';\nconst reservationTimerIdSelector = `#${reservationTimerId}`;\n\nconst getExpireTime = () => {\n return $(reservationTimerIdSelector).data('expireTime') || 0;\n};\n\nconst calculateNewExpireTime = () => {\n return new Date().getTime() + parseInt(window.resources.reservation.reservationSecondsRemaining * 1000, 10);\n};\n\nconst destroyTimer = () => {\n const $timerBanner = $(reservationTimerIdSelector);\n const reservationInterval = $timerBanner.data('reservationInterval');\n\n clearInterval(reservationInterval);\n\n $timerBanner.data('reservationInterval', null);\n $timerBanner.data('expireTime', null);\n\n if (window.resources && window.resources.reservation && window.resources.reservation.reservationSecondsRemaining) {\n delete window.resources.reservation.reservationSecondsRemaining;\n }\n if ($timerBanner && $timerBanner.length) {\n $timerBanner.trigger('close');\n }\n};\n\nconst getRemainingSeconds = (expireTime = getExpireTime()) => {\n let now = new Date().getTime();\n let secondsRemaining = parseInt((expireTime - now) / 1000, 10);\n\n return secondsRemaining;\n};\n\nconst popBanners = () => {\n if (window.resources && window.resources.reservation && window.resources.reservation.messages) {\n const remainingSeconds = getRemainingSeconds();\n // check each message for a matching time.\n let msgKeys = Object.keys(window.resources.reservation.messages);\n for (let i = 0; i < msgKeys.length; i++) {\n let msgKey = msgKeys[i];\n let msg = window.resources.reservation.messages[msgKey];\n\n let startTime = typeof msg.startTime !== 'undefined' ? msg.startTime : remainingSeconds; // display it immediately if startTime is undefined.\n let endTime = startTime - messageBufferTime;\n if ((remainingSeconds <= startTime && remainingSeconds > endTime) || typeof msg.startTime === 'undefined') {\n // show the banner:\n let html = `

${msg.title}

\n

${msg.message}

\n ${msg.additionalContent || ''}`;\n $.alert({\n content: html,\n placement: 'banner',\n theme: msg.theme,\n id: msgKey,\n containerId: 'reservationBannerContainer',\n timeToLive: 10000\n });\n // we've used the message, so remove it from the list\n delete window.resources.reservation.messages[msgKey];\n }\n }\n }\n};\n\nconst createTimeString = (remainingSeconds) => {\n let mins = Math.floor(remainingSeconds / 60);\n let secs = remainingSeconds % 60;\n if (secs < 10) {\n secs = '0' + secs; // convert to a string so we can have two digits. 9 => '09'\n }\n return `${mins}:${secs}`;\n};\n\nconst updateReservationTimer = () => {\n const remainingSeconds = getRemainingSeconds();\n\n if (remainingSeconds >= 0) {\n $('.reservation__time').text(createTimeString(remainingSeconds));\n\n if (remainingSeconds <= dangerZone) {\n // change the theme from 'info' to 'danger'\n $(`${reservationTimerIdSelector}.alert--info`).toggleClass('alert--info alert--danger');\n } else {\n $(`${reservationTimerIdSelector}.alert--danger`).toggleClass('alert--info alert--danger');\n }\n\n popBanners();\n } else {\n destroyTimer();\n }\n};\n\nconst startTimer = () => {\n const $timerBanner = $(reservationTimerIdSelector);\n const expireTime = calculateNewExpireTime();\n\n if (!$timerBanner || !$timerBanner.length) { // $timerBanner might be undefined, empty jquery object (truthy), or a valid jquery object (length 1)\n const remainingSeconds = getRemainingSeconds(expireTime);\n\n if (remainingSeconds >= 0) { // when remainingSeconds === 0, we still want to display '0:00'\n let initialTimeStr = createTimeString(remainingSeconds);\n let timeRemainingMessage = window.resources.reservation.timeRemainingMessage;\n const reservationInterval = setInterval(updateReservationTimer, 1000);\n\n $.alert({\n content: `
${timeRemainingMessage} ${initialTimeStr}
`,\n placement: 'banner',\n theme: window.resources.reservation.reservationSecondsRemaining <= dangerZone ? 'danger' : 'info',\n id: reservationTimerId,\n containerId: 'reservationBannerContainer',\n autoClose: false\n }).data('reservationInterval', reservationInterval).data('expireTime', expireTime);\n }\n } else {\n $timerBanner.data('expireTime', expireTime);\n }\n};\n\nconst init = () => {\n if (window.resources && window.resources.reservation && window.resources.reservation.reservationSecondsRemaining) {\n startTimer();\n }\n // remove any existing banners.\n $('#reservationBannerContainer').find('.alert').not(reservationTimerIdSelector).remove();\n popBanners();\n};\n\nconst updateReservationData = (response) => {\n if (response && response.reservation) {\n if (window.resources) {\n if (window.resources.reservation) {\n window.resources.reservation.messages = $.extend({}, window.resources.reservation.messages, response.reservation.messages);\n window.resources.reservation.reservationSecondsRemaining = response.reservation.reservationSecondsRemaining;\n $(reservationTimerIdSelector).data('remainingSeconds', parseInt(response.reservation.reservationSecondsRemaining, 10));\n } else {\n window.resources.reservation = response.reservation;\n }\n } else {\n window.resources = {\n reservation: response.reservation\n };\n }\n init();\n }\n};\n\nconst getDestroyTimer = () => {\n return destroyTimer;\n};\n\nmodule.exports = {\n init,\n getDestroyTimer,\n updateReservationData\n};\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","'use strict';\n\n/**\n * Adds or removes the alert-badge red dot on the minicart icon based on if\n * the Price Drop Modal is enabled and the user has a value for the\n * priceDropUserSegment in sessionStorage.\n */\nfunction toggleAlertBadge() {\n const $icon = $('.minicart-icon .svgicon');\n const hasAlertWrapper = $icon.parent().hasClass('alert-badge');\n\n if (window.clientData && window.clientData.priceDropModalEnabled) {\n const customerGroup = sessionStorage.getItem('priceDropUserSegment');\n\n if (customerGroup) {\n const hasSaleItemInCart = !!(window.digitalData && window.digitalData.cart && window.digitalData.cart.item) && window.digitalData.cart.item.some(item => item.isSaleItem === 'Yes');\n\n if (hasSaleItemInCart && !hasAlertWrapper) {\n $icon.wrap('
');\n } else if (!hasSaleItemInCart && hasAlertWrapper) {\n $icon.unwrap('.alert-badge');\n }\n } else if (hasAlertWrapper) {\n $icon.unwrap('.alert-badge');\n }\n } else if (hasAlertWrapper) {\n $icon.unwrap('.alert-badge');\n }\n}\n\nmodule.exports = {\n toggleAlertBadge\n};\n","'use strict';\n/**\n * Takes the current password value and tests each constraint against the appropriate regex expression\n * If regex criteria is met, it will add isValid\n * @param {string} passwordValue - current value in the password field\n * @param {string} constraintField - selector of the constraint\n * @param {string} regexPattern - pattern that will be used to test against\n * @return {boolean} - true if constraint is met, false otherwise\n */\nfunction showPasswordConstraint(passwordValue, constraintField, regexPattern) {\n // Regex Pattern will not exist if we do not enforce mixed case, min number or min special character requirements\n var constraintMet = true;\n if (regexPattern) {\n var $constraintField = $(constraintField);\n var regex = new RegExp(regexPattern);\n if (regex.test(passwordValue)) {\n $constraintField.addClass('isValid');\n } else {\n $constraintField.removeClass('isValid');\n constraintMet = false;\n }\n }\n return constraintMet;\n}\n\n/**\n * Takes the current password value and tests each constraint against the appropriate regex expression\n * If regex criteria is met, it will add isValid\n * @param {string} $passwordField - current value in the password field\n * @return {boolean} - true if constraint is met, false otherwise\n */\nfunction checkPasswordValidity($passwordField) {\n var isValid = true;\n if ($passwordField) {\n var passwordValue = $passwordField.val();\n var $constraintField = $passwordField.parents('.form-group').find('.constraintRegex');\n var $invalidPasswordField = $passwordField.parents('.form-group').find('.invalid-password');\n var hideConstraints = $passwordField.parents('form').data('hide-constraints');\n var allowEmpty = $constraintField.data('allow-empty');\n var constraintsMet;\n\n if (!hideConstraints) {\n var constraintsJSON = $constraintField.data('pass-regex');\n var minCharConstraint = showPasswordConstraint(passwordValue, '.min-char-constraint', constraintsJSON.minLengthRegex);\n var lowerCaseConstraint = showPasswordConstraint(passwordValue, '.lower-case-constraint', constraintsJSON.lowerCaseRegex);\n var upperCaseConstraint = showPasswordConstraint(passwordValue, '.upper-case-constraint', constraintsJSON.upperCaseRegex);\n var minNumberConstraint = showPasswordConstraint(passwordValue, '.min-number-constraint', constraintsJSON.numberRegex);\n var minSpecialCharConstraint = showPasswordConstraint(passwordValue, '.min-specialChar-constraint', constraintsJSON.specialCharRegex);\n\n if ((minCharConstraint && lowerCaseConstraint && upperCaseConstraint && minNumberConstraint && minSpecialCharConstraint) || (allowEmpty && !passwordValue.length)) {\n constraintsMet = true;\n }\n }\n\n if (constraintsMet || hideConstraints) {\n $invalidPasswordField.addClass('d-none');\n $passwordField.removeClass('is-invalid');\n $passwordField.parent().removeClass('is-invalid');\n } else {\n // Password field is only invalid if focus is lost before input is valid\n isValid = false;\n }\n }\n return isValid;\n}\n\nmodule.exports = {\n init: function () {\n $('body').off('keyup change', '.js-password-checker').on('keyup change', '.js-password-checker', function (e) {\n e.preventDefault();\n var $passwordField = $(this);\n checkPasswordValidity($passwordField);\n });\n },\n checkPasswordValidity: checkPasswordValidity\n};\n","'use strict';\n\n/**\n * Remove all validation. Should be called every time before revalidating form\n * @param {element} form - Form to be cleared\n * @returns {void}\n */\nfunction clearFormErrors(form) {\n $(form).find('.form-control.is-invalid').removeClass('is-invalid');\n}\n\nmodule.exports = function (formElement, payload) {\n // clear form validation first\n clearFormErrors(formElement);\n\n if (typeof payload === 'object' && payload.fields) {\n Object.keys(payload.fields).forEach(function (key) {\n if (payload.fields[key]) {\n var feedbackElement = $(formElement).find('[name=\"' + key + '\"]')\n .parent()\n .children('.invalid-feedback');\n\n if (feedbackElement.length > 0) {\n if (Array.isArray(payload[key])) {\n feedbackElement.html(payload.fields[key].join('
'));\n } else {\n feedbackElement.html(payload.fields[key]);\n }\n feedbackElement.siblings('.form-control').addClass('is-invalid');\n }\n }\n });\n }\n if (payload && payload.error) {\n // Modified to leverage alerts component\n const $formElement = $(formElement);\n const $form = $formElement.prop('tagName') === 'FORM'\n ? $formElement\n : $formElement.closest('form');\n\n $form.alert({\n content: payload.error.join('
'),\n theme: 'danger',\n attachment: 'prepend',\n autoClose: false\n });\n }\n};\n","'use strict';\n\nvar passwordChecker = require('../passwordChecker/passwordChecker');\n\n/**\n * Clear invalid classes, show help text, clear setCustomValidity.\n * @param {element} formField - Form to be cleared\n * @returns {void}\n */\nfunction clearFieldInvalidState(formField) {\n var $formField = $(formField);\n $formField.removeClass('is-invalid');\n $formField.attr('aria-invalid', false);\n formField.setCustomValidity('');\n $formField.closest('.form-group').removeClass('is-invalid').find('.form-help-text').show();\n}\n\n/**\n * Handle event.\n * @param {jQuery.element} $formField - Input element to be updated\n * @returns {void}\n */\nfunction updateFocusFillState($formField) {\n var formFieldIsActive = $formField.is($(document.activeElement));\n if ($formField && $formField.val() !== null) { // Select boxes can return null for value\n if ($formField.val().length > 0 || formFieldIsActive) {\n $formField.closest('.form-group').addClass('focus-fill');\n } else {\n $formField.closest('.form-group').removeClass('focus-fill');\n }\n }\n}\n\n/**\n * Validate whole form. Requires `this` to be set to form object\n * @param {jQuery.event} event - Event to be canceled if form is invalid.\n * @returns {boolean} - Flag to indicate if form is valid\n */\nfunction validateForm(event) {\n var valid = true;\n var $form = $(this); // this can be not a form element; can be a container of fields.\n var $formFields = $form.find('input, select, textarea');\n\n if (this.checkValidity && !this.checkValidity()) {\n // safari\n valid = false;\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n }\n\n $form.trigger('invalidForm');\n }\n\n $formFields.each(function () {\n let $formField = $(this);\n\n // set or clear error state for each field\n $formField.trigger('invalid', this.validity);\n\n // add or remove the focus-fill class\n updateFocusFillState($formField);\n });\n\n // if $form is not a form element this.checkValidity is undefined so valid will be true. Set valid according to if there are invalid fields in the container.\n const $invalidFields = $formFields.filter('.is-invalid');\n valid = valid && !$invalidFields.length;\n\n if (!valid) {\n let $firstInvalid = $invalidFields.first();\n\n if ($firstInvalid.prop('tagName') === 'INPUT') {\n $firstInvalid.trigger('select');\n }\n $firstInvalid.trigger('focus');\n }\n\n return valid;\n}\n\n/**\n * Remove all validation. Should be called every time before revalidating form\n * @param {element} form - Form to be cleared\n * @returns {void}\n */\nfunction clearForm(form) {\n $(form).find('.is-invalid').removeClass('is-invalid was-validated');\n}\n\n/**\n * Special handler for numeric fields which don't get validated until onSubmit\n * @returns {void}\n */\nfunction handleNumericOnBlur() {\n var $formControl = $(this);\n var valid = true;\n var rangeError = $formControl.data('range-error');\n var patternError = $formControl.data('pattern-mismatch');\n var val = $formControl.val();\n this.setCustomValidity(''); // clear previous invalid state\n\n if ($formControl.attr('type') === 'number') {\n val = parseInt(val, 10);\n }\n\n if (rangeError) {\n var min = parseInt($formControl.attr('min'), 10);\n var max = parseInt($formControl.attr('max'), 10);\n var minLength = $formControl.attr('minlength');\n var maxLength = $formControl.attr('maxlength');\n if (val < min || val > max || val.length < minLength || val.length > maxLength) {\n this.setCustomValidity(rangeError);\n valid = false;\n }\n }\n\n if (valid && patternError) {\n var regex = new RegExp($formControl.attr('pattern'));\n if (!regex.test(val)) {\n this.setCustomValidity(patternError);\n valid = false;\n }\n }\n}\n\n/**\n * Handle on focus in event.\n * @returns {void}\n */\nfunction handleOnFocus() {\n $(this).closest('.form-group').addClass('focus-fill');\n}\n\n/**\n * Handle on focus out event.\n * @returns {void}\n */\nfunction handleOnBlur() {\n var $formControl = $(this);\n updateFocusFillState($formControl);\n\n // skip validation if the field is empty. This prevents \"required\" errors from popping up if you tab through the form\n if ($formControl.val() === '') {\n clearFieldInvalidState($formControl[0]);\n return;\n }\n\n var mismatchError = $formControl.data('mismatch-error');\n var $mismatchField = $formControl.data('mismatch-field') && $('#' + $formControl.data('mismatch-field'));\n\n if ($formControl.attr('type') === 'number' || $formControl.attr('type') === 'tel') {\n handleNumericOnBlur.apply(this);\n } else if (mismatchError && $mismatchField && $mismatchField.length) {\n if ($formControl.val() && $mismatchField.val() !== $formControl.val()) {\n this.setCustomValidity(mismatchError);\n if ($mismatchField.attr('type') === 'password') {\n $mismatchField.trigger('select');\n }\n } else if (this.validationMessage === mismatchError) {\n // if the fields previously did not match, but they do now, remove the custom validity.\n this.setCustomValidity('');\n }\n }\n\n // Check to see if a password is invalid when focus is lost on the field\n if ($formControl.hasClass('password-field')) {\n var validPassword = passwordChecker.checkPasswordValidity($formControl);\n if (!validPassword) {\n var $invalidPasswordField = $formControl.closest('.form-group').find('.invalid-password');\n $invalidPasswordField.removeClass('d-none');\n this.setCustomValidity('Password does not meet requirements');\n } else {\n this.setCustomValidity('');\n }\n }\n\n $formControl.trigger('invalid', this.validity);\n}\n\n/**\n * Handle on input event.\n * @returns {void}\n */\nfunction handleOnInput() {\n updateFocusFillState($(this));\n}\n\n/**\n * Check if the field is visible and valid, or if not visible. For when we only want to validate visible fields,\n * and we don't care if the hidden fields are invalid.\n * @param {element} field The form field of which to check validity.\n * @returns {boolean} whether the field is hidden or valid and visible.\n */\nfunction isVisibleFieldValid(field) {\n return field.validity.valid || !$(field).is(':visible');\n}\n\n/**\n * Quietly validate required form elements without triggering invalid ui states.\n * See login.js for an example.\n * @param {element} $form - Form to be validated\n * @returns {boolean} - required elements are filled in\n */\nfunction quietValidation($form) {\n return $form[0].checkValidity();\n}\n\n/**\n * Handles proper UI display after autofill.\n * @param {JQuery} $forms - forms to examine for autofill\n */\nfunction empty($forms) {\n try {\n var hasAutoFill = $forms.find(':-webkit-autofill').length;\n\n if (hasAutoFill) {\n $(':-webkit-autofill').closest('.form-group').addClass('focus-fill');\n }\n } catch (e) {\n // eslint-disable-next-line no-trailing-spaces\n }\n}\n\n/**\n * Helper function to validate the current state of submit CTA for registration form\n * @param {HTMLElement} thisField the field in the registration forms that was changed\n */\nfunction setSubmitButtonState(thisField) {\n var $form = $(thisField).closest('form');\n var isValid = quietValidation($form);\n var $button = $form.find('button[type=submit]');\n\n if (isValid) {\n $button.attr('disabled', false);\n $button.removeClass('disabled');\n } else {\n $button.attr('disabled', true);\n }\n}\n\n/**\n * Toggles submit button state if valid.\n * @param {JQuery} $validSubmitForms - forms to examine for submit\n */\nfunction toggleSubmitButtonIfValid($validSubmitForms) {\n // check if page has form which valid submit is active\n if (!$validSubmitForms.length) {\n return;\n }\n\n /**\n * toggle submit button when all the fields checked vaidate correctly\n * @param {Object} form the form that is going to be validated\n * @param {Object} $submit is the name of the button that is enabled/disabled\n */\n var toggleSubmit = function (form, $submit) {\n var isValid = form.checkValidity();\n $submit.toggleClass('disabled', !isValid).prop('disabled', !isValid);\n };\n\n // execute for each form with js-form-valid-submit class\n $validSubmitForms.each(function () {\n var $form = $(this);\n var $submit = $form.find('button[type=submit], input[type=submit]');\n\n // check form validity for each input/select/textarea keyup blur and change events\n $form.find('input, select, textarea').filter('[required]').on('keyup blur change', function () {\n toggleSubmit($form[0], $submit);\n });\n\n // initial toggle\n toggleSubmit(this, $submit);\n });\n}\n\nmodule.exports = {\n validateForm: function () {\n $.fn.validateForm = function (event) {\n return validateForm.call(this[0], event || null);\n };\n },\n invalid: function () {\n $('body').on('invalid', 'input, select, textarea', function (e) {\n e.preventDefault();\n var $formControl = $(this);\n\n if (this.tagName.toLowerCase() === 'textarea' && $formControl.attr('pattern') && $formControl.data('pattern-mismatch')) {\n // textareas do not support the pattern attribute.\n var regEx = new RegExp($formControl.attr('pattern'));\n var patternError = $formControl.data('pattern-mismatch');\n\n if (!regEx.test($formControl.val())) {\n this.setCustomValidity(patternError);\n } else if (this.validationMessage === patternError) {\n // it passed the test and the custom validation message is the same.\n this.setCustomValidity('');\n }\n }\n\n if (!this.validity.valid) {\n var validationMessage = this.validationMessage;\n $formControl.addClass('is-invalid');\n $formControl.attr('aria-invalid', true);\n\n if (this.validity.valueMissing && $formControl.data('missing-error')) {\n validationMessage = $formControl.data('missing-error');\n } else if (this.value.length < parseInt(this.getAttribute('minlength'), 10) // for IE: doesn't support validity.tooShort\n && $formControl.data('range-error')) {\n validationMessage = $formControl.data('range-error');\n } else if ((this.validity.tooLong || this.validity.tooShort) // works with minlength and maxlength attribtues (except for IE)\n && $formControl.data('range-error')) {\n validationMessage = $formControl.data('range-error');\n } else if ((this.validity.rangeOverflow || this.validity.rangeUnderflow) // works with min and max attributes\n && $formControl.data('range-error')) {\n validationMessage = $formControl.data('range-error');\n } else if (this.validity.patternMismatch && $formControl.data('pattern-mismatch')) {\n validationMessage = $formControl.data('pattern-mismatch');\n }\n\n if ($formControl.siblings('.btn-icon').length ||\n $formControl.is('select') ||\n $formControl.closest('.form-group').hasClass('form-group--icon-append')) {\n $formControl.closest('.form-group').addClass('icon-buffer');\n }\n\n // Set invalid state\n $formControl.closest('.form-group').find('.invalid-feedback').text(validationMessage);\n $formControl.closest('.form-group').addClass('is-invalid');\n $formControl.closest('.form-group').find('.form-help-text').hide();\n } else {\n clearFieldInvalidState(this);\n }\n });\n },\n\n valid: function () {\n\n },\n\n empty: function () {\n $(window).on('load', function () {\n var formsSelector = 'form';\n var $forms = $(formsSelector);\n empty($forms);\n\n $('body').on('form:created', formsSelector, function () {\n empty($(this));\n });\n });\n },\n\n submit: function () {\n $('body').on('submit', 'form', function (e) {\n return validateForm.call(this, e);\n });\n },\n\n buttonClick: function () {\n $('body').on('click', 'form button[type=\"submit\"], form input[type=\"submit\"]', function (e) {\n var isFullyCoveredByAny = $('.billing-payment-options-block').data('fully-covered');\n var paymentMethod = $('#selectedPaymentMethod').val() || $('#selectedPaymentOption').val();\n\n if (!(isFullyCoveredByAny === true || paymentMethod === 'PayByLink')) {\n // clear all errors when trying to submit the form\n var theForm = this.form;\n clearForm(theForm);\n validateForm.call(theForm, e);\n }\n });\n },\n\n /**\n * Support for Material style form inputs\n */\n inlineLabels: function () {\n var textInputFields = 'input, select, textarea';\n\n $('body')\n .on('focus', textInputFields, function (event) {\n handleOnFocus.apply(this, [event]);\n })\n .on('blur', textInputFields, function (event) {\n handleOnBlur.apply(this, [event]);\n })\n .on('input', textInputFields, function (event) {\n handleOnInput.apply(this, [event]); // Update when autofill happens\n });\n\n // Event for adding or removing the \"focus-fill\" class, which makes the label move.\n $(document).on('validation.updateFocusFillState', function () {\n $(textInputFields).each(function () {\n updateFocusFillState($(this));\n });\n });\n\n // Set initial states\n $(document).trigger('validation.updateFocusFillState');\n },\n\n /**\n * Setup enable/disable submit button feature to a form with js-form-valid-submit cssclass\n * If the form is invalid then submit button will be disabled\n * If the form is valid then submit button will be enabled\n */\n toggleSubmitButtonIfValid: function () {\n var formsSelector = 'form.js-form-valid-submit';\n var $forms = $(formsSelector);\n toggleSubmitButtonIfValid($forms);\n\n $('body').on('form:created', formsSelector, function () {\n toggleSubmitButtonIfValid($(this));\n });\n },\n\n /**\n * Toggle the disabled state on the submit button if any of the form elements are empty.\n * Used on small forms where the fields are not required unless submitting the form.\n * (ie: we don't want to show an error if blurring an empty field, but can't submit unless all fields are filled)\n * Used on:\n * Apply Promo Code on the cart page\n * Apply Promo Code on the checkout page\n * Gift Card on the checkout page\n */\n toggleSubmitOnEmptyForm: function () {\n const noEmptyFormSelector = '.js-no-empty-submit'; // this behavior should only apply to elements with this class.\n /**\n * If any of the form elements are empty, disable the submit button.\n * @param {jQuery} $form The container of the fields that determine the disabled state of the button. (not necessarily a form element)\n */\n const toggleSubmit = ($form) => {\n let isIncomplete = false;\n const btnSelector = $form.data('submit-btn-selector');\n const $submitBtn = btnSelector ? $(btnSelector) : $form.find('button[type=submit]');\n const $formElements = $form.find('input, select, textarea');\n $formElements.each(function () { // eslint-disable-line consistent-return\n // look for empty fields\n if (!$(this).val()) {\n isIncomplete = true;\n return false; // No need to keep checking all fields. Break out of .each() loop\n }\n });\n $submitBtn.prop('disabled', isIncomplete);\n };\n\n // on page load, disable empty forms\n $(noEmptyFormSelector).each(function () {\n const $form = $(this);\n toggleSubmit($form);\n });\n\n // on input, check if the form is empty\n $(noEmptyFormSelector).find('input, select, textarea').on('input change blur', function () {\n const $form = $(this).closest(noEmptyFormSelector);\n toggleSubmit($form);\n });\n },\n\n functions: {\n isVisibleFieldValid: isVisibleFieldValid,\n quietValidation: quietValidation, // todo: remove this from login.js and stores.js, replace with form.checkValidity();\n clearFieldInvalidState: clearFieldInvalidState,\n clearForm: clearForm,\n setSubmitButtonState: setSubmitButtonState\n }\n};\n","'use strict';\n\n// Adyen constants\n/* CSC modified:\n added:\n - klarna to DISABLED_SUBMIT_BUTTON_METHODS\n - CREDIT_CARD attribute\n - KLARNA attribute\n - FIRST_PAYMENT_TO_SHOW attribute\n*/\nconst constants = {\n METHOD_ADYEN: 'Adyen',\n METHOD_ADYEN_POS: 'AdyenPOS',\n METHOD_ADYEN_COMPONENT: 'AdyenComponent',\n RECEIVED: 'Received',\n NOTENOUGHBALANCE: 'NotEnoughBalance',\n SUCCESS: 'Success',\n GIFTCARD: 'giftcard',\n CREDIT_CARD: 'scheme',\n KLARNA: 'klarna_account',\n GIROPAY: 'giropay',\n APPLE_PAY: 'applepay',\n ACTIONTYPE: {\n QRCODE: 'qrCode'\n },\n DISABLED_SUBMIT_BUTTON_METHODS: [\n 'paypal',\n 'paywithgoogle',\n 'googlepay',\n 'amazonpay',\n 'applepay',\n 'cashapp',\n 'klarna'\n ],\n APPLE_DOMAIN_URL:\n '/.well-known/apple-developer-merchantid-domain-association'\n};\n\nconstants.FIRST_PAYMENT_TO_SHOW = constants.CREDIT_CARD;\n\nmodule.exports = constants;\n","'use strict';\nvar focusHelper = require('../components/focus');\n\n/**\n * Retrieves the relevant pid value\n * @param {jquery} $el - DOM container for a given add to cart button\n * @return {string} - value to be used when adding product to cart\n */\nfunction getPidValue($el) {\n var pid;\n\n if ($('#quickViewModal').hasClass('show') && !$('.product-set').length) {\n pid = $($el).closest('.modal-content').find('.product-quickview').data('pid');\n } else if ($('.product-set-detail').length || $('.product-set').length) {\n pid = $($el).closest('.product-detail').find('.product-id').text();\n } else {\n pid = $('.product-detail:not(\".bundle-item\")').data('pid');\n }\n\n return pid;\n}\n\n/**\n * Retrieve contextual quantity selector\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {jquery} - quantity selector DOM container\n */\nfunction getQuantitySelector($el) {\n var quantitySelected;\n if ($el && $('.set-items').length) {\n quantitySelected = $($el).closest('.product-detail').find('.quantity-select');\n } else if ($el && $('.product-bundle').length) {\n var quantitySelectedModal = $($el).closest('.modal-footer').find('.quantity-select');\n var quantitySelectedPDP = $($el).closest('.bundle-footer').find('.quantity-select');\n if (quantitySelectedModal.val() === undefined) {\n quantitySelected = quantitySelectedPDP;\n } else {\n quantitySelected = quantitySelectedModal;\n }\n } else {\n quantitySelected = $('.quantity-select');\n }\n return quantitySelected;\n}\n\n/**\n * Retrieves the value associated with the Quantity pull-down menu\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {string} - value found in the quantity input\n */\nfunction getQuantitySelected($el) {\n return getQuantitySelector($el).val();\n}\n\n/**\n * Process the attribute values for an attribute that has image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction processSwatchValues(attr, $productContainer, msgs) {\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"' +\n attrValue.value + '\"]');\n var $swatchButton = $attrValue.parent();\n\n if (attrValue.selected) {\n $attrValue.addClass('selected');\n $attrValue.siblings('.selected-assistive-text').text(msgs.assistiveSelectedText);\n } else {\n $attrValue.removeClass('selected');\n $attrValue.siblings('.selected-assistive-text').empty();\n }\n\n if (attrValue.url) {\n $swatchButton.attr('data-url', attrValue.url);\n } else {\n $swatchButton.removeAttr('data-url');\n }\n\n // Disable if not selectable\n $attrValue.removeClass('selectable unselectable');\n\n $attrValue.addClass(attrValue.selectable ? 'selectable' : 'unselectable');\n });\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction processNonSwatchValues(attr, $productContainer) {\n var $attr = '[data-attr=\"' + attr.id + '\"]';\n var $defaultOption = $productContainer.find($attr + ' .select-' + attr.id + ' option:first');\n $defaultOption.attr('value', attr.resetUrl);\n\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer\n .find($attr + ' [data-attr-value=\"' + attrValue.value + '\"]');\n $attrValue.attr('value', attrValue.url)\n .removeAttr('disabled');\n\n if (!attrValue.selectable) {\n $attrValue.attr('disabled', true);\n }\n });\n}\n\n/**\n * Routes the handling of attribute processing depending on whether the attribute has image\n * swatches or not\n *\n * @param {Object} attrs - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {jQuery} $productContainer - DOM element for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction updateAttrs(attrs, $productContainer, msgs) {\n // Currently, the only attribute type that has image swatches is Color.\n var attrsWithSwatches = ['color'];\n\n attrs.forEach(function (attr) {\n if (attrsWithSwatches.indexOf(attr.id) > -1) {\n processSwatchValues(attr, $productContainer, msgs);\n } else {\n processNonSwatchValues(attr, $productContainer);\n }\n });\n}\n\n/**\n * Updates the availability status in the Product Detail Page\n *\n * @param {Object} response - Ajax response object after an\n * attribute value has been [de]selected\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateAvailability(response, $productContainer) {\n var availabilityValue = '';\n var availabilityMessages = response.product.availability.messages;\n if (!response.product.readyToOrder) {\n availabilityValue = '
  • ' + response.resources.info_selectforstock + '
  • ';\n } else {\n availabilityMessages.forEach(function (message) {\n availabilityValue += '
  • ' + message + '
  • ';\n });\n }\n\n $($productContainer).trigger('product:updateAvailability', {\n product: response.product,\n $productContainer: $productContainer,\n message: availabilityValue,\n resources: response.resources\n });\n}\n\n/**\n * Generates html for product attributes section\n *\n * @param {array} attributes - list of attributes\n * @return {string} - Compiled HTML\n */\nfunction getAttributesHtml(attributes) {\n if (!attributes) {\n return '';\n }\n\n var html = '';\n\n attributes.forEach(function (attributeGroup) {\n if (attributeGroup.ID === 'mainAttributes') {\n attributeGroup.attributes.forEach(function (attribute) {\n html += '
    ' + attribute.label + ': '\n + attribute.value + '
    ';\n });\n }\n });\n\n return html;\n}\n\n/**\n * @typedef UpdatedOptionValue\n * @type Object\n * @property {string} id - Option value ID for look up\n * @property {string} url - Updated option value selection URL\n */\n\n/**\n * @typedef OptionSelectionResponse\n * @type Object\n * @property {string} priceHtml - Updated price HTML code\n * @property {Object} options - Updated Options\n * @property {string} options.id - Option ID\n * @property {UpdatedOptionValue[]} options.values - Option values\n */\n\n/**\n * Updates DOM using post-option selection Ajax response\n *\n * @param {OptionSelectionResponse} optionsHtml - Ajax response optionsHtml from selecting a product option\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction updateOptions(optionsHtml, $productContainer) {\n\t// Update options\n $productContainer.find('.product-options').empty().html(optionsHtml);\n}\n\n/**\n * Dynamically creates Bootstrap carousel from response containing images\n * @param {Object[]} imgs - Array of large product images,along with related information\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction createCarousel(imgs, $productContainer) {\n var carousel = $productContainer.find('.carousel');\n $(carousel).carousel('dispose');\n var carouselId = $(carousel).attr('id');\n $(carousel).empty().append('
      ' + $(carousel).data('prev') + '' + $(carousel).data('next') + '');\n for (var i = 0; i < imgs.length; i++) {\n $('
      \"'
      ').appendTo($(carousel).find('.carousel-inner'));\n $('
    1. ').appendTo($(carousel).find('.carousel-indicators'));\n }\n $($(carousel).find('.carousel-item')).first().addClass('active');\n $($(carousel).find('.carousel-indicators > li')).first().addClass('active');\n if (imgs.length === 1) {\n $($(carousel).find('.carousel-indicators, a[class^=\"carousel-control-\"]')).detach();\n }\n $(carousel).carousel();\n $($(carousel).find('.carousel-indicators')).attr('aria-hidden', true);\n}\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n * attributes have been selected. Used partially to\n * determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n */\nfunction handleVariantResponse(response, $productContainer) {\n var isChoiceOfBonusProducts =\n $productContainer.parents('.choose-bonus-product-dialog').length > 0;\n var isVaraint;\n if (response.product.variationAttributes) {\n updateAttrs(response.product.variationAttributes, $productContainer, response.resources);\n isVaraint = response.product.productType === 'variant';\n if (isChoiceOfBonusProducts && isVaraint) {\n $productContainer.parent('.bonus-product-item')\n .data('pid', response.product.id);\n\n $productContainer.parent('.bonus-product-item')\n .data('ready-to-order', response.product.readyToOrder);\n }\n }\n\n // Update primary images\n var primaryImageUrls = response.product.images.large;\n createCarousel(primaryImageUrls, $productContainer);\n\n // Update pricing\n if (!isChoiceOfBonusProducts) {\n var $priceSelector = $('.prices .price', $productContainer).length\n ? $('.prices .price', $productContainer)\n : $('.prices .price');\n $priceSelector.replaceWith(response.product.price.html);\n }\n\n // Update promotions\n $productContainer.find('.promotions').empty().html(response.product.promotionsHtml);\n\n updateAvailability(response, $productContainer);\n\n if (isChoiceOfBonusProducts) {\n var $selectButton = $productContainer.find('.select-bonus-product');\n $selectButton.trigger('bonusproduct:updateSelectButton', {\n product: response.product, $productContainer: $productContainer\n });\n } else {\n // Enable \"Add to Cart\" button if all required attributes have been selected\n $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').trigger('product:updateAddToCart', {\n product: response.product, $productContainer: $productContainer\n }).trigger('product:statusUpdate', response.product);\n }\n\n // Update attributes\n $productContainer.find('.main-attributes').empty()\n .html(getAttributesHtml(response.product.attributes));\n}\n\n/**\n * @typespec UpdatedQuantity\n * @type Object\n * @property {boolean} selected - Whether the quantity has been selected\n * @property {string} value - The number of products to purchase\n * @property {string} url - Compiled URL that specifies variation attributes, product ID, options,\n * etc.\n */\n\n/**\n * Updates the quantity DOM elements post Ajax call\n * @param {UpdatedQuantity[]} quantities -\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction updateQuantities(quantities, $productContainer) {\n if ($productContainer.parent('.bonus-product-item').length <= 0) {\n var optionsHtml = quantities.map(function (quantity) {\n var selected = quantity.selected ? ' selected ' : '';\n return '';\n }).join('');\n getQuantitySelector($productContainer).empty().html(optionsHtml);\n }\n}\n\n/**\n * updates the product view when a product attribute is selected or deselected or when\n * changing quantity\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction attributeSelect(selectedValueUrl, $productContainer) {\n if (selectedValueUrl) {\n $('body').trigger('product:beforeAttributeSelect',\n { url: selectedValueUrl, container: $productContainer });\n\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n success: function (data) {\n handleVariantResponse(data, $productContainer);\n updateOptions(data.product.optionsHtml, $productContainer);\n updateQuantities(data.product.quantities, $productContainer);\n $('body').trigger('product:afterAttributeSelect',\n { data: data, container: $productContainer });\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @return {string} - The provided URL to use when adding a product to the cart\n */\nfunction getAddToCartUrl() {\n return $('.add-to-cart-url').val();\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nfunction parseHtml(html) {\n var $html = $('
      ').append($.parseHTML(html));\n\n var body = $html.find('.choice-of-bonus-product');\n var footer = $html.find('.modal-footer').children();\n\n return { body: body, footer: footer };\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction chooseBonusProducts(data) {\n $('.modal-body').spinner().start();\n\n if ($('#chooseBonusProductModal').length !== 0) {\n $('#chooseBonusProductModal').remove();\n }\n var bonusUrl;\n if (data.bonusChoiceRuleBased) {\n bonusUrl = data.showProductsUrlRuleBased;\n } else {\n bonusUrl = data.showProductsUrlListBased;\n }\n\n var htmlString = ''\n + '
      '\n + ''\n + '
      '\n + ''\n + '
      '\n + '
      '\n + ' ' + data.labels.selectprods + ''\n + ' '\n + '
      '\n + '
      '\n + '
      '\n + '
      '\n + '
      '\n + '
      ';\n $('body').append(htmlString);\n $('.modal-body').spinner().start();\n\n $.ajax({\n url: bonusUrl,\n method: 'GET',\n dataType: 'json',\n success: function (response) {\n var parsedHtml = parseHtml(response.renderedTemplate);\n $('#chooseBonusProductModal .modal-body').empty();\n $('#chooseBonusProductModal .enter-message').text(response.enterDialogMessage);\n $('#chooseBonusProductModal .modal-header .close .sr-only').text(response.closeButtonText);\n $('#chooseBonusProductModal .modal-body').html(parsedHtml.body);\n $('#chooseBonusProductModal .modal-footer').html(parsedHtml.footer);\n $('#chooseBonusProductModal').modal('show');\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\n/**\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\n * @param {string} response - ajax response from clicking the add to cart button\n */\nfunction handlePostCartAdd(response) {\n $('.minicart').trigger('count:update', response);\n var messageType = response.error ? 'alert-danger' : 'alert-success';\n // show add to cart toast\n if (response.newBonusDiscountLineItem\n && Object.keys(response.newBonusDiscountLineItem).length !== 0) {\n chooseBonusProducts(response.newBonusDiscountLineItem);\n } else {\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append(\n '
      '\n );\n }\n\n $('.add-to-cart-messages').append(\n '
      '\n + response.message\n + '
      '\n );\n\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n }, 5000);\n }\n}\n\n/**\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\n * items with their selected variants\n *\n * @return {string[]} - List of selected bundle product item ID's\n */\nfunction getChildProducts() {\n var childProducts = [];\n $('.bundle-item').each(function () {\n childProducts.push({\n pid: $(this).find('.product-id').text(),\n quantity: parseInt($(this).find('label.quantity').data('quantity'), 10)\n });\n });\n\n return childProducts.length ? JSON.stringify(childProducts) : [];\n}\n\n/**\n * Retrieve product options\n *\n * @param {jQuery} $productContainer - DOM element for current product\n * @return {string} - Product options and their selected values\n */\nfunction getOptions($productContainer) {\n var options = $productContainer\n .find('.product-option')\n .map(function () {\n var $elOption = $(this).find('.options-select');\n var urlValue = $elOption.val();\n var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]')\n .data('value-id');\n return {\n optionId: $(this).data('option-id'),\n selectedValueId: selectedValueId\n };\n }).toArray();\n\n return JSON.stringify(options);\n}\n\n/**\n * Makes a call to the server to report the event of adding an item to the cart\n *\n * @param {string | boolean} url - a string representing the end point to hit so that the event can be recorded, or false\n */\nfunction miniCartReportingUrl(url) {\n if (url) {\n $.ajax({\n url: url,\n method: 'GET',\n success: function () {\n // reporting urls hit on the server\n },\n error: function () {\n // no reporting urls hit on the server\n }\n });\n }\n}\n\nmodule.exports = {\n attributeSelect: attributeSelect,\n methods: {\n editBonusProducts: function (data) {\n chooseBonusProducts(data);\n }\n },\n\n focusChooseBonusProductModal: function () {\n $('body').on('shown.bs.modal', '#chooseBonusProductModal', function () {\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'true');\n $('#chooseBonusProductModal .close').focus();\n });\n },\n\n onClosingChooseBonusProductModal: function () {\n $('body').on('hidden.bs.modal', '#chooseBonusProductModal', function () {\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'false');\n });\n },\n\n trapChooseBonusProductModalFocus: function () {\n $('body').on('keydown', '#chooseBonusProductModal', function (e) {\n var focusParams = {\n event: e,\n containerSelector: '#chooseBonusProductModal',\n firstElementSelector: '.close',\n lastElementSelector: '.add-bonus-products'\n };\n focusHelper.setTabNextFocus(focusParams);\n });\n },\n\n colorAttribute: function () {\n $(document).on('click', '[data-attr=\"color\"] button', function (e) {\n e.preventDefault();\n\n if ($(this).attr('disabled')) {\n return;\n }\n var $productContainer = $(this).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n\n attributeSelect($(this).attr('data-url'), $productContainer);\n });\n },\n\n selectAttribute: function () {\n $(document).on('change', 'select[class*=\"select-\"], .options-select', function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n attributeSelect(e.currentTarget.value, $productContainer);\n });\n },\n\n availability: function () {\n $(document).on('change', '.quantity-select', function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.modal-content').find('.product-quickview');\n }\n\n if ($('.bundle-items', $productContainer).length === 0) {\n attributeSelect($(e.currentTarget).find('option:selected').data('url'),\n $productContainer);\n }\n });\n },\n\n addToCart: function () {\n $(document).on('click', 'button.add-to-cart, button.add-to-cart-global', function () {\n var addToCartUrl;\n var pid;\n var pidsObj;\n var setPids;\n\n $('body').trigger('product:beforeAddToCart', this);\n\n if ($('.set-items').length && $(this).hasClass('add-to-cart-global')) {\n setPids = [];\n\n $('.product-detail').each(function () {\n if (!$(this).hasClass('product-set-detail')) {\n setPids.push({\n pid: $(this).find('.product-id').text(),\n qty: $(this).find('.quantity-select').val(),\n options: getOptions($(this))\n });\n }\n });\n pidsObj = JSON.stringify(setPids);\n }\n\n pid = getPidValue($(this));\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\n }\n\n addToCartUrl = getAddToCartUrl();\n\n var form = {\n pid: pid,\n pidsObj: pidsObj,\n childProducts: getChildProducts(),\n quantity: getQuantitySelected($(this))\n };\n\n if (!$('.bundle-item').length) {\n form.options = getOptions($productContainer);\n }\n\n $(this).trigger('updateAddToCartFormData', form);\n if (addToCartUrl) {\n $.ajax({\n url: addToCartUrl,\n method: 'POST',\n data: form,\n success: function (data) {\n handlePostCartAdd(data);\n $('body').trigger('product:afterAddToCart', data);\n $.spinner().stop();\n miniCartReportingUrl(data.reportingURL);\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n });\n },\n selectBonusProduct: function () {\n $(document).on('click', '.select-bonus-product', function () {\n var $choiceOfBonusProduct = $(this).parents('.choice-of-bonus-product');\n var pid = $(this).data('pid');\n var maxPids = $('.choose-bonus-product-dialog').data('total-qty');\n var submittedQty = parseInt($choiceOfBonusProduct.find('.bonus-quantity-select').val(), 10);\n var totalQty = 0;\n $.each($('#chooseBonusProductModal .selected-bonus-products .selected-pid'), function () {\n totalQty += $(this).data('qty');\n });\n totalQty += submittedQty;\n var optionID = $choiceOfBonusProduct.find('.product-option').data('option-id');\n var valueId = $choiceOfBonusProduct.find('.options-select option:selected').data('valueId');\n if (totalQty <= maxPids) {\n var selectedBonusProductHtml = ''\n + '
      '\n + '
      '\n + $choiceOfBonusProduct.find('.product-name').html()\n + '
      '\n + '
      '\n + '
      '\n ;\n $('#chooseBonusProductModal .selected-bonus-products').append(selectedBonusProductHtml);\n $('.pre-cart-products').html(totalQty);\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n } else {\n $('.selected-bonus-products .bonus-summary').addClass('alert-danger');\n }\n });\n },\n removeBonusProduct: function () {\n $(document).on('click', '.selected-pid', function () {\n $(this).remove();\n var $selected = $('#chooseBonusProductModal .selected-bonus-products .selected-pid');\n var count = 0;\n if ($selected.length) {\n $selected.each(function () {\n count += parseInt($(this).data('qty'), 10);\n });\n }\n\n $('.pre-cart-products').html(count);\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n });\n },\n enableBonusProductSelection: function () {\n $('body').on('bonusproduct:updateSelectButton', function (e, response) {\n $('button.select-bonus-product', response.$productContainer).attr('disabled',\n (!response.product.readyToOrder || !response.product.available));\n var pid = response.product.id;\n $('button.select-bonus-product', response.$productContainer).data('pid', pid);\n });\n },\n showMoreBonusProducts: function () {\n $(document).on('click', '.show-more-bonus-products', function () {\n var url = $(this).data('url');\n $('.modal-content').spinner().start();\n $.ajax({\n url: url,\n method: 'GET',\n success: function (html) {\n var parsedHtml = parseHtml(html);\n $('.modal-body').append(parsedHtml.body);\n $('.show-more-bonus-products:first').remove();\n $('.modal-content').spinner().stop();\n },\n error: function () {\n $('.modal-content').spinner().stop();\n }\n });\n });\n },\n addBonusProductsToCart: function () {\n $(document).on('click', '.add-bonus-products', function () {\n var $readyToOrderBonusProducts = $('.choose-bonus-product-dialog .selected-pid');\n var queryString = '?pids=';\n var url = $('.choose-bonus-product-dialog').data('addtocarturl');\n var pidsObject = {\n bonusProducts: []\n };\n\n $.each($readyToOrderBonusProducts, function () {\n var qtyOption =\n parseInt($(this)\n .data('qty'), 10);\n\n var option = null;\n if (qtyOption > 0) {\n if ($(this).data('optionid') && $(this).data('option-selected-value')) {\n option = {};\n option.optionId = $(this).data('optionid');\n option.productId = $(this).data('pid');\n option.selectedValueId = $(this).data('option-selected-value');\n }\n pidsObject.bonusProducts.push({\n pid: $(this).data('pid'),\n qty: qtyOption,\n options: [option]\n });\n pidsObject.totalQty = parseInt($('.pre-cart-products').html(), 10);\n }\n });\n queryString += JSON.stringify(pidsObject);\n queryString = queryString + '&uuid=' + $('.choose-bonus-product-dialog').data('uuid');\n queryString = queryString + '&pliuuid=' + $('.choose-bonus-product-dialog').data('pliuuid');\n $.spinner().start();\n $.ajax({\n url: url + queryString,\n method: 'POST',\n success: function (data) {\n $.spinner().stop();\n if (data.error) {\n $('#chooseBonusProductModal').modal('hide');\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append('
      ');\n }\n $('.add-to-cart-messages').append(\n '
      '\n + data.errorMessage + '
      '\n );\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n }, 3000);\n } else {\n $('.configure-bonus-product-attributes').html(data);\n $('.bonus-products-step2').removeClass('hidden-xl-down');\n $('#chooseBonusProductModal').modal('hide');\n\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append('
      ');\n }\n $('.minicart-quantity').html(data.totalQty);\n $('.add-to-cart-messages').append(\n '
      '\n + data.msgSuccess + '
      '\n );\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n if ($('.cart-page').length) {\n location.reload();\n }\n }, 1500);\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n },\n\n getPidValue: getPidValue,\n getQuantitySelected: getQuantitySelected,\n miniCartReportingUrl: miniCartReportingUrl\n};\n","'use strict';\n\nmodule.exports = {\n setTabNextFocus: function (focusParams) {\n var KEYCODE_TAB = 9;\n var isTabPressed = (focusParams.event.key === 'Tab' || focusParams.event.keyCode === KEYCODE_TAB);\n\n if (!isTabPressed) {\n return;\n }\n\n var firstFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.firstElementSelector);\n var lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.lastElementSelector);\n\n if ($(focusParams.containerSelector + ' ' + focusParams.lastElementSelector).is(':disabled')) {\n lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.nextToLastElementSelector);\n if ($('.product-quickview.product-set').length > 0) {\n var linkElements = $(focusParams.containerSelector + ' a#fa-link.share-icons');\n lastFocusableEl = linkElements[linkElements.length - 1];\n }\n }\n\n if (focusParams.event.shiftKey) /* shift + tab */ {\n if ($(':focus').is(firstFocusableEl)) {\n lastFocusableEl.focus();\n focusParams.event.preventDefault();\n }\n } else /* tab */ {\n if ($(':focus').is(lastFocusableEl)) { // eslint-disable-line\n firstFocusableEl.focus();\n focusParams.event.preventDefault();\n }\n }\n }\n};\n","/**\n * SSR Window 4.0.0\n * Better handling for window object in SSR environment\n * https://github.com/nolimits4web/ssr-window\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: August 25, 2021\n */\n/* eslint-disable no-param-reassign */\nfunction isObject(obj) {\n return (obj !== null &&\n typeof obj === 'object' &&\n 'constructor' in obj &&\n obj.constructor === Object);\n}\nfunction extend(target = {}, src = {}) {\n Object.keys(src).forEach((key) => {\n if (typeof target[key] === 'undefined')\n target[key] = src[key];\n else if (isObject(src[key]) &&\n isObject(target[key]) &&\n Object.keys(src[key]).length > 0) {\n extend(target[key], src[key]);\n }\n });\n}\n\nconst ssrDocument = {\n body: {},\n addEventListener() { },\n removeEventListener() { },\n activeElement: {\n blur() { },\n nodeName: '',\n },\n querySelector() {\n return null;\n },\n querySelectorAll() {\n return [];\n },\n getElementById() {\n return null;\n },\n createEvent() {\n return {\n initEvent() { },\n };\n },\n createElement() {\n return {\n children: [],\n childNodes: [],\n style: {},\n setAttribute() { },\n getElementsByTagName() {\n return [];\n },\n };\n },\n createElementNS() {\n return {};\n },\n importNode() {\n return null;\n },\n location: {\n hash: '',\n host: '',\n hostname: '',\n href: '',\n origin: '',\n pathname: '',\n protocol: '',\n search: '',\n },\n};\nfunction getDocument() {\n const doc = typeof document !== 'undefined' ? document : {};\n extend(doc, ssrDocument);\n return doc;\n}\n\nconst ssrWindow = {\n document: ssrDocument,\n navigator: {\n userAgent: '',\n },\n location: {\n hash: '',\n host: '',\n hostname: '',\n href: '',\n origin: '',\n pathname: '',\n protocol: '',\n search: '',\n },\n history: {\n replaceState() { },\n pushState() { },\n go() { },\n back() { },\n },\n CustomEvent: function CustomEvent() {\n return this;\n },\n addEventListener() { },\n removeEventListener() { },\n getComputedStyle() {\n return {\n getPropertyValue() {\n return '';\n },\n };\n },\n Image() { },\n Date() { },\n screen: {},\n setTimeout() { },\n clearTimeout() { },\n matchMedia() {\n return {};\n },\n requestAnimationFrame(callback) {\n if (typeof setTimeout === 'undefined') {\n callback();\n return null;\n }\n return setTimeout(callback, 0);\n },\n cancelAnimationFrame(id) {\n if (typeof setTimeout === 'undefined') {\n return;\n }\n clearTimeout(id);\n },\n};\nfunction getWindow() {\n const win = typeof window !== 'undefined' ? window : {};\n extend(win, ssrWindow);\n return win;\n}\n\nexport { extend, getDocument, getWindow, ssrDocument, ssrWindow };\n","/**\n * Dom7 4.0.0\n * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API\n * https://framework7.io/docs/dom7.html\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: August 25, 2021\n */\nimport { getWindow, getDocument } from 'ssr-window';\n\n/* eslint-disable no-proto */\nfunction makeReactive(obj) {\n const proto = obj.__proto__;\n Object.defineProperty(obj, '__proto__', {\n get() {\n return proto;\n },\n\n set(value) {\n proto.__proto__ = value;\n }\n\n });\n}\n\nclass Dom7 extends Array {\n constructor(items) {\n super(...(items || []));\n makeReactive(this);\n }\n\n}\n\nfunction arrayFlat(arr = []) {\n const res = [];\n arr.forEach(el => {\n if (Array.isArray(el)) {\n res.push(...arrayFlat(el));\n } else {\n res.push(el);\n }\n });\n return res;\n}\nfunction arrayFilter(arr, callback) {\n return Array.prototype.filter.call(arr, callback);\n}\nfunction arrayUnique(arr) {\n const uniqueArray = [];\n\n for (let i = 0; i < arr.length; i += 1) {\n if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]);\n }\n\n return uniqueArray;\n}\nfunction toCamelCase(string) {\n return string.toLowerCase().replace(/-(.)/g, (match, group) => group.toUpperCase());\n}\n\n// eslint-disable-next-line\n\nfunction qsa(selector, context) {\n if (typeof selector !== 'string') {\n return [selector];\n }\n\n const a = [];\n const res = context.querySelectorAll(selector);\n\n for (let i = 0; i < res.length; i += 1) {\n a.push(res[i]);\n }\n\n return a;\n}\n\nfunction $(selector, context) {\n const window = getWindow();\n const document = getDocument();\n let arr = [];\n\n if (!context && selector instanceof Dom7) {\n return selector;\n }\n\n if (!selector) {\n return new Dom7(arr);\n }\n\n if (typeof selector === 'string') {\n const html = selector.trim();\n\n if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {\n let toCreate = 'div';\n if (html.indexOf(' c.split(' ')));\n this.forEach(el => {\n el.classList.add(...classNames);\n });\n return this;\n}\n\nfunction removeClass(...classes) {\n const classNames = arrayFlat(classes.map(c => c.split(' ')));\n this.forEach(el => {\n el.classList.remove(...classNames);\n });\n return this;\n}\n\nfunction toggleClass(...classes) {\n const classNames = arrayFlat(classes.map(c => c.split(' ')));\n this.forEach(el => {\n classNames.forEach(className => {\n el.classList.toggle(className);\n });\n });\n}\n\nfunction hasClass(...classes) {\n const classNames = arrayFlat(classes.map(c => c.split(' ')));\n return arrayFilter(this, el => {\n return classNames.filter(className => el.classList.contains(className)).length > 0;\n }).length > 0;\n}\n\nfunction attr(attrs, value) {\n if (arguments.length === 1 && typeof attrs === 'string') {\n // Get attr\n if (this[0]) return this[0].getAttribute(attrs);\n return undefined;\n } // Set attrs\n\n\n for (let i = 0; i < this.length; i += 1) {\n if (arguments.length === 2) {\n // String\n this[i].setAttribute(attrs, value);\n } else {\n // Object\n for (const attrName in attrs) {\n this[i][attrName] = attrs[attrName];\n this[i].setAttribute(attrName, attrs[attrName]);\n }\n }\n }\n\n return this;\n}\n\nfunction removeAttr(attr) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].removeAttribute(attr);\n }\n\n return this;\n}\n\nfunction prop(props, value) {\n if (arguments.length === 1 && typeof props === 'string') {\n // Get prop\n if (this[0]) return this[0][props];\n } else {\n // Set props\n for (let i = 0; i < this.length; i += 1) {\n if (arguments.length === 2) {\n // String\n this[i][props] = value;\n } else {\n // Object\n for (const propName in props) {\n this[i][propName] = props[propName];\n }\n }\n }\n\n return this;\n }\n\n return this;\n}\n\nfunction data(key, value) {\n let el;\n\n if (typeof value === 'undefined') {\n el = this[0];\n if (!el) return undefined; // Get value\n\n if (el.dom7ElementDataStorage && key in el.dom7ElementDataStorage) {\n return el.dom7ElementDataStorage[key];\n }\n\n const dataKey = el.getAttribute(`data-${key}`);\n\n if (dataKey) {\n return dataKey;\n }\n\n return undefined;\n } // Set value\n\n\n for (let i = 0; i < this.length; i += 1) {\n el = this[i];\n if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {};\n el.dom7ElementDataStorage[key] = value;\n }\n\n return this;\n}\n\nfunction removeData(key) {\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) {\n el.dom7ElementDataStorage[key] = null;\n delete el.dom7ElementDataStorage[key];\n }\n }\n}\n\nfunction dataset() {\n const el = this[0];\n if (!el) return undefined;\n const dataset = {}; // eslint-disable-line\n\n if (el.dataset) {\n for (const dataKey in el.dataset) {\n dataset[dataKey] = el.dataset[dataKey];\n }\n } else {\n for (let i = 0; i < el.attributes.length; i += 1) {\n const attr = el.attributes[i];\n\n if (attr.name.indexOf('data-') >= 0) {\n dataset[toCamelCase(attr.name.split('data-')[1])] = attr.value;\n }\n }\n }\n\n for (const key in dataset) {\n if (dataset[key] === 'false') dataset[key] = false;else if (dataset[key] === 'true') dataset[key] = true;else if (parseFloat(dataset[key]) === dataset[key] * 1) dataset[key] *= 1;\n }\n\n return dataset;\n}\n\nfunction val(value) {\n if (typeof value === 'undefined') {\n // get value\n const el = this[0];\n if (!el) return undefined;\n\n if (el.multiple && el.nodeName.toLowerCase() === 'select') {\n const values = [];\n\n for (let i = 0; i < el.selectedOptions.length; i += 1) {\n values.push(el.selectedOptions[i].value);\n }\n\n return values;\n }\n\n return el.value;\n } // set value\n\n\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (Array.isArray(value) && el.multiple && el.nodeName.toLowerCase() === 'select') {\n for (let j = 0; j < el.options.length; j += 1) {\n el.options[j].selected = value.indexOf(el.options[j].value) >= 0;\n }\n } else {\n el.value = value;\n }\n }\n\n return this;\n}\n\nfunction value(value) {\n return this.val(value);\n}\n\nfunction transform(transform) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.transform = transform;\n }\n\n return this;\n}\n\nfunction transition(duration) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.transitionDuration = typeof duration !== 'string' ? `${duration}ms` : duration;\n }\n\n return this;\n}\n\nfunction on(...args) {\n let [eventType, targetSelector, listener, capture] = args;\n\n if (typeof args[1] === 'function') {\n [eventType, listener, capture] = args;\n targetSelector = undefined;\n }\n\n if (!capture) capture = false;\n\n function handleLiveEvent(e) {\n const target = e.target;\n if (!target) return;\n const eventData = e.target.dom7EventData || [];\n\n if (eventData.indexOf(e) < 0) {\n eventData.unshift(e);\n }\n\n if ($(target).is(targetSelector)) listener.apply(target, eventData);else {\n const parents = $(target).parents(); // eslint-disable-line\n\n for (let k = 0; k < parents.length; k += 1) {\n if ($(parents[k]).is(targetSelector)) listener.apply(parents[k], eventData);\n }\n }\n }\n\n function handleEvent(e) {\n const eventData = e && e.target ? e.target.dom7EventData || [] : [];\n\n if (eventData.indexOf(e) < 0) {\n eventData.unshift(e);\n }\n\n listener.apply(this, eventData);\n }\n\n const events = eventType.split(' ');\n let j;\n\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (!targetSelector) {\n for (j = 0; j < events.length; j += 1) {\n const event = events[j];\n if (!el.dom7Listeners) el.dom7Listeners = {};\n if (!el.dom7Listeners[event]) el.dom7Listeners[event] = [];\n el.dom7Listeners[event].push({\n listener,\n proxyListener: handleEvent\n });\n el.addEventListener(event, handleEvent, capture);\n }\n } else {\n // Live events\n for (j = 0; j < events.length; j += 1) {\n const event = events[j];\n if (!el.dom7LiveListeners) el.dom7LiveListeners = {};\n if (!el.dom7LiveListeners[event]) el.dom7LiveListeners[event] = [];\n el.dom7LiveListeners[event].push({\n listener,\n proxyListener: handleLiveEvent\n });\n el.addEventListener(event, handleLiveEvent, capture);\n }\n }\n }\n\n return this;\n}\n\nfunction off(...args) {\n let [eventType, targetSelector, listener, capture] = args;\n\n if (typeof args[1] === 'function') {\n [eventType, listener, capture] = args;\n targetSelector = undefined;\n }\n\n if (!capture) capture = false;\n const events = eventType.split(' ');\n\n for (let i = 0; i < events.length; i += 1) {\n const event = events[i];\n\n for (let j = 0; j < this.length; j += 1) {\n const el = this[j];\n let handlers;\n\n if (!targetSelector && el.dom7Listeners) {\n handlers = el.dom7Listeners[event];\n } else if (targetSelector && el.dom7LiveListeners) {\n handlers = el.dom7LiveListeners[event];\n }\n\n if (handlers && handlers.length) {\n for (let k = handlers.length - 1; k >= 0; k -= 1) {\n const handler = handlers[k];\n\n if (listener && handler.listener === listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n } else if (!listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n }\n }\n }\n }\n }\n\n return this;\n}\n\nfunction once(...args) {\n const dom = this;\n let [eventName, targetSelector, listener, capture] = args;\n\n if (typeof args[1] === 'function') {\n [eventName, listener, capture] = args;\n targetSelector = undefined;\n }\n\n function onceHandler(...eventArgs) {\n listener.apply(this, eventArgs);\n dom.off(eventName, targetSelector, onceHandler, capture);\n\n if (onceHandler.dom7proxy) {\n delete onceHandler.dom7proxy;\n }\n }\n\n onceHandler.dom7proxy = listener;\n return dom.on(eventName, targetSelector, onceHandler, capture);\n}\n\nfunction trigger(...args) {\n const window = getWindow();\n const events = args[0].split(' ');\n const eventData = args[1];\n\n for (let i = 0; i < events.length; i += 1) {\n const event = events[i];\n\n for (let j = 0; j < this.length; j += 1) {\n const el = this[j];\n\n if (window.CustomEvent) {\n const evt = new window.CustomEvent(event, {\n detail: eventData,\n bubbles: true,\n cancelable: true\n });\n el.dom7EventData = args.filter((data, dataIndex) => dataIndex > 0);\n el.dispatchEvent(evt);\n el.dom7EventData = [];\n delete el.dom7EventData;\n }\n }\n }\n\n return this;\n}\n\nfunction transitionEnd(callback) {\n const dom = this;\n\n function fireCallBack(e) {\n if (e.target !== this) return;\n callback.call(this, e);\n dom.off('transitionend', fireCallBack);\n }\n\n if (callback) {\n dom.on('transitionend', fireCallBack);\n }\n\n return this;\n}\n\nfunction animationEnd(callback) {\n const dom = this;\n\n function fireCallBack(e) {\n if (e.target !== this) return;\n callback.call(this, e);\n dom.off('animationend', fireCallBack);\n }\n\n if (callback) {\n dom.on('animationend', fireCallBack);\n }\n\n return this;\n}\n\nfunction width() {\n const window = getWindow();\n\n if (this[0] === window) {\n return window.innerWidth;\n }\n\n if (this.length > 0) {\n return parseFloat(this.css('width'));\n }\n\n return null;\n}\n\nfunction outerWidth(includeMargins) {\n if (this.length > 0) {\n if (includeMargins) {\n const styles = this.styles();\n return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));\n }\n\n return this[0].offsetWidth;\n }\n\n return null;\n}\n\nfunction height() {\n const window = getWindow();\n\n if (this[0] === window) {\n return window.innerHeight;\n }\n\n if (this.length > 0) {\n return parseFloat(this.css('height'));\n }\n\n return null;\n}\n\nfunction outerHeight(includeMargins) {\n if (this.length > 0) {\n if (includeMargins) {\n const styles = this.styles();\n return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));\n }\n\n return this[0].offsetHeight;\n }\n\n return null;\n}\n\nfunction offset() {\n if (this.length > 0) {\n const window = getWindow();\n const document = getDocument();\n const el = this[0];\n const box = el.getBoundingClientRect();\n const body = document.body;\n const clientTop = el.clientTop || body.clientTop || 0;\n const clientLeft = el.clientLeft || body.clientLeft || 0;\n const scrollTop = el === window ? window.scrollY : el.scrollTop;\n const scrollLeft = el === window ? window.scrollX : el.scrollLeft;\n return {\n top: box.top + scrollTop - clientTop,\n left: box.left + scrollLeft - clientLeft\n };\n }\n\n return null;\n}\n\nfunction hide() {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.display = 'none';\n }\n\n return this;\n}\n\nfunction show() {\n const window = getWindow();\n\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (el.style.display === 'none') {\n el.style.display = '';\n }\n\n if (window.getComputedStyle(el, null).getPropertyValue('display') === 'none') {\n // Still not visible\n el.style.display = 'block';\n }\n }\n\n return this;\n}\n\nfunction styles() {\n const window = getWindow();\n if (this[0]) return window.getComputedStyle(this[0], null);\n return {};\n}\n\nfunction css(props, value) {\n const window = getWindow();\n let i;\n\n if (arguments.length === 1) {\n if (typeof props === 'string') {\n // .css('width')\n if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props);\n } else {\n // .css({ width: '100px' })\n for (i = 0; i < this.length; i += 1) {\n for (const prop in props) {\n this[i].style[prop] = props[prop];\n }\n }\n\n return this;\n }\n }\n\n if (arguments.length === 2 && typeof props === 'string') {\n // .css('width', '100px')\n for (i = 0; i < this.length; i += 1) {\n this[i].style[props] = value;\n }\n\n return this;\n }\n\n return this;\n}\n\nfunction each(callback) {\n if (!callback) return this;\n this.forEach((el, index) => {\n callback.apply(el, [el, index]);\n });\n return this;\n}\n\nfunction filter(callback) {\n const result = arrayFilter(this, callback);\n return $(result);\n}\n\nfunction html(html) {\n if (typeof html === 'undefined') {\n return this[0] ? this[0].innerHTML : null;\n }\n\n for (let i = 0; i < this.length; i += 1) {\n this[i].innerHTML = html;\n }\n\n return this;\n}\n\nfunction text(text) {\n if (typeof text === 'undefined') {\n return this[0] ? this[0].textContent.trim() : null;\n }\n\n for (let i = 0; i < this.length; i += 1) {\n this[i].textContent = text;\n }\n\n return this;\n}\n\nfunction is(selector) {\n const window = getWindow();\n const document = getDocument();\n const el = this[0];\n let compareWith;\n let i;\n if (!el || typeof selector === 'undefined') return false;\n\n if (typeof selector === 'string') {\n if (el.matches) return el.matches(selector);\n if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);\n if (el.msMatchesSelector) return el.msMatchesSelector(selector);\n compareWith = $(selector);\n\n for (i = 0; i < compareWith.length; i += 1) {\n if (compareWith[i] === el) return true;\n }\n\n return false;\n }\n\n if (selector === document) {\n return el === document;\n }\n\n if (selector === window) {\n return el === window;\n }\n\n if (selector.nodeType || selector instanceof Dom7) {\n compareWith = selector.nodeType ? [selector] : selector;\n\n for (i = 0; i < compareWith.length; i += 1) {\n if (compareWith[i] === el) return true;\n }\n\n return false;\n }\n\n return false;\n}\n\nfunction index() {\n let child = this[0];\n let i;\n\n if (child) {\n i = 0; // eslint-disable-next-line\n\n while ((child = child.previousSibling) !== null) {\n if (child.nodeType === 1) i += 1;\n }\n\n return i;\n }\n\n return undefined;\n}\n\nfunction eq(index) {\n if (typeof index === 'undefined') return this;\n const length = this.length;\n\n if (index > length - 1) {\n return $([]);\n }\n\n if (index < 0) {\n const returnIndex = length + index;\n if (returnIndex < 0) return $([]);\n return $([this[returnIndex]]);\n }\n\n return $([this[index]]);\n}\n\nfunction append(...els) {\n let newChild;\n const document = getDocument();\n\n for (let k = 0; k < els.length; k += 1) {\n newChild = els[k];\n\n for (let i = 0; i < this.length; i += 1) {\n if (typeof newChild === 'string') {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = newChild;\n\n while (tempDiv.firstChild) {\n this[i].appendChild(tempDiv.firstChild);\n }\n } else if (newChild instanceof Dom7) {\n for (let j = 0; j < newChild.length; j += 1) {\n this[i].appendChild(newChild[j]);\n }\n } else {\n this[i].appendChild(newChild);\n }\n }\n }\n\n return this;\n}\n\nfunction appendTo(parent) {\n $(parent).append(this);\n return this;\n}\n\nfunction prepend(newChild) {\n const document = getDocument();\n let i;\n let j;\n\n for (i = 0; i < this.length; i += 1) {\n if (typeof newChild === 'string') {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = newChild;\n\n for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {\n this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);\n }\n } else if (newChild instanceof Dom7) {\n for (j = 0; j < newChild.length; j += 1) {\n this[i].insertBefore(newChild[j], this[i].childNodes[0]);\n }\n } else {\n this[i].insertBefore(newChild, this[i].childNodes[0]);\n }\n }\n\n return this;\n}\n\nfunction prependTo(parent) {\n $(parent).prepend(this);\n return this;\n}\n\nfunction insertBefore(selector) {\n const before = $(selector);\n\n for (let i = 0; i < this.length; i += 1) {\n if (before.length === 1) {\n before[0].parentNode.insertBefore(this[i], before[0]);\n } else if (before.length > 1) {\n for (let j = 0; j < before.length; j += 1) {\n before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]);\n }\n }\n }\n}\n\nfunction insertAfter(selector) {\n const after = $(selector);\n\n for (let i = 0; i < this.length; i += 1) {\n if (after.length === 1) {\n after[0].parentNode.insertBefore(this[i], after[0].nextSibling);\n } else if (after.length > 1) {\n for (let j = 0; j < after.length; j += 1) {\n after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling);\n }\n }\n }\n}\n\nfunction next(selector) {\n if (this.length > 0) {\n if (selector) {\n if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {\n return $([this[0].nextElementSibling]);\n }\n\n return $([]);\n }\n\n if (this[0].nextElementSibling) return $([this[0].nextElementSibling]);\n return $([]);\n }\n\n return $([]);\n}\n\nfunction nextAll(selector) {\n const nextEls = [];\n let el = this[0];\n if (!el) return $([]);\n\n while (el.nextElementSibling) {\n const next = el.nextElementSibling; // eslint-disable-line\n\n if (selector) {\n if ($(next).is(selector)) nextEls.push(next);\n } else nextEls.push(next);\n\n el = next;\n }\n\n return $(nextEls);\n}\n\nfunction prev(selector) {\n if (this.length > 0) {\n const el = this[0];\n\n if (selector) {\n if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {\n return $([el.previousElementSibling]);\n }\n\n return $([]);\n }\n\n if (el.previousElementSibling) return $([el.previousElementSibling]);\n return $([]);\n }\n\n return $([]);\n}\n\nfunction prevAll(selector) {\n const prevEls = [];\n let el = this[0];\n if (!el) return $([]);\n\n while (el.previousElementSibling) {\n const prev = el.previousElementSibling; // eslint-disable-line\n\n if (selector) {\n if ($(prev).is(selector)) prevEls.push(prev);\n } else prevEls.push(prev);\n\n el = prev;\n }\n\n return $(prevEls);\n}\n\nfunction siblings(selector) {\n return this.nextAll(selector).add(this.prevAll(selector));\n}\n\nfunction parent(selector) {\n const parents = []; // eslint-disable-line\n\n for (let i = 0; i < this.length; i += 1) {\n if (this[i].parentNode !== null) {\n if (selector) {\n if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode);\n } else {\n parents.push(this[i].parentNode);\n }\n }\n }\n\n return $(parents);\n}\n\nfunction parents(selector) {\n const parents = []; // eslint-disable-line\n\n for (let i = 0; i < this.length; i += 1) {\n let parent = this[i].parentNode; // eslint-disable-line\n\n while (parent) {\n if (selector) {\n if ($(parent).is(selector)) parents.push(parent);\n } else {\n parents.push(parent);\n }\n\n parent = parent.parentNode;\n }\n }\n\n return $(parents);\n}\n\nfunction closest(selector) {\n let closest = this; // eslint-disable-line\n\n if (typeof selector === 'undefined') {\n return $([]);\n }\n\n if (!closest.is(selector)) {\n closest = closest.parents(selector).eq(0);\n }\n\n return closest;\n}\n\nfunction find(selector) {\n const foundElements = [];\n\n for (let i = 0; i < this.length; i += 1) {\n const found = this[i].querySelectorAll(selector);\n\n for (let j = 0; j < found.length; j += 1) {\n foundElements.push(found[j]);\n }\n }\n\n return $(foundElements);\n}\n\nfunction children(selector) {\n const children = []; // eslint-disable-line\n\n for (let i = 0; i < this.length; i += 1) {\n const childNodes = this[i].children;\n\n for (let j = 0; j < childNodes.length; j += 1) {\n if (!selector || $(childNodes[j]).is(selector)) {\n children.push(childNodes[j]);\n }\n }\n }\n\n return $(children);\n}\n\nfunction remove() {\n for (let i = 0; i < this.length; i += 1) {\n if (this[i].parentNode) this[i].parentNode.removeChild(this[i]);\n }\n\n return this;\n}\n\nfunction detach() {\n return this.remove();\n}\n\nfunction add(...els) {\n const dom = this;\n let i;\n let j;\n\n for (i = 0; i < els.length; i += 1) {\n const toAdd = $(els[i]);\n\n for (j = 0; j < toAdd.length; j += 1) {\n dom.push(toAdd[j]);\n }\n }\n\n return dom;\n}\n\nfunction empty() {\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (el.nodeType === 1) {\n for (let j = 0; j < el.childNodes.length; j += 1) {\n if (el.childNodes[j].parentNode) {\n el.childNodes[j].parentNode.removeChild(el.childNodes[j]);\n }\n }\n\n el.textContent = '';\n }\n }\n\n return this;\n}\n\n// eslint-disable-next-line\n\nfunction scrollTo(...args) {\n const window = getWindow();\n let [left, top, duration, easing, callback] = args;\n\n if (args.length === 4 && typeof easing === 'function') {\n callback = easing;\n [left, top, duration, callback, easing] = args;\n }\n\n if (typeof easing === 'undefined') easing = 'swing';\n return this.each(function animate() {\n const el = this;\n let currentTop;\n let currentLeft;\n let maxTop;\n let maxLeft;\n let newTop;\n let newLeft;\n let scrollTop; // eslint-disable-line\n\n let scrollLeft; // eslint-disable-line\n\n let animateTop = top > 0 || top === 0;\n let animateLeft = left > 0 || left === 0;\n\n if (typeof easing === 'undefined') {\n easing = 'swing';\n }\n\n if (animateTop) {\n currentTop = el.scrollTop;\n\n if (!duration) {\n el.scrollTop = top;\n }\n }\n\n if (animateLeft) {\n currentLeft = el.scrollLeft;\n\n if (!duration) {\n el.scrollLeft = left;\n }\n }\n\n if (!duration) return;\n\n if (animateTop) {\n maxTop = el.scrollHeight - el.offsetHeight;\n newTop = Math.max(Math.min(top, maxTop), 0);\n }\n\n if (animateLeft) {\n maxLeft = el.scrollWidth - el.offsetWidth;\n newLeft = Math.max(Math.min(left, maxLeft), 0);\n }\n\n let startTime = null;\n if (animateTop && newTop === currentTop) animateTop = false;\n if (animateLeft && newLeft === currentLeft) animateLeft = false;\n\n function render(time = new Date().getTime()) {\n if (startTime === null) {\n startTime = time;\n }\n\n const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n const easeProgress = easing === 'linear' ? progress : 0.5 - Math.cos(progress * Math.PI) / 2;\n let done;\n if (animateTop) scrollTop = currentTop + easeProgress * (newTop - currentTop);\n if (animateLeft) scrollLeft = currentLeft + easeProgress * (newLeft - currentLeft);\n\n if (animateTop && newTop > currentTop && scrollTop >= newTop) {\n el.scrollTop = newTop;\n done = true;\n }\n\n if (animateTop && newTop < currentTop && scrollTop <= newTop) {\n el.scrollTop = newTop;\n done = true;\n }\n\n if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft) {\n el.scrollLeft = newLeft;\n done = true;\n }\n\n if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft) {\n el.scrollLeft = newLeft;\n done = true;\n }\n\n if (done) {\n if (callback) callback();\n return;\n }\n\n if (animateTop) el.scrollTop = scrollTop;\n if (animateLeft) el.scrollLeft = scrollLeft;\n window.requestAnimationFrame(render);\n }\n\n window.requestAnimationFrame(render);\n });\n} // scrollTop(top, duration, easing, callback) {\n\n\nfunction scrollTop(...args) {\n let [top, duration, easing, callback] = args;\n\n if (args.length === 3 && typeof easing === 'function') {\n [top, duration, callback, easing] = args;\n }\n\n const dom = this;\n\n if (typeof top === 'undefined') {\n if (dom.length > 0) return dom[0].scrollTop;\n return null;\n }\n\n return dom.scrollTo(undefined, top, duration, easing, callback);\n}\n\nfunction scrollLeft(...args) {\n let [left, duration, easing, callback] = args;\n\n if (args.length === 3 && typeof easing === 'function') {\n [left, duration, callback, easing] = args;\n }\n\n const dom = this;\n\n if (typeof left === 'undefined') {\n if (dom.length > 0) return dom[0].scrollLeft;\n return null;\n }\n\n return dom.scrollTo(left, undefined, duration, easing, callback);\n}\n\n// eslint-disable-next-line\n\nfunction animate(initialProps, initialParams) {\n const window = getWindow();\n const els = this;\n const a = {\n props: Object.assign({}, initialProps),\n params: Object.assign({\n duration: 300,\n easing: 'swing' // or 'linear'\n\n /* Callbacks\n begin(elements)\n complete(elements)\n progress(elements, complete, remaining, start, tweenValue)\n */\n\n }, initialParams),\n elements: els,\n animating: false,\n que: [],\n\n easingProgress(easing, progress) {\n if (easing === 'swing') {\n return 0.5 - Math.cos(progress * Math.PI) / 2;\n }\n\n if (typeof easing === 'function') {\n return easing(progress);\n }\n\n return progress;\n },\n\n stop() {\n if (a.frameId) {\n window.cancelAnimationFrame(a.frameId);\n }\n\n a.animating = false;\n a.elements.each(el => {\n const element = el;\n delete element.dom7AnimateInstance;\n });\n a.que = [];\n },\n\n done(complete) {\n a.animating = false;\n a.elements.each(el => {\n const element = el;\n delete element.dom7AnimateInstance;\n });\n if (complete) complete(els);\n\n if (a.que.length > 0) {\n const que = a.que.shift();\n a.animate(que[0], que[1]);\n }\n },\n\n animate(props, params) {\n if (a.animating) {\n a.que.push([props, params]);\n return a;\n }\n\n const elements = []; // Define & Cache Initials & Units\n\n a.elements.each((el, index) => {\n let initialFullValue;\n let initialValue;\n let unit;\n let finalValue;\n let finalFullValue;\n if (!el.dom7AnimateInstance) a.elements[index].dom7AnimateInstance = a;\n elements[index] = {\n container: el\n };\n Object.keys(props).forEach(prop => {\n initialFullValue = window.getComputedStyle(el, null).getPropertyValue(prop).replace(',', '.');\n initialValue = parseFloat(initialFullValue);\n unit = initialFullValue.replace(initialValue, '');\n finalValue = parseFloat(props[prop]);\n finalFullValue = props[prop] + unit;\n elements[index][prop] = {\n initialFullValue,\n initialValue,\n unit,\n finalValue,\n finalFullValue,\n currentValue: initialValue\n };\n });\n });\n let startTime = null;\n let time;\n let elementsDone = 0;\n let propsDone = 0;\n let done;\n let began = false;\n a.animating = true;\n\n function render() {\n time = new Date().getTime();\n let progress;\n let easeProgress; // let el;\n\n if (!began) {\n began = true;\n if (params.begin) params.begin(els);\n }\n\n if (startTime === null) {\n startTime = time;\n }\n\n if (params.progress) {\n // eslint-disable-next-line\n params.progress(els, Math.max(Math.min((time - startTime) / params.duration, 1), 0), startTime + params.duration - time < 0 ? 0 : startTime + params.duration - time, startTime);\n }\n\n elements.forEach(element => {\n const el = element;\n if (done || el.done) return;\n Object.keys(props).forEach(prop => {\n if (done || el.done) return;\n progress = Math.max(Math.min((time - startTime) / params.duration, 1), 0);\n easeProgress = a.easingProgress(params.easing, progress);\n const {\n initialValue,\n finalValue,\n unit\n } = el[prop];\n el[prop].currentValue = initialValue + easeProgress * (finalValue - initialValue);\n const currentValue = el[prop].currentValue;\n\n if (finalValue > initialValue && currentValue >= finalValue || finalValue < initialValue && currentValue <= finalValue) {\n el.container.style[prop] = finalValue + unit;\n propsDone += 1;\n\n if (propsDone === Object.keys(props).length) {\n el.done = true;\n elementsDone += 1;\n }\n\n if (elementsDone === elements.length) {\n done = true;\n }\n }\n\n if (done) {\n a.done(params.complete);\n return;\n }\n\n el.container.style[prop] = currentValue + unit;\n });\n });\n if (done) return; // Then call\n\n a.frameId = window.requestAnimationFrame(render);\n }\n\n a.frameId = window.requestAnimationFrame(render);\n return a;\n }\n\n };\n\n if (a.elements.length === 0) {\n return els;\n }\n\n let animateInstance;\n\n for (let i = 0; i < a.elements.length; i += 1) {\n if (a.elements[i].dom7AnimateInstance) {\n animateInstance = a.elements[i].dom7AnimateInstance;\n } else a.elements[i].dom7AnimateInstance = a;\n }\n\n if (!animateInstance) {\n animateInstance = a;\n }\n\n if (initialProps === 'stop') {\n animateInstance.stop();\n } else {\n animateInstance.animate(a.props, a.params);\n }\n\n return els;\n}\n\nfunction stop() {\n const els = this;\n\n for (let i = 0; i < els.length; i += 1) {\n if (els[i].dom7AnimateInstance) {\n els[i].dom7AnimateInstance.stop();\n }\n }\n}\n\nconst noTrigger = 'resize scroll'.split(' ');\n\nfunction shortcut(name) {\n function eventHandler(...args) {\n if (typeof args[0] === 'undefined') {\n for (let i = 0; i < this.length; i += 1) {\n if (noTrigger.indexOf(name) < 0) {\n if (name in this[i]) this[i][name]();else {\n $(this[i]).trigger(name);\n }\n }\n }\n\n return this;\n }\n\n return this.on(name, ...args);\n }\n\n return eventHandler;\n}\n\nconst click = shortcut('click');\nconst blur = shortcut('blur');\nconst focus = shortcut('focus');\nconst focusin = shortcut('focusin');\nconst focusout = shortcut('focusout');\nconst keyup = shortcut('keyup');\nconst keydown = shortcut('keydown');\nconst keypress = shortcut('keypress');\nconst submit = shortcut('submit');\nconst change = shortcut('change');\nconst mousedown = shortcut('mousedown');\nconst mousemove = shortcut('mousemove');\nconst mouseup = shortcut('mouseup');\nconst mouseenter = shortcut('mouseenter');\nconst mouseleave = shortcut('mouseleave');\nconst mouseout = shortcut('mouseout');\nconst mouseover = shortcut('mouseover');\nconst touchstart = shortcut('touchstart');\nconst touchend = shortcut('touchend');\nconst touchmove = shortcut('touchmove');\nconst resize = shortcut('resize');\nconst scroll = shortcut('scroll');\n\nexport default $;\nexport { $, add, addClass, animate, animationEnd, append, appendTo, attr, blur, change, children, click, closest, css, data, dataset, detach, each, empty, eq, filter, find, focus, focusin, focusout, hasClass, height, hide, html, index, insertAfter, insertBefore, is, keydown, keypress, keyup, mousedown, mouseenter, mouseleave, mousemove, mouseout, mouseover, mouseup, next, nextAll, off, offset, on, once, outerHeight, outerWidth, parent, parents, prepend, prependTo, prev, prevAll, prop, remove, removeAttr, removeClass, removeData, resize, scroll, scrollLeft, scrollTo, scrollTop, show, siblings, stop, styles, submit, text, toggleClass, touchend, touchmove, touchstart, transform, transition, transitionEnd, trigger, val, value, width };\n","import {\n $,\n addClass,\n removeClass,\n hasClass,\n toggleClass,\n attr,\n removeAttr,\n transform,\n transition,\n on,\n off,\n trigger,\n transitionEnd,\n outerWidth,\n outerHeight,\n styles,\n offset,\n css,\n each,\n html,\n text,\n is,\n index,\n eq,\n append,\n prepend,\n next,\n nextAll,\n prev,\n prevAll,\n parent,\n parents,\n closest,\n find,\n children,\n filter,\n remove,\n} from 'dom7';\n\nconst Methods = {\n addClass,\n removeClass,\n hasClass,\n toggleClass,\n attr,\n removeAttr,\n transform,\n transition,\n on,\n off,\n trigger,\n transitionEnd,\n outerWidth,\n outerHeight,\n styles,\n offset,\n css,\n each,\n html,\n text,\n is,\n index,\n eq,\n append,\n prepend,\n next,\n nextAll,\n prev,\n prevAll,\n parent,\n parents,\n closest,\n find,\n children,\n filter,\n remove,\n};\n\nObject.keys(Methods).forEach((methodName) => {\n Object.defineProperty($.fn, methodName, { value: Methods[methodName], writable: true });\n});\n\nexport default $;\n","import { getWindow, getDocument } from 'ssr-window';\n\nlet support;\n\nfunction calcSupport() {\n const window = getWindow();\n const document = getDocument();\n\n return {\n smoothScroll: document.documentElement && 'scrollBehavior' in document.documentElement.style,\n\n touch: !!(\n 'ontouchstart' in window ||\n (window.DocumentTouch && document instanceof window.DocumentTouch)\n ),\n\n passiveListener: (function checkPassiveListener() {\n let supportsPassive = false;\n try {\n const opts = Object.defineProperty({}, 'passive', {\n // eslint-disable-next-line\n get() {\n supportsPassive = true;\n },\n });\n window.addEventListener('testPassiveListener', null, opts);\n } catch (e) {\n // No support\n }\n return supportsPassive;\n })(),\n\n gestures: (function checkGestures() {\n return 'ongesturestart' in window;\n })(),\n };\n}\n\nfunction getSupport() {\n if (!support) {\n support = calcSupport();\n }\n return support;\n}\n\nexport { getSupport };\n","import { getWindow } from 'ssr-window';\nimport { getSupport } from './get-support.js';\n\nlet deviceCached;\n\nfunction calcDevice({ userAgent } = {}) {\n const support = getSupport();\n const window = getWindow();\n const platform = window.navigator.platform;\n const ua = userAgent || window.navigator.userAgent;\n\n const device = {\n ios: false,\n android: false,\n };\n\n const screenWidth = window.screen.width;\n const screenHeight = window.screen.height;\n\n const android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n let ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n const ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n const iphone = !ipad && ua.match(/(iPhone\\sOS|iOS)\\s([\\d_]+)/);\n const windows = platform === 'Win32';\n let macos = platform === 'MacIntel';\n\n // iPadOs 13 fix\n const iPadScreens = [\n '1024x1366',\n '1366x1024',\n '834x1194',\n '1194x834',\n '834x1112',\n '1112x834',\n '768x1024',\n '1024x768',\n '820x1180',\n '1180x820',\n '810x1080',\n '1080x810',\n ];\n if (\n !ipad &&\n macos &&\n support.touch &&\n iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0\n ) {\n ipad = ua.match(/(Version)\\/([\\d.]+)/);\n if (!ipad) ipad = [0, 1, '13_0_0'];\n macos = false;\n }\n\n // Android\n if (android && !windows) {\n device.os = 'android';\n device.android = true;\n }\n if (ipad || iphone || ipod) {\n device.os = 'ios';\n device.ios = true;\n }\n\n // Export object\n return device;\n}\n\nfunction getDevice(overrides = {}) {\n if (!deviceCached) {\n deviceCached = calcDevice(overrides);\n }\n return deviceCached;\n}\n\nexport { getDevice };\n","import { getWindow } from 'ssr-window';\n\nlet browser;\n\nfunction calcBrowser() {\n const window = getWindow();\n function isSafari() {\n const ua = window.navigator.userAgent.toLowerCase();\n return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;\n }\n return {\n isSafari: isSafari(),\n isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent),\n };\n}\n\nfunction getBrowser() {\n if (!browser) {\n browser = calcBrowser();\n }\n return browser;\n}\n\nexport { getBrowser };\n","import { getWindow } from 'ssr-window';\n\nfunction deleteProps(obj) {\n const object = obj;\n Object.keys(object).forEach((key) => {\n try {\n object[key] = null;\n } catch (e) {\n // no getter for object\n }\n try {\n delete object[key];\n } catch (e) {\n // something got wrong\n }\n });\n}\nfunction nextTick(callback, delay = 0) {\n return setTimeout(callback, delay);\n}\nfunction now() {\n return Date.now();\n}\nfunction getComputedStyle(el) {\n const window = getWindow();\n let style;\n if (window.getComputedStyle) {\n style = window.getComputedStyle(el, null);\n }\n if (!style && el.currentStyle) {\n style = el.currentStyle;\n }\n if (!style) {\n style = el.style;\n }\n\n return style;\n}\nfunction getTranslate(el, axis = 'x') {\n const window = getWindow();\n let matrix;\n let curTransform;\n let transformMatrix;\n\n const curStyle = getComputedStyle(el, null);\n\n if (window.WebKitCSSMatrix) {\n curTransform = curStyle.transform || curStyle.webkitTransform;\n if (curTransform.split(',').length > 6) {\n curTransform = curTransform\n .split(', ')\n .map((a) => a.replace(',', '.'))\n .join(', ');\n }\n // Some old versions of Webkit choke when 'none' is passed; pass\n // empty string instead in this case\n transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);\n } else {\n transformMatrix =\n curStyle.MozTransform ||\n curStyle.OTransform ||\n curStyle.MsTransform ||\n curStyle.msTransform ||\n curStyle.transform ||\n curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');\n matrix = transformMatrix.toString().split(',');\n }\n\n if (axis === 'x') {\n // Latest Chrome and webkits Fix\n if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41;\n // Crazy IE10 Matrix\n else if (matrix.length === 16) curTransform = parseFloat(matrix[12]);\n // Normal Browsers\n else curTransform = parseFloat(matrix[4]);\n }\n if (axis === 'y') {\n // Latest Chrome and webkits Fix\n if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42;\n // Crazy IE10 Matrix\n else if (matrix.length === 16) curTransform = parseFloat(matrix[13]);\n // Normal Browsers\n else curTransform = parseFloat(matrix[5]);\n }\n return curTransform || 0;\n}\nfunction isObject(o) {\n return (\n typeof o === 'object' &&\n o !== null &&\n o.constructor &&\n Object.prototype.toString.call(o).slice(8, -1) === 'Object'\n );\n}\nfunction isNode(node) {\n // eslint-disable-next-line\n if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') {\n return node instanceof HTMLElement;\n }\n return node && (node.nodeType === 1 || node.nodeType === 11);\n}\nfunction extend(...args) {\n const to = Object(args[0]);\n const noExtend = ['__proto__', 'constructor', 'prototype'];\n for (let i = 1; i < args.length; i += 1) {\n const nextSource = args[i];\n if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) {\n const keysArray = Object.keys(Object(nextSource)).filter((key) => noExtend.indexOf(key) < 0);\n for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {\n const nextKey = keysArray[nextIndex];\n const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);\n if (desc !== undefined && desc.enumerable) {\n if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n if (nextSource[nextKey].__swiper__) {\n to[nextKey] = nextSource[nextKey];\n } else {\n extend(to[nextKey], nextSource[nextKey]);\n }\n } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n to[nextKey] = {};\n if (nextSource[nextKey].__swiper__) {\n to[nextKey] = nextSource[nextKey];\n } else {\n extend(to[nextKey], nextSource[nextKey]);\n }\n } else {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n }\n return to;\n}\n\nfunction setCSSProperty(el, varName, varValue) {\n el.style.setProperty(varName, varValue);\n}\n\nfunction animateCSSModeScroll({ swiper, targetPosition, side }) {\n const window = getWindow();\n const startPosition = -swiper.translate;\n let startTime = null;\n let time;\n const duration = swiper.params.speed;\n\n swiper.wrapperEl.style.scrollSnapType = 'none';\n window.cancelAnimationFrame(swiper.cssModeFrameID);\n\n const dir = targetPosition > startPosition ? 'next' : 'prev';\n\n const isOutOfBound = (current, target) => {\n return (dir === 'next' && current >= target) || (dir === 'prev' && current <= target);\n };\n\n const animate = () => {\n time = new Date().getTime();\n if (startTime === null) {\n startTime = time;\n }\n\n const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;\n let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);\n\n if (isOutOfBound(currentPosition, targetPosition)) {\n currentPosition = targetPosition;\n }\n swiper.wrapperEl.scrollTo({\n [side]: currentPosition,\n });\n if (isOutOfBound(currentPosition, targetPosition)) {\n swiper.wrapperEl.style.overflow = 'hidden';\n swiper.wrapperEl.style.scrollSnapType = '';\n setTimeout(() => {\n swiper.wrapperEl.style.overflow = '';\n swiper.wrapperEl.scrollTo({\n [side]: currentPosition,\n });\n });\n window.cancelAnimationFrame(swiper.cssModeFrameID);\n return;\n }\n swiper.cssModeFrameID = window.requestAnimationFrame(animate);\n };\n animate();\n}\n\nexport {\n animateCSSModeScroll,\n deleteProps,\n nextTick,\n now,\n getTranslate,\n isObject,\n extend,\n getComputedStyle,\n setCSSProperty,\n};\n","export default function transitionEmit({ swiper, runCallbacks, direction, step }) {\n const { activeIndex, previousIndex } = swiper;\n let dir = direction;\n if (!dir) {\n if (activeIndex > previousIndex) dir = 'next';\n else if (activeIndex < previousIndex) dir = 'prev';\n else dir = 'reset';\n }\n\n swiper.emit(`transition${step}`);\n\n if (runCallbacks && activeIndex !== previousIndex) {\n if (dir === 'reset') {\n swiper.emit(`slideResetTransition${step}`);\n return;\n }\n swiper.emit(`slideChangeTransition${step}`);\n if (dir === 'next') {\n swiper.emit(`slideNextTransition${step}`);\n } else {\n swiper.emit(`slidePrevTransition${step}`);\n }\n }\n}\n","import { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now } from '../../shared/utils.js';\n\n// Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd\nfunction closestElement(selector, base = this) {\n function __closestFrom(el) {\n if (!el || el === getDocument() || el === getWindow()) return null;\n if (el.assignedSlot) el = el.assignedSlot;\n const found = el.closest(selector);\n return found || __closestFrom(el.getRootNode().host);\n }\n return __closestFrom(base);\n}\n\nexport default function onTouchStart(event) {\n const swiper = this;\n const document = getDocument();\n const window = getWindow();\n\n const data = swiper.touchEventsData;\n const { params, touches, enabled } = swiper;\n if (!enabled) return;\n\n if (swiper.animating && params.preventInteractionOnTransition) {\n return;\n }\n if (!swiper.animating && params.cssMode && params.loop) {\n swiper.loopFix();\n }\n let e = event;\n if (e.originalEvent) e = e.originalEvent;\n let $targetEl = $(e.target);\n\n if (params.touchEventsTarget === 'wrapper') {\n if (!$targetEl.closest(swiper.wrapperEl).length) return;\n }\n data.isTouchEvent = e.type === 'touchstart';\n if (!data.isTouchEvent && 'which' in e && e.which === 3) return;\n if (!data.isTouchEvent && 'button' in e && e.button > 0) return;\n if (data.isTouched && data.isMoved) return;\n\n // change target el for shadow root component\n const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';\n if (swipingClassHasValue && e.target && e.target.shadowRoot && event.path && event.path[0]) {\n $targetEl = $(event.path[0]);\n }\n\n const noSwipingSelector = params.noSwipingSelector\n ? params.noSwipingSelector\n : `.${params.noSwipingClass}`;\n const isTargetShadow = !!(e.target && e.target.shadowRoot);\n\n // use closestElement for shadow root element to get the actual closest for nested shadow root element\n if (\n params.noSwiping &&\n (isTargetShadow\n ? closestElement(noSwipingSelector, e.target)\n : $targetEl.closest(noSwipingSelector)[0])\n ) {\n swiper.allowClick = true;\n return;\n }\n\n if (params.swipeHandler) {\n if (!$targetEl.closest(params.swipeHandler)[0]) return;\n }\n\n touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n const startX = touches.currentX;\n const startY = touches.currentY;\n\n // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore\n\n const edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;\n const edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;\n if (\n edgeSwipeDetection &&\n (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)\n ) {\n if (edgeSwipeDetection === 'prevent') {\n event.preventDefault();\n } else {\n return;\n }\n }\n\n Object.assign(data, {\n isTouched: true,\n isMoved: false,\n allowTouchCallbacks: true,\n isScrolling: undefined,\n startMoving: undefined,\n });\n\n touches.startX = startX;\n touches.startY = startY;\n data.touchStartTime = now();\n swiper.allowClick = true;\n swiper.updateSize();\n swiper.swipeDirection = undefined;\n if (params.threshold > 0) data.allowThresholdMove = false;\n if (e.type !== 'touchstart') {\n let preventDefault = true;\n if ($targetEl.is(data.focusableElements)) preventDefault = false;\n if (\n document.activeElement &&\n $(document.activeElement).is(data.focusableElements) &&\n document.activeElement !== $targetEl[0]\n ) {\n document.activeElement.blur();\n }\n\n const shouldPreventDefault =\n preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;\n if (\n (params.touchStartForcePreventDefault || shouldPreventDefault) &&\n !$targetEl[0].isContentEditable\n ) {\n e.preventDefault();\n }\n }\n swiper.emit('touchStart', e);\n}\n","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now } from '../../shared/utils.js';\n\nexport default function onTouchMove(event) {\n const document = getDocument();\n const swiper = this;\n const data = swiper.touchEventsData;\n const { params, touches, rtlTranslate: rtl, enabled } = swiper;\n if (!enabled) return;\n let e = event;\n if (e.originalEvent) e = e.originalEvent;\n if (!data.isTouched) {\n if (data.startMoving && data.isScrolling) {\n swiper.emit('touchMoveOpposite', e);\n }\n return;\n }\n if (data.isTouchEvent && e.type !== 'touchmove') return;\n const targetTouch =\n e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]);\n const pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX;\n const pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY;\n if (e.preventedByNestedSwiper) {\n touches.startX = pageX;\n touches.startY = pageY;\n return;\n }\n if (!swiper.allowTouchMove) {\n // isMoved = true;\n swiper.allowClick = false;\n if (data.isTouched) {\n Object.assign(touches, {\n startX: pageX,\n startY: pageY,\n currentX: pageX,\n currentY: pageY,\n });\n data.touchStartTime = now();\n }\n return;\n }\n if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {\n if (swiper.isVertical()) {\n // Vertical\n if (\n (pageY < touches.startY && swiper.translate <= swiper.maxTranslate()) ||\n (pageY > touches.startY && swiper.translate >= swiper.minTranslate())\n ) {\n data.isTouched = false;\n data.isMoved = false;\n return;\n }\n } else if (\n (pageX < touches.startX && swiper.translate <= swiper.maxTranslate()) ||\n (pageX > touches.startX && swiper.translate >= swiper.minTranslate())\n ) {\n return;\n }\n }\n if (data.isTouchEvent && document.activeElement) {\n if (e.target === document.activeElement && $(e.target).is(data.focusableElements)) {\n data.isMoved = true;\n swiper.allowClick = false;\n return;\n }\n }\n if (data.allowTouchCallbacks) {\n swiper.emit('touchMove', e);\n }\n if (e.targetTouches && e.targetTouches.length > 1) return;\n\n touches.currentX = pageX;\n touches.currentY = pageY;\n\n const diffX = touches.currentX - touches.startX;\n const diffY = touches.currentY - touches.startY;\n if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold)\n return;\n\n if (typeof data.isScrolling === 'undefined') {\n let touchAngle;\n if (\n (swiper.isHorizontal() && touches.currentY === touches.startY) ||\n (swiper.isVertical() && touches.currentX === touches.startX)\n ) {\n data.isScrolling = false;\n } else {\n // eslint-disable-next-line\n if (diffX * diffX + diffY * diffY >= 25) {\n touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI;\n data.isScrolling = swiper.isHorizontal()\n ? touchAngle > params.touchAngle\n : 90 - touchAngle > params.touchAngle;\n }\n }\n }\n if (data.isScrolling) {\n swiper.emit('touchMoveOpposite', e);\n }\n if (typeof data.startMoving === 'undefined') {\n if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {\n data.startMoving = true;\n }\n }\n if (data.isScrolling) {\n data.isTouched = false;\n return;\n }\n if (!data.startMoving) {\n return;\n }\n swiper.allowClick = false;\n if (!params.cssMode && e.cancelable) {\n e.preventDefault();\n }\n if (params.touchMoveStopPropagation && !params.nested) {\n e.stopPropagation();\n }\n\n if (!data.isMoved) {\n if (params.loop && !params.cssMode) {\n swiper.loopFix();\n }\n data.startTranslate = swiper.getTranslate();\n swiper.setTransition(0);\n if (swiper.animating) {\n swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');\n }\n data.allowMomentumBounce = false;\n // Grab Cursor\n if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n swiper.setGrabCursor(true);\n }\n swiper.emit('sliderFirstMove', e);\n }\n swiper.emit('sliderMove', e);\n data.isMoved = true;\n\n let diff = swiper.isHorizontal() ? diffX : diffY;\n touches.diff = diff;\n\n diff *= params.touchRatio;\n if (rtl) diff = -diff;\n\n swiper.swipeDirection = diff > 0 ? 'prev' : 'next';\n data.currentTranslate = diff + data.startTranslate;\n\n let disableParentSwiper = true;\n let resistanceRatio = params.resistanceRatio;\n if (params.touchReleaseOnEdges) {\n resistanceRatio = 0;\n }\n if (diff > 0 && data.currentTranslate > swiper.minTranslate()) {\n disableParentSwiper = false;\n if (params.resistance)\n data.currentTranslate =\n swiper.minTranslate() -\n 1 +\n (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;\n } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {\n disableParentSwiper = false;\n if (params.resistance)\n data.currentTranslate =\n swiper.maxTranslate() +\n 1 -\n (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;\n }\n\n if (disableParentSwiper) {\n e.preventedByNestedSwiper = true;\n }\n\n // Directions locks\n if (\n !swiper.allowSlideNext &&\n swiper.swipeDirection === 'next' &&\n data.currentTranslate < data.startTranslate\n ) {\n data.currentTranslate = data.startTranslate;\n }\n if (\n !swiper.allowSlidePrev &&\n swiper.swipeDirection === 'prev' &&\n data.currentTranslate > data.startTranslate\n ) {\n data.currentTranslate = data.startTranslate;\n }\n if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {\n data.currentTranslate = data.startTranslate;\n }\n\n // Threshold\n if (params.threshold > 0) {\n if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {\n if (!data.allowThresholdMove) {\n data.allowThresholdMove = true;\n touches.startX = touches.currentX;\n touches.startY = touches.currentY;\n data.currentTranslate = data.startTranslate;\n touches.diff = swiper.isHorizontal()\n ? touches.currentX - touches.startX\n : touches.currentY - touches.startY;\n return;\n }\n } else {\n data.currentTranslate = data.startTranslate;\n return;\n }\n }\n\n if (!params.followFinger || params.cssMode) return;\n\n // Update active index in free mode\n if (\n (params.freeMode && params.freeMode.enabled && swiper.freeMode) ||\n params.watchSlidesProgress\n ) {\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n if (swiper.params.freeMode && params.freeMode.enabled && swiper.freeMode) {\n swiper.freeMode.onTouchMove();\n }\n // Update progress\n swiper.updateProgress(data.currentTranslate);\n // Update translate\n swiper.setTranslate(data.currentTranslate);\n}\n","import { now, nextTick } from '../../shared/utils.js';\n\nexport default function onTouchEnd(event) {\n const swiper = this;\n const data = swiper.touchEventsData;\n\n const { params, touches, rtlTranslate: rtl, slidesGrid, enabled } = swiper;\n if (!enabled) return;\n let e = event;\n if (e.originalEvent) e = e.originalEvent;\n if (data.allowTouchCallbacks) {\n swiper.emit('touchEnd', e);\n }\n data.allowTouchCallbacks = false;\n if (!data.isTouched) {\n if (data.isMoved && params.grabCursor) {\n swiper.setGrabCursor(false);\n }\n data.isMoved = false;\n data.startMoving = false;\n return;\n }\n // Return Grab Cursor\n if (\n params.grabCursor &&\n data.isMoved &&\n data.isTouched &&\n (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)\n ) {\n swiper.setGrabCursor(false);\n }\n\n // Time diff\n const touchEndTime = now();\n const timeDiff = touchEndTime - data.touchStartTime;\n\n // Tap, doubleTap, Click\n if (swiper.allowClick) {\n swiper.updateClickedSlide(e);\n swiper.emit('tap click', e);\n if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {\n swiper.emit('doubleTap doubleClick', e);\n }\n }\n\n data.lastClickTime = now();\n nextTick(() => {\n if (!swiper.destroyed) swiper.allowClick = true;\n });\n\n if (\n !data.isTouched ||\n !data.isMoved ||\n !swiper.swipeDirection ||\n touches.diff === 0 ||\n data.currentTranslate === data.startTranslate\n ) {\n data.isTouched = false;\n data.isMoved = false;\n data.startMoving = false;\n return;\n }\n data.isTouched = false;\n data.isMoved = false;\n data.startMoving = false;\n\n let currentPos;\n if (params.followFinger) {\n currentPos = rtl ? swiper.translate : -swiper.translate;\n } else {\n currentPos = -data.currentTranslate;\n }\n\n if (params.cssMode) {\n return;\n }\n\n if (swiper.params.freeMode && params.freeMode.enabled) {\n swiper.freeMode.onTouchEnd({ currentPos });\n return;\n }\n\n // Find current slide\n let stopIndex = 0;\n let groupSize = swiper.slidesSizesGrid[0];\n for (\n let i = 0;\n i < slidesGrid.length;\n i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup\n ) {\n const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n if (typeof slidesGrid[i + increment] !== 'undefined') {\n if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) {\n stopIndex = i;\n groupSize = slidesGrid[i + increment] - slidesGrid[i];\n }\n } else if (currentPos >= slidesGrid[i]) {\n stopIndex = i;\n groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];\n }\n }\n\n // Find current slide size\n const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;\n const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n\n if (timeDiff > params.longSwipesMs) {\n // Long touches\n if (!params.longSwipes) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (swiper.swipeDirection === 'next') {\n if (ratio >= params.longSwipesRatio) swiper.slideTo(stopIndex + increment);\n else swiper.slideTo(stopIndex);\n }\n if (swiper.swipeDirection === 'prev') {\n if (ratio > 1 - params.longSwipesRatio) swiper.slideTo(stopIndex + increment);\n else swiper.slideTo(stopIndex);\n }\n } else {\n // Short swipes\n if (!params.shortSwipes) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n const isNavButtonTarget =\n swiper.navigation &&\n (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);\n if (!isNavButtonTarget) {\n if (swiper.swipeDirection === 'next') {\n swiper.slideTo(stopIndex + increment);\n }\n if (swiper.swipeDirection === 'prev') {\n swiper.slideTo(stopIndex);\n }\n } else if (e.target === swiper.navigation.nextEl) {\n swiper.slideTo(stopIndex + increment);\n } else {\n swiper.slideTo(stopIndex);\n }\n }\n}\n","export default function onResize() {\n const swiper = this;\n\n const { params, el } = swiper;\n\n if (el && el.offsetWidth === 0) return;\n\n // Breakpoints\n if (params.breakpoints) {\n swiper.setBreakpoint();\n }\n\n // Save locks\n const { allowSlideNext, allowSlidePrev, snapGrid } = swiper;\n\n // Disable locks on resize\n swiper.allowSlideNext = true;\n swiper.allowSlidePrev = true;\n\n swiper.updateSize();\n swiper.updateSlides();\n\n swiper.updateSlidesClasses();\n if (\n (params.slidesPerView === 'auto' || params.slidesPerView > 1) &&\n swiper.isEnd &&\n !swiper.isBeginning &&\n !swiper.params.centeredSlides\n ) {\n swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n } else {\n swiper.slideTo(swiper.activeIndex, 0, false, true);\n }\n\n if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {\n swiper.autoplay.run();\n }\n // Return locks after resize\n swiper.allowSlidePrev = allowSlidePrev;\n swiper.allowSlideNext = allowSlideNext;\n\n if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {\n swiper.checkOverflow();\n }\n}\n","export default function onClick(e) {\n const swiper = this;\n if (!swiper.enabled) return;\n if (!swiper.allowClick) {\n if (swiper.params.preventClicks) e.preventDefault();\n if (swiper.params.preventClicksPropagation && swiper.animating) {\n e.stopPropagation();\n e.stopImmediatePropagation();\n }\n }\n}\n","export default function onScroll() {\n const swiper = this;\n const { wrapperEl, rtlTranslate, enabled } = swiper;\n if (!enabled) return;\n swiper.previousTranslate = swiper.translate;\n if (swiper.isHorizontal()) {\n swiper.translate = -wrapperEl.scrollLeft;\n } else {\n swiper.translate = -wrapperEl.scrollTop;\n }\n // eslint-disable-next-line\n if (swiper.translate === -0) swiper.translate = 0;\n\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n\n let newProgress;\n const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n if (translatesDiff === 0) {\n newProgress = 0;\n } else {\n newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;\n }\n if (newProgress !== swiper.progress) {\n swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);\n }\n\n swiper.emit('setTranslate', swiper.translate, false);\n}\n","import { getDocument } from 'ssr-window';\n\nimport onTouchStart from './onTouchStart.js';\nimport onTouchMove from './onTouchMove.js';\nimport onTouchEnd from './onTouchEnd.js';\nimport onResize from './onResize.js';\nimport onClick from './onClick.js';\nimport onScroll from './onScroll.js';\n\nlet dummyEventAttached = false;\nfunction dummyEventListener() {}\n\nconst events = (swiper, method) => {\n const document = getDocument();\n const { params, touchEvents, el, wrapperEl, device, support } = swiper;\n const capture = !!params.nested;\n const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n const swiperMethod = method;\n\n // Touch Events\n if (!support.touch) {\n el[domMethod](touchEvents.start, swiper.onTouchStart, false);\n document[domMethod](touchEvents.move, swiper.onTouchMove, capture);\n document[domMethod](touchEvents.end, swiper.onTouchEnd, false);\n } else {\n const passiveListener =\n touchEvents.start === 'touchstart' && support.passiveListener && params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n el[domMethod](touchEvents.start, swiper.onTouchStart, passiveListener);\n el[domMethod](\n touchEvents.move,\n swiper.onTouchMove,\n support.passiveListener ? { passive: false, capture } : capture,\n );\n el[domMethod](touchEvents.end, swiper.onTouchEnd, passiveListener);\n if (touchEvents.cancel) {\n el[domMethod](touchEvents.cancel, swiper.onTouchEnd, passiveListener);\n }\n }\n // Prevent Links Clicks\n if (params.preventClicks || params.preventClicksPropagation) {\n el[domMethod]('click', swiper.onClick, true);\n }\n if (params.cssMode) {\n wrapperEl[domMethod]('scroll', swiper.onScroll);\n }\n\n // Resize handler\n if (params.updateOnWindowResize) {\n swiper[swiperMethod](\n device.ios || device.android\n ? 'resize orientationchange observerUpdate'\n : 'resize observerUpdate',\n onResize,\n true,\n );\n } else {\n swiper[swiperMethod]('observerUpdate', onResize, true);\n }\n};\n\nfunction attachEvents() {\n const swiper = this;\n const document = getDocument();\n const { params, support } = swiper;\n\n swiper.onTouchStart = onTouchStart.bind(swiper);\n swiper.onTouchMove = onTouchMove.bind(swiper);\n swiper.onTouchEnd = onTouchEnd.bind(swiper);\n\n if (params.cssMode) {\n swiper.onScroll = onScroll.bind(swiper);\n }\n\n swiper.onClick = onClick.bind(swiper);\n\n if (support.touch && !dummyEventAttached) {\n document.addEventListener('touchstart', dummyEventListener);\n dummyEventAttached = true;\n }\n\n events(swiper, 'on');\n}\n\nfunction detachEvents() {\n const swiper = this;\n events(swiper, 'off');\n}\n\nexport default {\n attachEvents,\n detachEvents,\n};\n","import { extend } from '../../shared/utils.js';\n\nconst isGridEnabled = (swiper, params) => {\n return swiper.grid && params.grid && params.grid.rows > 1;\n};\n\nexport default function setBreakpoint() {\n const swiper = this;\n const { activeIndex, initialized, loopedSlides = 0, params, $el } = swiper;\n const breakpoints = params.breakpoints;\n if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) return;\n\n // Get breakpoint for window width and update parameters\n const breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el);\n\n if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;\n\n const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;\n const breakpointParams = breakpointOnlyParams || swiper.originalParams;\n const wasMultiRow = isGridEnabled(swiper, params);\n const isMultiRow = isGridEnabled(swiper, breakpointParams);\n\n const wasEnabled = params.enabled;\n\n if (wasMultiRow && !isMultiRow) {\n $el.removeClass(\n `${params.containerModifierClass}grid ${params.containerModifierClass}grid-column`,\n );\n swiper.emitContainerClasses();\n } else if (!wasMultiRow && isMultiRow) {\n $el.addClass(`${params.containerModifierClass}grid`);\n if (\n (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column') ||\n (!breakpointParams.grid.fill && params.grid.fill === 'column')\n ) {\n $el.addClass(`${params.containerModifierClass}grid-column`);\n }\n swiper.emitContainerClasses();\n }\n\n const directionChanged =\n breakpointParams.direction && breakpointParams.direction !== params.direction;\n const needsReLoop =\n params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);\n\n if (directionChanged && initialized) {\n swiper.changeDirection();\n }\n extend(swiper.params, breakpointParams);\n\n const isEnabled = swiper.params.enabled;\n\n Object.assign(swiper, {\n allowTouchMove: swiper.params.allowTouchMove,\n allowSlideNext: swiper.params.allowSlideNext,\n allowSlidePrev: swiper.params.allowSlidePrev,\n });\n\n if (wasEnabled && !isEnabled) {\n swiper.disable();\n } else if (!wasEnabled && isEnabled) {\n swiper.enable();\n }\n\n swiper.currentBreakpoint = breakpoint;\n\n swiper.emit('_beforeBreakpoint', breakpointParams);\n\n if (needsReLoop && initialized) {\n swiper.loopDestroy();\n swiper.loopCreate();\n swiper.updateSlides();\n swiper.slideTo(activeIndex - loopedSlides + swiper.loopedSlides, 0, false);\n }\n\n swiper.emit('breakpoint', breakpointParams);\n}\n","export default {\n init: true,\n direction: 'horizontal',\n touchEventsTarget: 'wrapper',\n initialSlide: 0,\n speed: 300,\n cssMode: false,\n updateOnWindowResize: true,\n resizeObserver: true,\n nested: false,\n createElements: false,\n enabled: true,\n focusableElements: 'input, select, option, textarea, button, video, label',\n\n // Overrides\n width: null,\n height: null,\n\n //\n preventInteractionOnTransition: false,\n\n // ssr\n userAgent: null,\n url: null,\n\n // To support iOS's swipe-to-go-back gesture (when being used in-app).\n edgeSwipeDetection: false,\n edgeSwipeThreshold: 20,\n\n // Autoheight\n autoHeight: false,\n\n // Set wrapper width\n setWrapperSize: false,\n\n // Virtual Translate\n virtualTranslate: false,\n\n // Effects\n effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'\n\n // Breakpoints\n breakpoints: undefined,\n breakpointsBase: 'window',\n\n // Slides grid\n spaceBetween: 0,\n slidesPerView: 1,\n slidesPerGroup: 1,\n slidesPerGroupSkip: 0,\n slidesPerGroupAuto: false,\n centeredSlides: false,\n centeredSlidesBounds: false,\n slidesOffsetBefore: 0, // in px\n slidesOffsetAfter: 0, // in px\n normalizeSlideIndex: true,\n centerInsufficientSlides: false,\n\n // Disable swiper and hide navigation when container not overflow\n watchOverflow: true,\n\n // Round length\n roundLengths: false,\n\n // Touches\n touchRatio: 1,\n touchAngle: 45,\n simulateTouch: true,\n shortSwipes: true,\n longSwipes: true,\n longSwipesRatio: 0.5,\n longSwipesMs: 300,\n followFinger: true,\n allowTouchMove: true,\n threshold: 0,\n touchMoveStopPropagation: false,\n touchStartPreventDefault: true,\n touchStartForcePreventDefault: false,\n touchReleaseOnEdges: false,\n\n // Unique Navigation Elements\n uniqueNavElements: true,\n\n // Resistance\n resistance: true,\n resistanceRatio: 0.85,\n\n // Progress\n watchSlidesProgress: false,\n\n // Cursor\n grabCursor: false,\n\n // Clicks\n preventClicks: true,\n preventClicksPropagation: true,\n slideToClickedSlide: false,\n\n // Images\n preloadImages: true,\n updateOnImagesReady: true,\n\n // loop\n loop: false,\n loopAdditionalSlides: 0,\n loopedSlides: null,\n loopFillGroupWithBlank: false,\n loopPreventsSlide: true,\n\n // Swiping/no swiping\n allowSlidePrev: true,\n allowSlideNext: true,\n swipeHandler: null, // '.swipe-handler',\n noSwiping: true,\n noSwipingClass: 'swiper-no-swiping',\n noSwipingSelector: null,\n\n // Passive Listeners\n passiveListeners: true,\n\n // NS\n containerModifierClass: 'swiper-', // NEW\n slideClass: 'swiper-slide',\n slideBlankClass: 'swiper-slide-invisible-blank',\n slideActiveClass: 'swiper-slide-active',\n slideDuplicateActiveClass: 'swiper-slide-duplicate-active',\n slideVisibleClass: 'swiper-slide-visible',\n slideDuplicateClass: 'swiper-slide-duplicate',\n slideNextClass: 'swiper-slide-next',\n slideDuplicateNextClass: 'swiper-slide-duplicate-next',\n slidePrevClass: 'swiper-slide-prev',\n slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',\n wrapperClass: 'swiper-wrapper',\n\n // Callbacks\n runCallbacksOnInit: true,\n\n // Internals\n _emitClasses: false,\n};\n","import { extend } from '../shared/utils.js';\n\nexport default function moduleExtendParams(params, allModulesParams) {\n return function extendParams(obj = {}) {\n const moduleParamName = Object.keys(obj)[0];\n const moduleParams = obj[moduleParamName];\n if (typeof moduleParams !== 'object' || moduleParams === null) {\n extend(allModulesParams, obj);\n return;\n }\n if (\n ['navigation', 'pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 &&\n params[moduleParamName] === true\n ) {\n params[moduleParamName] = { auto: true };\n }\n if (!(moduleParamName in params && 'enabled' in moduleParams)) {\n extend(allModulesParams, obj);\n return;\n }\n if (params[moduleParamName] === true) {\n params[moduleParamName] = { enabled: true };\n }\n if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {\n params[moduleParamName].enabled = true;\n }\n if (!params[moduleParamName]) params[moduleParamName] = { enabled: false };\n extend(allModulesParams, obj);\n };\n}\n","/* eslint no-param-reassign: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport $ from '../shared/dom.js';\nimport { extend, now, deleteProps } from '../shared/utils.js';\nimport { getSupport } from '../shared/get-support.js';\nimport { getDevice } from '../shared/get-device.js';\nimport { getBrowser } from '../shared/get-browser.js';\n\nimport Resize from './modules/resize/resize.js';\nimport Observer from './modules/observer/observer.js';\n\nimport eventsEmitter from './events-emitter.js';\n\nimport update from './update/index.js';\nimport translate from './translate/index.js';\nimport transition from './transition/index.js';\nimport slide from './slide/index.js';\nimport loop from './loop/index.js';\nimport grabCursor from './grab-cursor/index.js';\nimport events from './events/index.js';\nimport breakpoints from './breakpoints/index.js';\nimport classes from './classes/index.js';\nimport images from './images/index.js';\nimport checkOverflow from './check-overflow/index.js';\n\nimport defaults from './defaults.js';\nimport moduleExtendParams from './moduleExtendParams.js';\n\nconst prototypes = {\n eventsEmitter,\n update,\n translate,\n transition,\n slide,\n loop,\n grabCursor,\n events,\n breakpoints,\n checkOverflow,\n classes,\n images,\n};\n\nconst extendedDefaults = {};\n\nclass Swiper {\n constructor(...args) {\n let el;\n let params;\n if (\n args.length === 1 &&\n args[0].constructor &&\n Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object'\n ) {\n params = args[0];\n } else {\n [el, params] = args;\n }\n if (!params) params = {};\n\n params = extend({}, params);\n if (el && !params.el) params.el = el;\n\n if (params.el && $(params.el).length > 1) {\n const swipers = [];\n $(params.el).each((containerEl) => {\n const newParams = extend({}, params, { el: containerEl });\n swipers.push(new Swiper(newParams));\n });\n return swipers;\n }\n\n // Swiper Instance\n const swiper = this;\n swiper.__swiper__ = true;\n swiper.support = getSupport();\n swiper.device = getDevice({ userAgent: params.userAgent });\n swiper.browser = getBrowser();\n\n swiper.eventsListeners = {};\n swiper.eventsAnyListeners = [];\n swiper.modules = [...swiper.__modules__];\n if (params.modules && Array.isArray(params.modules)) {\n swiper.modules.push(...params.modules);\n }\n\n const allModulesParams = {};\n\n swiper.modules.forEach((mod) => {\n mod({\n swiper,\n extendParams: moduleExtendParams(params, allModulesParams),\n on: swiper.on.bind(swiper),\n once: swiper.once.bind(swiper),\n off: swiper.off.bind(swiper),\n emit: swiper.emit.bind(swiper),\n });\n });\n\n // Extend defaults with modules params\n const swiperParams = extend({}, defaults, allModulesParams);\n\n // Extend defaults with passed params\n swiper.params = extend({}, swiperParams, extendedDefaults, params);\n swiper.originalParams = extend({}, swiper.params);\n swiper.passedParams = extend({}, params);\n\n // add event listeners\n if (swiper.params && swiper.params.on) {\n Object.keys(swiper.params.on).forEach((eventName) => {\n swiper.on(eventName, swiper.params.on[eventName]);\n });\n }\n if (swiper.params && swiper.params.onAny) {\n swiper.onAny(swiper.params.onAny);\n }\n\n // Save Dom lib\n swiper.$ = $;\n\n // Extend Swiper\n Object.assign(swiper, {\n enabled: swiper.params.enabled,\n el,\n\n // Classes\n classNames: [],\n\n // Slides\n slides: $(),\n slidesGrid: [],\n snapGrid: [],\n slidesSizesGrid: [],\n\n // isDirection\n isHorizontal() {\n return swiper.params.direction === 'horizontal';\n },\n isVertical() {\n return swiper.params.direction === 'vertical';\n },\n\n // Indexes\n activeIndex: 0,\n realIndex: 0,\n\n //\n isBeginning: true,\n isEnd: false,\n\n // Props\n translate: 0,\n previousTranslate: 0,\n progress: 0,\n velocity: 0,\n animating: false,\n\n // Locks\n allowSlideNext: swiper.params.allowSlideNext,\n allowSlidePrev: swiper.params.allowSlidePrev,\n\n // Touch Events\n touchEvents: (function touchEvents() {\n const touch = ['touchstart', 'touchmove', 'touchend', 'touchcancel'];\n const desktop = ['pointerdown', 'pointermove', 'pointerup'];\n\n swiper.touchEventsTouch = {\n start: touch[0],\n move: touch[1],\n end: touch[2],\n cancel: touch[3],\n };\n swiper.touchEventsDesktop = {\n start: desktop[0],\n move: desktop[1],\n end: desktop[2],\n };\n return swiper.support.touch || !swiper.params.simulateTouch\n ? swiper.touchEventsTouch\n : swiper.touchEventsDesktop;\n })(),\n touchEventsData: {\n isTouched: undefined,\n isMoved: undefined,\n allowTouchCallbacks: undefined,\n touchStartTime: undefined,\n isScrolling: undefined,\n currentTranslate: undefined,\n startTranslate: undefined,\n allowThresholdMove: undefined,\n // Form elements to match\n focusableElements: swiper.params.focusableElements,\n // Last click time\n lastClickTime: now(),\n clickTimeout: undefined,\n // Velocities\n velocities: [],\n allowMomentumBounce: undefined,\n isTouchEvent: undefined,\n startMoving: undefined,\n },\n\n // Clicks\n allowClick: true,\n\n // Touches\n allowTouchMove: swiper.params.allowTouchMove,\n\n touches: {\n startX: 0,\n startY: 0,\n currentX: 0,\n currentY: 0,\n diff: 0,\n },\n\n // Images\n imagesToLoad: [],\n imagesLoaded: 0,\n });\n\n swiper.emit('_swiper');\n\n // Init\n if (swiper.params.init) {\n swiper.init();\n }\n\n // Return app instance\n return swiper;\n }\n\n enable() {\n const swiper = this;\n if (swiper.enabled) return;\n swiper.enabled = true;\n if (swiper.params.grabCursor) {\n swiper.setGrabCursor();\n }\n swiper.emit('enable');\n }\n\n disable() {\n const swiper = this;\n if (!swiper.enabled) return;\n swiper.enabled = false;\n if (swiper.params.grabCursor) {\n swiper.unsetGrabCursor();\n }\n swiper.emit('disable');\n }\n\n setProgress(progress, speed) {\n const swiper = this;\n progress = Math.min(Math.max(progress, 0), 1);\n const min = swiper.minTranslate();\n const max = swiper.maxTranslate();\n const current = (max - min) * progress + min;\n swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n\n emitContainerClasses() {\n const swiper = this;\n if (!swiper.params._emitClasses || !swiper.el) return;\n const cls = swiper.el.className.split(' ').filter((className) => {\n return (\n className.indexOf('swiper') === 0 ||\n className.indexOf(swiper.params.containerModifierClass) === 0\n );\n });\n swiper.emit('_containerClasses', cls.join(' '));\n }\n\n getSlideClasses(slideEl) {\n const swiper = this;\n\n return slideEl.className\n .split(' ')\n .filter((className) => {\n return (\n className.indexOf('swiper-slide') === 0 ||\n className.indexOf(swiper.params.slideClass) === 0\n );\n })\n .join(' ');\n }\n\n emitSlidesClasses() {\n const swiper = this;\n if (!swiper.params._emitClasses || !swiper.el) return;\n const updates = [];\n swiper.slides.each((slideEl) => {\n const classNames = swiper.getSlideClasses(slideEl);\n updates.push({ slideEl, classNames });\n swiper.emit('_slideClass', slideEl, classNames);\n });\n swiper.emit('_slideClasses', updates);\n }\n\n slidesPerViewDynamic(view = 'current', exact = false) {\n const swiper = this;\n const { params, slides, slidesGrid, slidesSizesGrid, size: swiperSize, activeIndex } = swiper;\n let spv = 1;\n if (params.centeredSlides) {\n let slideSize = slides[activeIndex].swiperSlideSize;\n let breakLoop;\n for (let i = activeIndex + 1; i < slides.length; i += 1) {\n if (slides[i] && !breakLoop) {\n slideSize += slides[i].swiperSlideSize;\n spv += 1;\n if (slideSize > swiperSize) breakLoop = true;\n }\n }\n for (let i = activeIndex - 1; i >= 0; i -= 1) {\n if (slides[i] && !breakLoop) {\n slideSize += slides[i].swiperSlideSize;\n spv += 1;\n if (slideSize > swiperSize) breakLoop = true;\n }\n }\n } else {\n // eslint-disable-next-line\n if (view === 'current') {\n for (let i = activeIndex + 1; i < slides.length; i += 1) {\n const slideInView = exact\n ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize\n : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;\n if (slideInView) {\n spv += 1;\n }\n }\n } else {\n // previous\n for (let i = activeIndex - 1; i >= 0; i -= 1) {\n const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;\n if (slideInView) {\n spv += 1;\n }\n }\n }\n }\n return spv;\n }\n\n update() {\n const swiper = this;\n if (!swiper || swiper.destroyed) return;\n const { snapGrid, params } = swiper;\n // Breakpoints\n if (params.breakpoints) {\n swiper.setBreakpoint();\n }\n swiper.updateSize();\n swiper.updateSlides();\n swiper.updateProgress();\n swiper.updateSlidesClasses();\n\n function setTranslate() {\n const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;\n const newTranslate = Math.min(\n Math.max(translateValue, swiper.maxTranslate()),\n swiper.minTranslate(),\n );\n swiper.setTranslate(newTranslate);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n let translated;\n if (swiper.params.freeMode && swiper.params.freeMode.enabled) {\n setTranslate();\n if (swiper.params.autoHeight) {\n swiper.updateAutoHeight();\n }\n } else {\n if (\n (swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) &&\n swiper.isEnd &&\n !swiper.params.centeredSlides\n ) {\n translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n } else {\n translated = swiper.slideTo(swiper.activeIndex, 0, false, true);\n }\n if (!translated) {\n setTranslate();\n }\n }\n if (params.watchOverflow && snapGrid !== swiper.snapGrid) {\n swiper.checkOverflow();\n }\n swiper.emit('update');\n }\n\n changeDirection(newDirection, needUpdate = true) {\n const swiper = this;\n const currentDirection = swiper.params.direction;\n if (!newDirection) {\n // eslint-disable-next-line\n newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';\n }\n if (\n newDirection === currentDirection ||\n (newDirection !== 'horizontal' && newDirection !== 'vertical')\n ) {\n return swiper;\n }\n\n swiper.$el\n .removeClass(`${swiper.params.containerModifierClass}${currentDirection}`)\n .addClass(`${swiper.params.containerModifierClass}${newDirection}`);\n swiper.emitContainerClasses();\n\n swiper.params.direction = newDirection;\n\n swiper.slides.each((slideEl) => {\n if (newDirection === 'vertical') {\n slideEl.style.width = '';\n } else {\n slideEl.style.height = '';\n }\n });\n\n swiper.emit('changeDirection');\n if (needUpdate) swiper.update();\n\n return swiper;\n }\n\n mount(el) {\n const swiper = this;\n if (swiper.mounted) return true;\n\n // Find el\n const $el = $(el || swiper.params.el);\n el = $el[0];\n\n if (!el) {\n return false;\n }\n\n el.swiper = swiper;\n\n const getWrapperSelector = () => {\n return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`;\n };\n\n const getWrapper = () => {\n if (el && el.shadowRoot && el.shadowRoot.querySelector) {\n const res = $(el.shadowRoot.querySelector(getWrapperSelector()));\n // Children needs to return slot items\n res.children = (options) => $el.children(options);\n return res;\n }\n return $el.children(getWrapperSelector());\n };\n // Find Wrapper\n let $wrapperEl = getWrapper();\n if ($wrapperEl.length === 0 && swiper.params.createElements) {\n const document = getDocument();\n const wrapper = document.createElement('div');\n $wrapperEl = $(wrapper);\n wrapper.className = swiper.params.wrapperClass;\n $el.append(wrapper);\n $el.children(`.${swiper.params.slideClass}`).each((slideEl) => {\n $wrapperEl.append(slideEl);\n });\n }\n\n Object.assign(swiper, {\n $el,\n el,\n $wrapperEl,\n wrapperEl: $wrapperEl[0],\n mounted: true,\n\n // RTL\n rtl: el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl',\n rtlTranslate:\n swiper.params.direction === 'horizontal' &&\n (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),\n wrongRTL: $wrapperEl.css('display') === '-webkit-box',\n });\n\n return true;\n }\n\n init(el) {\n const swiper = this;\n if (swiper.initialized) return swiper;\n\n const mounted = swiper.mount(el);\n if (mounted === false) return swiper;\n\n swiper.emit('beforeInit');\n\n // Set breakpoint\n if (swiper.params.breakpoints) {\n swiper.setBreakpoint();\n }\n\n // Add Classes\n swiper.addClasses();\n\n // Create loop\n if (swiper.params.loop) {\n swiper.loopCreate();\n }\n\n // Update size\n swiper.updateSize();\n\n // Update slides\n swiper.updateSlides();\n\n if (swiper.params.watchOverflow) {\n swiper.checkOverflow();\n }\n\n // Set Grab Cursor\n if (swiper.params.grabCursor && swiper.enabled) {\n swiper.setGrabCursor();\n }\n\n if (swiper.params.preloadImages) {\n swiper.preloadImages();\n }\n\n // Slide To Initial Slide\n if (swiper.params.loop) {\n swiper.slideTo(\n swiper.params.initialSlide + swiper.loopedSlides,\n 0,\n swiper.params.runCallbacksOnInit,\n false,\n true,\n );\n } else {\n swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);\n }\n\n // Attach events\n swiper.attachEvents();\n\n // Init Flag\n swiper.initialized = true;\n\n // Emit\n swiper.emit('init');\n swiper.emit('afterInit');\n\n return swiper;\n }\n\n destroy(deleteInstance = true, cleanStyles = true) {\n const swiper = this;\n const { params, $el, $wrapperEl, slides } = swiper;\n\n if (typeof swiper.params === 'undefined' || swiper.destroyed) {\n return null;\n }\n\n swiper.emit('beforeDestroy');\n\n // Init Flag\n swiper.initialized = false;\n\n // Detach events\n swiper.detachEvents();\n\n // Destroy loop\n if (params.loop) {\n swiper.loopDestroy();\n }\n\n // Cleanup styles\n if (cleanStyles) {\n swiper.removeClasses();\n $el.removeAttr('style');\n $wrapperEl.removeAttr('style');\n if (slides && slides.length) {\n slides\n .removeClass(\n [\n params.slideVisibleClass,\n params.slideActiveClass,\n params.slideNextClass,\n params.slidePrevClass,\n ].join(' '),\n )\n .removeAttr('style')\n .removeAttr('data-swiper-slide-index');\n }\n }\n\n swiper.emit('destroy');\n\n // Detach emitter events\n Object.keys(swiper.eventsListeners).forEach((eventName) => {\n swiper.off(eventName);\n });\n\n if (deleteInstance !== false) {\n swiper.$el[0].swiper = null;\n deleteProps(swiper);\n }\n swiper.destroyed = true;\n\n return null;\n }\n\n static extendDefaults(newDefaults) {\n extend(extendedDefaults, newDefaults);\n }\n\n static get extendedDefaults() {\n return extendedDefaults;\n }\n\n static get defaults() {\n return defaults;\n }\n\n static installModule(mod) {\n if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = [];\n const modules = Swiper.prototype.__modules__;\n\n if (typeof mod === 'function' && modules.indexOf(mod) < 0) {\n modules.push(mod);\n }\n }\n\n static use(module) {\n if (Array.isArray(module)) {\n module.forEach((m) => Swiper.installModule(m));\n return Swiper;\n }\n Swiper.installModule(module);\n return Swiper;\n }\n}\n\nObject.keys(prototypes).forEach((prototypeGroup) => {\n Object.keys(prototypes[prototypeGroup]).forEach((protoMethod) => {\n Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];\n });\n});\n\nSwiper.use([Resize, Observer]);\n\nexport default Swiper;\n","/* eslint-disable no-underscore-dangle */\n\nexport default {\n on(events, handler, priority) {\n const self = this;\n if (typeof handler !== 'function') return self;\n const method = priority ? 'unshift' : 'push';\n events.split(' ').forEach((event) => {\n if (!self.eventsListeners[event]) self.eventsListeners[event] = [];\n self.eventsListeners[event][method](handler);\n });\n return self;\n },\n\n once(events, handler, priority) {\n const self = this;\n if (typeof handler !== 'function') return self;\n function onceHandler(...args) {\n self.off(events, onceHandler);\n if (onceHandler.__emitterProxy) {\n delete onceHandler.__emitterProxy;\n }\n handler.apply(self, args);\n }\n onceHandler.__emitterProxy = handler;\n return self.on(events, onceHandler, priority);\n },\n\n onAny(handler, priority) {\n const self = this;\n if (typeof handler !== 'function') return self;\n const method = priority ? 'unshift' : 'push';\n if (self.eventsAnyListeners.indexOf(handler) < 0) {\n self.eventsAnyListeners[method](handler);\n }\n return self;\n },\n\n offAny(handler) {\n const self = this;\n if (!self.eventsAnyListeners) return self;\n const index = self.eventsAnyListeners.indexOf(handler);\n if (index >= 0) {\n self.eventsAnyListeners.splice(index, 1);\n }\n return self;\n },\n\n off(events, handler) {\n const self = this;\n if (!self.eventsListeners) return self;\n events.split(' ').forEach((event) => {\n if (typeof handler === 'undefined') {\n self.eventsListeners[event] = [];\n } else if (self.eventsListeners[event]) {\n self.eventsListeners[event].forEach((eventHandler, index) => {\n if (\n eventHandler === handler ||\n (eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler)\n ) {\n self.eventsListeners[event].splice(index, 1);\n }\n });\n }\n });\n return self;\n },\n\n emit(...args) {\n const self = this;\n if (!self.eventsListeners) return self;\n let events;\n let data;\n let context;\n if (typeof args[0] === 'string' || Array.isArray(args[0])) {\n events = args[0];\n data = args.slice(1, args.length);\n context = self;\n } else {\n events = args[0].events;\n data = args[0].data;\n context = args[0].context || self;\n }\n data.unshift(context);\n const eventsArray = Array.isArray(events) ? events : events.split(' ');\n\n eventsArray.forEach((event) => {\n if (self.eventsAnyListeners && self.eventsAnyListeners.length) {\n self.eventsAnyListeners.forEach((eventHandler) => {\n eventHandler.apply(context, [event, ...data]);\n });\n }\n if (self.eventsListeners && self.eventsListeners[event]) {\n self.eventsListeners[event].forEach((eventHandler) => {\n eventHandler.apply(context, data);\n });\n }\n });\n return self;\n },\n};\n","import updateSize from './updateSize.js';\nimport updateSlides from './updateSlides.js';\nimport updateAutoHeight from './updateAutoHeight.js';\nimport updateSlidesOffset from './updateSlidesOffset.js';\nimport updateSlidesProgress from './updateSlidesProgress.js';\nimport updateProgress from './updateProgress.js';\nimport updateSlidesClasses from './updateSlidesClasses.js';\nimport updateActiveIndex from './updateActiveIndex.js';\nimport updateClickedSlide from './updateClickedSlide.js';\n\nexport default {\n updateSize,\n updateSlides,\n updateAutoHeight,\n updateSlidesOffset,\n updateSlidesProgress,\n updateProgress,\n updateSlidesClasses,\n updateActiveIndex,\n updateClickedSlide,\n};\n","export default function updateSize() {\n const swiper = this;\n let width;\n let height;\n const $el = swiper.$el;\n if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {\n width = swiper.params.width;\n } else {\n width = $el[0].clientWidth;\n }\n if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {\n height = swiper.params.height;\n } else {\n height = $el[0].clientHeight;\n }\n if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) {\n return;\n }\n\n // Subtract paddings\n width =\n width -\n parseInt($el.css('padding-left') || 0, 10) -\n parseInt($el.css('padding-right') || 0, 10);\n height =\n height -\n parseInt($el.css('padding-top') || 0, 10) -\n parseInt($el.css('padding-bottom') || 0, 10);\n\n if (Number.isNaN(width)) width = 0;\n if (Number.isNaN(height)) height = 0;\n\n Object.assign(swiper, {\n width,\n height,\n size: swiper.isHorizontal() ? width : height,\n });\n}\n","import { setCSSProperty } from '../../shared/utils.js';\n\nexport default function updateSlides() {\n const swiper = this;\n function getDirectionLabel(property) {\n if (swiper.isHorizontal()) {\n return property;\n }\n // prettier-ignore\n return {\n 'width': 'height',\n 'margin-top': 'margin-left',\n 'margin-bottom ': 'margin-right',\n 'margin-left': 'margin-top',\n 'margin-right': 'margin-bottom',\n 'padding-left': 'padding-top',\n 'padding-right': 'padding-bottom',\n 'marginRight': 'marginBottom',\n }[property];\n }\n function getDirectionPropertyValue(node, label) {\n return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0);\n }\n\n const params = swiper.params;\n\n const { $wrapperEl, size: swiperSize, rtlTranslate: rtl, wrongRTL } = swiper;\n const isVirtual = swiper.virtual && params.virtual.enabled;\n const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;\n const slides = $wrapperEl.children(`.${swiper.params.slideClass}`);\n const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;\n let snapGrid = [];\n const slidesGrid = [];\n const slidesSizesGrid = [];\n\n let offsetBefore = params.slidesOffsetBefore;\n if (typeof offsetBefore === 'function') {\n offsetBefore = params.slidesOffsetBefore.call(swiper);\n }\n\n let offsetAfter = params.slidesOffsetAfter;\n if (typeof offsetAfter === 'function') {\n offsetAfter = params.slidesOffsetAfter.call(swiper);\n }\n\n const previousSnapGridLength = swiper.snapGrid.length;\n const previousSlidesGridLength = swiper.slidesGrid.length;\n\n let spaceBetween = params.spaceBetween;\n let slidePosition = -offsetBefore;\n let prevSlideSize = 0;\n let index = 0;\n if (typeof swiperSize === 'undefined') {\n return;\n }\n if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiperSize;\n }\n\n swiper.virtualSize = -spaceBetween;\n\n // reset margins\n if (rtl) slides.css({ marginLeft: '', marginBottom: '', marginTop: '' });\n else slides.css({ marginRight: '', marginBottom: '', marginTop: '' });\n\n // reset cssMode offsets\n if (params.centeredSlides && params.cssMode) {\n setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', '');\n setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-after', '');\n }\n\n const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;\n if (gridEnabled) {\n swiper.grid.initSlides(slidesLength);\n }\n\n // Calc slides\n let slideSize;\n\n const shouldResetSlideSize =\n params.slidesPerView === 'auto' &&\n params.breakpoints &&\n Object.keys(params.breakpoints).filter((key) => {\n return typeof params.breakpoints[key].slidesPerView !== 'undefined';\n }).length > 0;\n\n for (let i = 0; i < slidesLength; i += 1) {\n slideSize = 0;\n const slide = slides.eq(i);\n if (gridEnabled) {\n swiper.grid.updateSlide(i, slide, slidesLength, getDirectionLabel);\n }\n if (slide.css('display') === 'none') continue; // eslint-disable-line\n\n if (params.slidesPerView === 'auto') {\n if (shouldResetSlideSize) {\n slides[i].style[getDirectionLabel('width')] = ``;\n }\n const slideStyles = getComputedStyle(slide[0]);\n const currentTransform = slide[0].style.transform;\n const currentWebKitTransform = slide[0].style.webkitTransform;\n if (currentTransform) {\n slide[0].style.transform = 'none';\n }\n if (currentWebKitTransform) {\n slide[0].style.webkitTransform = 'none';\n }\n if (params.roundLengths) {\n slideSize = swiper.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(true);\n } else {\n // eslint-disable-next-line\n const width = getDirectionPropertyValue(slideStyles, 'width');\n const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');\n const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');\n const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');\n const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');\n const boxSizing = slideStyles.getPropertyValue('box-sizing');\n if (boxSizing && boxSizing === 'border-box') {\n slideSize = width + marginLeft + marginRight;\n } else {\n const { clientWidth, offsetWidth } = slide[0];\n slideSize =\n width +\n paddingLeft +\n paddingRight +\n marginLeft +\n marginRight +\n (offsetWidth - clientWidth);\n }\n }\n if (currentTransform) {\n slide[0].style.transform = currentTransform;\n }\n if (currentWebKitTransform) {\n slide[0].style.webkitTransform = currentWebKitTransform;\n }\n if (params.roundLengths) slideSize = Math.floor(slideSize);\n } else {\n slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;\n if (params.roundLengths) slideSize = Math.floor(slideSize);\n\n if (slides[i]) {\n slides[i].style[getDirectionLabel('width')] = `${slideSize}px`;\n }\n }\n if (slides[i]) {\n slides[i].swiperSlideSize = slideSize;\n }\n slidesSizesGrid.push(slideSize);\n\n if (params.centeredSlides) {\n slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;\n if (prevSlideSize === 0 && i !== 0)\n slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;\n if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);\n slidesGrid.push(slidePosition);\n } else {\n if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n if (\n (index - Math.min(swiper.params.slidesPerGroupSkip, index)) %\n swiper.params.slidesPerGroup ===\n 0\n )\n snapGrid.push(slidePosition);\n slidesGrid.push(slidePosition);\n slidePosition = slidePosition + slideSize + spaceBetween;\n }\n\n swiper.virtualSize += slideSize + spaceBetween;\n\n prevSlideSize = slideSize;\n\n index += 1;\n }\n swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;\n\n if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {\n $wrapperEl.css({ width: `${swiper.virtualSize + params.spaceBetween}px` });\n }\n if (params.setWrapperSize) {\n $wrapperEl.css({\n [getDirectionLabel('width')]: `${swiper.virtualSize + params.spaceBetween}px`,\n });\n }\n\n if (gridEnabled) {\n swiper.grid.updateWrapperSize(slideSize, snapGrid, getDirectionLabel);\n }\n\n // Remove last grid elements depending on width\n if (!params.centeredSlides) {\n const newSlidesGrid = [];\n for (let i = 0; i < snapGrid.length; i += 1) {\n let slidesGridItem = snapGrid[i];\n if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n if (snapGrid[i] <= swiper.virtualSize - swiperSize) {\n newSlidesGrid.push(slidesGridItem);\n }\n }\n snapGrid = newSlidesGrid;\n\n if (\n Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) >\n 1\n ) {\n snapGrid.push(swiper.virtualSize - swiperSize);\n }\n }\n if (snapGrid.length === 0) snapGrid = [0];\n\n if (params.spaceBetween !== 0) {\n const key = swiper.isHorizontal() && rtl ? 'marginLeft' : getDirectionLabel('marginRight');\n slides\n .filter((_, slideIndex) => {\n if (!params.cssMode) return true;\n if (slideIndex === slides.length - 1) {\n return false;\n }\n return true;\n })\n .css({ [key]: `${spaceBetween}px` });\n }\n\n if (params.centeredSlides && params.centeredSlidesBounds) {\n let allSlidesSize = 0;\n slidesSizesGrid.forEach((slideSizeValue) => {\n allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n });\n allSlidesSize -= params.spaceBetween;\n const maxSnap = allSlidesSize - swiperSize;\n snapGrid = snapGrid.map((snap) => {\n if (snap < 0) return -offsetBefore;\n if (snap > maxSnap) return maxSnap + offsetAfter;\n return snap;\n });\n }\n\n if (params.centerInsufficientSlides) {\n let allSlidesSize = 0;\n slidesSizesGrid.forEach((slideSizeValue) => {\n allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n });\n allSlidesSize -= params.spaceBetween;\n if (allSlidesSize < swiperSize) {\n const allSlidesOffset = (swiperSize - allSlidesSize) / 2;\n snapGrid.forEach((snap, snapIndex) => {\n snapGrid[snapIndex] = snap - allSlidesOffset;\n });\n slidesGrid.forEach((snap, snapIndex) => {\n slidesGrid[snapIndex] = snap + allSlidesOffset;\n });\n }\n }\n\n Object.assign(swiper, {\n slides,\n snapGrid,\n slidesGrid,\n slidesSizesGrid,\n });\n\n if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {\n setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`);\n setCSSProperty(\n swiper.wrapperEl,\n '--swiper-centered-offset-after',\n `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`,\n );\n const addToSnapGrid = -swiper.snapGrid[0];\n const addToSlidesGrid = -swiper.slidesGrid[0];\n swiper.snapGrid = swiper.snapGrid.map((v) => v + addToSnapGrid);\n swiper.slidesGrid = swiper.slidesGrid.map((v) => v + addToSlidesGrid);\n }\n\n if (slidesLength !== previousSlidesLength) {\n swiper.emit('slidesLengthChange');\n }\n if (snapGrid.length !== previousSnapGridLength) {\n if (swiper.params.watchOverflow) swiper.checkOverflow();\n swiper.emit('snapGridLengthChange');\n }\n if (slidesGrid.length !== previousSlidesGridLength) {\n swiper.emit('slidesGridLengthChange');\n }\n\n if (params.watchSlidesProgress) {\n swiper.updateSlidesOffset();\n }\n}\n","export default function updateAutoHeight(speed) {\n const swiper = this;\n const activeSlides = [];\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n let newHeight = 0;\n let i;\n if (typeof speed === 'number') {\n swiper.setTransition(speed);\n } else if (speed === true) {\n swiper.setTransition(swiper.params.speed);\n }\n\n const getSlideByIndex = (index) => {\n if (isVirtual) {\n return swiper.slides.filter(\n (el) => parseInt(el.getAttribute('data-swiper-slide-index'), 10) === index,\n )[0];\n }\n return swiper.slides.eq(index)[0];\n };\n // Find slides currently in view\n if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {\n if (swiper.params.centeredSlides) {\n swiper.visibleSlides.each((slide) => {\n activeSlides.push(slide);\n });\n } else {\n for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {\n const index = swiper.activeIndex + i;\n if (index > swiper.slides.length && !isVirtual) break;\n activeSlides.push(getSlideByIndex(index));\n }\n }\n } else {\n activeSlides.push(getSlideByIndex(swiper.activeIndex));\n }\n\n // Find new height from highest slide in view\n for (i = 0; i < activeSlides.length; i += 1) {\n if (typeof activeSlides[i] !== 'undefined') {\n const height = activeSlides[i].offsetHeight;\n newHeight = height > newHeight ? height : newHeight;\n }\n }\n\n // Update Height\n if (newHeight) swiper.$wrapperEl.css('height', `${newHeight}px`);\n}\n","export default function updateSlidesOffset() {\n const swiper = this;\n const slides = swiper.slides;\n for (let i = 0; i < slides.length; i += 1) {\n slides[i].swiperSlideOffset = swiper.isHorizontal()\n ? slides[i].offsetLeft\n : slides[i].offsetTop;\n }\n}\n","import $ from '../../shared/dom.js';\n\nexport default function updateSlidesProgress(translate = (this && this.translate) || 0) {\n const swiper = this;\n const params = swiper.params;\n\n const { slides, rtlTranslate: rtl } = swiper;\n\n if (slides.length === 0) return;\n if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();\n\n let offsetCenter = -translate;\n if (rtl) offsetCenter = translate;\n\n // Visible Slides\n slides.removeClass(params.slideVisibleClass);\n\n swiper.visibleSlidesIndexes = [];\n swiper.visibleSlides = [];\n\n for (let i = 0; i < slides.length; i += 1) {\n const slide = slides[i];\n let slideOffset = slide.swiperSlideOffset;\n if (params.cssMode && params.centeredSlides) {\n slideOffset -= slides[0].swiperSlideOffset;\n }\n\n const slideProgress =\n (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) /\n (slide.swiperSlideSize + params.spaceBetween);\n const slideBefore = -(offsetCenter - slideOffset);\n const slideAfter = slideBefore + swiper.slidesSizesGrid[i];\n const isVisible =\n (slideBefore >= 0 && slideBefore < swiper.size - 1) ||\n (slideAfter > 1 && slideAfter <= swiper.size) ||\n (slideBefore <= 0 && slideAfter >= swiper.size);\n if (isVisible) {\n swiper.visibleSlides.push(slide);\n swiper.visibleSlidesIndexes.push(i);\n slides.eq(i).addClass(params.slideVisibleClass);\n }\n slide.progress = rtl ? -slideProgress : slideProgress;\n }\n swiper.visibleSlides = $(swiper.visibleSlides);\n}\n","export default function updateProgress(translate) {\n const swiper = this;\n if (typeof translate === 'undefined') {\n const multiplier = swiper.rtlTranslate ? -1 : 1;\n // eslint-disable-next-line\n translate = (swiper && swiper.translate && swiper.translate * multiplier) || 0;\n }\n const params = swiper.params;\n const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n let { progress, isBeginning, isEnd } = swiper;\n const wasBeginning = isBeginning;\n const wasEnd = isEnd;\n if (translatesDiff === 0) {\n progress = 0;\n isBeginning = true;\n isEnd = true;\n } else {\n progress = (translate - swiper.minTranslate()) / translatesDiff;\n isBeginning = progress <= 0;\n isEnd = progress >= 1;\n }\n Object.assign(swiper, {\n progress,\n isBeginning,\n isEnd,\n });\n\n if (params.watchSlidesProgress || (params.centeredSlides && params.autoHeight))\n swiper.updateSlidesProgress(translate);\n\n if (isBeginning && !wasBeginning) {\n swiper.emit('reachBeginning toEdge');\n }\n if (isEnd && !wasEnd) {\n swiper.emit('reachEnd toEdge');\n }\n if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) {\n swiper.emit('fromEdge');\n }\n\n swiper.emit('progress', progress);\n}\n","export default function updateSlidesClasses() {\n const swiper = this;\n\n const { slides, params, $wrapperEl, activeIndex, realIndex } = swiper;\n const isVirtual = swiper.virtual && params.virtual.enabled;\n\n slides.removeClass(\n `${params.slideActiveClass} ${params.slideNextClass} ${params.slidePrevClass} ${params.slideDuplicateActiveClass} ${params.slideDuplicateNextClass} ${params.slideDuplicatePrevClass}`,\n );\n\n let activeSlide;\n if (isVirtual) {\n activeSlide = swiper.$wrapperEl.find(\n `.${params.slideClass}[data-swiper-slide-index=\"${activeIndex}\"]`,\n );\n } else {\n activeSlide = slides.eq(activeIndex);\n }\n\n // Active classes\n activeSlide.addClass(params.slideActiveClass);\n\n if (params.loop) {\n // Duplicate to all looped slides\n if (activeSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children(\n `.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index=\"${realIndex}\"]`,\n )\n .addClass(params.slideDuplicateActiveClass);\n } else {\n $wrapperEl\n .children(\n `.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index=\"${realIndex}\"]`,\n )\n .addClass(params.slideDuplicateActiveClass);\n }\n }\n // Next Slide\n let nextSlide = activeSlide\n .nextAll(`.${params.slideClass}`)\n .eq(0)\n .addClass(params.slideNextClass);\n if (params.loop && nextSlide.length === 0) {\n nextSlide = slides.eq(0);\n nextSlide.addClass(params.slideNextClass);\n }\n // Prev Slide\n let prevSlide = activeSlide\n .prevAll(`.${params.slideClass}`)\n .eq(0)\n .addClass(params.slidePrevClass);\n if (params.loop && prevSlide.length === 0) {\n prevSlide = slides.eq(-1);\n prevSlide.addClass(params.slidePrevClass);\n }\n if (params.loop) {\n // Duplicate to all looped slides\n if (nextSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children(\n `.${params.slideClass}:not(.${\n params.slideDuplicateClass\n })[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicateNextClass);\n } else {\n $wrapperEl\n .children(\n `.${params.slideClass}.${\n params.slideDuplicateClass\n }[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicateNextClass);\n }\n if (prevSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children(\n `.${params.slideClass}:not(.${\n params.slideDuplicateClass\n })[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicatePrevClass);\n } else {\n $wrapperEl\n .children(\n `.${params.slideClass}.${\n params.slideDuplicateClass\n }[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicatePrevClass);\n }\n }\n swiper.emitSlidesClasses();\n}\n","export default function updateActiveIndex(newActiveIndex) {\n const swiper = this;\n const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n const {\n slidesGrid,\n snapGrid,\n params,\n activeIndex: previousIndex,\n realIndex: previousRealIndex,\n snapIndex: previousSnapIndex,\n } = swiper;\n let activeIndex = newActiveIndex;\n let snapIndex;\n if (typeof activeIndex === 'undefined') {\n for (let i = 0; i < slidesGrid.length; i += 1) {\n if (typeof slidesGrid[i + 1] !== 'undefined') {\n if (\n translate >= slidesGrid[i] &&\n translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2\n ) {\n activeIndex = i;\n } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {\n activeIndex = i + 1;\n }\n } else if (translate >= slidesGrid[i]) {\n activeIndex = i;\n }\n }\n // Normalize slideIndex\n if (params.normalizeSlideIndex) {\n if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;\n }\n }\n if (snapGrid.indexOf(translate) >= 0) {\n snapIndex = snapGrid.indexOf(translate);\n } else {\n const skip = Math.min(params.slidesPerGroupSkip, activeIndex);\n snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);\n }\n if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n if (activeIndex === previousIndex) {\n if (snapIndex !== previousSnapIndex) {\n swiper.snapIndex = snapIndex;\n swiper.emit('snapIndexChange');\n }\n return;\n }\n\n // Get real index\n const realIndex = parseInt(\n swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex,\n 10,\n );\n\n Object.assign(swiper, {\n snapIndex,\n realIndex,\n previousIndex,\n activeIndex,\n });\n swiper.emit('activeIndexChange');\n swiper.emit('snapIndexChange');\n if (previousRealIndex !== realIndex) {\n swiper.emit('realIndexChange');\n }\n if (swiper.initialized || swiper.params.runCallbacksOnInit) {\n swiper.emit('slideChange');\n }\n}\n","import $ from '../../shared/dom.js';\n\nexport default function updateClickedSlide(e) {\n const swiper = this;\n const params = swiper.params;\n const slide = $(e.target).closest(`.${params.slideClass}`)[0];\n let slideFound = false;\n let slideIndex;\n\n if (slide) {\n for (let i = 0; i < swiper.slides.length; i += 1) {\n if (swiper.slides[i] === slide) {\n slideFound = true;\n slideIndex = i;\n break;\n }\n }\n }\n\n if (slide && slideFound) {\n swiper.clickedSlide = slide;\n if (swiper.virtual && swiper.params.virtual.enabled) {\n swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10);\n } else {\n swiper.clickedIndex = slideIndex;\n }\n } else {\n swiper.clickedSlide = undefined;\n swiper.clickedIndex = undefined;\n return;\n }\n if (\n params.slideToClickedSlide &&\n swiper.clickedIndex !== undefined &&\n swiper.clickedIndex !== swiper.activeIndex\n ) {\n swiper.slideToClickedSlide();\n }\n}\n","import getTranslate from './getTranslate.js';\nimport setTranslate from './setTranslate.js';\nimport minTranslate from './minTranslate.js';\nimport maxTranslate from './maxTranslate.js';\nimport translateTo from './translateTo.js';\n\nexport default {\n getTranslate,\n setTranslate,\n minTranslate,\n maxTranslate,\n translateTo,\n};\n","import { getTranslate } from '../../shared/utils.js';\n\nexport default function getSwiperTranslate(axis = this.isHorizontal() ? 'x' : 'y') {\n const swiper = this;\n\n const { params, rtlTranslate: rtl, translate, $wrapperEl } = swiper;\n\n if (params.virtualTranslate) {\n return rtl ? -translate : translate;\n }\n if (params.cssMode) {\n return translate;\n }\n\n let currentTranslate = getTranslate($wrapperEl[0], axis);\n if (rtl) currentTranslate = -currentTranslate;\n\n return currentTranslate || 0;\n}\n","export default function setTranslate(translate, byController) {\n const swiper = this;\n const { rtlTranslate: rtl, params, $wrapperEl, wrapperEl, progress } = swiper;\n let x = 0;\n let y = 0;\n const z = 0;\n\n if (swiper.isHorizontal()) {\n x = rtl ? -translate : translate;\n } else {\n y = translate;\n }\n\n if (params.roundLengths) {\n x = Math.floor(x);\n y = Math.floor(y);\n }\n\n if (params.cssMode) {\n wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;\n } else if (!params.virtualTranslate) {\n $wrapperEl.transform(`translate3d(${x}px, ${y}px, ${z}px)`);\n }\n swiper.previousTranslate = swiper.translate;\n swiper.translate = swiper.isHorizontal() ? x : y;\n\n // Check if we need to update progress\n let newProgress;\n const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n if (translatesDiff === 0) {\n newProgress = 0;\n } else {\n newProgress = (translate - swiper.minTranslate()) / translatesDiff;\n }\n if (newProgress !== progress) {\n swiper.updateProgress(translate);\n }\n\n swiper.emit('setTranslate', swiper.translate, byController);\n}\n","export default function minTranslate() {\n return -this.snapGrid[0];\n}\n","export default function maxTranslate() {\n return -this.snapGrid[this.snapGrid.length - 1];\n}\n","import { animateCSSModeScroll } from '../../shared/utils.js';\n\nexport default function translateTo(\n translate = 0,\n speed = this.params.speed,\n runCallbacks = true,\n translateBounds = true,\n internal,\n) {\n const swiper = this;\n\n const { params, wrapperEl } = swiper;\n\n if (swiper.animating && params.preventInteractionOnTransition) {\n return false;\n }\n\n const minTranslate = swiper.minTranslate();\n const maxTranslate = swiper.maxTranslate();\n let newTranslate;\n if (translateBounds && translate > minTranslate) newTranslate = minTranslate;\n else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;\n else newTranslate = translate;\n\n // Update progress\n swiper.updateProgress(newTranslate);\n\n if (params.cssMode) {\n const isH = swiper.isHorizontal();\n if (speed === 0) {\n wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;\n } else {\n if (!swiper.support.smoothScroll) {\n animateCSSModeScroll({ swiper, targetPosition: -newTranslate, side: isH ? 'left' : 'top' });\n return true;\n }\n wrapperEl.scrollTo({\n [isH ? 'left' : 'top']: -newTranslate,\n behavior: 'smooth',\n });\n }\n return true;\n }\n\n if (speed === 0) {\n swiper.setTransition(0);\n swiper.setTranslate(newTranslate);\n if (runCallbacks) {\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.emit('transitionEnd');\n }\n } else {\n swiper.setTransition(speed);\n swiper.setTranslate(newTranslate);\n if (runCallbacks) {\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.emit('transitionStart');\n }\n if (!swiper.animating) {\n swiper.animating = true;\n if (!swiper.onTranslateToWrapperTransitionEnd) {\n swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {\n if (!swiper || swiper.destroyed) return;\n if (e.target !== this) return;\n swiper.$wrapperEl[0].removeEventListener(\n 'transitionend',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n swiper.$wrapperEl[0].removeEventListener(\n 'webkitTransitionEnd',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n swiper.onTranslateToWrapperTransitionEnd = null;\n delete swiper.onTranslateToWrapperTransitionEnd;\n if (runCallbacks) {\n swiper.emit('transitionEnd');\n }\n };\n }\n swiper.$wrapperEl[0].addEventListener(\n 'transitionend',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n swiper.$wrapperEl[0].addEventListener(\n 'webkitTransitionEnd',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n }\n }\n\n return true;\n}\n","import setTransition from './setTransition.js';\nimport transitionStart from './transitionStart.js';\nimport transitionEnd from './transitionEnd.js';\n\nexport default {\n setTransition,\n transitionStart,\n transitionEnd,\n};\n","export default function setTransition(duration, byController) {\n const swiper = this;\n\n if (!swiper.params.cssMode) {\n swiper.$wrapperEl.transition(duration);\n }\n\n swiper.emit('setTransition', duration, byController);\n}\n","import transitionEmit from './transitionEmit.js';\n\nexport default function transitionStart(runCallbacks = true, direction) {\n const swiper = this;\n const { params } = swiper;\n if (params.cssMode) return;\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n\n transitionEmit({ swiper, runCallbacks, direction, step: 'Start' });\n}\n","import transitionEmit from './transitionEmit.js';\n\nexport default function transitionEnd(runCallbacks = true, direction) {\n const swiper = this;\n const { params } = swiper;\n swiper.animating = false;\n if (params.cssMode) return;\n swiper.setTransition(0);\n\n transitionEmit({ swiper, runCallbacks, direction, step: 'End' });\n}\n","import slideTo from './slideTo.js';\nimport slideToLoop from './slideToLoop.js';\nimport slideNext from './slideNext.js';\nimport slidePrev from './slidePrev.js';\nimport slideReset from './slideReset.js';\nimport slideToClosest from './slideToClosest.js';\nimport slideToClickedSlide from './slideToClickedSlide.js';\n\nexport default {\n slideTo,\n slideToLoop,\n slideNext,\n slidePrev,\n slideReset,\n slideToClosest,\n slideToClickedSlide,\n};\n","import { animateCSSModeScroll } from '../../shared/utils.js';\n\nexport default function slideTo(\n index = 0,\n speed = this.params.speed,\n runCallbacks = true,\n internal,\n initial,\n) {\n if (typeof index !== 'number' && typeof index !== 'string') {\n throw new Error(\n `The 'index' argument cannot have type other than 'number' or 'string'. [${typeof index}] given.`,\n );\n }\n\n if (typeof index === 'string') {\n /**\n * The `index` argument converted from `string` to `number`.\n * @type {number}\n */\n const indexAsNumber = parseInt(index, 10);\n\n /**\n * Determines whether the `index` argument is a valid `number`\n * after being converted from the `string` type.\n * @type {boolean}\n */\n const isValidNumber = isFinite(indexAsNumber);\n\n if (!isValidNumber) {\n throw new Error(\n `The passed-in 'index' (string) couldn't be converted to 'number'. [${index}] given.`,\n );\n }\n\n // Knowing that the converted `index` is a valid number,\n // we can update the original argument's value.\n index = indexAsNumber;\n }\n\n const swiper = this;\n let slideIndex = index;\n if (slideIndex < 0) slideIndex = 0;\n\n const {\n params,\n snapGrid,\n slidesGrid,\n previousIndex,\n activeIndex,\n rtlTranslate: rtl,\n wrapperEl,\n enabled,\n } = swiper;\n\n if (\n (swiper.animating && params.preventInteractionOnTransition) ||\n (!enabled && !internal && !initial)\n ) {\n return false;\n }\n\n const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);\n let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);\n if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n\n if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {\n swiper.emit('beforeSlideChangeStart');\n }\n\n const translate = -snapGrid[snapIndex];\n\n // Update progress\n swiper.updateProgress(translate);\n\n // Normalize slideIndex\n if (params.normalizeSlideIndex) {\n for (let i = 0; i < slidesGrid.length; i += 1) {\n const normalizedTranslate = -Math.floor(translate * 100);\n const normalizedGrid = Math.floor(slidesGrid[i] * 100);\n const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);\n if (typeof slidesGrid[i + 1] !== 'undefined') {\n if (\n normalizedTranslate >= normalizedGrid &&\n normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2\n ) {\n slideIndex = i;\n } else if (\n normalizedTranslate >= normalizedGrid &&\n normalizedTranslate < normalizedGridNext\n ) {\n slideIndex = i + 1;\n }\n } else if (normalizedTranslate >= normalizedGrid) {\n slideIndex = i;\n }\n }\n }\n // Directions locks\n if (swiper.initialized && slideIndex !== activeIndex) {\n if (\n !swiper.allowSlideNext &&\n translate < swiper.translate &&\n translate < swiper.minTranslate()\n ) {\n return false;\n }\n if (\n !swiper.allowSlidePrev &&\n translate > swiper.translate &&\n translate > swiper.maxTranslate()\n ) {\n if ((activeIndex || 0) !== slideIndex) return false;\n }\n }\n\n let direction;\n if (slideIndex > activeIndex) direction = 'next';\n else if (slideIndex < activeIndex) direction = 'prev';\n else direction = 'reset';\n\n // Update Index\n if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) {\n swiper.updateActiveIndex(slideIndex);\n // Update Height\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n swiper.updateSlidesClasses();\n if (params.effect !== 'slide') {\n swiper.setTranslate(translate);\n }\n if (direction !== 'reset') {\n swiper.transitionStart(runCallbacks, direction);\n swiper.transitionEnd(runCallbacks, direction);\n }\n return false;\n }\n if (params.cssMode) {\n const isH = swiper.isHorizontal();\n const t = rtl ? translate : -translate;\n if (speed === 0) {\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n if (isVirtual) {\n swiper.wrapperEl.style.scrollSnapType = 'none';\n swiper._immediateVirtual = true;\n }\n wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;\n if (isVirtual) {\n requestAnimationFrame(() => {\n swiper.wrapperEl.style.scrollSnapType = '';\n swiper._swiperImmediateVirtual = false;\n });\n }\n } else {\n if (!swiper.support.smoothScroll) {\n animateCSSModeScroll({ swiper, targetPosition: t, side: isH ? 'left' : 'top' });\n return true;\n }\n wrapperEl.scrollTo({\n [isH ? 'left' : 'top']: t,\n behavior: 'smooth',\n });\n }\n return true;\n }\n\n if (speed === 0) {\n swiper.setTransition(0);\n swiper.setTranslate(translate);\n swiper.updateActiveIndex(slideIndex);\n swiper.updateSlidesClasses();\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.transitionStart(runCallbacks, direction);\n swiper.transitionEnd(runCallbacks, direction);\n } else {\n swiper.setTransition(speed);\n swiper.setTranslate(translate);\n swiper.updateActiveIndex(slideIndex);\n swiper.updateSlidesClasses();\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.transitionStart(runCallbacks, direction);\n if (!swiper.animating) {\n swiper.animating = true;\n if (!swiper.onSlideToWrapperTransitionEnd) {\n swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {\n if (!swiper || swiper.destroyed) return;\n if (e.target !== this) return;\n swiper.$wrapperEl[0].removeEventListener(\n 'transitionend',\n swiper.onSlideToWrapperTransitionEnd,\n );\n swiper.$wrapperEl[0].removeEventListener(\n 'webkitTransitionEnd',\n swiper.onSlideToWrapperTransitionEnd,\n );\n swiper.onSlideToWrapperTransitionEnd = null;\n delete swiper.onSlideToWrapperTransitionEnd;\n swiper.transitionEnd(runCallbacks, direction);\n };\n }\n swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n swiper.$wrapperEl[0].addEventListener(\n 'webkitTransitionEnd',\n swiper.onSlideToWrapperTransitionEnd,\n );\n }\n }\n\n return true;\n}\n","export default function slideToLoop(\n index = 0,\n speed = this.params.speed,\n runCallbacks = true,\n internal,\n) {\n const swiper = this;\n let newIndex = index;\n if (swiper.params.loop) {\n newIndex += swiper.loopedSlides;\n }\n\n return swiper.slideTo(newIndex, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slideNext(speed = this.params.speed, runCallbacks = true, internal) {\n const swiper = this;\n const { animating, enabled, params } = swiper;\n if (!enabled) return swiper;\n let perGroup = params.slidesPerGroup;\n if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {\n perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1);\n }\n const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;\n if (params.loop) {\n if (animating && params.loopPreventsSlide) return false;\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n }\n return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slidePrev(speed = this.params.speed, runCallbacks = true, internal) {\n const swiper = this;\n const { params, animating, snapGrid, slidesGrid, rtlTranslate, enabled } = swiper;\n if (!enabled) return swiper;\n\n if (params.loop) {\n if (animating && params.loopPreventsSlide) return false;\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n }\n const translate = rtlTranslate ? swiper.translate : -swiper.translate;\n\n function normalize(val) {\n if (val < 0) return -Math.floor(Math.abs(val));\n return Math.floor(val);\n }\n const normalizedTranslate = normalize(translate);\n const normalizedSnapGrid = snapGrid.map((val) => normalize(val));\n\n let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];\n if (typeof prevSnap === 'undefined' && params.cssMode) {\n let prevSnapIndex;\n snapGrid.forEach((snap, snapIndex) => {\n if (normalizedTranslate >= snap) {\n // prevSnap = snap;\n prevSnapIndex = snapIndex;\n }\n });\n if (typeof prevSnapIndex !== 'undefined') {\n prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];\n }\n }\n let prevIndex = 0;\n if (typeof prevSnap !== 'undefined') {\n prevIndex = slidesGrid.indexOf(prevSnap);\n if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;\n if (\n params.slidesPerView === 'auto' &&\n params.slidesPerGroup === 1 &&\n params.slidesPerGroupAuto\n ) {\n prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;\n prevIndex = Math.max(prevIndex, 0);\n }\n }\n return swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slideReset(speed = this.params.speed, runCallbacks = true, internal) {\n const swiper = this;\n return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slideToClosest(\n speed = this.params.speed,\n runCallbacks = true,\n internal,\n threshold = 0.5,\n) {\n const swiper = this;\n let index = swiper.activeIndex;\n const skip = Math.min(swiper.params.slidesPerGroupSkip, index);\n const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);\n\n const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n\n if (translate >= swiper.snapGrid[snapIndex]) {\n // The current translate is on or after the current snap index, so the choice\n // is between the current index and the one after it.\n const currentSnap = swiper.snapGrid[snapIndex];\n const nextSnap = swiper.snapGrid[snapIndex + 1];\n if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {\n index += swiper.params.slidesPerGroup;\n }\n } else {\n // The current translate is before the current snap index, so the choice\n // is between the current index and the one before it.\n const prevSnap = swiper.snapGrid[snapIndex - 1];\n const currentSnap = swiper.snapGrid[snapIndex];\n if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) {\n index -= swiper.params.slidesPerGroup;\n }\n }\n index = Math.max(index, 0);\n index = Math.min(index, swiper.slidesGrid.length - 1);\n\n return swiper.slideTo(index, speed, runCallbacks, internal);\n}\n","import $ from '../../shared/dom.js';\nimport { nextTick } from '../../shared/utils.js';\n\nexport default function slideToClickedSlide() {\n const swiper = this;\n const { params, $wrapperEl } = swiper;\n\n const slidesPerView =\n params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;\n let slideToIndex = swiper.clickedIndex;\n let realIndex;\n if (params.loop) {\n if (swiper.animating) return;\n realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n if (params.centeredSlides) {\n if (\n slideToIndex < swiper.loopedSlides - slidesPerView / 2 ||\n slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2\n ) {\n swiper.loopFix();\n slideToIndex = $wrapperEl\n .children(\n `.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`,\n )\n .eq(0)\n .index();\n\n nextTick(() => {\n swiper.slideTo(slideToIndex);\n });\n } else {\n swiper.slideTo(slideToIndex);\n }\n } else if (slideToIndex > swiper.slides.length - slidesPerView) {\n swiper.loopFix();\n slideToIndex = $wrapperEl\n .children(\n `.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`,\n )\n .eq(0)\n .index();\n\n nextTick(() => {\n swiper.slideTo(slideToIndex);\n });\n } else {\n swiper.slideTo(slideToIndex);\n }\n } else {\n swiper.slideTo(slideToIndex);\n }\n}\n","import loopCreate from './loopCreate.js';\nimport loopFix from './loopFix.js';\nimport loopDestroy from './loopDestroy.js';\n\nexport default {\n loopCreate,\n loopFix,\n loopDestroy,\n};\n","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function loopCreate() {\n const swiper = this;\n const document = getDocument();\n const { params, $wrapperEl } = swiper;\n // Remove duplicated slides\n $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}`).remove();\n\n let slides = $wrapperEl.children(`.${params.slideClass}`);\n\n if (params.loopFillGroupWithBlank) {\n const blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup);\n if (blankSlidesNum !== params.slidesPerGroup) {\n for (let i = 0; i < blankSlidesNum; i += 1) {\n const blankNode = $(document.createElement('div')).addClass(\n `${params.slideClass} ${params.slideBlankClass}`,\n );\n $wrapperEl.append(blankNode);\n }\n slides = $wrapperEl.children(`.${params.slideClass}`);\n }\n }\n\n if (params.slidesPerView === 'auto' && !params.loopedSlides) params.loopedSlides = slides.length;\n\n swiper.loopedSlides = Math.ceil(parseFloat(params.loopedSlides || params.slidesPerView, 10));\n swiper.loopedSlides += params.loopAdditionalSlides;\n if (swiper.loopedSlides > slides.length) {\n swiper.loopedSlides = slides.length;\n }\n\n const prependSlides = [];\n const appendSlides = [];\n slides.each((el, index) => {\n const slide = $(el);\n if (index < swiper.loopedSlides) {\n appendSlides.push(el);\n }\n if (index < slides.length && index >= slides.length - swiper.loopedSlides) {\n prependSlides.push(el);\n }\n slide.attr('data-swiper-slide-index', index);\n });\n for (let i = 0; i < appendSlides.length; i += 1) {\n $wrapperEl.append($(appendSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n }\n for (let i = prependSlides.length - 1; i >= 0; i -= 1) {\n $wrapperEl.prepend($(prependSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n }\n}\n","export default function loopFix() {\n const swiper = this;\n\n swiper.emit('beforeLoopFix');\n\n const {\n activeIndex,\n slides,\n loopedSlides,\n allowSlidePrev,\n allowSlideNext,\n snapGrid,\n rtlTranslate: rtl,\n } = swiper;\n let newIndex;\n swiper.allowSlidePrev = true;\n swiper.allowSlideNext = true;\n\n const snapTranslate = -snapGrid[activeIndex];\n const diff = snapTranslate - swiper.getTranslate();\n\n // Fix For Negative Oversliding\n if (activeIndex < loopedSlides) {\n newIndex = slides.length - loopedSlides * 3 + activeIndex;\n newIndex += loopedSlides;\n const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n if (slideChanged && diff !== 0) {\n swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n }\n } else if (activeIndex >= slides.length - loopedSlides) {\n // Fix For Positive Oversliding\n newIndex = -slides.length + activeIndex + loopedSlides;\n newIndex += loopedSlides;\n const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n if (slideChanged && diff !== 0) {\n swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n }\n }\n swiper.allowSlidePrev = allowSlidePrev;\n swiper.allowSlideNext = allowSlideNext;\n\n swiper.emit('loopFix');\n}\n","export default function loopDestroy() {\n const swiper = this;\n const { $wrapperEl, params, slides } = swiper;\n $wrapperEl\n .children(\n `.${params.slideClass}.${params.slideDuplicateClass},.${params.slideClass}.${params.slideBlankClass}`,\n )\n .remove();\n slides.removeAttr('data-swiper-slide-index');\n}\n","import setGrabCursor from './setGrabCursor.js';\nimport unsetGrabCursor from './unsetGrabCursor.js';\n\nexport default {\n setGrabCursor,\n unsetGrabCursor,\n};\n","export default function setGrabCursor(moving) {\n const swiper = this;\n if (\n swiper.support.touch ||\n !swiper.params.simulateTouch ||\n (swiper.params.watchOverflow && swiper.isLocked) ||\n swiper.params.cssMode\n )\n return;\n const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl;\n el.style.cursor = 'move';\n el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';\n el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';\n el.style.cursor = moving ? 'grabbing' : 'grab';\n}\n","export default function unsetGrabCursor() {\n const swiper = this;\n if (\n swiper.support.touch ||\n (swiper.params.watchOverflow && swiper.isLocked) ||\n swiper.params.cssMode\n ) {\n return;\n }\n swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = '';\n}\n","import setBreakpoint from './setBreakpoint.js';\nimport getBreakpoint from './getBreakpoint.js';\n\nexport default { setBreakpoint, getBreakpoint };\n","import { getWindow } from 'ssr-window';\n\nexport default function getBreakpoint(breakpoints, base = 'window', containerEl) {\n if (!breakpoints || (base === 'container' && !containerEl)) return undefined;\n let breakpoint = false;\n\n const window = getWindow();\n const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;\n\n const points = Object.keys(breakpoints).map((point) => {\n if (typeof point === 'string' && point.indexOf('@') === 0) {\n const minRatio = parseFloat(point.substr(1));\n const value = currentHeight * minRatio;\n return { value, point };\n }\n return { value: point, point };\n });\n\n points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10));\n for (let i = 0; i < points.length; i += 1) {\n const { point, value } = points[i];\n if (base === 'window') {\n if (window.matchMedia(`(min-width: ${value}px)`).matches) {\n breakpoint = point;\n }\n } else if (value <= containerEl.clientWidth) {\n breakpoint = point;\n }\n }\n return breakpoint || 'max';\n}\n","function checkOverflow() {\n const swiper = this;\n const { isLocked: wasLocked, params } = swiper;\n const { slidesOffsetBefore } = params;\n\n if (slidesOffsetBefore) {\n const lastSlideIndex = swiper.slides.length - 1;\n const lastSlideRightEdge =\n swiper.slidesGrid[lastSlideIndex] +\n swiper.slidesSizesGrid[lastSlideIndex] +\n slidesOffsetBefore * 2;\n swiper.isLocked = swiper.size > lastSlideRightEdge;\n } else {\n swiper.isLocked = swiper.snapGrid.length === 1;\n }\n if (params.allowSlideNext === true) {\n swiper.allowSlideNext = !swiper.isLocked;\n }\n if (params.allowSlidePrev === true) {\n swiper.allowSlidePrev = !swiper.isLocked;\n }\n\n if (wasLocked && wasLocked !== swiper.isLocked) {\n swiper.isEnd = false;\n }\n if (wasLocked !== swiper.isLocked) {\n swiper.emit(swiper.isLocked ? 'lock' : 'unlock');\n }\n}\n\nexport default { checkOverflow };\n","import addClasses from './addClasses.js';\nimport removeClasses from './removeClasses.js';\n\nexport default { addClasses, removeClasses };\n","function prepareClasses(entries, prefix) {\n const resultClasses = [];\n entries.forEach((item) => {\n if (typeof item === 'object') {\n Object.keys(item).forEach((classNames) => {\n if (item[classNames]) {\n resultClasses.push(prefix + classNames);\n }\n });\n } else if (typeof item === 'string') {\n resultClasses.push(prefix + item);\n }\n });\n return resultClasses;\n}\n\nexport default function addClasses() {\n const swiper = this;\n const { classNames, params, rtl, $el, device, support } = swiper;\n // prettier-ignore\n const suffixes = prepareClasses([\n 'initialized',\n params.direction,\n { 'pointer-events': !support.touch },\n { 'free-mode': swiper.params.freeMode && params.freeMode.enabled },\n { 'autoheight': params.autoHeight },\n { 'rtl': rtl },\n { 'grid': params.grid && params.grid.rows > 1 },\n { 'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column' },\n { 'android': device.android },\n { 'ios': device.ios },\n { 'css-mode': params.cssMode },\n { 'centered': params.cssMode && params.centeredSlides },\n ], params.containerModifierClass);\n classNames.push(...suffixes);\n $el.addClass([...classNames].join(' '));\n swiper.emitContainerClasses();\n}\n","export default function removeClasses() {\n const swiper = this;\n const { $el, classNames } = swiper;\n\n $el.removeClass(classNames.join(' '));\n swiper.emitContainerClasses();\n}\n","import loadImage from './loadImage.js';\nimport preloadImages from './preloadImages.js';\n\nexport default {\n loadImage,\n preloadImages,\n};\n","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function loadImage(imageEl, src, srcset, sizes, checkForComplete, callback) {\n const window = getWindow();\n let image;\n function onReady() {\n if (callback) callback();\n }\n const isPicture = $(imageEl).parent('picture')[0];\n\n if (!isPicture && (!imageEl.complete || !checkForComplete)) {\n if (src) {\n image = new window.Image();\n image.onload = onReady;\n image.onerror = onReady;\n if (sizes) {\n image.sizes = sizes;\n }\n if (srcset) {\n image.srcset = srcset;\n }\n if (src) {\n image.src = src;\n }\n } else {\n onReady();\n }\n } else {\n // image already loaded...\n onReady();\n }\n}\n","export default function preloadImages() {\n const swiper = this;\n swiper.imagesToLoad = swiper.$el.find('img');\n function onReady() {\n if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) return;\n if (swiper.imagesLoaded !== undefined) swiper.imagesLoaded += 1;\n if (swiper.imagesLoaded === swiper.imagesToLoad.length) {\n if (swiper.params.updateOnImagesReady) swiper.update();\n swiper.emit('imagesReady');\n }\n }\n for (let i = 0; i < swiper.imagesToLoad.length; i += 1) {\n const imageEl = swiper.imagesToLoad[i];\n swiper.loadImage(\n imageEl,\n imageEl.currentSrc || imageEl.getAttribute('src'),\n imageEl.srcset || imageEl.getAttribute('srcset'),\n imageEl.sizes || imageEl.getAttribute('sizes'),\n true,\n onReady,\n );\n }\n}\n","import { getDocument } from 'ssr-window';\n\nexport default function createElementIfNotDefined(swiper, originalParams, params, checkProps) {\n const document = getDocument();\n if (swiper.params.createElements) {\n Object.keys(checkProps).forEach((key) => {\n if (!params[key] && params.auto === true) {\n let element = swiper.$el.children(`.${checkProps[key]}`)[0];\n if (!element) {\n element = document.createElement('div');\n element.className = checkProps[key];\n swiper.$el.append(element);\n }\n params[key] = element;\n originalParams[key] = element;\n }\n });\n }\n return params;\n}\n","export default function classesToSelector(classes = '') {\n return `.${classes\n .trim()\n .replace(/([\\.:!\\/])/g, '\\\\$1') // eslint-disable-line\n .replace(/ /g, '.')}`;\n}\n","export default function appendSlide(slides) {\n const swiper = this;\n const { $wrapperEl, params } = swiper;\n if (params.loop) {\n swiper.loopDestroy();\n }\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) $wrapperEl.append(slides[i]);\n }\n } else {\n $wrapperEl.append(slides);\n }\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer) {\n swiper.update();\n }\n}\n","export default function prependSlide(slides) {\n const swiper = this;\n const { params, $wrapperEl, activeIndex } = swiper;\n\n if (params.loop) {\n swiper.loopDestroy();\n }\n let newActiveIndex = activeIndex + 1;\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) $wrapperEl.prepend(slides[i]);\n }\n newActiveIndex = activeIndex + slides.length;\n } else {\n $wrapperEl.prepend(slides);\n }\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer) {\n swiper.update();\n }\n swiper.slideTo(newActiveIndex, 0, false);\n}\n","export default function addSlide(index, slides) {\n const swiper = this;\n const { $wrapperEl, params, activeIndex } = swiper;\n let activeIndexBuffer = activeIndex;\n if (params.loop) {\n activeIndexBuffer -= swiper.loopedSlides;\n swiper.loopDestroy();\n swiper.slides = $wrapperEl.children(`.${params.slideClass}`);\n }\n const baseLength = swiper.slides.length;\n if (index <= 0) {\n swiper.prependSlide(slides);\n return;\n }\n if (index >= baseLength) {\n swiper.appendSlide(slides);\n return;\n }\n let newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;\n\n const slidesBuffer = [];\n for (let i = baseLength - 1; i >= index; i -= 1) {\n const currentSlide = swiper.slides.eq(i);\n currentSlide.remove();\n slidesBuffer.unshift(currentSlide);\n }\n\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) $wrapperEl.append(slides[i]);\n }\n newActiveIndex =\n activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;\n } else {\n $wrapperEl.append(slides);\n }\n\n for (let i = 0; i < slidesBuffer.length; i += 1) {\n $wrapperEl.append(slidesBuffer[i]);\n }\n\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer) {\n swiper.update();\n }\n if (params.loop) {\n swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n } else {\n swiper.slideTo(newActiveIndex, 0, false);\n }\n}\n","export default function removeSlide(slidesIndexes) {\n const swiper = this;\n const { params, $wrapperEl, activeIndex } = swiper;\n\n let activeIndexBuffer = activeIndex;\n if (params.loop) {\n activeIndexBuffer -= swiper.loopedSlides;\n swiper.loopDestroy();\n swiper.slides = $wrapperEl.children(`.${params.slideClass}`);\n }\n let newActiveIndex = activeIndexBuffer;\n let indexToRemove;\n\n if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {\n for (let i = 0; i < slidesIndexes.length; i += 1) {\n indexToRemove = slidesIndexes[i];\n if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove();\n if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n }\n newActiveIndex = Math.max(newActiveIndex, 0);\n } else {\n indexToRemove = slidesIndexes;\n if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove();\n if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n newActiveIndex = Math.max(newActiveIndex, 0);\n }\n\n if (params.loop) {\n swiper.loopCreate();\n }\n\n if (!params.observer) {\n swiper.update();\n }\n if (params.loop) {\n swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n } else {\n swiper.slideTo(newActiveIndex, 0, false);\n }\n}\n","export default function removeAllSlides() {\n const swiper = this;\n\n const slidesIndexes = [];\n for (let i = 0; i < swiper.slides.length; i += 1) {\n slidesIndexes.push(i);\n }\n swiper.removeSlide(slidesIndexes);\n}\n","export default function effectInit(params) {\n const { effect, swiper, on, setTranslate, setTransition, overwriteParams, perspective } = params;\n\n on('beforeInit', () => {\n if (swiper.params.effect !== effect) return;\n swiper.classNames.push(`${swiper.params.containerModifierClass}${effect}`);\n if (perspective && perspective()) {\n swiper.classNames.push(`${swiper.params.containerModifierClass}3d`);\n }\n\n const overwriteParamsResult = overwriteParams ? overwriteParams() : {};\n\n Object.assign(swiper.params, overwriteParamsResult);\n Object.assign(swiper.originalParams, overwriteParamsResult);\n });\n on('setTranslate', () => {\n if (swiper.params.effect !== effect) return;\n setTranslate();\n });\n on('setTransition', (_s, duration) => {\n if (swiper.params.effect !== effect) return;\n setTransition(duration);\n });\n}\n","export default function effectTarget(effectParams, $slideEl) {\n if (effectParams.transformEl) {\n return $slideEl.find(effectParams.transformEl).css({\n 'backface-visibility': 'hidden',\n '-webkit-backface-visibility': 'hidden',\n });\n }\n return $slideEl;\n}\n","export default function effectVirtualTransitionEnd({ swiper, duration, transformEl, allSlides }) {\n const { slides, activeIndex, $wrapperEl } = swiper;\n if (swiper.params.virtualTranslate && duration !== 0) {\n let eventTriggered = false;\n let $transitionEndTarget;\n if (allSlides) {\n $transitionEndTarget = transformEl ? slides.find(transformEl) : slides;\n } else {\n $transitionEndTarget = transformEl\n ? slides.eq(activeIndex).find(transformEl)\n : slides.eq(activeIndex);\n }\n $transitionEndTarget.transitionEnd(() => {\n if (eventTriggered) return;\n if (!swiper || swiper.destroyed) return;\n eventTriggered = true;\n swiper.animating = false;\n const triggerEvents = ['webkitTransitionEnd', 'transitionend'];\n for (let i = 0; i < triggerEvents.length; i += 1) {\n $wrapperEl.trigger(triggerEvents[i]);\n }\n });\n }\n}\n","import $ from './dom.js';\n\nexport default function createShadow(params, $slideEl, side) {\n const shadowClass = `swiper-slide-shadow${side ? `-${side}` : ''}`;\n const $shadowContainer = params.transformEl ? $slideEl.find(params.transformEl) : $slideEl;\n let $shadowEl = $shadowContainer.children(`.${shadowClass}`);\n\n if (!$shadowEl.length) {\n $shadowEl = $(`
      `);\n $shadowContainer.append($shadowEl);\n }\n return $shadowEl;\n}\n","import { getWindow } from 'ssr-window';\n\nexport default function Resize({ swiper, on, emit }) {\n const window = getWindow();\n let observer = null;\n\n const resizeHandler = () => {\n if (!swiper || swiper.destroyed || !swiper.initialized) return;\n emit('beforeResize');\n emit('resize');\n };\n\n const createObserver = () => {\n if (!swiper || swiper.destroyed || !swiper.initialized) return;\n observer = new ResizeObserver((entries) => {\n const { width, height } = swiper;\n let newWidth = width;\n let newHeight = height;\n entries.forEach(({ contentBoxSize, contentRect, target }) => {\n if (target && target !== swiper.el) return;\n newWidth = contentRect\n ? contentRect.width\n : (contentBoxSize[0] || contentBoxSize).inlineSize;\n newHeight = contentRect\n ? contentRect.height\n : (contentBoxSize[0] || contentBoxSize).blockSize;\n });\n if (newWidth !== width || newHeight !== height) {\n resizeHandler();\n }\n });\n observer.observe(swiper.el);\n };\n\n const removeObserver = () => {\n if (observer && observer.unobserve && swiper.el) {\n observer.unobserve(swiper.el);\n observer = null;\n }\n };\n\n const orientationChangeHandler = () => {\n if (!swiper || swiper.destroyed || !swiper.initialized) return;\n emit('orientationchange');\n };\n\n on('init', () => {\n if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') {\n createObserver();\n return;\n }\n window.addEventListener('resize', resizeHandler);\n window.addEventListener('orientationchange', orientationChangeHandler);\n });\n\n on('destroy', () => {\n removeObserver();\n window.removeEventListener('resize', resizeHandler);\n window.removeEventListener('orientationchange', orientationChangeHandler);\n });\n}\n","import { getWindow } from 'ssr-window';\n\nexport default function Observer({ swiper, extendParams, on, emit }) {\n const observers = [];\n const window = getWindow();\n const attach = (target, options = {}) => {\n const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;\n const observer = new ObserverFunc((mutations) => {\n // The observerUpdate event should only be triggered\n // once despite the number of mutations. Additional\n // triggers are redundant and are very costly\n if (mutations.length === 1) {\n emit('observerUpdate', mutations[0]);\n return;\n }\n const observerUpdate = function observerUpdate() {\n emit('observerUpdate', mutations[0]);\n };\n\n if (window.requestAnimationFrame) {\n window.requestAnimationFrame(observerUpdate);\n } else {\n window.setTimeout(observerUpdate, 0);\n }\n });\n\n observer.observe(target, {\n attributes: typeof options.attributes === 'undefined' ? true : options.attributes,\n childList: typeof options.childList === 'undefined' ? true : options.childList,\n characterData: typeof options.characterData === 'undefined' ? true : options.characterData,\n });\n\n observers.push(observer);\n };\n const init = () => {\n if (!swiper.params.observer) return;\n if (swiper.params.observeParents) {\n const containerParents = swiper.$el.parents();\n for (let i = 0; i < containerParents.length; i += 1) {\n attach(containerParents[i]);\n }\n }\n // Observe container\n attach(swiper.$el[0], {\n childList: swiper.params.observeSlideChildren,\n });\n\n // Observe wrapper\n attach(swiper.$wrapperEl[0], { attributes: false });\n };\n const destroy = () => {\n observers.forEach((observer) => {\n observer.disconnect();\n });\n observers.splice(0, observers.length);\n };\n\n extendParams({\n observer: false,\n observeParents: false,\n observeSlideChildren: false,\n });\n on('init', init);\n on('destroy', destroy);\n}\n","// Swiper Class\nimport Swiper from './core/core.js';\n\n//IMPORT_MODULES\n\nconst modules = [\n //INSTALL_MODULES\n];\n\nSwiper.use(modules);\n\n//EXPORT\n","import $ from '../../shared/dom.js';\nimport { setCSSProperty } from '../../shared/utils.js';\n\nexport default function Virtual({ swiper, extendParams, on }) {\n extendParams({\n virtual: {\n enabled: false,\n slides: [],\n cache: true,\n renderSlide: null,\n renderExternal: null,\n renderExternalUpdate: true,\n addSlidesBefore: 0,\n addSlidesAfter: 0,\n },\n });\n\n let cssModeTimeout;\n\n swiper.virtual = {\n cache: {},\n from: undefined,\n to: undefined,\n slides: [],\n offset: 0,\n slidesGrid: [],\n };\n\n function renderSlide(slide, index) {\n const params = swiper.params.virtual;\n if (params.cache && swiper.virtual.cache[index]) {\n return swiper.virtual.cache[index];\n }\n const $slideEl = params.renderSlide\n ? $(params.renderSlide.call(swiper, slide, index))\n : $(\n `
      ${slide}
      `,\n );\n if (!$slideEl.attr('data-swiper-slide-index')) $slideEl.attr('data-swiper-slide-index', index);\n if (params.cache) swiper.virtual.cache[index] = $slideEl;\n return $slideEl;\n }\n\n function update(force) {\n const { slidesPerView, slidesPerGroup, centeredSlides } = swiper.params;\n const { addSlidesBefore, addSlidesAfter } = swiper.params.virtual;\n const {\n from: previousFrom,\n to: previousTo,\n slides,\n slidesGrid: previousSlidesGrid,\n offset: previousOffset,\n } = swiper.virtual;\n if (!swiper.params.cssMode) {\n swiper.updateActiveIndex();\n }\n\n const activeIndex = swiper.activeIndex || 0;\n\n let offsetProp;\n if (swiper.rtlTranslate) offsetProp = 'right';\n else offsetProp = swiper.isHorizontal() ? 'left' : 'top';\n\n let slidesAfter;\n let slidesBefore;\n if (centeredSlides) {\n slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;\n slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;\n } else {\n slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesAfter;\n slidesBefore = slidesPerGroup + addSlidesBefore;\n }\n const from = Math.max((activeIndex || 0) - slidesBefore, 0);\n const to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);\n const offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);\n\n Object.assign(swiper.virtual, {\n from,\n to,\n offset,\n slidesGrid: swiper.slidesGrid,\n });\n\n function onRendered() {\n swiper.updateSlides();\n swiper.updateProgress();\n swiper.updateSlidesClasses();\n if (swiper.lazy && swiper.params.lazy.enabled) {\n swiper.lazy.load();\n }\n }\n\n if (previousFrom === from && previousTo === to && !force) {\n if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {\n swiper.slides.css(offsetProp, `${offset}px`);\n }\n swiper.updateProgress();\n return;\n }\n if (swiper.params.virtual.renderExternal) {\n swiper.params.virtual.renderExternal.call(swiper, {\n offset,\n from,\n to,\n slides: (function getSlides() {\n const slidesToRender = [];\n for (let i = from; i <= to; i += 1) {\n slidesToRender.push(slides[i]);\n }\n return slidesToRender;\n })(),\n });\n if (swiper.params.virtual.renderExternalUpdate) {\n onRendered();\n }\n return;\n }\n const prependIndexes = [];\n const appendIndexes = [];\n if (force) {\n swiper.$wrapperEl.find(`.${swiper.params.slideClass}`).remove();\n } else {\n for (let i = previousFrom; i <= previousTo; i += 1) {\n if (i < from || i > to) {\n swiper.$wrapperEl\n .find(`.${swiper.params.slideClass}[data-swiper-slide-index=\"${i}\"]`)\n .remove();\n }\n }\n }\n for (let i = 0; i < slides.length; i += 1) {\n if (i >= from && i <= to) {\n if (typeof previousTo === 'undefined' || force) {\n appendIndexes.push(i);\n } else {\n if (i > previousTo) appendIndexes.push(i);\n if (i < previousFrom) prependIndexes.push(i);\n }\n }\n }\n appendIndexes.forEach((index) => {\n swiper.$wrapperEl.append(renderSlide(slides[index], index));\n });\n prependIndexes\n .sort((a, b) => b - a)\n .forEach((index) => {\n swiper.$wrapperEl.prepend(renderSlide(slides[index], index));\n });\n swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, `${offset}px`);\n onRendered();\n }\n\n function appendSlide(slides) {\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) swiper.virtual.slides.push(slides[i]);\n }\n } else {\n swiper.virtual.slides.push(slides);\n }\n update(true);\n }\n function prependSlide(slides) {\n const activeIndex = swiper.activeIndex;\n let newActiveIndex = activeIndex + 1;\n let numberOfNewSlides = 1;\n\n if (Array.isArray(slides)) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) swiper.virtual.slides.unshift(slides[i]);\n }\n newActiveIndex = activeIndex + slides.length;\n numberOfNewSlides = slides.length;\n } else {\n swiper.virtual.slides.unshift(slides);\n }\n if (swiper.params.virtual.cache) {\n const cache = swiper.virtual.cache;\n const newCache = {};\n Object.keys(cache).forEach((cachedIndex) => {\n const $cachedEl = cache[cachedIndex];\n const cachedElIndex = $cachedEl.attr('data-swiper-slide-index');\n if (cachedElIndex) {\n $cachedEl.attr(\n 'data-swiper-slide-index',\n parseInt(cachedElIndex, 10) + numberOfNewSlides,\n );\n }\n newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = $cachedEl;\n });\n swiper.virtual.cache = newCache;\n }\n update(true);\n swiper.slideTo(newActiveIndex, 0);\n }\n function removeSlide(slidesIndexes) {\n if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return;\n let activeIndex = swiper.activeIndex;\n if (Array.isArray(slidesIndexes)) {\n for (let i = slidesIndexes.length - 1; i >= 0; i -= 1) {\n swiper.virtual.slides.splice(slidesIndexes[i], 1);\n if (swiper.params.virtual.cache) {\n delete swiper.virtual.cache[slidesIndexes[i]];\n }\n if (slidesIndexes[i] < activeIndex) activeIndex -= 1;\n activeIndex = Math.max(activeIndex, 0);\n }\n } else {\n swiper.virtual.slides.splice(slidesIndexes, 1);\n if (swiper.params.virtual.cache) {\n delete swiper.virtual.cache[slidesIndexes];\n }\n if (slidesIndexes < activeIndex) activeIndex -= 1;\n activeIndex = Math.max(activeIndex, 0);\n }\n update(true);\n swiper.slideTo(activeIndex, 0);\n }\n function removeAllSlides() {\n swiper.virtual.slides = [];\n if (swiper.params.virtual.cache) {\n swiper.virtual.cache = {};\n }\n update(true);\n swiper.slideTo(0, 0);\n }\n\n on('beforeInit', () => {\n if (!swiper.params.virtual.enabled) return;\n swiper.virtual.slides = swiper.params.virtual.slides;\n swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`);\n\n swiper.params.watchSlidesProgress = true;\n swiper.originalParams.watchSlidesProgress = true;\n\n if (!swiper.params.initialSlide) {\n update();\n }\n });\n on('setTranslate', () => {\n if (!swiper.params.virtual.enabled) return;\n if (swiper.params.cssMode && !swiper._immediateVirtual) {\n clearTimeout(cssModeTimeout);\n cssModeTimeout = setTimeout(() => {\n update();\n }, 100);\n } else {\n update();\n }\n });\n on('init update resize', () => {\n if (!swiper.params.virtual.enabled) return;\n if (swiper.params.cssMode) {\n setCSSProperty(swiper.wrapperEl, '--swiper-virtual-size', `${swiper.virtualSize}px`);\n }\n });\n\n Object.assign(swiper.virtual, {\n appendSlide,\n prependSlide,\n removeSlide,\n removeAllSlides,\n update,\n });\n}\n","/* eslint-disable consistent-return */\nimport { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function Keyboard({ swiper, extendParams, on, emit }) {\n const document = getDocument();\n const window = getWindow();\n swiper.keyboard = {\n enabled: false,\n };\n extendParams({\n keyboard: {\n enabled: false,\n onlyInViewport: true,\n pageUpDown: true,\n },\n });\n\n function handle(event) {\n if (!swiper.enabled) return;\n\n const { rtlTranslate: rtl } = swiper;\n let e = event;\n if (e.originalEvent) e = e.originalEvent; // jquery fix\n const kc = e.keyCode || e.charCode;\n const pageUpDown = swiper.params.keyboard.pageUpDown;\n const isPageUp = pageUpDown && kc === 33;\n const isPageDown = pageUpDown && kc === 34;\n const isArrowLeft = kc === 37;\n const isArrowRight = kc === 39;\n const isArrowUp = kc === 38;\n const isArrowDown = kc === 40;\n // Directions locks\n if (\n !swiper.allowSlideNext &&\n ((swiper.isHorizontal() && isArrowRight) ||\n (swiper.isVertical() && isArrowDown) ||\n isPageDown)\n ) {\n return false;\n }\n if (\n !swiper.allowSlidePrev &&\n ((swiper.isHorizontal() && isArrowLeft) || (swiper.isVertical() && isArrowUp) || isPageUp)\n ) {\n return false;\n }\n if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {\n return undefined;\n }\n if (\n document.activeElement &&\n document.activeElement.nodeName &&\n (document.activeElement.nodeName.toLowerCase() === 'input' ||\n document.activeElement.nodeName.toLowerCase() === 'textarea')\n ) {\n return undefined;\n }\n if (\n swiper.params.keyboard.onlyInViewport &&\n (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)\n ) {\n let inView = false;\n // Check that swiper should be inside of visible area of window\n if (\n swiper.$el.parents(`.${swiper.params.slideClass}`).length > 0 &&\n swiper.$el.parents(`.${swiper.params.slideActiveClass}`).length === 0\n ) {\n return undefined;\n }\n\n const $el = swiper.$el;\n const swiperWidth = $el[0].clientWidth;\n const swiperHeight = $el[0].clientHeight;\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n const swiperOffset = swiper.$el.offset();\n if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft;\n const swiperCoord = [\n [swiperOffset.left, swiperOffset.top],\n [swiperOffset.left + swiperWidth, swiperOffset.top],\n [swiperOffset.left, swiperOffset.top + swiperHeight],\n [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight],\n ];\n for (let i = 0; i < swiperCoord.length; i += 1) {\n const point = swiperCoord[i];\n if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) {\n if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line\n inView = true;\n }\n }\n if (!inView) return undefined;\n }\n if (swiper.isHorizontal()) {\n if (isPageUp || isPageDown || isArrowLeft || isArrowRight) {\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n }\n if (((isPageDown || isArrowRight) && !rtl) || ((isPageUp || isArrowLeft) && rtl))\n swiper.slideNext();\n if (((isPageUp || isArrowLeft) && !rtl) || ((isPageDown || isArrowRight) && rtl))\n swiper.slidePrev();\n } else {\n if (isPageUp || isPageDown || isArrowUp || isArrowDown) {\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n }\n if (isPageDown || isArrowDown) swiper.slideNext();\n if (isPageUp || isArrowUp) swiper.slidePrev();\n }\n emit('keyPress', kc);\n return undefined;\n }\n function enable() {\n if (swiper.keyboard.enabled) return;\n $(document).on('keydown', handle);\n swiper.keyboard.enabled = true;\n }\n function disable() {\n if (!swiper.keyboard.enabled) return;\n $(document).off('keydown', handle);\n swiper.keyboard.enabled = false;\n }\n\n on('init', () => {\n if (swiper.params.keyboard.enabled) {\n enable();\n }\n });\n on('destroy', () => {\n if (swiper.keyboard.enabled) {\n disable();\n }\n });\n\n Object.assign(swiper.keyboard, {\n enable,\n disable,\n });\n}\n","/* eslint-disable consistent-return */\nimport { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now, nextTick } from '../../shared/utils.js';\n\nexport default function Mousewheel({ swiper, extendParams, on, emit }) {\n const window = getWindow();\n\n extendParams({\n mousewheel: {\n enabled: false,\n releaseOnEdges: false,\n invert: false,\n forceToAxis: false,\n sensitivity: 1,\n eventsTarget: 'container',\n thresholdDelta: null,\n thresholdTime: null,\n },\n });\n\n swiper.mousewheel = {\n enabled: false,\n };\n\n let timeout;\n let lastScrollTime = now();\n let lastEventBeforeSnap;\n const recentWheelEvents = [];\n\n function normalize(e) {\n // Reasonable defaults\n const PIXEL_STEP = 10;\n const LINE_HEIGHT = 40;\n const PAGE_HEIGHT = 800;\n\n let sX = 0;\n let sY = 0; // spinX, spinY\n let pX = 0;\n let pY = 0; // pixelX, pixelY\n\n // Legacy\n if ('detail' in e) {\n sY = e.detail;\n }\n if ('wheelDelta' in e) {\n sY = -e.wheelDelta / 120;\n }\n if ('wheelDeltaY' in e) {\n sY = -e.wheelDeltaY / 120;\n }\n if ('wheelDeltaX' in e) {\n sX = -e.wheelDeltaX / 120;\n }\n\n // side scrolling on FF with DOMMouseScroll\n if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {\n sX = sY;\n sY = 0;\n }\n\n pX = sX * PIXEL_STEP;\n pY = sY * PIXEL_STEP;\n\n if ('deltaY' in e) {\n pY = e.deltaY;\n }\n if ('deltaX' in e) {\n pX = e.deltaX;\n }\n\n if (e.shiftKey && !pX) {\n // if user scrolls with shift he wants horizontal scroll\n pX = pY;\n pY = 0;\n }\n\n if ((pX || pY) && e.deltaMode) {\n if (e.deltaMode === 1) {\n // delta in LINE units\n pX *= LINE_HEIGHT;\n pY *= LINE_HEIGHT;\n } else {\n // delta in PAGE units\n pX *= PAGE_HEIGHT;\n pY *= PAGE_HEIGHT;\n }\n }\n\n // Fall-back if spin cannot be determined\n if (pX && !sX) {\n sX = pX < 1 ? -1 : 1;\n }\n if (pY && !sY) {\n sY = pY < 1 ? -1 : 1;\n }\n\n return {\n spinX: sX,\n spinY: sY,\n pixelX: pX,\n pixelY: pY,\n };\n }\n function handleMouseEnter() {\n if (!swiper.enabled) return;\n swiper.mouseEntered = true;\n }\n function handleMouseLeave() {\n if (!swiper.enabled) return;\n swiper.mouseEntered = false;\n }\n function animateSlider(newEvent) {\n if (\n swiper.params.mousewheel.thresholdDelta &&\n newEvent.delta < swiper.params.mousewheel.thresholdDelta\n ) {\n // Prevent if delta of wheel scroll delta is below configured threshold\n return false;\n }\n\n if (\n swiper.params.mousewheel.thresholdTime &&\n now() - lastScrollTime < swiper.params.mousewheel.thresholdTime\n ) {\n // Prevent if time between scrolls is below configured threshold\n return false;\n }\n\n // If the movement is NOT big enough and\n // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):\n // Don't go any further (avoid insignificant scroll movement).\n if (newEvent.delta >= 6 && now() - lastScrollTime < 60) {\n // Return false as a default\n return true;\n }\n // If user is scrolling towards the end:\n // If the slider hasn't hit the latest slide or\n // if the slider is a loop and\n // if the slider isn't moving right now:\n // Go to next slide and\n // emit a scroll event.\n // Else (the user is scrolling towards the beginning) and\n // if the slider hasn't hit the first slide or\n // if the slider is a loop and\n // if the slider isn't moving right now:\n // Go to prev slide and\n // emit a scroll event.\n if (newEvent.direction < 0) {\n if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {\n swiper.slideNext();\n emit('scroll', newEvent.raw);\n }\n } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {\n swiper.slidePrev();\n emit('scroll', newEvent.raw);\n }\n // If you got here is because an animation has been triggered so store the current time\n lastScrollTime = new window.Date().getTime();\n // Return false as a default\n return false;\n }\n function releaseScroll(newEvent) {\n const params = swiper.params.mousewheel;\n if (newEvent.direction < 0) {\n if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {\n // Return true to animate scroll on edges\n return true;\n }\n } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {\n // Return true to animate scroll on edges\n return true;\n }\n return false;\n }\n function handle(event) {\n let e = event;\n let disableParentSwiper = true;\n if (!swiper.enabled) return;\n const params = swiper.params.mousewheel;\n\n if (swiper.params.cssMode) {\n e.preventDefault();\n }\n\n let target = swiper.$el;\n if (swiper.params.mousewheel.eventsTarget !== 'container') {\n target = $(swiper.params.mousewheel.eventsTarget);\n }\n if (!swiper.mouseEntered && !target[0].contains(e.target) && !params.releaseOnEdges)\n return true;\n\n if (e.originalEvent) e = e.originalEvent; // jquery fix\n let delta = 0;\n const rtlFactor = swiper.rtlTranslate ? -1 : 1;\n\n const data = normalize(e);\n\n if (params.forceToAxis) {\n if (swiper.isHorizontal()) {\n if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;\n else return true;\n } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;\n else return true;\n } else {\n delta =\n Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;\n }\n\n if (delta === 0) return true;\n\n if (params.invert) delta = -delta;\n\n // Get the scroll positions\n let positions = swiper.getTranslate() + delta * params.sensitivity;\n\n if (positions >= swiper.minTranslate()) positions = swiper.minTranslate();\n if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate();\n\n // When loop is true:\n // the disableParentSwiper will be true.\n // When loop is false:\n // if the scroll positions is not on edge,\n // then the disableParentSwiper will be true.\n // if the scroll on edge positions,\n // then the disableParentSwiper will be false.\n disableParentSwiper = swiper.params.loop\n ? true\n : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate());\n\n if (disableParentSwiper && swiper.params.nested) e.stopPropagation();\n\n if (!swiper.params.freeMode || !swiper.params.freeMode.enabled) {\n // Register the new event in a variable which stores the relevant data\n const newEvent = {\n time: now(),\n delta: Math.abs(delta),\n direction: Math.sign(delta),\n raw: event,\n };\n\n // Keep the most recent events\n if (recentWheelEvents.length >= 2) {\n recentWheelEvents.shift(); // only store the last N events\n }\n const prevEvent = recentWheelEvents.length\n ? recentWheelEvents[recentWheelEvents.length - 1]\n : undefined;\n recentWheelEvents.push(newEvent);\n\n // If there is at least one previous recorded event:\n // If direction has changed or\n // if the scroll is quicker than the previous one:\n // Animate the slider.\n // Else (this is the first time the wheel is moved):\n // Animate the slider.\n if (prevEvent) {\n if (\n newEvent.direction !== prevEvent.direction ||\n newEvent.delta > prevEvent.delta ||\n newEvent.time > prevEvent.time + 150\n ) {\n animateSlider(newEvent);\n }\n } else {\n animateSlider(newEvent);\n }\n\n // If it's time to release the scroll:\n // Return now so you don't hit the preventDefault.\n if (releaseScroll(newEvent)) {\n return true;\n }\n } else {\n // Freemode or scrollContainer:\n\n // If we recently snapped after a momentum scroll, then ignore wheel events\n // to give time for the deceleration to finish. Stop ignoring after 500 msecs\n // or if it's a new scroll (larger delta or inverse sign as last event before\n // an end-of-momentum snap).\n const newEvent = {\n time: now(),\n delta: Math.abs(delta),\n direction: Math.sign(delta),\n };\n const ignoreWheelEvents =\n lastEventBeforeSnap &&\n newEvent.time < lastEventBeforeSnap.time + 500 &&\n newEvent.delta <= lastEventBeforeSnap.delta &&\n newEvent.direction === lastEventBeforeSnap.direction;\n if (!ignoreWheelEvents) {\n lastEventBeforeSnap = undefined;\n\n if (swiper.params.loop) {\n swiper.loopFix();\n }\n let position = swiper.getTranslate() + delta * params.sensitivity;\n const wasBeginning = swiper.isBeginning;\n const wasEnd = swiper.isEnd;\n\n if (position >= swiper.minTranslate()) position = swiper.minTranslate();\n if (position <= swiper.maxTranslate()) position = swiper.maxTranslate();\n\n swiper.setTransition(0);\n swiper.setTranslate(position);\n swiper.updateProgress();\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n\n if ((!wasBeginning && swiper.isBeginning) || (!wasEnd && swiper.isEnd)) {\n swiper.updateSlidesClasses();\n }\n\n if (swiper.params.freeMode.sticky) {\n // When wheel scrolling starts with sticky (aka snap) enabled, then detect\n // the end of a momentum scroll by storing recent (N=15?) wheel events.\n // 1. do all N events have decreasing or same (absolute value) delta?\n // 2. did all N events arrive in the last M (M=500?) msecs?\n // 3. does the earliest event have an (absolute value) delta that's\n // at least P (P=1?) larger than the most recent event's delta?\n // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?\n // If 1-4 are \"yes\" then we're near the end of a momentum scroll deceleration.\n // Snap immediately and ignore remaining wheel events in this scroll.\n // See comment above for \"remaining wheel events in this scroll\" determination.\n // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.\n clearTimeout(timeout);\n timeout = undefined;\n if (recentWheelEvents.length >= 15) {\n recentWheelEvents.shift(); // only store the last N events\n }\n const prevEvent = recentWheelEvents.length\n ? recentWheelEvents[recentWheelEvents.length - 1]\n : undefined;\n const firstEvent = recentWheelEvents[0];\n recentWheelEvents.push(newEvent);\n if (\n prevEvent &&\n (newEvent.delta > prevEvent.delta || newEvent.direction !== prevEvent.direction)\n ) {\n // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.\n recentWheelEvents.splice(0);\n } else if (\n recentWheelEvents.length >= 15 &&\n newEvent.time - firstEvent.time < 500 &&\n firstEvent.delta - newEvent.delta >= 1 &&\n newEvent.delta <= 6\n ) {\n // We're at the end of the deceleration of a momentum scroll, so there's no need\n // to wait for more events. Snap ASAP on the next tick.\n // Also, because there's some remaining momentum we'll bias the snap in the\n // direction of the ongoing scroll because it's better UX for the scroll to snap\n // in the same direction as the scroll instead of reversing to snap. Therefore,\n // if it's already scrolled more than 20% in the current direction, keep going.\n const snapToThreshold = delta > 0 ? 0.8 : 0.2;\n lastEventBeforeSnap = newEvent;\n recentWheelEvents.splice(0);\n timeout = nextTick(() => {\n swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n }, 0); // no delay; move on next tick\n }\n if (!timeout) {\n // if we get here, then we haven't detected the end of a momentum scroll, so\n // we'll consider a scroll \"complete\" when there haven't been any wheel events\n // for 500ms.\n timeout = nextTick(() => {\n const snapToThreshold = 0.5;\n lastEventBeforeSnap = newEvent;\n recentWheelEvents.splice(0);\n swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n }, 500);\n }\n }\n\n // Emit event\n if (!ignoreWheelEvents) emit('scroll', e);\n\n // Stop autoplay\n if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction)\n swiper.autoplay.stop();\n // Return page scroll on edge positions\n if (position === swiper.minTranslate() || position === swiper.maxTranslate()) return true;\n }\n }\n\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n return false;\n }\n\n function events(method) {\n let target = swiper.$el;\n if (swiper.params.mousewheel.eventsTarget !== 'container') {\n target = $(swiper.params.mousewheel.eventsTarget);\n }\n target[method]('mouseenter', handleMouseEnter);\n target[method]('mouseleave', handleMouseLeave);\n target[method]('wheel', handle);\n }\n\n function enable() {\n if (swiper.params.cssMode) {\n swiper.wrapperEl.removeEventListener('wheel', handle);\n return true;\n }\n if (swiper.mousewheel.enabled) return false;\n events('on');\n swiper.mousewheel.enabled = true;\n return true;\n }\n function disable() {\n if (swiper.params.cssMode) {\n swiper.wrapperEl.addEventListener(event, handle);\n return true;\n }\n if (!swiper.mousewheel.enabled) return false;\n events('off');\n swiper.mousewheel.enabled = false;\n return true;\n }\n\n on('init', () => {\n if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {\n disable();\n }\n if (swiper.params.mousewheel.enabled) enable();\n });\n on('destroy', () => {\n if (swiper.params.cssMode) {\n enable();\n }\n if (swiper.mousewheel.enabled) disable();\n });\n\n Object.assign(swiper.mousewheel, {\n enable,\n disable,\n });\n}\n","import createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\nimport $ from '../../shared/dom.js';\n\nexport default function Navigation({ swiper, extendParams, on, emit }) {\n extendParams({\n navigation: {\n nextEl: null,\n prevEl: null,\n\n hideOnClick: false,\n disabledClass: 'swiper-button-disabled',\n hiddenClass: 'swiper-button-hidden',\n lockClass: 'swiper-button-lock',\n },\n });\n\n swiper.navigation = {\n nextEl: null,\n $nextEl: null,\n prevEl: null,\n $prevEl: null,\n };\n\n function getEl(el) {\n let $el;\n if (el) {\n $el = $(el);\n if (\n swiper.params.uniqueNavElements &&\n typeof el === 'string' &&\n $el.length > 1 &&\n swiper.$el.find(el).length === 1\n ) {\n $el = swiper.$el.find(el);\n }\n }\n return $el;\n }\n\n function toggleEl($el, disabled) {\n const params = swiper.params.navigation;\n if ($el && $el.length > 0) {\n $el[disabled ? 'addClass' : 'removeClass'](params.disabledClass);\n if ($el[0] && $el[0].tagName === 'BUTTON') $el[0].disabled = disabled;\n if (swiper.params.watchOverflow && swiper.enabled) {\n $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n }\n }\n }\n function update() {\n // Update Navigation Buttons\n if (swiper.params.loop) return;\n const { $nextEl, $prevEl } = swiper.navigation;\n\n toggleEl($prevEl, swiper.isBeginning);\n toggleEl($nextEl, swiper.isEnd);\n }\n function onPrevClick(e) {\n e.preventDefault();\n if (swiper.isBeginning && !swiper.params.loop) return;\n swiper.slidePrev();\n }\n function onNextClick(e) {\n e.preventDefault();\n if (swiper.isEnd && !swiper.params.loop) return;\n swiper.slideNext();\n }\n function init() {\n const params = swiper.params.navigation;\n\n swiper.params.navigation = createElementIfNotDefined(\n swiper,\n swiper.originalParams.navigation,\n swiper.params.navigation,\n {\n nextEl: 'swiper-button-next',\n prevEl: 'swiper-button-prev',\n },\n );\n if (!(params.nextEl || params.prevEl)) return;\n\n const $nextEl = getEl(params.nextEl);\n const $prevEl = getEl(params.prevEl);\n\n if ($nextEl && $nextEl.length > 0) {\n $nextEl.on('click', onNextClick);\n }\n if ($prevEl && $prevEl.length > 0) {\n $prevEl.on('click', onPrevClick);\n }\n\n Object.assign(swiper.navigation, {\n $nextEl,\n nextEl: $nextEl && $nextEl[0],\n $prevEl,\n prevEl: $prevEl && $prevEl[0],\n });\n\n if (!swiper.enabled) {\n if ($nextEl) $nextEl.addClass(params.lockClass);\n if ($prevEl) $prevEl.addClass(params.lockClass);\n }\n }\n function destroy() {\n const { $nextEl, $prevEl } = swiper.navigation;\n if ($nextEl && $nextEl.length) {\n $nextEl.off('click', onNextClick);\n $nextEl.removeClass(swiper.params.navigation.disabledClass);\n }\n if ($prevEl && $prevEl.length) {\n $prevEl.off('click', onPrevClick);\n $prevEl.removeClass(swiper.params.navigation.disabledClass);\n }\n }\n\n on('init', () => {\n init();\n update();\n });\n on('toEdge fromEdge lock unlock', () => {\n update();\n });\n on('destroy', () => {\n destroy();\n });\n on('enable disable', () => {\n const { $nextEl, $prevEl } = swiper.navigation;\n if ($nextEl) {\n $nextEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);\n }\n if ($prevEl) {\n $prevEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);\n }\n });\n on('click', (_s, e) => {\n const { $nextEl, $prevEl } = swiper.navigation;\n const targetEl = e.target;\n if (\n swiper.params.navigation.hideOnClick &&\n !$(targetEl).is($prevEl) &&\n !$(targetEl).is($nextEl)\n ) {\n if (\n swiper.pagination &&\n swiper.params.pagination &&\n swiper.params.pagination.clickable &&\n (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))\n )\n return;\n let isHidden;\n if ($nextEl) {\n isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass);\n } else if ($prevEl) {\n isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass);\n }\n if (isHidden === true) {\n emit('navigationShow');\n } else {\n emit('navigationHide');\n }\n if ($nextEl) {\n $nextEl.toggleClass(swiper.params.navigation.hiddenClass);\n }\n if ($prevEl) {\n $prevEl.toggleClass(swiper.params.navigation.hiddenClass);\n }\n }\n });\n\n Object.assign(swiper.navigation, {\n update,\n init,\n destroy,\n });\n}\n","import $ from '../../shared/dom.js';\nimport classesToSelector from '../../shared/classes-to-selector.js';\nimport createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\n\nexport default function Pagination({ swiper, extendParams, on, emit }) {\n const pfx = 'swiper-pagination';\n extendParams({\n pagination: {\n el: null,\n bulletElement: 'span',\n clickable: false,\n hideOnClick: false,\n renderBullet: null,\n renderProgressbar: null,\n renderFraction: null,\n renderCustom: null,\n progressbarOpposite: false,\n type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom'\n dynamicBullets: false,\n dynamicMainBullets: 1,\n formatFractionCurrent: (number) => number,\n formatFractionTotal: (number) => number,\n bulletClass: `${pfx}-bullet`,\n bulletActiveClass: `${pfx}-bullet-active`,\n modifierClass: `${pfx}-`,\n currentClass: `${pfx}-current`,\n totalClass: `${pfx}-total`,\n hiddenClass: `${pfx}-hidden`,\n progressbarFillClass: `${pfx}-progressbar-fill`,\n progressbarOppositeClass: `${pfx}-progressbar-opposite`,\n clickableClass: `${pfx}-clickable`,\n lockClass: `${pfx}-lock`,\n horizontalClass: `${pfx}-horizontal`,\n verticalClass: `${pfx}-vertical`,\n },\n });\n\n swiper.pagination = {\n el: null,\n $el: null,\n bullets: [],\n };\n\n let bulletSize;\n let dynamicBulletIndex = 0;\n\n function isPaginationDisabled() {\n return (\n !swiper.params.pagination.el ||\n !swiper.pagination.el ||\n !swiper.pagination.$el ||\n swiper.pagination.$el.length === 0\n );\n }\n\n function setSideBullets($bulletEl, position) {\n const { bulletActiveClass } = swiper.params.pagination;\n $bulletEl[position]()\n .addClass(`${bulletActiveClass}-${position}`)\n [position]()\n .addClass(`${bulletActiveClass}-${position}-${position}`);\n }\n\n function update() {\n // Render || Update Pagination bullets/items\n const rtl = swiper.rtl;\n const params = swiper.params.pagination;\n if (isPaginationDisabled()) return;\n const slidesLength =\n swiper.virtual && swiper.params.virtual.enabled\n ? swiper.virtual.slides.length\n : swiper.slides.length;\n const $el = swiper.pagination.$el;\n // Current/Total\n let current;\n const total = swiper.params.loop\n ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup)\n : swiper.snapGrid.length;\n if (swiper.params.loop) {\n current = Math.ceil(\n (swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup,\n );\n if (current > slidesLength - 1 - swiper.loopedSlides * 2) {\n current -= slidesLength - swiper.loopedSlides * 2;\n }\n if (current > total - 1) current -= total;\n if (current < 0 && swiper.params.paginationType !== 'bullets') current = total + current;\n } else if (typeof swiper.snapIndex !== 'undefined') {\n current = swiper.snapIndex;\n } else {\n current = swiper.activeIndex || 0;\n }\n // Types\n if (\n params.type === 'bullets' &&\n swiper.pagination.bullets &&\n swiper.pagination.bullets.length > 0\n ) {\n const bullets = swiper.pagination.bullets;\n let firstIndex;\n let lastIndex;\n let midIndex;\n if (params.dynamicBullets) {\n bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);\n $el.css(\n swiper.isHorizontal() ? 'width' : 'height',\n `${bulletSize * (params.dynamicMainBullets + 4)}px`,\n );\n if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {\n dynamicBulletIndex += current - swiper.previousIndex;\n if (dynamicBulletIndex > params.dynamicMainBullets - 1) {\n dynamicBulletIndex = params.dynamicMainBullets - 1;\n } else if (dynamicBulletIndex < 0) {\n dynamicBulletIndex = 0;\n }\n }\n firstIndex = current - dynamicBulletIndex;\n lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);\n midIndex = (lastIndex + firstIndex) / 2;\n }\n bullets.removeClass(\n ['', '-next', '-next-next', '-prev', '-prev-prev', '-main']\n .map((suffix) => `${params.bulletActiveClass}${suffix}`)\n .join(' '),\n );\n if ($el.length > 1) {\n bullets.each((bullet) => {\n const $bullet = $(bullet);\n const bulletIndex = $bullet.index();\n if (bulletIndex === current) {\n $bullet.addClass(params.bulletActiveClass);\n }\n if (params.dynamicBullets) {\n if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {\n $bullet.addClass(`${params.bulletActiveClass}-main`);\n }\n if (bulletIndex === firstIndex) {\n setSideBullets($bullet, 'prev');\n }\n if (bulletIndex === lastIndex) {\n setSideBullets($bullet, 'next');\n }\n }\n });\n } else {\n const $bullet = bullets.eq(current);\n const bulletIndex = $bullet.index();\n $bullet.addClass(params.bulletActiveClass);\n if (params.dynamicBullets) {\n const $firstDisplayedBullet = bullets.eq(firstIndex);\n const $lastDisplayedBullet = bullets.eq(lastIndex);\n for (let i = firstIndex; i <= lastIndex; i += 1) {\n bullets.eq(i).addClass(`${params.bulletActiveClass}-main`);\n }\n if (swiper.params.loop) {\n if (bulletIndex >= bullets.length - params.dynamicMainBullets) {\n for (let i = params.dynamicMainBullets; i >= 0; i -= 1) {\n bullets.eq(bullets.length - i).addClass(`${params.bulletActiveClass}-main`);\n }\n bullets\n .eq(bullets.length - params.dynamicMainBullets - 1)\n .addClass(`${params.bulletActiveClass}-prev`);\n } else {\n setSideBullets($firstDisplayedBullet, 'prev');\n setSideBullets($lastDisplayedBullet, 'next');\n }\n } else {\n setSideBullets($firstDisplayedBullet, 'prev');\n setSideBullets($lastDisplayedBullet, 'next');\n }\n }\n }\n if (params.dynamicBullets) {\n const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);\n const bulletsOffset =\n (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize;\n const offsetProp = rtl ? 'right' : 'left';\n bullets.css(swiper.isHorizontal() ? offsetProp : 'top', `${bulletsOffset}px`);\n }\n }\n if (params.type === 'fraction') {\n $el\n .find(classesToSelector(params.currentClass))\n .text(params.formatFractionCurrent(current + 1));\n $el.find(classesToSelector(params.totalClass)).text(params.formatFractionTotal(total));\n }\n if (params.type === 'progressbar') {\n let progressbarDirection;\n if (params.progressbarOpposite) {\n progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';\n } else {\n progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';\n }\n const scale = (current + 1) / total;\n let scaleX = 1;\n let scaleY = 1;\n if (progressbarDirection === 'horizontal') {\n scaleX = scale;\n } else {\n scaleY = scale;\n }\n $el\n .find(classesToSelector(params.progressbarFillClass))\n .transform(`translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`)\n .transition(swiper.params.speed);\n }\n if (params.type === 'custom' && params.renderCustom) {\n $el.html(params.renderCustom(swiper, current + 1, total));\n emit('paginationRender', $el[0]);\n } else {\n emit('paginationUpdate', $el[0]);\n }\n if (swiper.params.watchOverflow && swiper.enabled) {\n $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n }\n }\n function render() {\n // Render Container\n const params = swiper.params.pagination;\n if (isPaginationDisabled()) return;\n const slidesLength =\n swiper.virtual && swiper.params.virtual.enabled\n ? swiper.virtual.slides.length\n : swiper.slides.length;\n\n const $el = swiper.pagination.$el;\n let paginationHTML = '';\n if (params.type === 'bullets') {\n let numberOfBullets = swiper.params.loop\n ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup)\n : swiper.snapGrid.length;\n if (\n swiper.params.freeMode &&\n swiper.params.freeMode.enabled &&\n !swiper.params.loop &&\n numberOfBullets > slidesLength\n ) {\n numberOfBullets = slidesLength;\n }\n for (let i = 0; i < numberOfBullets; i += 1) {\n if (params.renderBullet) {\n paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);\n } else {\n paginationHTML += `<${params.bulletElement} class=\"${params.bulletClass}\">`;\n }\n }\n $el.html(paginationHTML);\n\n swiper.pagination.bullets = $el.find(classesToSelector(params.bulletClass));\n }\n if (params.type === 'fraction') {\n if (params.renderFraction) {\n paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);\n } else {\n paginationHTML =\n `` +\n ' / ' +\n ``;\n }\n $el.html(paginationHTML);\n }\n if (params.type === 'progressbar') {\n if (params.renderProgressbar) {\n paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);\n } else {\n paginationHTML = ``;\n }\n $el.html(paginationHTML);\n }\n if (params.type !== 'custom') {\n emit('paginationRender', swiper.pagination.$el[0]);\n }\n }\n function init() {\n swiper.params.pagination = createElementIfNotDefined(\n swiper,\n swiper.originalParams.pagination,\n swiper.params.pagination,\n { el: 'swiper-pagination' },\n );\n const params = swiper.params.pagination;\n if (!params.el) return;\n\n let $el = $(params.el);\n if ($el.length === 0) return;\n\n if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1) {\n $el = swiper.$el.find(params.el);\n // check if it belongs to another nested Swiper\n if ($el.length > 1) {\n $el = $el.filter((el) => {\n if ($(el).parents('.swiper')[0] !== swiper.el) return false;\n return true;\n });\n }\n }\n\n if (params.type === 'bullets' && params.clickable) {\n $el.addClass(params.clickableClass);\n }\n\n $el.addClass(params.modifierClass + params.type);\n $el.addClass(params.modifierClass + swiper.params.direction);\n\n if (params.type === 'bullets' && params.dynamicBullets) {\n $el.addClass(`${params.modifierClass}${params.type}-dynamic`);\n dynamicBulletIndex = 0;\n if (params.dynamicMainBullets < 1) {\n params.dynamicMainBullets = 1;\n }\n }\n if (params.type === 'progressbar' && params.progressbarOpposite) {\n $el.addClass(params.progressbarOppositeClass);\n }\n\n if (params.clickable) {\n $el.on('click', classesToSelector(params.bulletClass), function onClick(e) {\n e.preventDefault();\n let index = $(this).index() * swiper.params.slidesPerGroup;\n if (swiper.params.loop) index += swiper.loopedSlides;\n swiper.slideTo(index);\n });\n }\n\n Object.assign(swiper.pagination, {\n $el,\n el: $el[0],\n });\n\n if (!swiper.enabled) {\n $el.addClass(params.lockClass);\n }\n }\n function destroy() {\n const params = swiper.params.pagination;\n if (isPaginationDisabled()) return;\n const $el = swiper.pagination.$el;\n\n $el.removeClass(params.hiddenClass);\n $el.removeClass(params.modifierClass + params.type);\n $el.removeClass(params.modifierClass + swiper.params.direction);\n if (swiper.pagination.bullets && swiper.pagination.bullets.removeClass)\n swiper.pagination.bullets.removeClass(params.bulletActiveClass);\n if (params.clickable) {\n $el.off('click', classesToSelector(params.bulletClass));\n }\n }\n\n on('init', () => {\n init();\n render();\n update();\n });\n on('activeIndexChange', () => {\n if (swiper.params.loop) {\n update();\n } else if (typeof swiper.snapIndex === 'undefined') {\n update();\n }\n });\n on('snapIndexChange', () => {\n if (!swiper.params.loop) {\n update();\n }\n });\n on('slidesLengthChange', () => {\n if (swiper.params.loop) {\n render();\n update();\n }\n });\n on('snapGridLengthChange', () => {\n if (!swiper.params.loop) {\n render();\n update();\n }\n });\n on('destroy', () => {\n destroy();\n });\n on('enable disable', () => {\n const { $el } = swiper.pagination;\n if ($el) {\n $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.pagination.lockClass);\n }\n });\n on('lock unlock', () => {\n update();\n });\n on('click', (_s, e) => {\n const targetEl = e.target;\n const { $el } = swiper.pagination;\n if (\n swiper.params.pagination.el &&\n swiper.params.pagination.hideOnClick &&\n $el.length > 0 &&\n !$(targetEl).hasClass(swiper.params.pagination.bulletClass)\n ) {\n if (\n swiper.navigation &&\n ((swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl) ||\n (swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl))\n )\n return;\n const isHidden = $el.hasClass(swiper.params.pagination.hiddenClass);\n if (isHidden === true) {\n emit('paginationShow');\n } else {\n emit('paginationHide');\n }\n $el.toggleClass(swiper.params.pagination.hiddenClass);\n }\n });\n\n Object.assign(swiper.pagination, {\n render,\n update,\n init,\n destroy,\n });\n}\n","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { nextTick } from '../../shared/utils.js';\nimport createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\n\nexport default function Scrollbar({ swiper, extendParams, on, emit }) {\n const document = getDocument();\n\n let isTouched = false;\n let timeout = null;\n let dragTimeout = null;\n let dragStartPos;\n let dragSize;\n let trackSize;\n let divider;\n\n extendParams({\n scrollbar: {\n el: null,\n dragSize: 'auto',\n hide: false,\n draggable: false,\n snapOnRelease: true,\n lockClass: 'swiper-scrollbar-lock',\n dragClass: 'swiper-scrollbar-drag',\n },\n });\n\n swiper.scrollbar = {\n el: null,\n dragEl: null,\n $el: null,\n $dragEl: null,\n };\n\n function setTranslate() {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n const { scrollbar, rtlTranslate: rtl, progress } = swiper;\n const { $dragEl, $el } = scrollbar;\n const params = swiper.params.scrollbar;\n\n let newSize = dragSize;\n let newPos = (trackSize - dragSize) * progress;\n if (rtl) {\n newPos = -newPos;\n if (newPos > 0) {\n newSize = dragSize - newPos;\n newPos = 0;\n } else if (-newPos + dragSize > trackSize) {\n newSize = trackSize + newPos;\n }\n } else if (newPos < 0) {\n newSize = dragSize + newPos;\n newPos = 0;\n } else if (newPos + dragSize > trackSize) {\n newSize = trackSize - newPos;\n }\n if (swiper.isHorizontal()) {\n $dragEl.transform(`translate3d(${newPos}px, 0, 0)`);\n $dragEl[0].style.width = `${newSize}px`;\n } else {\n $dragEl.transform(`translate3d(0px, ${newPos}px, 0)`);\n $dragEl[0].style.height = `${newSize}px`;\n }\n if (params.hide) {\n clearTimeout(timeout);\n $el[0].style.opacity = 1;\n timeout = setTimeout(() => {\n $el[0].style.opacity = 0;\n $el.transition(400);\n }, 1000);\n }\n }\n function setTransition(duration) {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n swiper.scrollbar.$dragEl.transition(duration);\n }\n function updateSize() {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n\n const { scrollbar } = swiper;\n const { $dragEl, $el } = scrollbar;\n\n $dragEl[0].style.width = '';\n $dragEl[0].style.height = '';\n trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;\n\n divider =\n swiper.size /\n (swiper.virtualSize +\n swiper.params.slidesOffsetBefore -\n (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0));\n if (swiper.params.scrollbar.dragSize === 'auto') {\n dragSize = trackSize * divider;\n } else {\n dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);\n }\n\n if (swiper.isHorizontal()) {\n $dragEl[0].style.width = `${dragSize}px`;\n } else {\n $dragEl[0].style.height = `${dragSize}px`;\n }\n\n if (divider >= 1) {\n $el[0].style.display = 'none';\n } else {\n $el[0].style.display = '';\n }\n if (swiper.params.scrollbar.hide) {\n $el[0].style.opacity = 0;\n }\n\n if (swiper.params.watchOverflow && swiper.enabled) {\n scrollbar.$el[swiper.isLocked ? 'addClass' : 'removeClass'](\n swiper.params.scrollbar.lockClass,\n );\n }\n }\n function getPointerPosition(e) {\n if (swiper.isHorizontal()) {\n return e.type === 'touchstart' || e.type === 'touchmove'\n ? e.targetTouches[0].clientX\n : e.clientX;\n }\n return e.type === 'touchstart' || e.type === 'touchmove'\n ? e.targetTouches[0].clientY\n : e.clientY;\n }\n function setDragPosition(e) {\n const { scrollbar, rtlTranslate: rtl } = swiper;\n const { $el } = scrollbar;\n\n let positionRatio;\n positionRatio =\n (getPointerPosition(e) -\n $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] -\n (dragStartPos !== null ? dragStartPos : dragSize / 2)) /\n (trackSize - dragSize);\n positionRatio = Math.max(Math.min(positionRatio, 1), 0);\n if (rtl) {\n positionRatio = 1 - positionRatio;\n }\n\n const position =\n swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio;\n\n swiper.updateProgress(position);\n swiper.setTranslate(position);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n function onDragStart(e) {\n const params = swiper.params.scrollbar;\n const { scrollbar, $wrapperEl } = swiper;\n const { $el, $dragEl } = scrollbar;\n isTouched = true;\n dragStartPos =\n e.target === $dragEl[0] || e.target === $dragEl\n ? getPointerPosition(e) -\n e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top']\n : null;\n e.preventDefault();\n e.stopPropagation();\n\n $wrapperEl.transition(100);\n $dragEl.transition(100);\n setDragPosition(e);\n\n clearTimeout(dragTimeout);\n\n $el.transition(0);\n if (params.hide) {\n $el.css('opacity', 1);\n }\n if (swiper.params.cssMode) {\n swiper.$wrapperEl.css('scroll-snap-type', 'none');\n }\n emit('scrollbarDragStart', e);\n }\n function onDragMove(e) {\n const { scrollbar, $wrapperEl } = swiper;\n const { $el, $dragEl } = scrollbar;\n\n if (!isTouched) return;\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n setDragPosition(e);\n $wrapperEl.transition(0);\n $el.transition(0);\n $dragEl.transition(0);\n emit('scrollbarDragMove', e);\n }\n function onDragEnd(e) {\n const params = swiper.params.scrollbar;\n const { scrollbar, $wrapperEl } = swiper;\n const { $el } = scrollbar;\n\n if (!isTouched) return;\n isTouched = false;\n if (swiper.params.cssMode) {\n swiper.$wrapperEl.css('scroll-snap-type', '');\n $wrapperEl.transition('');\n }\n if (params.hide) {\n clearTimeout(dragTimeout);\n dragTimeout = nextTick(() => {\n $el.css('opacity', 0);\n $el.transition(400);\n }, 1000);\n }\n emit('scrollbarDragEnd', e);\n if (params.snapOnRelease) {\n swiper.slideToClosest();\n }\n }\n\n function events(method) {\n const { scrollbar, touchEventsTouch, touchEventsDesktop, params, support } = swiper;\n const $el = scrollbar.$el;\n const target = $el[0];\n const activeListener =\n support.passiveListener && params.passiveListeners\n ? { passive: false, capture: false }\n : false;\n const passiveListener =\n support.passiveListener && params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n if (!target) return;\n const eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n if (!support.touch) {\n target[eventMethod](touchEventsDesktop.start, onDragStart, activeListener);\n document[eventMethod](touchEventsDesktop.move, onDragMove, activeListener);\n document[eventMethod](touchEventsDesktop.end, onDragEnd, passiveListener);\n } else {\n target[eventMethod](touchEventsTouch.start, onDragStart, activeListener);\n target[eventMethod](touchEventsTouch.move, onDragMove, activeListener);\n target[eventMethod](touchEventsTouch.end, onDragEnd, passiveListener);\n }\n }\n\n function enableDraggable() {\n if (!swiper.params.scrollbar.el) return;\n events('on');\n }\n function disableDraggable() {\n if (!swiper.params.scrollbar.el) return;\n events('off');\n }\n function init() {\n const { scrollbar, $el: $swiperEl } = swiper;\n swiper.params.scrollbar = createElementIfNotDefined(\n swiper,\n swiper.originalParams.scrollbar,\n swiper.params.scrollbar,\n { el: 'swiper-scrollbar' },\n );\n const params = swiper.params.scrollbar;\n if (!params.el) return;\n\n let $el = $(params.el);\n if (\n swiper.params.uniqueNavElements &&\n typeof params.el === 'string' &&\n $el.length > 1 &&\n $swiperEl.find(params.el).length === 1\n ) {\n $el = $swiperEl.find(params.el);\n }\n\n let $dragEl = $el.find(`.${swiper.params.scrollbar.dragClass}`);\n if ($dragEl.length === 0) {\n $dragEl = $(`
      `);\n $el.append($dragEl);\n }\n\n Object.assign(scrollbar, {\n $el,\n el: $el[0],\n $dragEl,\n dragEl: $dragEl[0],\n });\n\n if (params.draggable) {\n enableDraggable();\n }\n\n if ($el) {\n $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);\n }\n }\n function destroy() {\n disableDraggable();\n }\n\n on('init', () => {\n init();\n updateSize();\n setTranslate();\n });\n on('update resize observerUpdate lock unlock', () => {\n updateSize();\n });\n on('setTranslate', () => {\n setTranslate();\n });\n on('setTransition', (_s, duration) => {\n setTransition(duration);\n });\n on('enable disable', () => {\n const { $el } = swiper.scrollbar;\n if ($el) {\n $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);\n }\n });\n on('destroy', () => {\n destroy();\n });\n\n Object.assign(swiper.scrollbar, {\n updateSize,\n setTranslate,\n init,\n destroy,\n });\n}\n","import $ from '../../shared/dom.js';\n\nexport default function Parallax({ swiper, extendParams, on }) {\n extendParams({\n parallax: {\n enabled: false,\n },\n });\n\n const setTransform = (el, progress) => {\n const { rtl } = swiper;\n\n const $el = $(el);\n const rtlFactor = rtl ? -1 : 1;\n\n const p = $el.attr('data-swiper-parallax') || '0';\n let x = $el.attr('data-swiper-parallax-x');\n let y = $el.attr('data-swiper-parallax-y');\n const scale = $el.attr('data-swiper-parallax-scale');\n const opacity = $el.attr('data-swiper-parallax-opacity');\n\n if (x || y) {\n x = x || '0';\n y = y || '0';\n } else if (swiper.isHorizontal()) {\n x = p;\n y = '0';\n } else {\n y = p;\n x = '0';\n }\n\n if (x.indexOf('%') >= 0) {\n x = `${parseInt(x, 10) * progress * rtlFactor}%`;\n } else {\n x = `${x * progress * rtlFactor}px`;\n }\n if (y.indexOf('%') >= 0) {\n y = `${parseInt(y, 10) * progress}%`;\n } else {\n y = `${y * progress}px`;\n }\n\n if (typeof opacity !== 'undefined' && opacity !== null) {\n const currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress));\n $el[0].style.opacity = currentOpacity;\n }\n if (typeof scale === 'undefined' || scale === null) {\n $el.transform(`translate3d(${x}, ${y}, 0px)`);\n } else {\n const currentScale = scale - (scale - 1) * (1 - Math.abs(progress));\n $el.transform(`translate3d(${x}, ${y}, 0px) scale(${currentScale})`);\n }\n };\n\n const setTranslate = () => {\n const { $el, slides, progress, snapGrid } = swiper;\n $el\n .children(\n '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]',\n )\n .each((el) => {\n setTransform(el, progress);\n });\n slides.each((slideEl, slideIndex) => {\n let slideProgress = slideEl.progress;\n if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {\n slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1);\n }\n slideProgress = Math.min(Math.max(slideProgress, -1), 1);\n $(slideEl)\n .find(\n '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]',\n )\n .each((el) => {\n setTransform(el, slideProgress);\n });\n });\n };\n\n const setTransition = (duration = swiper.params.speed) => {\n const { $el } = swiper;\n $el\n .find(\n '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]',\n )\n .each((parallaxEl) => {\n const $parallaxEl = $(parallaxEl);\n let parallaxDuration =\n parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;\n if (duration === 0) parallaxDuration = 0;\n $parallaxEl.transition(parallaxDuration);\n });\n };\n\n on('beforeInit', () => {\n if (!swiper.params.parallax.enabled) return;\n swiper.params.watchSlidesProgress = true;\n swiper.originalParams.watchSlidesProgress = true;\n });\n on('init', () => {\n if (!swiper.params.parallax.enabled) return;\n setTranslate();\n });\n on('setTranslate', () => {\n if (!swiper.params.parallax.enabled) return;\n setTranslate();\n });\n on('setTransition', (_swiper, duration) => {\n if (!swiper.params.parallax.enabled) return;\n setTransition(duration);\n });\n}\n","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { getTranslate } from '../../shared/utils.js';\n\nexport default function Zoom({ swiper, extendParams, on, emit }) {\n const window = getWindow();\n extendParams({\n zoom: {\n enabled: false,\n maxRatio: 3,\n minRatio: 1,\n toggle: true,\n containerClass: 'swiper-zoom-container',\n zoomedSlideClass: 'swiper-slide-zoomed',\n },\n });\n\n swiper.zoom = {\n enabled: false,\n };\n\n let currentScale = 1;\n let isScaling = false;\n let gesturesEnabled;\n let fakeGestureTouched;\n let fakeGestureMoved;\n const gesture = {\n $slideEl: undefined,\n slideWidth: undefined,\n slideHeight: undefined,\n $imageEl: undefined,\n $imageWrapEl: undefined,\n maxRatio: 3,\n };\n const image = {\n isTouched: undefined,\n isMoved: undefined,\n currentX: undefined,\n currentY: undefined,\n minX: undefined,\n minY: undefined,\n maxX: undefined,\n maxY: undefined,\n width: undefined,\n height: undefined,\n startX: undefined,\n startY: undefined,\n touchesStart: {},\n touchesCurrent: {},\n };\n const velocity = {\n x: undefined,\n y: undefined,\n prevPositionX: undefined,\n prevPositionY: undefined,\n prevTime: undefined,\n };\n\n let scale = 1;\n Object.defineProperty(swiper.zoom, 'scale', {\n get() {\n return scale;\n },\n set(value) {\n if (scale !== value) {\n const imageEl = gesture.$imageEl ? gesture.$imageEl[0] : undefined;\n const slideEl = gesture.$slideEl ? gesture.$slideEl[0] : undefined;\n emit('zoomChange', value, imageEl, slideEl);\n }\n scale = value;\n },\n });\n\n function getDistanceBetweenTouches(e) {\n if (e.targetTouches.length < 2) return 1;\n const x1 = e.targetTouches[0].pageX;\n const y1 = e.targetTouches[0].pageY;\n const x2 = e.targetTouches[1].pageX;\n const y2 = e.targetTouches[1].pageY;\n const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n return distance;\n }\n\n // Events\n function onGestureStart(e) {\n const support = swiper.support;\n const params = swiper.params.zoom;\n fakeGestureTouched = false;\n fakeGestureMoved = false;\n if (!support.gestures) {\n if (e.type !== 'touchstart' || (e.type === 'touchstart' && e.targetTouches.length < 2)) {\n return;\n }\n fakeGestureTouched = true;\n gesture.scaleStart = getDistanceBetweenTouches(e);\n }\n if (!gesture.$slideEl || !gesture.$slideEl.length) {\n gesture.$slideEl = $(e.target).closest(`.${swiper.params.slideClass}`);\n if (gesture.$slideEl.length === 0) gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n gesture.$imageEl = gesture.$slideEl\n .find(`.${params.containerClass}`)\n .eq(0)\n .find('img, svg, canvas, picture, .swiper-zoom-target');\n gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n if (gesture.$imageWrapEl.length === 0) {\n gesture.$imageEl = undefined;\n return;\n }\n }\n if (gesture.$imageEl) {\n gesture.$imageEl.transition(0);\n }\n isScaling = true;\n }\n function onGestureChange(e) {\n const support = swiper.support;\n const params = swiper.params.zoom;\n const zoom = swiper.zoom;\n if (!support.gestures) {\n if (e.type !== 'touchmove' || (e.type === 'touchmove' && e.targetTouches.length < 2)) {\n return;\n }\n fakeGestureMoved = true;\n gesture.scaleMove = getDistanceBetweenTouches(e);\n }\n\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) {\n if (e.type === 'gesturechange') onGestureStart(e);\n return;\n }\n if (support.gestures) {\n zoom.scale = e.scale * currentScale;\n } else {\n zoom.scale = (gesture.scaleMove / gesture.scaleStart) * currentScale;\n }\n if (zoom.scale > gesture.maxRatio) {\n zoom.scale = gesture.maxRatio - 1 + (zoom.scale - gesture.maxRatio + 1) ** 0.5;\n }\n if (zoom.scale < params.minRatio) {\n zoom.scale = params.minRatio + 1 - (params.minRatio - zoom.scale + 1) ** 0.5;\n }\n gesture.$imageEl.transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n }\n function onGestureEnd(e) {\n const device = swiper.device;\n const support = swiper.support;\n const params = swiper.params.zoom;\n const zoom = swiper.zoom;\n if (!support.gestures) {\n if (!fakeGestureTouched || !fakeGestureMoved) {\n return;\n }\n if (\n e.type !== 'touchend' ||\n (e.type === 'touchend' && e.changedTouches.length < 2 && !device.android)\n ) {\n return;\n }\n fakeGestureTouched = false;\n fakeGestureMoved = false;\n }\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);\n gesture.$imageEl\n .transition(swiper.params.speed)\n .transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n currentScale = zoom.scale;\n isScaling = false;\n if (zoom.scale === 1) gesture.$slideEl = undefined;\n }\n function onTouchStart(e) {\n const device = swiper.device;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n if (image.isTouched) return;\n if (device.android && e.cancelable) e.preventDefault();\n image.isTouched = true;\n image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n }\n function onTouchMove(e) {\n const zoom = swiper.zoom;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n swiper.allowClick = false;\n if (!image.isTouched || !gesture.$slideEl) return;\n\n if (!image.isMoved) {\n image.width = gesture.$imageEl[0].offsetWidth;\n image.height = gesture.$imageEl[0].offsetHeight;\n image.startX = getTranslate(gesture.$imageWrapEl[0], 'x') || 0;\n image.startY = getTranslate(gesture.$imageWrapEl[0], 'y') || 0;\n gesture.slideWidth = gesture.$slideEl[0].offsetWidth;\n gesture.slideHeight = gesture.$slideEl[0].offsetHeight;\n gesture.$imageWrapEl.transition(0);\n }\n // Define if we need image drag\n const scaledWidth = image.width * zoom.scale;\n const scaledHeight = image.height * zoom.scale;\n\n if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) return;\n\n image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n image.maxX = -image.minX;\n image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n image.maxY = -image.minY;\n\n image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n\n if (!image.isMoved && !isScaling) {\n if (\n swiper.isHorizontal() &&\n ((Math.floor(image.minX) === Math.floor(image.startX) &&\n image.touchesCurrent.x < image.touchesStart.x) ||\n (Math.floor(image.maxX) === Math.floor(image.startX) &&\n image.touchesCurrent.x > image.touchesStart.x))\n ) {\n image.isTouched = false;\n return;\n }\n if (\n !swiper.isHorizontal() &&\n ((Math.floor(image.minY) === Math.floor(image.startY) &&\n image.touchesCurrent.y < image.touchesStart.y) ||\n (Math.floor(image.maxY) === Math.floor(image.startY) &&\n image.touchesCurrent.y > image.touchesStart.y))\n ) {\n image.isTouched = false;\n return;\n }\n }\n if (e.cancelable) {\n e.preventDefault();\n }\n e.stopPropagation();\n\n image.isMoved = true;\n image.currentX = image.touchesCurrent.x - image.touchesStart.x + image.startX;\n image.currentY = image.touchesCurrent.y - image.touchesStart.y + image.startY;\n\n if (image.currentX < image.minX) {\n image.currentX = image.minX + 1 - (image.minX - image.currentX + 1) ** 0.8;\n }\n if (image.currentX > image.maxX) {\n image.currentX = image.maxX - 1 + (image.currentX - image.maxX + 1) ** 0.8;\n }\n\n if (image.currentY < image.minY) {\n image.currentY = image.minY + 1 - (image.minY - image.currentY + 1) ** 0.8;\n }\n if (image.currentY > image.maxY) {\n image.currentY = image.maxY - 1 + (image.currentY - image.maxY + 1) ** 0.8;\n }\n\n // Velocity\n if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x;\n if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y;\n if (!velocity.prevTime) velocity.prevTime = Date.now();\n velocity.x =\n (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;\n velocity.y =\n (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;\n if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0;\n if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0;\n velocity.prevPositionX = image.touchesCurrent.x;\n velocity.prevPositionY = image.touchesCurrent.y;\n velocity.prevTime = Date.now();\n\n gesture.$imageWrapEl.transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`);\n }\n function onTouchEnd() {\n const zoom = swiper.zoom;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n if (!image.isTouched || !image.isMoved) {\n image.isTouched = false;\n image.isMoved = false;\n return;\n }\n image.isTouched = false;\n image.isMoved = false;\n let momentumDurationX = 300;\n let momentumDurationY = 300;\n const momentumDistanceX = velocity.x * momentumDurationX;\n const newPositionX = image.currentX + momentumDistanceX;\n const momentumDistanceY = velocity.y * momentumDurationY;\n const newPositionY = image.currentY + momentumDistanceY;\n\n // Fix duration\n if (velocity.x !== 0)\n momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x);\n if (velocity.y !== 0)\n momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y);\n const momentumDuration = Math.max(momentumDurationX, momentumDurationY);\n\n image.currentX = newPositionX;\n image.currentY = newPositionY;\n\n // Define if we need image drag\n const scaledWidth = image.width * zoom.scale;\n const scaledHeight = image.height * zoom.scale;\n image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n image.maxX = -image.minX;\n image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n image.maxY = -image.minY;\n image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);\n image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);\n\n gesture.$imageWrapEl\n .transition(momentumDuration)\n .transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`);\n }\n function onTransitionEnd() {\n const zoom = swiper.zoom;\n if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) {\n if (gesture.$imageEl) {\n gesture.$imageEl.transform('translate3d(0,0,0) scale(1)');\n }\n if (gesture.$imageWrapEl) {\n gesture.$imageWrapEl.transform('translate3d(0,0,0)');\n }\n\n zoom.scale = 1;\n currentScale = 1;\n\n gesture.$slideEl = undefined;\n gesture.$imageEl = undefined;\n gesture.$imageWrapEl = undefined;\n }\n }\n\n function zoomIn(e) {\n const zoom = swiper.zoom;\n const params = swiper.params.zoom;\n\n if (!gesture.$slideEl) {\n if (e && e.target) {\n gesture.$slideEl = $(e.target).closest(`.${swiper.params.slideClass}`);\n }\n if (!gesture.$slideEl) {\n if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`);\n } else {\n gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n }\n }\n\n gesture.$imageEl = gesture.$slideEl\n .find(`.${params.containerClass}`)\n .eq(0)\n .find('img, svg, canvas, picture, .swiper-zoom-target');\n gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n }\n if (\n !gesture.$imageEl ||\n gesture.$imageEl.length === 0 ||\n !gesture.$imageWrapEl ||\n gesture.$imageWrapEl.length === 0\n )\n return;\n if (swiper.params.cssMode) {\n swiper.wrapperEl.style.overflow = 'hidden';\n swiper.wrapperEl.style.touchAction = 'none';\n }\n\n gesture.$slideEl.addClass(`${params.zoomedSlideClass}`);\n\n let touchX;\n let touchY;\n let offsetX;\n let offsetY;\n let diffX;\n let diffY;\n let translateX;\n let translateY;\n let imageWidth;\n let imageHeight;\n let scaledWidth;\n let scaledHeight;\n let translateMinX;\n let translateMinY;\n let translateMaxX;\n let translateMaxY;\n let slideWidth;\n let slideHeight;\n\n if (typeof image.touchesStart.x === 'undefined' && e) {\n touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;\n touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;\n } else {\n touchX = image.touchesStart.x;\n touchY = image.touchesStart.y;\n }\n\n zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n if (e) {\n slideWidth = gesture.$slideEl[0].offsetWidth;\n slideHeight = gesture.$slideEl[0].offsetHeight;\n offsetX = gesture.$slideEl.offset().left + window.scrollX;\n offsetY = gesture.$slideEl.offset().top + window.scrollY;\n diffX = offsetX + slideWidth / 2 - touchX;\n diffY = offsetY + slideHeight / 2 - touchY;\n\n imageWidth = gesture.$imageEl[0].offsetWidth;\n imageHeight = gesture.$imageEl[0].offsetHeight;\n scaledWidth = imageWidth * zoom.scale;\n scaledHeight = imageHeight * zoom.scale;\n\n translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0);\n translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0);\n translateMaxX = -translateMinX;\n translateMaxY = -translateMinY;\n\n translateX = diffX * zoom.scale;\n translateY = diffY * zoom.scale;\n\n if (translateX < translateMinX) {\n translateX = translateMinX;\n }\n if (translateX > translateMaxX) {\n translateX = translateMaxX;\n }\n\n if (translateY < translateMinY) {\n translateY = translateMinY;\n }\n if (translateY > translateMaxY) {\n translateY = translateMaxY;\n }\n } else {\n translateX = 0;\n translateY = 0;\n }\n gesture.$imageWrapEl\n .transition(300)\n .transform(`translate3d(${translateX}px, ${translateY}px,0)`);\n gesture.$imageEl.transition(300).transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n }\n function zoomOut() {\n const zoom = swiper.zoom;\n const params = swiper.params.zoom;\n\n if (!gesture.$slideEl) {\n if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`);\n } else {\n gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n }\n gesture.$imageEl = gesture.$slideEl\n .find(`.${params.containerClass}`)\n .eq(0)\n .find('img, svg, canvas, picture, .swiper-zoom-target');\n gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n }\n if (\n !gesture.$imageEl ||\n gesture.$imageEl.length === 0 ||\n !gesture.$imageWrapEl ||\n gesture.$imageWrapEl.length === 0\n )\n return;\n if (swiper.params.cssMode) {\n swiper.wrapperEl.style.overflow = '';\n swiper.wrapperEl.style.touchAction = '';\n }\n zoom.scale = 1;\n currentScale = 1;\n gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)');\n gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)');\n gesture.$slideEl.removeClass(`${params.zoomedSlideClass}`);\n gesture.$slideEl = undefined;\n }\n\n // Toggle Zoom\n function zoomToggle(e) {\n const zoom = swiper.zoom;\n\n if (zoom.scale && zoom.scale !== 1) {\n // Zoom Out\n zoomOut();\n } else {\n // Zoom In\n zoomIn(e);\n }\n }\n\n function getListeners() {\n const support = swiper.support;\n const passiveListener =\n swiper.touchEvents.start === 'touchstart' &&\n support.passiveListener &&\n swiper.params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n const activeListenerWithCapture = support.passiveListener\n ? { passive: false, capture: true }\n : true;\n return { passiveListener, activeListenerWithCapture };\n }\n\n function getSlideSelector() {\n return `.${swiper.params.slideClass}`;\n }\n\n function toggleGestures(method) {\n const { passiveListener } = getListeners();\n const slideSelector = getSlideSelector();\n swiper.$wrapperEl[method]('gesturestart', slideSelector, onGestureStart, passiveListener);\n swiper.$wrapperEl[method]('gesturechange', slideSelector, onGestureChange, passiveListener);\n swiper.$wrapperEl[method]('gestureend', slideSelector, onGestureEnd, passiveListener);\n }\n function enableGestures() {\n if (gesturesEnabled) return;\n gesturesEnabled = true;\n toggleGestures('on');\n }\n function disableGestures() {\n if (!gesturesEnabled) return;\n gesturesEnabled = false;\n toggleGestures('off');\n }\n\n // Attach/Detach Events\n function enable() {\n const zoom = swiper.zoom;\n if (zoom.enabled) return;\n zoom.enabled = true;\n const support = swiper.support;\n const { passiveListener, activeListenerWithCapture } = getListeners();\n const slideSelector = getSlideSelector();\n\n // Scale image\n if (support.gestures) {\n swiper.$wrapperEl.on(swiper.touchEvents.start, enableGestures, passiveListener);\n swiper.$wrapperEl.on(swiper.touchEvents.end, disableGestures, passiveListener);\n } else if (swiper.touchEvents.start === 'touchstart') {\n swiper.$wrapperEl.on(\n swiper.touchEvents.start,\n slideSelector,\n onGestureStart,\n passiveListener,\n );\n swiper.$wrapperEl.on(\n swiper.touchEvents.move,\n slideSelector,\n onGestureChange,\n activeListenerWithCapture,\n );\n swiper.$wrapperEl.on(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener);\n if (swiper.touchEvents.cancel) {\n swiper.$wrapperEl.on(\n swiper.touchEvents.cancel,\n slideSelector,\n onGestureEnd,\n passiveListener,\n );\n }\n }\n\n // Move image\n swiper.$wrapperEl.on(\n swiper.touchEvents.move,\n `.${swiper.params.zoom.containerClass}`,\n onTouchMove,\n activeListenerWithCapture,\n );\n }\n function disable() {\n const zoom = swiper.zoom;\n if (!zoom.enabled) return;\n const support = swiper.support;\n zoom.enabled = false;\n\n const { passiveListener, activeListenerWithCapture } = getListeners();\n const slideSelector = getSlideSelector();\n\n // Scale image\n if (support.gestures) {\n swiper.$wrapperEl.off(swiper.touchEvents.start, enableGestures, passiveListener);\n swiper.$wrapperEl.off(swiper.touchEvents.end, disableGestures, passiveListener);\n } else if (swiper.touchEvents.start === 'touchstart') {\n swiper.$wrapperEl.off(\n swiper.touchEvents.start,\n slideSelector,\n onGestureStart,\n passiveListener,\n );\n swiper.$wrapperEl.off(\n swiper.touchEvents.move,\n slideSelector,\n onGestureChange,\n activeListenerWithCapture,\n );\n swiper.$wrapperEl.off(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener);\n if (swiper.touchEvents.cancel) {\n swiper.$wrapperEl.off(\n swiper.touchEvents.cancel,\n slideSelector,\n onGestureEnd,\n passiveListener,\n );\n }\n }\n\n // Move image\n swiper.$wrapperEl.off(\n swiper.touchEvents.move,\n `.${swiper.params.zoom.containerClass}`,\n onTouchMove,\n activeListenerWithCapture,\n );\n }\n\n on('init', () => {\n if (swiper.params.zoom.enabled) {\n enable();\n }\n });\n on('destroy', () => {\n disable();\n });\n on('touchStart', (_s, e) => {\n if (!swiper.zoom.enabled) return;\n onTouchStart(e);\n });\n on('touchEnd', (_s, e) => {\n if (!swiper.zoom.enabled) return;\n onTouchEnd(e);\n });\n on('doubleTap', (_s, e) => {\n if (\n !swiper.animating &&\n swiper.params.zoom.enabled &&\n swiper.zoom.enabled &&\n swiper.params.zoom.toggle\n ) {\n zoomToggle(e);\n }\n });\n on('transitionEnd', () => {\n if (swiper.zoom.enabled && swiper.params.zoom.enabled) {\n onTransitionEnd();\n }\n });\n on('slideChange', () => {\n if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) {\n onTransitionEnd();\n }\n });\n\n Object.assign(swiper.zoom, {\n enable,\n disable,\n in: zoomIn,\n out: zoomOut,\n toggle: zoomToggle,\n });\n}\n","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function Lazy({ swiper, extendParams, on, emit }) {\n extendParams({\n lazy: {\n checkInView: false,\n enabled: false,\n loadPrevNext: false,\n loadPrevNextAmount: 1,\n loadOnTransitionStart: false,\n scrollingElement: '',\n\n elementClass: 'swiper-lazy',\n loadingClass: 'swiper-lazy-loading',\n loadedClass: 'swiper-lazy-loaded',\n preloaderClass: 'swiper-lazy-preloader',\n },\n });\n\n swiper.lazy = {};\n\n let scrollHandlerAttached = false;\n let initialImageLoaded = false;\n\n function loadInSlide(index, loadInDuplicate = true) {\n const params = swiper.params.lazy;\n if (typeof index === 'undefined') return;\n if (swiper.slides.length === 0) return;\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n\n const $slideEl = isVirtual\n ? swiper.$wrapperEl.children(\n `.${swiper.params.slideClass}[data-swiper-slide-index=\"${index}\"]`,\n )\n : swiper.slides.eq(index);\n\n const $images = $slideEl.find(\n `.${params.elementClass}:not(.${params.loadedClass}):not(.${params.loadingClass})`,\n );\n if (\n $slideEl.hasClass(params.elementClass) &&\n !$slideEl.hasClass(params.loadedClass) &&\n !$slideEl.hasClass(params.loadingClass)\n ) {\n $images.push($slideEl[0]);\n }\n if ($images.length === 0) return;\n\n $images.each((imageEl) => {\n const $imageEl = $(imageEl);\n $imageEl.addClass(params.loadingClass);\n\n const background = $imageEl.attr('data-background');\n const src = $imageEl.attr('data-src');\n const srcset = $imageEl.attr('data-srcset');\n const sizes = $imageEl.attr('data-sizes');\n const $pictureEl = $imageEl.parent('picture');\n\n swiper.loadImage($imageEl[0], src || background, srcset, sizes, false, () => {\n if (\n typeof swiper === 'undefined' ||\n swiper === null ||\n !swiper ||\n (swiper && !swiper.params) ||\n swiper.destroyed\n )\n return;\n if (background) {\n $imageEl.css('background-image', `url(\"${background}\")`);\n $imageEl.removeAttr('data-background');\n } else {\n if (srcset) {\n $imageEl.attr('srcset', srcset);\n $imageEl.removeAttr('data-srcset');\n }\n if (sizes) {\n $imageEl.attr('sizes', sizes);\n $imageEl.removeAttr('data-sizes');\n }\n if ($pictureEl.length) {\n $pictureEl.children('source').each((sourceEl) => {\n const $source = $(sourceEl);\n\n if ($source.attr('data-srcset')) {\n $source.attr('srcset', $source.attr('data-srcset'));\n $source.removeAttr('data-srcset');\n }\n });\n }\n if (src) {\n $imageEl.attr('src', src);\n $imageEl.removeAttr('data-src');\n }\n }\n\n $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass);\n $slideEl.find(`.${params.preloaderClass}`).remove();\n if (swiper.params.loop && loadInDuplicate) {\n const slideOriginalIndex = $slideEl.attr('data-swiper-slide-index');\n if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) {\n const originalSlide = swiper.$wrapperEl.children(\n `[data-swiper-slide-index=\"${slideOriginalIndex}\"]:not(.${swiper.params.slideDuplicateClass})`,\n );\n loadInSlide(originalSlide.index(), false);\n } else {\n const duplicatedSlide = swiper.$wrapperEl.children(\n `.${swiper.params.slideDuplicateClass}[data-swiper-slide-index=\"${slideOriginalIndex}\"]`,\n );\n loadInSlide(duplicatedSlide.index(), false);\n }\n }\n emit('lazyImageReady', $slideEl[0], $imageEl[0]);\n if (swiper.params.autoHeight) {\n swiper.updateAutoHeight();\n }\n });\n\n emit('lazyImageLoad', $slideEl[0], $imageEl[0]);\n });\n }\n\n function load() {\n const { $wrapperEl, params: swiperParams, slides, activeIndex } = swiper;\n const isVirtual = swiper.virtual && swiperParams.virtual.enabled;\n const params = swiperParams.lazy;\n\n let slidesPerView = swiperParams.slidesPerView;\n if (slidesPerView === 'auto') {\n slidesPerView = 0;\n }\n\n function slideExist(index) {\n if (isVirtual) {\n if (\n $wrapperEl.children(`.${swiperParams.slideClass}[data-swiper-slide-index=\"${index}\"]`)\n .length\n ) {\n return true;\n }\n } else if (slides[index]) return true;\n return false;\n }\n\n function slideIndex(slideEl) {\n if (isVirtual) {\n return $(slideEl).attr('data-swiper-slide-index');\n }\n return $(slideEl).index();\n }\n\n if (!initialImageLoaded) initialImageLoaded = true;\n if (swiper.params.watchSlidesProgress) {\n $wrapperEl.children(`.${swiperParams.slideVisibleClass}`).each((slideEl) => {\n const index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index();\n loadInSlide(index);\n });\n } else if (slidesPerView > 1) {\n for (let i = activeIndex; i < activeIndex + slidesPerView; i += 1) {\n if (slideExist(i)) loadInSlide(i);\n }\n } else {\n loadInSlide(activeIndex);\n }\n if (params.loadPrevNext) {\n if (slidesPerView > 1 || (params.loadPrevNextAmount && params.loadPrevNextAmount > 1)) {\n const amount = params.loadPrevNextAmount;\n const spv = slidesPerView;\n const maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length);\n const minIndex = Math.max(activeIndex - Math.max(spv, amount), 0);\n // Next Slides\n for (let i = activeIndex + slidesPerView; i < maxIndex; i += 1) {\n if (slideExist(i)) loadInSlide(i);\n }\n // Prev Slides\n for (let i = minIndex; i < activeIndex; i += 1) {\n if (slideExist(i)) loadInSlide(i);\n }\n } else {\n const nextSlide = $wrapperEl.children(`.${swiperParams.slideNextClass}`);\n if (nextSlide.length > 0) loadInSlide(slideIndex(nextSlide));\n\n const prevSlide = $wrapperEl.children(`.${swiperParams.slidePrevClass}`);\n if (prevSlide.length > 0) loadInSlide(slideIndex(prevSlide));\n }\n }\n }\n function checkInViewOnLoad() {\n const window = getWindow();\n if (!swiper || swiper.destroyed) return;\n const $scrollElement = swiper.params.lazy.scrollingElement\n ? $(swiper.params.lazy.scrollingElement)\n : $(window);\n const isWindow = $scrollElement[0] === window;\n const scrollElementWidth = isWindow ? window.innerWidth : $scrollElement[0].offsetWidth;\n const scrollElementHeight = isWindow ? window.innerHeight : $scrollElement[0].offsetHeight;\n const swiperOffset = swiper.$el.offset();\n const { rtlTranslate: rtl } = swiper;\n\n let inView = false;\n\n if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft;\n const swiperCoord = [\n [swiperOffset.left, swiperOffset.top],\n [swiperOffset.left + swiper.width, swiperOffset.top],\n [swiperOffset.left, swiperOffset.top + swiper.height],\n [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height],\n ];\n for (let i = 0; i < swiperCoord.length; i += 1) {\n const point = swiperCoord[i];\n if (\n point[0] >= 0 &&\n point[0] <= scrollElementWidth &&\n point[1] >= 0 &&\n point[1] <= scrollElementHeight\n ) {\n if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line\n inView = true;\n }\n }\n\n const passiveListener =\n swiper.touchEvents.start === 'touchstart' &&\n swiper.support.passiveListener &&\n swiper.params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n\n if (inView) {\n load();\n $scrollElement.off('scroll', checkInViewOnLoad, passiveListener);\n } else if (!scrollHandlerAttached) {\n scrollHandlerAttached = true;\n $scrollElement.on('scroll', checkInViewOnLoad, passiveListener);\n }\n }\n\n on('beforeInit', () => {\n if (swiper.params.lazy.enabled && swiper.params.preloadImages) {\n swiper.params.preloadImages = false;\n }\n });\n on('init', () => {\n if (swiper.params.lazy.enabled) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n });\n on('scroll', () => {\n if (\n swiper.params.freeMode &&\n swiper.params.freeMode.enabled &&\n !swiper.params.freeMode.sticky\n ) {\n load();\n }\n });\n on('scrollbarDragMove resize _freeModeNoMomentumRelease', () => {\n if (swiper.params.lazy.enabled) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n });\n on('transitionStart', () => {\n if (swiper.params.lazy.enabled) {\n if (\n swiper.params.lazy.loadOnTransitionStart ||\n (!swiper.params.lazy.loadOnTransitionStart && !initialImageLoaded)\n ) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n }\n });\n on('transitionEnd', () => {\n if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n });\n on('slideChange', () => {\n const { lazy, cssMode, watchSlidesProgress, touchReleaseOnEdges, resistanceRatio } =\n swiper.params;\n if (\n lazy.enabled &&\n (cssMode || (watchSlidesProgress && (touchReleaseOnEdges || resistanceRatio === 0)))\n ) {\n load();\n }\n });\n\n Object.assign(swiper.lazy, {\n load,\n loadInSlide,\n });\n}\n","/* eslint no-bitwise: [\"error\", { \"allow\": [\">>\"] }] */\nimport { nextTick } from '../../shared/utils.js';\n\nexport default function Controller({ swiper, extendParams, on }) {\n extendParams({\n controller: {\n control: undefined,\n inverse: false,\n by: 'slide', // or 'container'\n },\n });\n\n swiper.controller = {\n control: undefined,\n };\n\n function LinearSpline(x, y) {\n const binarySearch = (function search() {\n let maxIndex;\n let minIndex;\n let guess;\n return (array, val) => {\n minIndex = -1;\n maxIndex = array.length;\n while (maxIndex - minIndex > 1) {\n guess = (maxIndex + minIndex) >> 1;\n if (array[guess] <= val) {\n minIndex = guess;\n } else {\n maxIndex = guess;\n }\n }\n return maxIndex;\n };\n })();\n this.x = x;\n this.y = y;\n this.lastIndex = x.length - 1;\n // Given an x value (x2), return the expected y2 value:\n // (x1,y1) is the known point before given value,\n // (x3,y3) is the known point after given value.\n let i1;\n let i3;\n\n this.interpolate = function interpolate(x2) {\n if (!x2) return 0;\n\n // Get the indexes of x1 and x3 (the array indexes before and after given x2):\n i3 = binarySearch(this.x, x2);\n i1 = i3 - 1;\n\n // We have our indexes i1 & i3, so we can calculate already:\n // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1\n return (\n ((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1]) + this.y[i1]\n );\n };\n return this;\n }\n // xxx: for now i will just save one spline function to to\n function getInterpolateFunction(c) {\n if (!swiper.controller.spline) {\n swiper.controller.spline = swiper.params.loop\n ? new LinearSpline(swiper.slidesGrid, c.slidesGrid)\n : new LinearSpline(swiper.snapGrid, c.snapGrid);\n }\n }\n function setTranslate(_t, byController) {\n const controlled = swiper.controller.control;\n let multiplier;\n let controlledTranslate;\n const Swiper = swiper.constructor;\n function setControlledTranslate(c) {\n // this will create an Interpolate function based on the snapGrids\n // x is the Grid of the scrolled scroller and y will be the controlled scroller\n // it makes sense to create this only once and recall it for the interpolation\n // the function does a lot of value caching for performance\n const translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;\n if (swiper.params.controller.by === 'slide') {\n getInterpolateFunction(c);\n // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid\n // but it did not work out\n controlledTranslate = -swiper.controller.spline.interpolate(-translate);\n }\n\n if (!controlledTranslate || swiper.params.controller.by === 'container') {\n multiplier =\n (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());\n controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate();\n }\n\n if (swiper.params.controller.inverse) {\n controlledTranslate = c.maxTranslate() - controlledTranslate;\n }\n c.updateProgress(controlledTranslate);\n c.setTranslate(controlledTranslate, swiper);\n c.updateActiveIndex();\n c.updateSlidesClasses();\n }\n if (Array.isArray(controlled)) {\n for (let i = 0; i < controlled.length; i += 1) {\n if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n setControlledTranslate(controlled[i]);\n }\n }\n } else if (controlled instanceof Swiper && byController !== controlled) {\n setControlledTranslate(controlled);\n }\n }\n function setTransition(duration, byController) {\n const Swiper = swiper.constructor;\n const controlled = swiper.controller.control;\n let i;\n function setControlledTransition(c) {\n c.setTransition(duration, swiper);\n if (duration !== 0) {\n c.transitionStart();\n if (c.params.autoHeight) {\n nextTick(() => {\n c.updateAutoHeight();\n });\n }\n c.$wrapperEl.transitionEnd(() => {\n if (!controlled) return;\n if (c.params.loop && swiper.params.controller.by === 'slide') {\n c.loopFix();\n }\n c.transitionEnd();\n });\n }\n }\n if (Array.isArray(controlled)) {\n for (i = 0; i < controlled.length; i += 1) {\n if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n setControlledTransition(controlled[i]);\n }\n }\n } else if (controlled instanceof Swiper && byController !== controlled) {\n setControlledTransition(controlled);\n }\n }\n\n function removeSpline() {\n if (!swiper.controller.control) return;\n if (swiper.controller.spline) {\n swiper.controller.spline = undefined;\n delete swiper.controller.spline;\n }\n }\n on('beforeInit', () => {\n swiper.controller.control = swiper.params.controller.control;\n });\n on('update', () => {\n removeSpline();\n });\n on('resize', () => {\n removeSpline();\n });\n on('observerUpdate', () => {\n removeSpline();\n });\n on('setTranslate', (_s, translate, byController) => {\n if (!swiper.controller.control) return;\n swiper.controller.setTranslate(translate, byController);\n });\n on('setTransition', (_s, duration, byController) => {\n if (!swiper.controller.control) return;\n swiper.controller.setTransition(duration, byController);\n });\n\n Object.assign(swiper.controller, {\n setTranslate,\n setTransition,\n });\n}\n","import classesToSelector from '../../shared/classes-to-selector.js';\nimport $ from '../../shared/dom.js';\n\nexport default function A11y({ swiper, extendParams, on }) {\n extendParams({\n a11y: {\n enabled: true,\n notificationClass: 'swiper-notification',\n prevSlideMessage: 'Previous slide',\n nextSlideMessage: 'Next slide',\n firstSlideMessage: 'This is the first slide',\n lastSlideMessage: 'This is the last slide',\n paginationBulletMessage: 'Go to slide {{index}}',\n slideLabelMessage: '{{index}} / {{slidesLength}}',\n containerMessage: null,\n containerRoleDescriptionMessage: null,\n itemRoleDescriptionMessage: null,\n slideRole: 'group',\n },\n });\n\n let liveRegion = null;\n\n function notify(message) {\n const notification = liveRegion;\n if (notification.length === 0) return;\n notification.html('');\n notification.html(message);\n }\n\n function getRandomNumber(size = 16) {\n const randomChar = () => Math.round(16 * Math.random()).toString(16);\n return 'x'.repeat(size).replace(/x/g, randomChar);\n }\n function makeElFocusable($el) {\n $el.attr('tabIndex', '0');\n }\n function makeElNotFocusable($el) {\n $el.attr('tabIndex', '-1');\n }\n function addElRole($el, role) {\n $el.attr('role', role);\n }\n function addElRoleDescription($el, description) {\n $el.attr('aria-roledescription', description);\n }\n function addElControls($el, controls) {\n $el.attr('aria-controls', controls);\n }\n function addElLabel($el, label) {\n $el.attr('aria-label', label);\n }\n function addElId($el, id) {\n $el.attr('id', id);\n }\n function addElLive($el, live) {\n $el.attr('aria-live', live);\n }\n function disableEl($el) {\n $el.attr('aria-disabled', true);\n }\n function enableEl($el) {\n $el.attr('aria-disabled', false);\n }\n\n function onEnterOrSpaceKey(e) {\n if (e.keyCode !== 13 && e.keyCode !== 32) return;\n const params = swiper.params.a11y;\n const $targetEl = $(e.target);\n if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {\n if (!(swiper.isEnd && !swiper.params.loop)) {\n swiper.slideNext();\n }\n if (swiper.isEnd) {\n notify(params.lastSlideMessage);\n } else {\n notify(params.nextSlideMessage);\n }\n }\n if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {\n if (!(swiper.isBeginning && !swiper.params.loop)) {\n swiper.slidePrev();\n }\n if (swiper.isBeginning) {\n notify(params.firstSlideMessage);\n } else {\n notify(params.prevSlideMessage);\n }\n }\n\n if (\n swiper.pagination &&\n $targetEl.is(classesToSelector(swiper.params.pagination.bulletClass))\n ) {\n $targetEl[0].click();\n }\n }\n\n function updateNavigation() {\n if (swiper.params.loop || !swiper.navigation) return;\n const { $nextEl, $prevEl } = swiper.navigation;\n\n if ($prevEl && $prevEl.length > 0) {\n if (swiper.isBeginning) {\n disableEl($prevEl);\n makeElNotFocusable($prevEl);\n } else {\n enableEl($prevEl);\n makeElFocusable($prevEl);\n }\n }\n if ($nextEl && $nextEl.length > 0) {\n if (swiper.isEnd) {\n disableEl($nextEl);\n makeElNotFocusable($nextEl);\n } else {\n enableEl($nextEl);\n makeElFocusable($nextEl);\n }\n }\n }\n\n function hasPagination() {\n return (\n swiper.pagination &&\n swiper.params.pagination.clickable &&\n swiper.pagination.bullets &&\n swiper.pagination.bullets.length\n );\n }\n\n function updatePagination() {\n const params = swiper.params.a11y;\n if (hasPagination()) {\n swiper.pagination.bullets.each((bulletEl) => {\n const $bulletEl = $(bulletEl);\n makeElFocusable($bulletEl);\n if (!swiper.params.pagination.renderBullet) {\n addElRole($bulletEl, 'button');\n addElLabel(\n $bulletEl,\n params.paginationBulletMessage.replace(/\\{\\{index\\}\\}/, $bulletEl.index() + 1),\n );\n }\n });\n }\n }\n\n const initNavEl = ($el, wrapperId, message) => {\n makeElFocusable($el);\n if ($el[0].tagName !== 'BUTTON') {\n addElRole($el, 'button');\n $el.on('keydown', onEnterOrSpaceKey);\n }\n addElLabel($el, message);\n addElControls($el, wrapperId);\n };\n\n function init() {\n const params = swiper.params.a11y;\n\n swiper.$el.append(liveRegion);\n\n // Container\n const $containerEl = swiper.$el;\n if (params.containerRoleDescriptionMessage) {\n addElRoleDescription($containerEl, params.containerRoleDescriptionMessage);\n }\n if (params.containerMessage) {\n addElLabel($containerEl, params.containerMessage);\n }\n\n // Wrapper\n const $wrapperEl = swiper.$wrapperEl;\n const wrapperId = $wrapperEl.attr('id') || `swiper-wrapper-${getRandomNumber(16)}`;\n const live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite';\n addElId($wrapperEl, wrapperId);\n addElLive($wrapperEl, live);\n\n // Slide\n if (params.itemRoleDescriptionMessage) {\n addElRoleDescription($(swiper.slides), params.itemRoleDescriptionMessage);\n }\n addElRole($(swiper.slides), params.slideRole);\n\n const slidesLength = swiper.params.loop\n ? swiper.slides.filter((el) => !el.classList.contains(swiper.params.slideDuplicateClass))\n .length\n : swiper.slides.length;\n swiper.slides.each((slideEl, index) => {\n const $slideEl = $(slideEl);\n const slideIndex = swiper.params.loop\n ? parseInt($slideEl.attr('data-swiper-slide-index'), 10)\n : index;\n const ariaLabelMessage = params.slideLabelMessage\n .replace(/\\{\\{index\\}\\}/, slideIndex + 1)\n .replace(/\\{\\{slidesLength\\}\\}/, slidesLength);\n addElLabel($slideEl, ariaLabelMessage);\n });\n\n // Navigation\n let $nextEl;\n let $prevEl;\n if (swiper.navigation && swiper.navigation.$nextEl) {\n $nextEl = swiper.navigation.$nextEl;\n }\n if (swiper.navigation && swiper.navigation.$prevEl) {\n $prevEl = swiper.navigation.$prevEl;\n }\n\n if ($nextEl && $nextEl.length) {\n initNavEl($nextEl, wrapperId, params.nextSlideMessage);\n }\n if ($prevEl && $prevEl.length) {\n initNavEl($prevEl, wrapperId, params.prevSlideMessage);\n }\n\n // Pagination\n if (hasPagination()) {\n swiper.pagination.$el.on(\n 'keydown',\n classesToSelector(swiper.params.pagination.bulletClass),\n onEnterOrSpaceKey,\n );\n }\n }\n function destroy() {\n if (liveRegion && liveRegion.length > 0) liveRegion.remove();\n\n let $nextEl;\n let $prevEl;\n if (swiper.navigation && swiper.navigation.$nextEl) {\n $nextEl = swiper.navigation.$nextEl;\n }\n if (swiper.navigation && swiper.navigation.$prevEl) {\n $prevEl = swiper.navigation.$prevEl;\n }\n if ($nextEl) {\n $nextEl.off('keydown', onEnterOrSpaceKey);\n }\n if ($prevEl) {\n $prevEl.off('keydown', onEnterOrSpaceKey);\n }\n\n // Pagination\n if (hasPagination()) {\n swiper.pagination.$el.off(\n 'keydown',\n classesToSelector(swiper.params.pagination.bulletClass),\n onEnterOrSpaceKey,\n );\n }\n }\n\n on('beforeInit', () => {\n liveRegion = $(\n ``,\n );\n });\n\n on('afterInit', () => {\n if (!swiper.params.a11y.enabled) return;\n init();\n updateNavigation();\n });\n on('toEdge', () => {\n if (!swiper.params.a11y.enabled) return;\n updateNavigation();\n });\n on('fromEdge', () => {\n if (!swiper.params.a11y.enabled) return;\n updateNavigation();\n });\n on('paginationUpdate', () => {\n if (!swiper.params.a11y.enabled) return;\n updatePagination();\n });\n on('destroy', () => {\n if (!swiper.params.a11y.enabled) return;\n destroy();\n });\n}\n","import { getWindow } from 'ssr-window';\n\nexport default function History({ swiper, extendParams, on }) {\n extendParams({\n history: {\n enabled: false,\n root: '',\n replaceState: false,\n key: 'slides',\n },\n });\n\n let initialized = false;\n let paths = {};\n\n const slugify = (text) => {\n return text\n .toString()\n .replace(/\\s+/g, '-')\n .replace(/[^\\w-]+/g, '')\n .replace(/--+/g, '-')\n .replace(/^-+/, '')\n .replace(/-+$/, '');\n };\n\n const getPathValues = (urlOverride) => {\n const window = getWindow();\n let location;\n if (urlOverride) {\n location = new URL(urlOverride);\n } else {\n location = window.location;\n }\n const pathArray = location.pathname\n .slice(1)\n .split('/')\n .filter((part) => part !== '');\n const total = pathArray.length;\n const key = pathArray[total - 2];\n const value = pathArray[total - 1];\n return { key, value };\n };\n const setHistory = (key, index) => {\n const window = getWindow();\n if (!initialized || !swiper.params.history.enabled) return;\n let location;\n if (swiper.params.url) {\n location = new URL(swiper.params.url);\n } else {\n location = window.location;\n }\n const slide = swiper.slides.eq(index);\n let value = slugify(slide.attr('data-history'));\n if (swiper.params.history.root.length > 0) {\n let root = swiper.params.history.root;\n if (root[root.length - 1] === '/') root = root.slice(0, root.length - 1);\n value = `${root}/${key}/${value}`;\n } else if (!location.pathname.includes(key)) {\n value = `${key}/${value}`;\n }\n const currentState = window.history.state;\n if (currentState && currentState.value === value) {\n return;\n }\n if (swiper.params.history.replaceState) {\n window.history.replaceState({ value }, null, value);\n } else {\n window.history.pushState({ value }, null, value);\n }\n };\n\n const scrollToSlide = (speed, value, runCallbacks) => {\n if (value) {\n for (let i = 0, length = swiper.slides.length; i < length; i += 1) {\n const slide = swiper.slides.eq(i);\n const slideHistory = slugify(slide.attr('data-history'));\n if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n const index = slide.index();\n swiper.slideTo(index, speed, runCallbacks);\n }\n }\n } else {\n swiper.slideTo(0, speed, runCallbacks);\n }\n };\n\n const setHistoryPopState = () => {\n paths = getPathValues(swiper.params.url);\n scrollToSlide(swiper.params.speed, swiper.paths.value, false);\n };\n\n const init = () => {\n const window = getWindow();\n if (!swiper.params.history) return;\n if (!window.history || !window.history.pushState) {\n swiper.params.history.enabled = false;\n swiper.params.hashNavigation.enabled = true;\n return;\n }\n initialized = true;\n paths = getPathValues(swiper.params.url);\n if (!paths.key && !paths.value) return;\n scrollToSlide(0, paths.value, swiper.params.runCallbacksOnInit);\n if (!swiper.params.history.replaceState) {\n window.addEventListener('popstate', setHistoryPopState);\n }\n };\n const destroy = () => {\n const window = getWindow();\n if (!swiper.params.history.replaceState) {\n window.removeEventListener('popstate', setHistoryPopState);\n }\n };\n\n on('init', () => {\n if (swiper.params.history.enabled) {\n init();\n }\n });\n on('destroy', () => {\n if (swiper.params.history.enabled) {\n destroy();\n }\n });\n on('transitionEnd _freeModeNoMomentumRelease', () => {\n if (initialized) {\n setHistory(swiper.params.history.key, swiper.activeIndex);\n }\n });\n on('slideChange', () => {\n if (initialized && swiper.params.cssMode) {\n setHistory(swiper.params.history.key, swiper.activeIndex);\n }\n });\n}\n","import { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function HashNavigation({ swiper, extendParams, emit, on }) {\n let initialized = false;\n const document = getDocument();\n const window = getWindow();\n extendParams({\n hashNavigation: {\n enabled: false,\n replaceState: false,\n watchState: false,\n },\n });\n const onHashChange = () => {\n emit('hashChange');\n const newHash = document.location.hash.replace('#', '');\n const activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash');\n if (newHash !== activeSlideHash) {\n const newIndex = swiper.$wrapperEl\n .children(`.${swiper.params.slideClass}[data-hash=\"${newHash}\"]`)\n .index();\n if (typeof newIndex === 'undefined') return;\n swiper.slideTo(newIndex);\n }\n };\n const setHash = () => {\n if (!initialized || !swiper.params.hashNavigation.enabled) return;\n if (\n swiper.params.hashNavigation.replaceState &&\n window.history &&\n window.history.replaceState\n ) {\n window.history.replaceState(\n null,\n null,\n `#${swiper.slides.eq(swiper.activeIndex).attr('data-hash')}` || '',\n );\n emit('hashSet');\n } else {\n const slide = swiper.slides.eq(swiper.activeIndex);\n const hash = slide.attr('data-hash') || slide.attr('data-history');\n document.location.hash = hash || '';\n emit('hashSet');\n }\n };\n const init = () => {\n if (\n !swiper.params.hashNavigation.enabled ||\n (swiper.params.history && swiper.params.history.enabled)\n )\n return;\n initialized = true;\n const hash = document.location.hash.replace('#', '');\n if (hash) {\n const speed = 0;\n for (let i = 0, length = swiper.slides.length; i < length; i += 1) {\n const slide = swiper.slides.eq(i);\n const slideHash = slide.attr('data-hash') || slide.attr('data-history');\n if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n const index = slide.index();\n swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true);\n }\n }\n }\n if (swiper.params.hashNavigation.watchState) {\n $(window).on('hashchange', onHashChange);\n }\n };\n const destroy = () => {\n if (swiper.params.hashNavigation.watchState) {\n $(window).off('hashchange', onHashChange);\n }\n };\n\n on('init', () => {\n if (swiper.params.hashNavigation.enabled) {\n init();\n }\n });\n on('destroy', () => {\n if (swiper.params.hashNavigation.enabled) {\n destroy();\n }\n });\n on('transitionEnd _freeModeNoMomentumRelease', () => {\n if (initialized) {\n setHash();\n }\n });\n on('slideChange', () => {\n if (initialized && swiper.params.cssMode) {\n setHash();\n }\n });\n}\n","/* eslint no-underscore-dangle: \"off\" */\n/* eslint no-use-before-define: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport { nextTick } from '../../shared/utils.js';\n\nexport default function Autoplay({ swiper, extendParams, on, emit }) {\n let timeout;\n\n swiper.autoplay = {\n running: false,\n paused: false,\n };\n\n extendParams({\n autoplay: {\n enabled: false,\n delay: 3000,\n waitForTransition: true,\n disableOnInteraction: true,\n stopOnLastSlide: false,\n reverseDirection: false,\n pauseOnMouseEnter: false,\n },\n });\n\n function run() {\n const $activeSlideEl = swiper.slides.eq(swiper.activeIndex);\n let delay = swiper.params.autoplay.delay;\n if ($activeSlideEl.attr('data-swiper-autoplay')) {\n delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;\n }\n clearTimeout(timeout);\n timeout = nextTick(() => {\n let autoplayResult;\n if (swiper.params.autoplay.reverseDirection) {\n if (swiper.params.loop) {\n swiper.loopFix();\n autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.isBeginning) {\n autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.params.autoplay.stopOnLastSlide) {\n autoplayResult = swiper.slideTo(\n swiper.slides.length - 1,\n swiper.params.speed,\n true,\n true,\n );\n emit('autoplay');\n } else {\n stop();\n }\n } else if (swiper.params.loop) {\n swiper.loopFix();\n autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.isEnd) {\n autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.params.autoplay.stopOnLastSlide) {\n autoplayResult = swiper.slideTo(0, swiper.params.speed, true, true);\n emit('autoplay');\n } else {\n stop();\n }\n if (swiper.params.cssMode && swiper.autoplay.running) run();\n else if (autoplayResult === false) {\n run();\n }\n }, delay);\n }\n function start() {\n if (typeof timeout !== 'undefined') return false;\n if (swiper.autoplay.running) return false;\n swiper.autoplay.running = true;\n emit('autoplayStart');\n run();\n return true;\n }\n function stop() {\n if (!swiper.autoplay.running) return false;\n if (typeof timeout === 'undefined') return false;\n\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n swiper.autoplay.running = false;\n emit('autoplayStop');\n return true;\n }\n function pause(speed) {\n if (!swiper.autoplay.running) return;\n if (swiper.autoplay.paused) return;\n if (timeout) clearTimeout(timeout);\n swiper.autoplay.paused = true;\n if (speed === 0 || !swiper.params.autoplay.waitForTransition) {\n swiper.autoplay.paused = false;\n run();\n } else {\n ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n swiper.$wrapperEl[0].addEventListener(event, onTransitionEnd);\n });\n }\n }\n function onVisibilityChange() {\n const document = getDocument();\n if (document.visibilityState === 'hidden' && swiper.autoplay.running) {\n pause();\n }\n if (document.visibilityState === 'visible' && swiper.autoplay.paused) {\n run();\n swiper.autoplay.paused = false;\n }\n }\n function onTransitionEnd(e) {\n if (!swiper || swiper.destroyed || !swiper.$wrapperEl) return;\n if (e.target !== swiper.$wrapperEl[0]) return;\n ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n });\n swiper.autoplay.paused = false;\n if (!swiper.autoplay.running) {\n stop();\n } else {\n run();\n }\n }\n function onMouseEnter() {\n if (swiper.params.autoplay.disableOnInteraction) {\n stop();\n } else {\n pause();\n }\n\n ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n });\n }\n function onMouseLeave() {\n if (swiper.params.autoplay.disableOnInteraction) {\n return;\n }\n swiper.autoplay.paused = false;\n run();\n }\n function attachMouseEvents() {\n if (swiper.params.autoplay.pauseOnMouseEnter) {\n swiper.$el.on('mouseenter', onMouseEnter);\n swiper.$el.on('mouseleave', onMouseLeave);\n }\n }\n function detachMouseEvents() {\n swiper.$el.off('mouseenter', onMouseEnter);\n swiper.$el.off('mouseleave', onMouseLeave);\n }\n\n on('init', () => {\n if (swiper.params.autoplay.enabled) {\n start();\n const document = getDocument();\n document.addEventListener('visibilitychange', onVisibilityChange);\n attachMouseEvents();\n }\n });\n on('beforeTransitionStart', (_s, speed, internal) => {\n if (swiper.autoplay.running) {\n if (internal || !swiper.params.autoplay.disableOnInteraction) {\n swiper.autoplay.pause(speed);\n } else {\n stop();\n }\n }\n });\n on('sliderFirstMove', () => {\n if (swiper.autoplay.running) {\n if (swiper.params.autoplay.disableOnInteraction) {\n stop();\n } else {\n pause();\n }\n }\n });\n on('touchEnd', () => {\n if (\n swiper.params.cssMode &&\n swiper.autoplay.paused &&\n !swiper.params.autoplay.disableOnInteraction\n ) {\n run();\n }\n });\n on('destroy', () => {\n detachMouseEvents();\n if (swiper.autoplay.running) {\n stop();\n }\n const document = getDocument();\n document.removeEventListener('visibilitychange', onVisibilityChange);\n });\n\n Object.assign(swiper.autoplay, {\n pause,\n run,\n start,\n stop,\n });\n}\n","import { isObject } from '../../shared/utils.js';\nimport $ from '../../shared/dom.js';\n\nexport default function Thumb({ swiper, extendParams, on }) {\n extendParams({\n thumbs: {\n swiper: null,\n multipleActiveThumbs: true,\n autoScrollOffset: 0,\n slideThumbActiveClass: 'swiper-slide-thumb-active',\n thumbsContainerClass: 'swiper-thumbs',\n },\n });\n\n let initialized = false;\n let swiperCreated = false;\n\n swiper.thumbs = {\n swiper: null,\n };\n\n function onThumbClick() {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n const clickedIndex = thumbsSwiper.clickedIndex;\n const clickedSlide = thumbsSwiper.clickedSlide;\n if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass))\n return;\n if (typeof clickedIndex === 'undefined' || clickedIndex === null) return;\n let slideToIndex;\n if (thumbsSwiper.params.loop) {\n slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n } else {\n slideToIndex = clickedIndex;\n }\n if (swiper.params.loop) {\n let currentIndex = swiper.activeIndex;\n if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n currentIndex = swiper.activeIndex;\n }\n const prevIndex = swiper.slides\n .eq(currentIndex)\n .prevAll(`[data-swiper-slide-index=\"${slideToIndex}\"]`)\n .eq(0)\n .index();\n const nextIndex = swiper.slides\n .eq(currentIndex)\n .nextAll(`[data-swiper-slide-index=\"${slideToIndex}\"]`)\n .eq(0)\n .index();\n if (typeof prevIndex === 'undefined') slideToIndex = nextIndex;\n else if (typeof nextIndex === 'undefined') slideToIndex = prevIndex;\n else if (nextIndex - currentIndex < currentIndex - prevIndex) slideToIndex = nextIndex;\n else slideToIndex = prevIndex;\n }\n swiper.slideTo(slideToIndex);\n }\n\n function init() {\n const { thumbs: thumbsParams } = swiper.params;\n if (initialized) return false;\n initialized = true;\n const SwiperClass = swiper.constructor;\n if (thumbsParams.swiper instanceof SwiperClass) {\n swiper.thumbs.swiper = thumbsParams.swiper;\n Object.assign(swiper.thumbs.swiper.originalParams, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n Object.assign(swiper.thumbs.swiper.params, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n } else if (isObject(thumbsParams.swiper)) {\n const thumbsSwiperParams = Object.assign({}, thumbsParams.swiper);\n Object.assign(thumbsSwiperParams, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams);\n swiperCreated = true;\n }\n swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass);\n swiper.thumbs.swiper.on('tap', onThumbClick);\n return true;\n }\n\n function update(initial) {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n\n const slidesPerView =\n thumbsSwiper.params.slidesPerView === 'auto'\n ? thumbsSwiper.slidesPerViewDynamic()\n : thumbsSwiper.params.slidesPerView;\n\n const autoScrollOffset = swiper.params.thumbs.autoScrollOffset;\n const useOffset = autoScrollOffset && !thumbsSwiper.params.loop;\n if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {\n let currentThumbsIndex = thumbsSwiper.activeIndex;\n let newThumbsIndex;\n let direction;\n if (thumbsSwiper.params.loop) {\n if (\n thumbsSwiper.slides\n .eq(currentThumbsIndex)\n .hasClass(thumbsSwiper.params.slideDuplicateClass)\n ) {\n thumbsSwiper.loopFix();\n // eslint-disable-next-line\n thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;\n currentThumbsIndex = thumbsSwiper.activeIndex;\n }\n // Find actual thumbs index to slide to\n const prevThumbsIndex = thumbsSwiper.slides\n .eq(currentThumbsIndex)\n .prevAll(`[data-swiper-slide-index=\"${swiper.realIndex}\"]`)\n .eq(0)\n .index();\n const nextThumbsIndex = thumbsSwiper.slides\n .eq(currentThumbsIndex)\n .nextAll(`[data-swiper-slide-index=\"${swiper.realIndex}\"]`)\n .eq(0)\n .index();\n if (typeof prevThumbsIndex === 'undefined') {\n newThumbsIndex = nextThumbsIndex;\n } else if (typeof nextThumbsIndex === 'undefined') {\n newThumbsIndex = prevThumbsIndex;\n } else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) {\n newThumbsIndex =\n thumbsSwiper.params.slidesPerGroup > 1 ? nextThumbsIndex : currentThumbsIndex;\n } else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) {\n newThumbsIndex = nextThumbsIndex;\n } else {\n newThumbsIndex = prevThumbsIndex;\n }\n direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';\n } else {\n newThumbsIndex = swiper.realIndex;\n direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev';\n }\n if (useOffset) {\n newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset;\n }\n\n if (\n thumbsSwiper.visibleSlidesIndexes &&\n thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0\n ) {\n if (thumbsSwiper.params.centeredSlides) {\n if (newThumbsIndex > currentThumbsIndex) {\n newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;\n } else {\n newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;\n }\n } else if (\n newThumbsIndex > currentThumbsIndex &&\n thumbsSwiper.params.slidesPerGroup === 1\n ) {\n // newThumbsIndex = newThumbsIndex - slidesPerView + 1;\n }\n thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);\n }\n }\n\n // Activate thumbs\n let thumbsToActivate = 1;\n const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;\n\n if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {\n thumbsToActivate = swiper.params.slidesPerView;\n }\n\n if (!swiper.params.thumbs.multipleActiveThumbs) {\n thumbsToActivate = 1;\n }\n\n thumbsToActivate = Math.floor(thumbsToActivate);\n\n thumbsSwiper.slides.removeClass(thumbActiveClass);\n if (\n thumbsSwiper.params.loop ||\n (thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled)\n ) {\n for (let i = 0; i < thumbsToActivate; i += 1) {\n thumbsSwiper.$wrapperEl\n .children(`[data-swiper-slide-index=\"${swiper.realIndex + i}\"]`)\n .addClass(thumbActiveClass);\n }\n } else {\n for (let i = 0; i < thumbsToActivate; i += 1) {\n thumbsSwiper.slides.eq(swiper.realIndex + i).addClass(thumbActiveClass);\n }\n }\n }\n\n on('beforeInit', () => {\n const { thumbs } = swiper.params;\n if (!thumbs || !thumbs.swiper) return;\n init();\n update(true);\n });\n on('slideChange update resize observerUpdate', () => {\n if (!swiper.thumbs.swiper) return;\n update();\n });\n on('setTransition', (_s, duration) => {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n thumbsSwiper.setTransition(duration);\n });\n on('beforeDestroy', () => {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n if (swiperCreated && thumbsSwiper) {\n thumbsSwiper.destroy();\n }\n });\n\n Object.assign(swiper.thumbs, {\n init,\n update,\n });\n}\n","import { now } from '../../shared/utils.js';\n\nexport default function freeMode({ swiper, extendParams, emit, once }) {\n extendParams({\n freeMode: {\n enabled: false,\n momentum: true,\n momentumRatio: 1,\n momentumBounce: true,\n momentumBounceRatio: 1,\n momentumVelocityRatio: 1,\n sticky: false,\n minimumVelocity: 0.02,\n },\n });\n\n function onTouchMove() {\n const { touchEventsData: data, touches } = swiper;\n // Velocity\n if (data.velocities.length === 0) {\n data.velocities.push({\n position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],\n time: data.touchStartTime,\n });\n }\n data.velocities.push({\n position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],\n time: now(),\n });\n }\n\n function onTouchEnd({ currentPos }) {\n const { params, $wrapperEl, rtlTranslate: rtl, snapGrid, touchEventsData: data } = swiper;\n // Time diff\n const touchEndTime = now();\n const timeDiff = touchEndTime - data.touchStartTime;\n\n if (currentPos < -swiper.minTranslate()) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (currentPos > -swiper.maxTranslate()) {\n if (swiper.slides.length < snapGrid.length) {\n swiper.slideTo(snapGrid.length - 1);\n } else {\n swiper.slideTo(swiper.slides.length - 1);\n }\n return;\n }\n\n if (params.freeMode.momentum) {\n if (data.velocities.length > 1) {\n const lastMoveEvent = data.velocities.pop();\n const velocityEvent = data.velocities.pop();\n\n const distance = lastMoveEvent.position - velocityEvent.position;\n const time = lastMoveEvent.time - velocityEvent.time;\n swiper.velocity = distance / time;\n swiper.velocity /= 2;\n if (Math.abs(swiper.velocity) < params.freeMode.minimumVelocity) {\n swiper.velocity = 0;\n }\n // this implies that the user stopped moving a finger then released.\n // There would be no events with distance zero, so the last event is stale.\n if (time > 150 || now() - lastMoveEvent.time > 300) {\n swiper.velocity = 0;\n }\n } else {\n swiper.velocity = 0;\n }\n swiper.velocity *= params.freeMode.momentumVelocityRatio;\n\n data.velocities.length = 0;\n let momentumDuration = 1000 * params.freeMode.momentumRatio;\n const momentumDistance = swiper.velocity * momentumDuration;\n\n let newPosition = swiper.translate + momentumDistance;\n if (rtl) newPosition = -newPosition;\n\n let doBounce = false;\n let afterBouncePosition;\n const bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeMode.momentumBounceRatio;\n let needsLoopFix;\n if (newPosition < swiper.maxTranslate()) {\n if (params.freeMode.momentumBounce) {\n if (newPosition + swiper.maxTranslate() < -bounceAmount) {\n newPosition = swiper.maxTranslate() - bounceAmount;\n }\n afterBouncePosition = swiper.maxTranslate();\n doBounce = true;\n data.allowMomentumBounce = true;\n } else {\n newPosition = swiper.maxTranslate();\n }\n if (params.loop && params.centeredSlides) needsLoopFix = true;\n } else if (newPosition > swiper.minTranslate()) {\n if (params.freeMode.momentumBounce) {\n if (newPosition - swiper.minTranslate() > bounceAmount) {\n newPosition = swiper.minTranslate() + bounceAmount;\n }\n afterBouncePosition = swiper.minTranslate();\n doBounce = true;\n data.allowMomentumBounce = true;\n } else {\n newPosition = swiper.minTranslate();\n }\n if (params.loop && params.centeredSlides) needsLoopFix = true;\n } else if (params.freeMode.sticky) {\n let nextSlide;\n for (let j = 0; j < snapGrid.length; j += 1) {\n if (snapGrid[j] > -newPosition) {\n nextSlide = j;\n break;\n }\n }\n\n if (\n Math.abs(snapGrid[nextSlide] - newPosition) <\n Math.abs(snapGrid[nextSlide - 1] - newPosition) ||\n swiper.swipeDirection === 'next'\n ) {\n newPosition = snapGrid[nextSlide];\n } else {\n newPosition = snapGrid[nextSlide - 1];\n }\n newPosition = -newPosition;\n }\n if (needsLoopFix) {\n once('transitionEnd', () => {\n swiper.loopFix();\n });\n }\n // Fix duration\n if (swiper.velocity !== 0) {\n if (rtl) {\n momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);\n } else {\n momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);\n }\n if (params.freeMode.sticky) {\n // If freeMode.sticky is active and the user ends a swipe with a slow-velocity\n // event, then durations can be 20+ seconds to slide one (or zero!) slides.\n // It's easy to see this when simulating touch with mouse events. To fix this,\n // limit single-slide swipes to the default slide duration. This also has the\n // nice side effect of matching slide speed if the user stopped moving before\n // lifting finger or mouse vs. moving slowly before lifting the finger/mouse.\n // For faster swipes, also apply limits (albeit higher ones).\n const moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);\n const currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];\n if (moveDistance < currentSlideSize) {\n momentumDuration = params.speed;\n } else if (moveDistance < 2 * currentSlideSize) {\n momentumDuration = params.speed * 1.5;\n } else {\n momentumDuration = params.speed * 2.5;\n }\n }\n } else if (params.freeMode.sticky) {\n swiper.slideToClosest();\n return;\n }\n\n if (params.freeMode.momentumBounce && doBounce) {\n swiper.updateProgress(afterBouncePosition);\n swiper.setTransition(momentumDuration);\n swiper.setTranslate(newPosition);\n swiper.transitionStart(true, swiper.swipeDirection);\n swiper.animating = true;\n $wrapperEl.transitionEnd(() => {\n if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return;\n emit('momentumBounce');\n swiper.setTransition(params.speed);\n setTimeout(() => {\n swiper.setTranslate(afterBouncePosition);\n $wrapperEl.transitionEnd(() => {\n if (!swiper || swiper.destroyed) return;\n swiper.transitionEnd();\n });\n }, 0);\n });\n } else if (swiper.velocity) {\n emit('_freeModeNoMomentumRelease');\n swiper.updateProgress(newPosition);\n swiper.setTransition(momentumDuration);\n swiper.setTranslate(newPosition);\n swiper.transitionStart(true, swiper.swipeDirection);\n if (!swiper.animating) {\n swiper.animating = true;\n $wrapperEl.transitionEnd(() => {\n if (!swiper || swiper.destroyed) return;\n swiper.transitionEnd();\n });\n }\n } else {\n swiper.updateProgress(newPosition);\n }\n\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n } else if (params.freeMode.sticky) {\n swiper.slideToClosest();\n return;\n } else if (params.freeMode) {\n emit('_freeModeNoMomentumRelease');\n }\n\n if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) {\n swiper.updateProgress();\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n }\n\n Object.assign(swiper, {\n freeMode: {\n onTouchMove,\n onTouchEnd,\n },\n });\n}\n","export default function Grid({ swiper, extendParams }) {\n extendParams({\n grid: {\n rows: 1,\n fill: 'column',\n },\n });\n\n let slidesNumberEvenToRows;\n let slidesPerRow;\n let numFullColumns;\n\n const initSlides = (slidesLength) => {\n const { slidesPerView } = swiper.params;\n const { rows, fill } = swiper.params.grid;\n slidesPerRow = slidesNumberEvenToRows / rows;\n numFullColumns = Math.floor(slidesLength / rows);\n if (Math.floor(slidesLength / rows) === slidesLength / rows) {\n slidesNumberEvenToRows = slidesLength;\n } else {\n slidesNumberEvenToRows = Math.ceil(slidesLength / rows) * rows;\n }\n if (slidesPerView !== 'auto' && fill === 'row') {\n slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, slidesPerView * rows);\n }\n };\n\n const updateSlide = (i, slide, slidesLength, getDirectionLabel) => {\n const { slidesPerGroup, spaceBetween } = swiper.params;\n const { rows, fill } = swiper.params.grid;\n // Set slides order\n let newSlideOrderIndex;\n let column;\n let row;\n if (fill === 'row' && slidesPerGroup > 1) {\n const groupIndex = Math.floor(i / (slidesPerGroup * rows));\n const slideIndexInGroup = i - rows * slidesPerGroup * groupIndex;\n const columnsInGroup =\n groupIndex === 0\n ? slidesPerGroup\n : Math.min(\n Math.ceil((slidesLength - groupIndex * rows * slidesPerGroup) / rows),\n slidesPerGroup,\n );\n row = Math.floor(slideIndexInGroup / columnsInGroup);\n column = slideIndexInGroup - row * columnsInGroup + groupIndex * slidesPerGroup;\n\n newSlideOrderIndex = column + (row * slidesNumberEvenToRows) / rows;\n slide.css({\n '-webkit-order': newSlideOrderIndex,\n order: newSlideOrderIndex,\n });\n } else if (fill === 'column') {\n column = Math.floor(i / rows);\n row = i - column * rows;\n if (column > numFullColumns || (column === numFullColumns && row === rows - 1)) {\n row += 1;\n if (row >= rows) {\n row = 0;\n column += 1;\n }\n }\n } else {\n row = Math.floor(i / slidesPerRow);\n column = i - row * slidesPerRow;\n }\n slide.css(\n getDirectionLabel('margin-top'),\n row !== 0 ? spaceBetween && `${spaceBetween}px` : '',\n );\n };\n\n const updateWrapperSize = (slideSize, snapGrid, getDirectionLabel) => {\n const { spaceBetween, centeredSlides, roundLengths } = swiper.params;\n const { rows } = swiper.params.grid;\n swiper.virtualSize = (slideSize + spaceBetween) * slidesNumberEvenToRows;\n swiper.virtualSize = Math.ceil(swiper.virtualSize / rows) - spaceBetween;\n swiper.$wrapperEl.css({\n [getDirectionLabel('width')]: `${swiper.virtualSize + spaceBetween}px`,\n });\n if (centeredSlides) {\n snapGrid.splice(0, snapGrid.length);\n const newSlidesGrid = [];\n for (let i = 0; i < snapGrid.length; i += 1) {\n let slidesGridItem = snapGrid[i];\n if (roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem);\n }\n snapGrid.push(...newSlidesGrid);\n }\n };\n\n swiper.grid = {\n initSlides,\n updateSlide,\n updateWrapperSize,\n };\n}\n","import appendSlide from './methods/appendSlide.js';\nimport prependSlide from './methods/prependSlide.js';\nimport addSlide from './methods/addSlide.js';\nimport removeSlide from './methods/removeSlide.js';\nimport removeAllSlides from './methods/removeAllSlides.js';\n\nexport default function Manipulation({ swiper }) {\n Object.assign(swiper, {\n appendSlide: appendSlide.bind(swiper),\n prependSlide: prependSlide.bind(swiper),\n addSlide: addSlide.bind(swiper),\n removeSlide: removeSlide.bind(swiper),\n removeAllSlides: removeAllSlides.bind(swiper),\n });\n}\n","import effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectFade({ swiper, extendParams, on }) {\n extendParams({\n fadeEffect: {\n crossFade: false,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { slides } = swiper;\n const params = swiper.params.fadeEffect;\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = swiper.slides.eq(i);\n const offset = $slideEl[0].swiperSlideOffset;\n let tx = -offset;\n if (!swiper.params.virtualTranslate) tx -= swiper.translate;\n let ty = 0;\n if (!swiper.isHorizontal()) {\n ty = tx;\n tx = 0;\n }\n const slideOpacity = swiper.params.fadeEffect.crossFade\n ? Math.max(1 - Math.abs($slideEl[0].progress), 0)\n : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0);\n\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl\n .css({\n opacity: slideOpacity,\n })\n .transform(`translate3d(${tx}px, ${ty}px, 0px)`);\n }\n };\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.fadeEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements.transition(duration);\n effectVirtualTransitionEnd({ swiper, duration, transformEl, allSlides: true });\n };\n\n effectInit({\n effect: 'fade',\n swiper,\n on,\n setTranslate,\n setTransition,\n overwriteParams: () => ({\n slidesPerView: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n spaceBetween: 0,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","import $ from '../../shared/dom.js';\nimport effectInit from '../../shared/effect-init.js';\n\nexport default function EffectCube({ swiper, extendParams, on }) {\n extendParams({\n cubeEffect: {\n slideShadows: true,\n shadow: true,\n shadowOffset: 20,\n shadowScale: 0.94,\n },\n });\n\n const setTranslate = () => {\n const {\n $el,\n $wrapperEl,\n slides,\n width: swiperWidth,\n height: swiperHeight,\n rtlTranslate: rtl,\n size: swiperSize,\n browser,\n } = swiper;\n const params = swiper.params.cubeEffect;\n const isHorizontal = swiper.isHorizontal();\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n let wrapperRotate = 0;\n let $cubeShadowEl;\n if (params.shadow) {\n if (isHorizontal) {\n $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow');\n if ($cubeShadowEl.length === 0) {\n $cubeShadowEl = $('
      ');\n $wrapperEl.append($cubeShadowEl);\n }\n $cubeShadowEl.css({ height: `${swiperWidth}px` });\n } else {\n $cubeShadowEl = $el.find('.swiper-cube-shadow');\n if ($cubeShadowEl.length === 0) {\n $cubeShadowEl = $('
      ');\n $el.append($cubeShadowEl);\n }\n }\n }\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n let slideIndex = i;\n if (isVirtual) {\n slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10);\n }\n let slideAngle = slideIndex * 90;\n let round = Math.floor(slideAngle / 360);\n if (rtl) {\n slideAngle = -slideAngle;\n round = Math.floor(-slideAngle / 360);\n }\n const progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n let tx = 0;\n let ty = 0;\n let tz = 0;\n if (slideIndex % 4 === 0) {\n tx = -round * 4 * swiperSize;\n tz = 0;\n } else if ((slideIndex - 1) % 4 === 0) {\n tx = 0;\n tz = -round * 4 * swiperSize;\n } else if ((slideIndex - 2) % 4 === 0) {\n tx = swiperSize + round * 4 * swiperSize;\n tz = swiperSize;\n } else if ((slideIndex - 3) % 4 === 0) {\n tx = -swiperSize;\n tz = 3 * swiperSize + swiperSize * 4 * round;\n }\n if (rtl) {\n tx = -tx;\n }\n\n if (!isHorizontal) {\n ty = tx;\n tx = 0;\n }\n\n const transform = `rotateX(${isHorizontal ? 0 : -slideAngle}deg) rotateY(${\n isHorizontal ? slideAngle : 0\n }deg) translate3d(${tx}px, ${ty}px, ${tz}px)`;\n if (progress <= 1 && progress > -1) {\n wrapperRotate = slideIndex * 90 + progress * 90;\n if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90;\n }\n $slideEl.transform(transform);\n if (params.slideShadows) {\n // Set shadows\n let shadowBefore = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-left')\n : $slideEl.find('.swiper-slide-shadow-top');\n let shadowAfter = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-right')\n : $slideEl.find('.swiper-slide-shadow-bottom');\n if (shadowBefore.length === 0) {\n shadowBefore = $(\n `
      `,\n );\n $slideEl.append(shadowBefore);\n }\n if (shadowAfter.length === 0) {\n shadowAfter = $(\n `
      `,\n );\n $slideEl.append(shadowAfter);\n }\n if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);\n if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);\n }\n }\n $wrapperEl.css({\n '-webkit-transform-origin': `50% 50% -${swiperSize / 2}px`,\n 'transform-origin': `50% 50% -${swiperSize / 2}px`,\n });\n\n if (params.shadow) {\n if (isHorizontal) {\n $cubeShadowEl.transform(\n `translate3d(0px, ${swiperWidth / 2 + params.shadowOffset}px, ${\n -swiperWidth / 2\n }px) rotateX(90deg) rotateZ(0deg) scale(${params.shadowScale})`,\n );\n } else {\n const shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90;\n const multiplier =\n 1.5 -\n (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2 +\n Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2);\n const scale1 = params.shadowScale;\n const scale2 = params.shadowScale / multiplier;\n const offset = params.shadowOffset;\n $cubeShadowEl.transform(\n `scale3d(${scale1}, 1, ${scale2}) translate3d(0px, ${swiperHeight / 2 + offset}px, ${\n -swiperHeight / 2 / scale2\n }px) rotateX(-90deg)`,\n );\n }\n }\n const zFactor = browser.isSafari || browser.isWebView ? -swiperSize / 2 : 0;\n $wrapperEl.transform(\n `translate3d(0px,0,${zFactor}px) rotateX(${\n swiper.isHorizontal() ? 0 : wrapperRotate\n }deg) rotateY(${swiper.isHorizontal() ? -wrapperRotate : 0}deg)`,\n );\n };\n const setTransition = (duration) => {\n const { $el, slides } = swiper;\n slides\n .transition(duration)\n .find(\n '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n )\n .transition(duration);\n if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {\n $el.find('.swiper-cube-shadow').transition(duration);\n }\n };\n\n effectInit({\n effect: 'cube',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n slidesPerView: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n resistanceRatio: 0,\n spaceBetween: 0,\n centeredSlides: false,\n virtualTranslate: true,\n }),\n });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectFlip({ swiper, extendParams, on }) {\n extendParams({\n flipEffect: {\n slideShadows: true,\n limitRotation: true,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { slides, rtlTranslate: rtl } = swiper;\n const params = swiper.params.flipEffect;\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n let progress = $slideEl[0].progress;\n if (swiper.params.flipEffect.limitRotation) {\n progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n }\n const offset = $slideEl[0].swiperSlideOffset;\n const rotate = -180 * progress;\n let rotateY = rotate;\n let rotateX = 0;\n let tx = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n let ty = 0;\n if (!swiper.isHorizontal()) {\n ty = tx;\n tx = 0;\n rotateX = -rotateY;\n rotateY = 0;\n } else if (rtl) {\n rotateY = -rotateY;\n }\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;\n\n if (params.slideShadows) {\n // Set shadows\n let shadowBefore = swiper.isHorizontal()\n ? $slideEl.find('.swiper-slide-shadow-left')\n : $slideEl.find('.swiper-slide-shadow-top');\n let shadowAfter = swiper.isHorizontal()\n ? $slideEl.find('.swiper-slide-shadow-right')\n : $slideEl.find('.swiper-slide-shadow-bottom');\n if (shadowBefore.length === 0) {\n shadowBefore = createShadow(params, $slideEl, swiper.isHorizontal() ? 'left' : 'top');\n }\n if (shadowAfter.length === 0) {\n shadowAfter = createShadow(params, $slideEl, swiper.isHorizontal() ? 'right' : 'bottom');\n }\n if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);\n if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);\n }\n const transform = `translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`;\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(transform);\n }\n };\n\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.flipEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements\n .transition(duration)\n .find(\n '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n )\n .transition(duration);\n effectVirtualTransitionEnd({ swiper, duration, transformEl });\n };\n\n effectInit({\n effect: 'flip',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n slidesPerView: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n spaceBetween: 0,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\n\nexport default function EffectCoverflow({ swiper, extendParams, on }) {\n extendParams({\n coverflowEffect: {\n rotate: 50,\n stretch: 0,\n depth: 100,\n scale: 1,\n modifier: 1,\n slideShadows: true,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { width: swiperWidth, height: swiperHeight, slides, slidesSizesGrid } = swiper;\n const params = swiper.params.coverflowEffect;\n const isHorizontal = swiper.isHorizontal();\n const transform = swiper.translate;\n const center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2;\n const rotate = isHorizontal ? params.rotate : -params.rotate;\n const translate = params.depth;\n // Each slide offset from center\n for (let i = 0, length = slides.length; i < length; i += 1) {\n const $slideEl = slides.eq(i);\n const slideSize = slidesSizesGrid[i];\n const slideOffset = $slideEl[0].swiperSlideOffset;\n const offsetMultiplier =\n ((center - slideOffset - slideSize / 2) / slideSize) * params.modifier;\n\n let rotateY = isHorizontal ? rotate * offsetMultiplier : 0;\n let rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;\n // var rotateZ = 0\n let translateZ = -translate * Math.abs(offsetMultiplier);\n\n let stretch = params.stretch;\n // Allow percentage to make a relative stretch for responsive sliders\n if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {\n stretch = (parseFloat(params.stretch) / 100) * slideSize;\n }\n let translateY = isHorizontal ? 0 : stretch * offsetMultiplier;\n let translateX = isHorizontal ? stretch * offsetMultiplier : 0;\n\n let scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier);\n\n // Fix for ultra small values\n if (Math.abs(translateX) < 0.001) translateX = 0;\n if (Math.abs(translateY) < 0.001) translateY = 0;\n if (Math.abs(translateZ) < 0.001) translateZ = 0;\n if (Math.abs(rotateY) < 0.001) rotateY = 0;\n if (Math.abs(rotateX) < 0.001) rotateX = 0;\n if (Math.abs(scale) < 0.001) scale = 0;\n\n const slideTransform = `translate3d(${translateX}px,${translateY}px,${translateZ}px) rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(${scale})`;\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(slideTransform);\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;\n\n if (params.slideShadows) {\n // Set shadows\n let $shadowBeforeEl = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-left')\n : $slideEl.find('.swiper-slide-shadow-top');\n let $shadowAfterEl = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-right')\n : $slideEl.find('.swiper-slide-shadow-bottom');\n if ($shadowBeforeEl.length === 0) {\n $shadowBeforeEl = createShadow(params, $slideEl, isHorizontal ? 'left' : 'top');\n }\n if ($shadowAfterEl.length === 0) {\n $shadowAfterEl = createShadow(params, $slideEl, isHorizontal ? 'right' : 'bottom');\n }\n if ($shadowBeforeEl.length)\n $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0;\n if ($shadowAfterEl.length)\n $shadowAfterEl[0].style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0;\n }\n }\n };\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.coverflowEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements\n .transition(duration)\n .find(\n '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n )\n .transition(duration);\n };\n\n effectInit({\n effect: 'coverflow',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n watchSlidesProgress: true,\n }),\n });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectCreative({ swiper, extendParams, on }) {\n extendParams({\n creativeEffect: {\n transformEl: null,\n limitProgress: 1,\n shadowPerProgress: false,\n progressMultiplier: 1,\n perspective: true,\n prev: {\n translate: [0, 0, 0],\n rotate: [0, 0, 0],\n opacity: 1,\n scale: 1,\n },\n next: {\n translate: [0, 0, 0],\n rotate: [0, 0, 0],\n opacity: 1,\n scale: 1,\n },\n },\n });\n\n const getTranslateValue = (value) => {\n if (typeof value === 'string') return value;\n return `${value}px`;\n };\n\n const setTranslate = () => {\n const { slides } = swiper;\n const params = swiper.params.creativeEffect;\n const { progressMultiplier: multiplier } = params;\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n const slideProgress = $slideEl[0].progress;\n const progress = Math.min(\n Math.max($slideEl[0].progress, -params.limitProgress),\n params.limitProgress,\n );\n const offset = $slideEl[0].swiperSlideOffset;\n const t = [swiper.params.cssMode ? -offset - swiper.translate : -offset, 0, 0];\n const r = [0, 0, 0];\n let custom = false;\n if (!swiper.isHorizontal()) {\n t[1] = t[0];\n t[0] = 0;\n }\n let data = {\n translate: [0, 0, 0],\n rotate: [0, 0, 0],\n scale: 1,\n opacity: 1,\n };\n if (progress < 0) {\n data = params.next;\n custom = true;\n } else if (progress > 0) {\n data = params.prev;\n custom = true;\n }\n // set translate\n t.forEach((value, index) => {\n t[index] = `calc(${value}px + (${getTranslateValue(data.translate[index])} * ${Math.abs(\n progress * multiplier,\n )}))`;\n });\n // set rotates\n r.forEach((value, index) => {\n r[index] = data.rotate[index] * Math.abs(progress * multiplier);\n });\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n\n const translateString = t.join(', ');\n const rotateString = `rotateX(${r[0]}deg) rotateY(${r[1]}deg) rotateZ(${r[2]}deg)`;\n const scaleString =\n progress < 0\n ? `scale(${1 + (1 - data.scale) * progress * multiplier})`\n : `scale(${1 - (1 - data.scale) * progress * multiplier})`;\n const opacityString =\n progress < 0\n ? 1 + (1 - data.opacity) * progress * multiplier\n : 1 - (1 - data.opacity) * progress * multiplier;\n const transform = `translate3d(${translateString}) ${rotateString} ${scaleString}`;\n\n // Set shadows\n if ((custom && data.shadow) || !custom) {\n let $shadowEl = $slideEl.children('.swiper-slide-shadow');\n if ($shadowEl.length === 0 && data.shadow) {\n $shadowEl = createShadow(params, $slideEl);\n }\n if ($shadowEl.length) {\n const shadowOpacity = params.shadowPerProgress\n ? progress * (1 / params.limitProgress)\n : progress;\n $shadowEl[0].style.opacity = Math.min(Math.max(Math.abs(shadowOpacity), 0), 1);\n }\n }\n\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(transform).css({ opacity: opacityString });\n if (data.origin) {\n $targetEl.css('transform-origin', data.origin);\n }\n }\n };\n\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.creativeEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration);\n\n effectVirtualTransitionEnd({ swiper, duration, transformEl, allSlides: true });\n };\n\n effectInit({\n effect: 'creative',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => swiper.params.creativeEffect.perspective,\n overwriteParams: () => ({\n watchSlidesProgress: true,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectCards({ swiper, extendParams, on }) {\n extendParams({\n cardsEffect: {\n slideShadows: true,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { slides, activeIndex } = swiper;\n const params = swiper.params.cardsEffect;\n const { startTranslate, isTouched } = swiper.touchEventsData;\n const currentTranslate = swiper.translate;\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n const slideProgress = $slideEl[0].progress;\n const progress = Math.min(Math.max(slideProgress, -4), 4);\n let offset = $slideEl[0].swiperSlideOffset;\n if (swiper.params.centeredSlides && !swiper.params.cssMode) {\n swiper.$wrapperEl.transform(`translateX(${swiper.minTranslate()}px)`);\n }\n if (swiper.params.centeredSlides && swiper.params.cssMode) {\n offset -= slides[0].swiperSlideOffset;\n }\n let tX = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n let tY = 0;\n const tZ = -100 * Math.abs(progress);\n let scale = 1;\n let rotate = -2 * progress;\n\n let tXAdd = 8 - Math.abs(progress) * 0.75;\n\n const isSwipeToNext =\n (i === activeIndex || i === activeIndex - 1) &&\n progress > 0 &&\n progress < 1 &&\n (isTouched || swiper.params.cssMode) &&\n currentTranslate < startTranslate;\n const isSwipeToPrev =\n (i === activeIndex || i === activeIndex + 1) &&\n progress < 0 &&\n progress > -1 &&\n (isTouched || swiper.params.cssMode) &&\n currentTranslate > startTranslate;\n if (isSwipeToNext || isSwipeToPrev) {\n const subProgress = (1 - Math.abs((Math.abs(progress) - 0.5) / 0.5)) ** 0.5;\n rotate += -28 * progress * subProgress;\n scale += -0.5 * subProgress;\n tXAdd += 96 * subProgress;\n tY = `${-25 * subProgress * Math.abs(progress)}%`;\n }\n\n if (progress < 0) {\n // next\n tX = `calc(${tX}px + (${tXAdd * Math.abs(progress)}%))`;\n } else if (progress > 0) {\n // prev\n tX = `calc(${tX}px + (-${tXAdd * Math.abs(progress)}%))`;\n } else {\n tX = `${tX}px`;\n }\n if (!swiper.isHorizontal()) {\n const prevY = tY;\n tY = tX;\n tX = prevY;\n }\n\n const scaleString =\n progress < 0 ? `${1 + (1 - scale) * progress}` : `${1 - (1 - scale) * progress}`;\n const transform = `\n translate3d(${tX}, ${tY}, ${tZ}px)\n rotateZ(${rotate}deg)\n scale(${scaleString})\n `;\n\n if (params.slideShadows) {\n // Set shadows\n let $shadowEl = $slideEl.find('.swiper-slide-shadow');\n if ($shadowEl.length === 0) {\n $shadowEl = createShadow(params, $slideEl);\n }\n if ($shadowEl.length)\n $shadowEl[0].style.opacity = Math.min(Math.max((Math.abs(progress) - 0.5) / 0.5, 0), 1);\n }\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(transform);\n }\n };\n\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.cardsEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration);\n\n effectVirtualTransitionEnd({ swiper, duration, transformEl });\n };\n\n effectInit({\n effect: 'cards',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n watchSlidesProgress: true,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","'use strict';\n\nconst utils = require('../components/utils');\n\nconst $mainPDPGallery = $('.product-gallery--main');\nconst $modelDescription = $('.js-onmodel-description');\n\n/**\n * Reset (hide) model description\n */\nfunction resetModelDescription() {\n $modelDescription.removeClass('d-block').addClass('d-none');\n}\n\n/**\n * Initialize model data\n * @param {string} onModelValue: Reference to data model of thumbnail image\n * @returns {boolean} True if no errors occur\n */\nfunction getOnModelData(onModelValue) {\n let modelKey;\n let modelValue;\n let modelObject;\n const url = $mainPDPGallery.data('model-url');\n try {\n const onModelObj = onModelValue && JSON.parse(decodeURIComponent(onModelValue));\n if (onModelObj) {\n modelKey = Object.keys(onModelObj)[0];\n modelValue = onModelObj[modelKey];\n modelObject = {\n modelKey: modelKey,\n modelValue: modelValue\n };\n $.ajax({\n url: utils.setUrlKeyValue(url, 'pid', onModelObj.variantUPC.trim()),\n type: 'post',\n dataType: 'json',\n data: modelObject,\n success: function (data) {\n if (data && data.modelDescription) {\n $modelDescription.html(data.modelDescription)\n .removeClass('d-none').addClass('d-block');\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n } catch (e) {\n return false;\n }\n return true;\n}\n\n/**\n * Initialize model data\n * @returns {string} modeldataValue on model data value of image\n */\nfunction imageModelData() {\n let modelImg = $mainPDPGallery.find('.js-model-image');\n let modelDataValue;\n\n if (modelImg) {\n let modelImgArray = Array.from(modelImg);\n modelDataValue = modelImgArray.find(function (element) {\n return $(element).data('onmodel') !== null;\n });\n }\n return modelDataValue;\n}\n\n/**\n * Trigger display of OnModel description\n * Dependency: imageModelData()\n */\nfunction triggerOnModelDescription() {\n const modelValue = imageModelData();\n const imageclick = $(modelValue).data('onmodel');\n\n resetModelDescription();\n getOnModelData(imageclick);\n}\n\nmodule.exports = {\n getOnModelData: getOnModelData,\n imageModelData: imageModelData,\n triggerOnModelDescription: triggerOnModelDescription\n};\n","'use strict';\n\nconst breakpoints = require('../components/breakpoints');\nconst debounce = require('lodash/debounce');\n\n/**\n * Updates the tab and content state for the item that was clicked\n * @param {selector} clickedTabSelector for example: .ofs-item\n */\nfunction updateTabbedContainerContent(clickedTabSelector) {\n var $clickedTab = $(clickedTabSelector);\n var $tabbedContainer = $clickedTab.closest('.tabbed-container');\n var $contentContainer = $tabbedContainer.children('.tabbed-container__content-container');\n var targetContentSelector = $clickedTab.data('target') || $clickedTab.attr('href');\n var $targetContent = $(targetContentSelector);\n\n // Show clicked tab's contents, hide all sibling tabs' contents.\n // This prevents white space below the footer when very long tab content is hidden\n $targetContent.show();\n\n if (breakpoints.isHighRes() || !$targetContent.closest('.responsive-tabs').length) {\n // only apply this style class when the tabbed container is being rendered as tabs (e.g. hybrid view at desktop width, or tab-only view at any width)\n $targetContent.siblings().hide();\n }\n\n // toggle active class on the content\n $contentContainer.children('.tabbed-container__content').removeClass('active');\n $targetContent.addClass('active');\n}\n\n/**\n * Reinitializes any carousels within tabbed content of any variation (e.g. tabs, accordions, hybrid)\n * @param {JQuery} $clickedItem for example: .ofs-item or .card-header\n */\nfunction reinitializeCarousels($clickedItem) {\n var targetContentSelector = $clickedItem.data('target') || $clickedItem.attr('href');\n $(targetContentSelector).find('.slick-initialized').slick('unslick').slick('reinit');\n}\n\nmodule.exports = {\n init: function () {\n // set initial height of all content containers to the size of their active content.\n $('.tabbed-container__content-container').each(function () {\n var $this = $(this);\n var $hybridTabbedContainer = $this.closest('.responsive-tabs'); // may or may not exist depending on which $('.tabbed-container__content-container') we are in\n\n // wait for window.onLoad and try setting the height again, for those instances that weren't ready the first time.\n $(window).on('load', function () {\n if (breakpoints.isHighRes() || !$hybridTabbedContainer.length) {\n // only apply this style class when the tabbed container is being rendered as tabs (e.g. hybrid view at desktop width, or tab-only view at any width)\n $this.find('.active').siblings().hide();\n }\n });\n\n // make sure that we don't lose content if someone rotates their tablet or phone back and forth and the tabbed container transitions between accordion and tab view\n $(window).on('resize', debounce(\n function () {\n if ($hybridTabbedContainer.length) {\n $this.find('.active').siblings().toggle(breakpoints.isLowRes());\n }\n }, 200));\n });\n\n $('.tabbed-container__tabs').on('click', '.ofs__item', function (e) {\n e.preventDefault();\n var $thisItem = $(this);\n\n // toggle active classes on the tabs\n $thisItem.siblings('.ofs__item').removeClass('active');\n $thisItem.addClass('active');\n\n var $ofs = $thisItem.closest('.overflow-slider');\n $ofs.prop('ofs').slideToItem($ofs, $thisItem);\n\n // reinitialize the carousels in case they got cut short on initial page load and tab content hiding\n reinitializeCarousels($thisItem);\n\n updateTabbedContainerContent($thisItem);\n });\n\n $('.accordions').on('click', '.card-header', function () {\n var $thisItem = $(this);\n\n // reinitialize the carousels in case they got cut short on initial page load and tab content hiding\n reinitializeCarousels($thisItem);\n });\n\n var hash = location.hash;\n if (hash) {\n // check if any of the ofs__items have this href or target.\n $('.tabbed-container__tabs .ofs__item').each(function () {\n var $thisItem = $(this);\n var targetContentSelector = $thisItem.data('target') || $thisItem.attr('href');\n if (targetContentSelector === hash) {\n // go to this item\n $thisItem.trigger('click'); // this will call the event handler above to make this item active.\n return false; // break out of the .each() loop.\n }\n return true;\n });\n }\n }\n};\n","import * as allExports from './index.js';\nimport { mixin } from './index.js';\n\n// Add all of the Underscore functions to the wrapper object.\nvar _ = mixin(allExports);\n// Legacy Node.js API\n_._ = _;\n// Export the Underscore API.\nexport default _;\n","'use strict';\n\n/**\n * Display error messages and highlight form fields with errors.\n * @param {*} formElem - a string selector for the form or the form element which contains the fields\n * @param {Object} fieldErrors - the fields with errors\n * @param {number} index - index of current form, default is 0\n */\nfunction loadFormErrors(formElem, fieldErrors, index) { // eslint-disable-line\n // Display error messages and highlight form fields with errors.\n var currIndex = index || 0;\n let ogformElem = formElem;\n let isInvalidEmail = false;\n $.each(fieldErrors, function (fieldName) {\n if (fieldName === 'dwfrm_shipping_upsLocator_selectedAddress_email_emailAddress' || fieldName === 'email') {\n formElem = '.js-email-form'; // eslint-disable-line no-param-reassign\n isInvalidEmail = true;\n } else {\n formElem = ogformElem; // eslint-disable-line no-param-reassign\n }\n $(formElem).find('*[name*=' + fieldName + ']').eq(currIndex)\n .addClass('is-invalid')\n .siblings('.invalid-feedback')\n .html(fieldErrors[fieldName])\n .closest('.form-group')\n .addClass('is-invalid');\n });\n // Animate to top of form that has errors\n let headerOffset = $('.js-site-header').outerHeight() + 16;\n $(isInvalidEmail ? '.js-email-form' : ogformElem).find('.is-invalid').first().scrollTo(headerOffset);\n}\n\n/**\n * Clear the form errors.\n * @param {string} parentSelector - the parent form selector.\n */\nfunction clearPreviousErrors(parentSelector) {\n $(parentSelector).find('.is-invalid').removeClass('is-invalid');\n $('.error-message').hide();\n}\n\nmodule.exports = {\n loadFormErrors: loadFormErrors,\n clearPreviousErrors: clearPreviousErrors\n};\n","'use strict';\n\nconst utils = require('../components/utils');\nconst minicartSaleItemAlertBadge = require('../components/minicartSaleItemAlertBadge');\n\nconst isCartPage = $('.page').data('action') === 'Cart-Show';\n\n/**\n * renders an error alert at the top of the page.\n * @param {Object} message - Error message to display\n */\nfunction createErrorNotification(message) {\n $('.cart-error').empty().alert({\n content: message,\n theme: 'danger',\n placement: 'inline',\n autoClose: false\n });\n}\n\n/**\n * Stolen from product/base.js so we don't need to import and execute the whole file.\n * Retrieves the relevant pid value\n * @param {jQuery} $el - DOM container for a given add to cart button\n * @return {string} - value to be used when adding product to cart\n */\nconst getPidFromQuickview = function ($el) {\n if ($('.quickview-modal').hasClass('show') && !$('.product-set').length) {\n return $el.closest('.modal-content').find('.product-quickview').data('pid');\n } else if ($('.product-set-detail').length || $('.product-set').length) {\n return $el.closest('.product-detail').find('.product-id').data('pid');\n }\n return $('.product-detail:not(\".bundle-item\")').data('pid');\n};\n\n/**\n * Confirmation for deleting an item from the cart\n * @param {Object} $this - jQuery target of event\n */\nfunction deleteItemConfirmation($this) {\n const productID = $this.data('pid');\n const uuid = $this.data('uuid');\n const urlParams = {\n pid: productID,\n uuid: uuid,\n cartSource: isCartPage ? 'cart' : 'mini-cart' // For dtm-events\n };\n const url = utils.setUrlData($this.data('action'), urlParams);\n\n $('body > .modal-backdrop').remove();\n $.spinner().start();\n $('body').trigger('cart:beforeUpdate');\n\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json'\n }).done(data => {\n window.dispatchEvent(new Event('cart:updated:dtm'));\n if (data.basket.items.length === 0 && isCartPage) {\n window.location.reload();\n } else {\n $.spinner().stop();\n\n if (data.toBeDeletedUUIDs && data.toBeDeletedUUIDs.length) {\n data.toBeDeletedUUIDs.forEach(uuidToDelete => {\n $(`uuid-${uuidToDelete}`).remove();\n });\n }\n $(`.uuid-${uuid}`).remove();\n if (!data.basket.hasBonusProduct) {\n $('.bonus-product').remove();\n }\n }\n\n // if we're on the cart page, cart.js will handle this event\n $('body').trigger('cart:update', data.basket);\n\n $('body').trigger('minicart:updatecount', data.basket.numItems);\n\n // TODO: data.reservation is always an object (may be empty).\n // if empty or reservableProductsInCart is falsy,\n // reservationTimerHelper.getDestroyTimer() returns a function that is not executed.\n if (data.reservation) {\n const reservationTimerHelper = require('../components/reservationTimer');\n if (data.reservation.reservableProductsInCart) {\n reservationTimerHelper.updateReservationData(data);\n } else {\n reservationTimerHelper.getDestroyTimer();\n delete window.resources.reservation;\n }\n }\n\n if (data.dtmEvent) {\n $('body').trigger('cart:emitEvents', { events: data.dtmEvent });\n }\n\n if (data && 'dtmLayer' in data && 'digitalData' in window) {\n if (data.dtmLayer.pageInstanceID) {\n window.digitalData.pageInstanceID = data.dtmLayer.pageInstanceID;\n }\n if (data.dtmLayer.page) {\n window.digitalData.page = data.dtmLayer.page;\n }\n if (data.dtmLayer.user) {\n window.digitalData.user = data.dtmLayer.user;\n }\n if (data.dtmLayer.cart) {\n window.digitalData.cart = data.dtmLayer.cart;\n minicartSaleItemAlertBadge.toggleAlertBadge();\n\n // Update Stylitics widget on cart page if it exists\n $('body').trigger('stylitics:update');\n }\n }\n }).fail(err => {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n $.spinner().stop();\n createErrorNotification(err.responseJSON.errorMessage);\n }\n });\n}\n\n/**\n * Creates a confirmation modal when the Remove button is clicked, on cart or minicart.\n * @param {JQuery} $this the remove button that was clicked. it contains data attributes for creating the modal.\n */\nfunction removeProductModal($this) {\n const productName = $this.data('name');\n const pid = $this.data('pid');\n const uuid = $this.data('uuid');\n const isBonusProduct = $this.data('bonus-product');\n const showSFL = $this.data('show-sfl-btn') && !$this.data('sfl-requires-login');\n\n const removeButton = ``;\n\n const cancelButton = ``;\n\n const sflButton = ``;\n\n const buttons = [removeButton];\n buttons.push(showSFL ? sflButton : cancelButton);\n\n const modalContent = isBonusProduct ? `

      ${window.resources.cart.removeBonusProductBody}

      ${productName}

      ` : `

      ${window.resources.cart.removeProductBody}

      ${productName}

      `;\n const $confirmModal = $.modal({\n title: window.resources.cart.removeProduct,\n content: modalContent,\n modalSizeClass: 'modal-md',\n buttons\n });\n\n $confirmModal.on('shown.bs.modal', function () {\n $confirmModal.on('click', '.cart-delete-confirmation-btn', function (e) {\n e.preventDefault();\n deleteItemConfirmation($(this));\n });\n });\n\n $confirmModal.one('hidden.bs.modal', function () {\n // if the modal was closed without removing the product, make sure the qty is not 0\n const $qtyField = $this.closest('.product-card').find('.js-quantity'); // Cart-page only\n if ($qtyField.val() < 1) {\n $qtyField.val(parseInt($qtyField.data('pre-select-qty'), 10));\n }\n\n // We remove here so that the deletion happens before the modal closes\n $confirmModal.remove();\n $.enableScroll();\n });\n}\n\n/**\n * Click handler for when user clicks the save for later button on a product\n * @param {Object} $this - jQuery target of event\n */\nfunction saveForLater($this) {\n let pid = $this.data('pid');\n let uuid = $this.data('uuid');\n let removeFromCart = $this.data('removeFromCart');\n let formData = {\n pid,\n uuid,\n removeFromCart\n };\n\n $.spinner().start();\n $('body').trigger('cart:beforeUpdate');\n $.ajax({\n url: window.resources.cart.saveForLaterUrl, // Cart-SaveForLaterProductLineItem\n type: 'POST',\n data: formData,\n dataType: 'json'\n }).done(function (data) {\n if (data.error) {\n $.spinner().stop();\n createErrorNotification(data.errorMessage);\n return;\n }\n\n if (isCartPage) {\n $('body').trigger('cart:refresh');\n\n $('.js-saveforlater-listsize').html(data.listSizeMsg).data('listsize', data.lineItemsTotalCount);\n\n // update stuff\n if (!data.cart.numItems) {\n location.reload();\n } else {\n $('body').trigger('cart:update', data.cart);\n }\n } else { // saved from minicart\n $.spinner().stop();\n $(document).trigger('minicart:updatecount', data.cart.numItems);\n }\n\n $.alert({\n content: data.alertMsg,\n theme: 'success',\n placement: 'banner'\n });\n\n\n if (data && 'dtmLayer' in data && 'digitalData' in window) {\n if (data.dtmLayer.pageInstanceID) {\n window.digitalData.pageInstanceID = data.dtmLayer.pageInstanceID;\n }\n if (data.dtmLayer.page) {\n window.digitalData.page = data.dtmLayer.page;\n }\n if (data.dtmLayer.user) {\n window.digitalData.user = data.dtmLayer.user;\n }\n if (data.dtmLayer.cart) {\n window.digitalData.cart = data.dtmLayer.cart;\n minicartSaleItemAlertBadge.toggleAlertBadge();\n }\n }\n\n if (data.dtmEvent) {\n $('body').trigger('cart:emitEvents', { events: data.dtmEvent });\n }\n\n // Update Stylitics widget on cart page if it exists\n $('body').trigger('stylitics:update');\n }).fail(function (err) {\n if (err.responseJSON.redirectUrl) {\n location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification(err.responseJSON.errorMessage);\n $.spinner().stop();\n }\n });\n}\n\n/**\n * Sets up Remove Coupon modal with the data needed to remove the coupon.\n * `.remove-coupon` button triggers a modal via `data-toggle=\"modal\"`.\n * Modal markup is already hidden on page with id `#removeCouponModal`\n * @param {jQuery} $this - the clicked remove button\n */\nfunction removeCoupon($this) {\n let couponCode = $this.data('code');\n\n $('.delete-coupon-confirmation-btn').data({\n uuid: $this.data('uuid'),\n code: couponCode\n });\n $('.coupon-to-remove').text(couponCode);\n}\n\n/**\n * Updates the CGR rewards card and banner on cart/checkout pages\n * @param {Object} data - AJAX response from the server\n */\nfunction updateRewardsCardAndBanner(data) {\n if (data.rewardsCard) {\n // Check for points multiplier\n $('.js-rewards-banner-promomsg').toggleClass('d-none', data.rewardsCard.basketMultiplier <= 1);\n\n // update rewards balance messaging, if applicable\n if (data.rewardsCard.loyaltyActive) {\n if (data.rewardsCard.appliedRewards && data.rewardsCard.appliedRewards.value > 0) { // rewards applied\n $('.js-rewards-balance-msg').html('Rewards applied: ' + data.rewardsCard.appliedRewards.formatted + '');\n $('.js-rewards-banner-remaining').text(data.rewardsCard.remainingRewards);\n $('.checkoutRewardsBanner__detail-small').toggleClass('d-none', false);\n } else { // rewards removed\n if (data.rewardsCard.rewardsBalance) {\n if (data.rewardsCard.rewardsBalance.available.numericValue < 5) {\n $('.js-rewards-balance-msg').html('Rewards Balance: ' + data.rewardsCard.rewardsBalance.available.currencyFormattedString + '');\n } else {\n $('.js-rewards-balance-msg').html('Available Rewards: ' + data.rewardsCard.rewardsBalance.available.currencyFormattedString + '');\n }\n }\n\n $('.checkoutRewardsBanner__detail-small').toggleClass('d-none', true);\n }\n }\n\n // update earned rewards on basket\n // Toggle Cart and Checkout Banner Guest Rewards Message\n const cartWillEarnRewards = data.rewardsCard.rewards && data.rewardsCard.rewards.promoRewards.value > 0;\n $('.js-cart-rewards-banner, .js-checkout-shipping-rewards-banner').toggleClass('d-none', !cartWillEarnRewards);\n $('.js-cart-rewards-banner-zero, .js-checkout-shipping-rewards-banner-zero').toggleClass('d-none', cartWillEarnRewards);\n\n // Toggle Rewards Card Basket Earnings Message\n $('.js-rewards-earnings-msg').toggleClass('d-none', !cartWillEarnRewards);\n $('.js-rewards-earnings-msg-zero').toggleClass('d-none', cartWillEarnRewards);\n\n if (cartWillEarnRewards) {\n if (data.rewardsCard.rewards.strikeThrough) {\n $('.js-rewards-banner-strikethrough').toggleClass('d-none', false);\n $('.js-rewards-banner-strikethrough').html(data.rewardsCard.rewards.strikeThrough);\n $('.js-rewards-banner-earnamt').text(data.rewardsCard.rewards.promoRewards.formatted);\n } else {\n $('.js-rewards-banner-strikethrough').toggleClass('d-none', true);\n $('.js-rewards-banner-earnamt').text(data.rewardsCard.rewards.baseRewards.formatted);\n }\n }\n }\n}\n\n/**\n * confirmation of coupon removal from total\n * @param {jQuery} $this - the clicked confirmation button ( $('.delete-coupon-confirmation-btn') )\n */\nfunction removeCouponConfirmation($this) {\n const url = utils.setUrlData($this.data('action'), { // Cart-RemoveCouponLineItem\n code: $this.data('code'),\n uuid: $this.data('uuid')\n });\n\n $('body > .modal-backdrop').remove();\n\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json'\n }).done(data => {\n $('body').trigger('cart:update', data);\n\n $('.js_braintree_paypal_cart_button').removeClass('disabled');\n $.spinner().stop();\n\n if ('dtmLayer' in data && data.dtmLayer && 'digitalData' in window) {\n ['pageInstanceID', 'page', 'user', 'cart'].forEach(prop => {\n if (data.dtmLayer[prop]) {\n window.digitalData[prop] = data.dtmLayer[prop];\n }\n });\n }\n\n $('body').trigger('updateBillingBlockDataAttributes', data);\n\n if (data.dtmEvent) {\n $('body').trigger('cart:emitEvents', { events: data.dtmEvent });\n }\n\n updateRewardsCardAndBanner(data);\n }).fail(err => {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification(err.responseJSON.errorMessage);\n $.spinner().stop();\n }\n });\n}\n\n/**\n * Common handler for emitting analytics events\n * @param {Array} events - an array of dtmEvent objects\n */\nfunction emitCartEvents(events) {\n if ('_satellite' in window && !!events && events.length) {\n events.forEach((action) => {\n _satellite.track(action.event, action.data); // eslint-disable-line no-undef\n });\n }\n}\n\n/**\n * On page load, grab events written via template, fire them through dtm, and clear the on-page element.\n * The global variable is inside a template included in both cart and minicart\n */\nfunction processOnloadEvents() {\n /* global cartOnloadEvents */\n if (cartOnloadEvents) {\n emitCartEvents(cartOnloadEvents);\n }\n}\n\nmodule.exports = {\n init: function () {\n $('body')\n .on('click', '.js-remove-product', function (e) {\n e.preventDefault();\n removeProductModal($(this));\n })\n .on('click', '.js-saveForLater-product', function (e) {\n e.preventDefault();\n saveForLater($(this));\n })\n .on('click', '.remove-coupon', function (e) {\n e.preventDefault();\n removeCoupon($(this));\n })\n .on('click', '.delete-coupon-confirmation-btn', function (e) {\n e.preventDefault();\n removeCouponConfirmation($(this));\n })\n .on('cart:emitEvents', function (e, data) {\n e.preventDefault();\n emitCartEvents(data.events);\n });\n },\n updateRewardsCardAndBanner: updateRewardsCardAndBanner,\n getPidFromQuickview: getPidFromQuickview,\n processOnloadEvents: processOnloadEvents\n};\n","/* global clientData */\n'use strict';\n\n/**\n * Product Base Module\n */\n\nvar utils = require('../components/utils');\nvar onModel = require('../product/onModelDescription');\nvar Badge = require('../product/badge.js');\nvar Overview = require('../product/overview.js');\nconst minicartSaleItemAlertBadge = require('../components/minicartSaleItemAlertBadge');\n\n/*\n * All needed methods from app_storefront_base/cartridge/client/default/js/product/base.js have been overridden here\n */\n\nvar base = require('base/product/base');\nvar breakpoints = require('../components/breakpoints');\n\nconst $mainPDPGallery = $('.product-gallery--main');\nconst oosData = {};\n\n/**\n * method to identify if BISN is enabled at variant level\n * @param {Object} attrValue color swatch value\n * @param {Object} $productObject Product object\n * @returns {boolean} true if BISN is checked at variant level, else false\n */\nfunction isNotifyMeEnabled(attrValue, $productObject) {\n var enableNotifyMe;\n var varKeys = Object.keys($productObject.variantData);\n varKeys.forEach(function (key) {\n if ($productObject.variantData[key].color === attrValue.id) {\n enableNotifyMe = $productObject.variantData[key].bisnflag;\n return false;\n }\n return true;\n });\n return enableNotifyMe;\n}\n/**\n * Retrieves the relevant pid value\n * @param {jquery} $el - DOM container for a given add to cart button\n * @return {string} - value to be used when adding product to cart\n */\nfunction getPidValue($el) {\n var pid;\n\n if ($('.quickview-modal').hasClass('show') && !$('.product-set').length) {\n pid = $($el).closest('.modal-content').find('.product-quickview').data('pid');\n } else if ($('.product-set-detail').length || $('.product-set').length) {\n pid = $($el).closest('.product-detail').find('.product-id').data('pid');\n } else {\n pid = $('.product-detail:not(\".bundle-item\")').data('pid');\n }\n\n return pid;\n}\n\n/**\n * Process the attribute values for an attribute that has image swatches\n *\n * @param {Object} attr - Attribute\n * @param {Object} $productObject product object\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {string} topLevelAttribute - Either 'color' or 'sizeType'\n */\nfunction processSwatchValues(attr, $productObject, $productContainer, topLevelAttribute) {\n attr.values.forEach(function (attrValue) {\n const $swatchSpan = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"' + attrValue.value + '\"]');\n const $swatchAnchor = $swatchSpan.parent();\n const swatchOutOfStockText = $swatchAnchor.closest('.js-color-attribute').data('attr-oos-text');\n\n // Disable if not selectable\n $swatchSpan.removeClass('selected selectable unselectable');\n $swatchAnchor.removeClass('selected selectable unselectable'); // This is only for visual display\n $swatchAnchor.data('attr-oos', '');\n\n let url;\n if (attr.topLevelAttribute) { // Color as top-level\n /**\n * The top-level attribute (either color or sizeType) should always be clickable:\n *\n * For example, if you selected Standard/Black/M, normally you would not be\n * able to switch from Standard to Big, because Black/M is not a value combination\n * for Big.\n **/\n url = attrValue.url;\n if (url === undefined) {\n // This would be very rare\n $swatchAnchor.data('attr-url', '');\n $swatchAnchor.addClass('unselectable');\n $swatchSpan.addClass('unselectable');\n } else {\n // Top level is always selectable... Unless the URL above is empty.\n $swatchAnchor.data('attr-url', url);\n $swatchAnchor.addClass('selectable');\n $swatchSpan.addClass('selectable');\n }\n } else { // Color when SizeType is top-level.\n url = attrValue.url;\n if (url === undefined) {\n // This would be very rare\n $swatchAnchor.data('attr-url', '');\n $swatchAnchor.addClass('unselectable');\n $swatchSpan.addClass('unselectable');\n } else {\n if (topLevelAttribute === 'sizeType' && attrValue.url === undefined) { // eslint-disable-line\n // If there is a SizeType dimension, this will mess up stuff...\n $swatchAnchor.data('attr-url', '');\n $swatchAnchor.addClass('unselectable');\n $swatchSpan.addClass('unselectable');\n } else {\n $swatchAnchor.data('attr-url', url);\n $swatchAnchor.addClass('selectable');\n $swatchSpan.addClass('selectable');\n }\n }\n }\n const enableNotifyMe = isNotifyMeEnabled(attrValue, $productObject);\n\n // Reset aria-label attribute for each color option\n $swatchAnchor.attr('aria-label', attrValue.displayValue);\n if (attrValue.selected) {\n $swatchAnchor.addClass('selected');\n $swatchAnchor.attr('aria-label', attrValue.displayValue + ' ' + $swatchAnchor.data('selected-label'));\n $swatchAnchor.trigger('blur').on('focus', (e) => {\n e.preventDefault();\n e.target.focus({ preventScroll: true });\n });\n $swatchSpan.addClass('selected');\n $swatchAnchor.trigger('attribute:select', [$swatchAnchor, attrValue]);\n }\n\n if (attrValue.masterSelectable === false && enableNotifyMe !== null && !enableNotifyMe) {\n $swatchAnchor.addClass('not-orderable');\n $swatchSpan.addClass('not-orderable');\n if ($swatchAnchor.hasClass('unselectable')) {\n $swatchAnchor.removeClass('unselectable');\n $swatchSpan.removeClass('unselectable');\n }\n } else if (attrValue.masterSelectable === false && enableNotifyMe) {\n if (!$swatchAnchor.hasClass('unselectable')) {\n $swatchAnchor.addClass('unselectable');\n $swatchSpan.addClass('unselectable');\n }\n }\n\n if (attrValue.pdpUrl === undefined) {\n $swatchAnchor.removeAttr('href');\n } else {\n $swatchAnchor.attr('href', attrValue.pdpUrl);\n }\n\n if ($swatchAnchor.hasClass('unselectable')) {\n $swatchAnchor.attr('data-attr-oos', swatchOutOfStockText); // sets the data attribute to the out of stock text\n } else {\n $swatchAnchor.attr('data-attr-oos', '');\n }\n\n /*\n window.console.log('---',\n 'ID:', attr.id,\n 'Value:', attrValue.value,\n 'Selected:', attrValue.selected,\n 'Selectable:', attrValue.selectable, '\\n',\n 'url:', (attrValue.url && attrValue.url.split('?').length ? attrValue.url.split('?')[1] : attrValue.url), '\\n'\n );\n */\n });\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {string} topLevelAttribute - Either 'color' or 'sizeType'\n */\nfunction processNonSwatchValues(attr, $productContainer, topLevelAttribute) { // eslint-disable-line\n let count = 0;\n let selectedCount = 0;\n attr.values.forEach(function (attributeValue) {\n if (attributeValue.selectable) {\n count++;\n }\n if (attributeValue.selected) {\n selectedCount++;\n }\n });\n attr.values.forEach(function (attrValue) {\n const $attrValue = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"' + attrValue.value + '\"]');\n const attrOutOfStockText = $attrValue.closest('.js-size-attribute, .js-dimension-attribute').data('attr-oos-text');\n\n // Reset Everything\n $attrValue.removeClass('selected selectable unselectable');\n $attrValue.data('attr-oos', '');\n if (selectedCount === 0) {\n $attrValue.closest('.js-attribute').find('.js-attr-label-value').removeClass('text-danger').text(''); // reset attribute label\n }\n\n let url;\n if (attr.topLevelAttribute) { // SizeType\n /**\n * The top-level attribute (either color or sizeType) should always be clickable:\n *\n * For example, if you selected Standard/Black/M, normally you would not be\n * able to switch from Standard to Big, because Black/M is not a value combination\n * for Big.\n **/\n url = attrValue.url;\n if (url === undefined) {\n // This would be very rare\n $attrValue.data('attr-url', '');\n $attrValue.addClass('unselectable');\n } else {\n // Top level is always selectable... Unless the URL above is empty.\n $attrValue.data('attr-url', url);\n $attrValue.addClass('selectable');\n }\n } else { // Size or Dimension\n url = attrValue.url;\n if (url === undefined) {\n // This would be very rare\n $attrValue.data('attr-url', '');\n $attrValue.addClass('unselectable');\n } else {\n $attrValue.data('attr-url', url);\n\n if (attrValue.selectable) {\n $attrValue.addClass('selectable');\n } else {\n $attrValue.addClass('unselectable');\n }\n }\n }\n\n // Reset aria-label attribute\n $attrValue.attr('aria-label', $attrValue.data('attr-hover'));\n if (attrValue.selected) {\n $attrValue.addClass('selected');\n $attrValue.attr('aria-label', $attrValue.data('attr-hover') + ' ' + $attrValue.data('selected-label'));\n $attrValue.trigger('blur').on('focus', (e) => {\n e.preventDefault();\n e.target.focus({ preventScroll: true });\n });\n $attrValue.trigger('attribute:select', [$attrValue, attrValue]);\n }\n\n if (attr.attributeId && attr.attributeId.toLowerCase() === 'dimension') {\n if (attrValue.selectable) {\n if (count === 1 && attrValue.selected) {\n $attrValue.addClass('selected');\n } else {\n $attrValue.addClass('selectable');\n }\n } else {\n $attrValue.addClass('unselectable');\n }\n }\n\n if (attrValue.masterSelectable === false) {\n $attrValue.addClass('unselectable');\n }\n\n if (attrValue.pdpUrl === undefined) {\n $attrValue.removeAttr('href');\n } else {\n $attrValue.attr('href', attrValue.pdpUrl);\n }\n\n if ($attrValue.hasClass('unselectable')) {\n $attrValue.attr('data-attr-oos', attrOutOfStockText); // sets the HTML data attribute to the out of stock text\n } else {\n $attrValue.attr('data-attr-oos', '');\n }\n\n /*\n window.\n ('---',\n 'ID:', attr.id,\n 'Value:', attrValue.value,\n 'Selected:', attrValue.selected,\n 'Selectable:', attrValue.selectable, '\\n',\n 'url:', (attrValue.url && attrValue.url.split('?').length ? attrValue.url.split('?')[1] : attrValue.url), '\\n'\n );\n */\n });\n}\n\n/**\n * Color swatches can be broken up into price groups. If all the swatches are hidden, also hide the price label.\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction hideColorPriceGroups($productContainer) {\n $('.priceGroup', $productContainer).each(function () {\n var groupVisible = false;\n $(this).find('.color-value').each(function () {\n if ($(this).hasClass('selectable')\n && $(this).hasClass('not-orderable') === false\n && $(this).hasClass('invalid') === false\n ) {\n groupVisible = true;\n }\n });\n\n if (groupVisible) {\n $(this).show();\n } else {\n $(this).hide();\n }\n });\n}\n\n/**\n * Pass in an array of SKUs, the variantData array, and and Attribute ID\n * Returns an array of unique Attribute Values from the SKUs\n *\n * @param {Object} variantData - Indexed by SKU. See models/product/decorators/variantMatrix.js\n * @param {array} skuArray - Array of skus\n * @param {string} attributeID - Attribute ID\n * @return {array} - Array of unique attribute values\n */\nfunction getSkuValues(variantData, skuArray, attributeID) {\n var arr = [];\n for (var i = 0; i < skuArray.length; i++) {\n var sku = skuArray[i];\n if (variantData[sku] !== undefined) {\n var attributeValue = variantData[sku][attributeID];\n if (arr.indexOf(attributeValue) === -1) {\n arr.push(attributeValue);\n }\n }\n }\n return arr; // These are all the valid values\n}\n\n/**\n * For products with 3 dimensions of attributes, we must hide/show swatch combinations\n * that are not valid possibilities. For example, a pant sizes of SizeType \"Big\" and a\n * Size of \"30/30\". Big pants are not available in this size...\n *\n * @param {jQuery} $productContainer - DOM element for a given product\n * @param {array} attrs - Attributes from the AJAX productObject.variationAttributes result\n * @param {string} topLevelAttribute - sizeType, color or empty\n * @param {array} allAttributes - Possible values are sizeType, color, size, dimension\n * @param {Object} variantData - Indexed by SKU. See models/product/decorators/variantMatrix.js\n * @param {Object} variantMatrix - Indexed by Attribute. See models/product/decorators/variantMatrix.js\n */\nfunction hideShowValidSwatches($productContainer, attrs, topLevelAttribute, allAttributes, variantData, variantMatrix) {\n if (topLevelAttribute === '') {\n return;\n }\n\n var hasSizeType = allAttributes.indexOf('sizeType') !== -1;\n var hasColor = allAttributes.indexOf('color') !== -1;\n var hasSize = allAttributes.indexOf('size') !== -1;\n var hasDimension = allAttributes.indexOf('dimension') !== -1;\n\n // The functionality below only applies in these two scenarios:\n // 1. A product which SizeType + Color + Size\n // 2. A product which has Color + Size + Dimension\n if (!(hasSizeType || hasDimension)) {\n return;\n }\n\n // Get all the currently selected attributes values:\n var selectedAttributes = {};\n attrs.forEach(function (attr) {\n attr.values.forEach(function (attrValue) {\n if (attrValue.selected) {\n selectedAttributes[attr.id] = attrValue.value;\n }\n });\n });\n\n var skuArray;\n if (topLevelAttribute === 'sizeType' && hasSizeType) {\n $productContainer.find('.js-attribute-size .js-attribute-value').removeClass('invalid');\n $productContainer.find('.js-attribute-color .js-attribute-value').removeClass('invalid');\n\n // There should always be a SizeType selected, otherwise we\n // cannot determine which color and size swatches are valid.\n var selectedSizeType = selectedAttributes['sizeType']; // eslint-disable-line dot-notation\n if (selectedSizeType === undefined) {\n return;\n }\n\n // Array of skus which have the selected SizeType.\n skuArray = variantMatrix['sizeType'][selectedSizeType]; // eslint-disable-line dot-notation\n\n // Based on the selected SizeType, show/hide \"valid\" Size swatches.\n if (hasSize) {\n var validSizes = getSkuValues(variantData, skuArray, 'size'); // Array of unique \"Size\" values in sku array.\n\n // Hide all skus with invalid values\n if (validSizes.length) {\n $productContainer.find('.js-attribute-size .js-attribute-value').each(function () {\n var val = $(this).data('attr-value');\n if (val !== undefined && validSizes.indexOf(String(val)) === -1) {\n // Value of swatch does not appear in array. Hide swatch.\n $(this).addClass('invalid');\n }\n });\n }\n }\n\n // Based on the selected SizeType, show/hide \"valid\" Color swatches.\n if (hasColor) {\n var validColors = getSkuValues(variantData, skuArray, 'color'); // Array of unique \"Color\" values in sku array.\n\n if (validColors.length) {\n $productContainer.find('.js-attribute-color .js-attribute-value').each(function () {\n var val = $(this).data('attr-value');\n if (val !== undefined && validColors.indexOf(String(val)) === -1) {\n // Value of swatch does not appear in array. Hide swatch.\n $(this).addClass('invalid');\n }\n });\n }\n }\n } else if (topLevelAttribute === 'color' && hasDimension) {\n $productContainer.find('.js-attribute-dimension .js-attribute-value').removeClass('invalid');\n\n // Dimension is an attribute of the selected Size and Color.\n var selectedSize = selectedAttributes['size']; // eslint-disable-line dot-notation\n if (selectedSize === undefined) {\n return;\n }\n\n var skuColorArray = [];\n var skuSizeArray = [];\n if (hasColor) {\n var selectedColor = selectedAttributes['color']; // eslint-disable-line dot-notation\n if (selectedColor !== undefined) {\n skuColorArray = variantMatrix['color'][selectedColor]; // eslint-disable-line dot-notation\n }\n }\n\n // Based on the selected Size, show/hide \"valid\" Size swatches.\n if (hasSize) {\n // Array of skus which have the selected SizeType.\n skuSizeArray = variantMatrix['size'][selectedSize]; // eslint-disable-line dot-notation\n\n // Note: Both Color and Size must be selected to determine which lengths are \"valid\" options.\n if (skuSizeArray.length && skuColorArray.length) {\n // If both Size and Color are selected, determine which skus\n // appear in both arrays via intersection.\n skuArray = utils.arrayIntersection(skuSizeArray, skuColorArray);\n } else {\n skuArray = skuSizeArray;\n }\n\n var validDimensions = getSkuValues(variantData, skuArray, 'dimension'); // Array of unique \"dimension\" values in sku array.\n\n // Hide all skus with invalid values\n if (validDimensions.length) {\n $productContainer.find('.js-attribute-dimension .js-attribute-value').each(function () {\n var val = $(this).data('attr-value');\n if (val !== undefined && validDimensions.indexOf(String(val)) === -1) {\n // Value of swatch does not appear in array. Hide swatch.\n $(this).addClass('invalid');\n }\n });\n }\n }\n }\n}\n\n/**\n * Get selected size/dimension swatch\n * @param {string} variantID Variant ID to locate in the productCache data\n * @param {Object} swatchArrays Contains arrays of variants, organized by size/dim\n * @param {Array} swatchKeys Array containing swatch key values (eg. 'S', 'M', 'L', etc.)\n * @return {string} Size or dimension that is currently selected\n */\nfunction getSelectedSwatchValue(variantID, swatchArrays, swatchKeys) {\n var result;\n for (let i = 0; i < swatchKeys.length; i++) {\n if (swatchArrays[swatchKeys[i]].includes(variantID)) {\n result = swatchKeys[i];\n break;\n }\n }\n return result;\n}\n\n/**\n * Adds 'unselectable' class to color swatches\n * @param {Object} colorVariantArrays Object containing variantID arrays, grouped by color ID\n * @param {Array} colorVariantKeys Array of color ID indices\n * @param {string} variantID Target variant ID\n */\nfunction markOOSColorVariants(colorVariantArrays, colorVariantKeys, variantID) {\n colorVariantKeys.forEach(colorVarKey => {\n if (colorVariantArrays[colorVarKey].includes(variantID)) {\n // Find the matching color swatch span and mark the parent anchor element as 'unselectable'\n $('.js-attribute-value[data-attr-value=\"' + colorVarKey + '\"]')\n .closest('.js-color-swatch')\n .removeClass('selectable')\n .addClass('unselectable');\n }\n });\n}\n\n/**\n *\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateOOSColorVariants($productContainer) {\n const masterID = String($productContainer.data('master-pid'));\n const variantID = String($productContainer.data('pid'));\n\n // Exit function if productCache prerequisites are not met\n if (!window.productCache || !masterID || !variantID ||\n !window.productCache[masterID] ||\n !window.productCache[masterID].variantMatrix ||\n !window.productCache[masterID].variantMatrix.inventory) {\n return;\n }\n\n if (JSON.stringify(oosData) === '{}') {\n oosData.colorVariantArrays = window.productCache[masterID].variantMatrix.color || {};\n oosData.colorVariantKeys = Object.keys(oosData.colorVariantArrays);\n oosData.sizeVariantArrays = window.productCache[masterID].variantMatrix.size || {};\n oosData.sizeVariantKeys = Object.keys(oosData.sizeVariantArrays);\n oosData.dimVariantArrays = window.productCache[masterID].variantMatrix.dimension || {};\n oosData.dimVariantKeys = Object.keys(oosData.dimVariantArrays);\n }\n\n const oosVariants = window.productCache[masterID].variantMatrix.inventory[0];\n if (oosVariants) {\n let selectedSize;\n let selectedDim;\n\n selectedSize = oosData.sizeVariantArrays ? getSelectedSwatchValue(variantID, oosData.sizeVariantArrays, oosData.sizeVariantKeys) : null;\n selectedDim = oosData.dimVariantArrays ? getSelectedSwatchValue(variantID, oosData.dimVariantArrays, oosData.dimVariantKeys) : null;\n\n if (selectedSize) {\n if (selectedDim) {\n // Locate variantID that may exist in intersection of size & dimension arrays\n // and identify which colors are out of stock for this size & dimension combination\n oosData.dimVariantArrays[selectedDim].forEach(variant => {\n if (oosVariants.includes(variant) && oosData.sizeVariantArrays[selectedSize].includes(variant)) {\n markOOSColorVariants(oosData.colorVariantArrays, oosData.colorVariantKeys, variant);\n }\n });\n } else {\n // Loop through 'size' variants and identify which colors are out of stock for this size\n oosData.sizeVariantArrays[selectedSize].forEach(variant => {\n if (oosVariants.includes(variant)) {\n markOOSColorVariants(oosData.colorVariantArrays, oosData.colorVariantKeys, variant);\n }\n });\n }\n }\n }\n}\n\n/**\n * Routes the handling of attribute processing depending on whether the attribute has image\n * swatches or not\n *\n * @param {Object} productObject - Product Data\n * @param {string} attr.id - Attribute ID\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateAttrs(productObject, $productContainer) {\n var attrs = productObject.variationAttributes;\n\n // Currently, the only attribute type that has image swatches is Color.\n var attrsWithSwatches = ['color'];\n\n // Find attribute with topLevelAttribute == true\n var topLevelArray = attrs.filter(function (attr) {\n return attr.topLevelAttribute;\n });\n\n // Possible values are: sizeType, color or empty.\n var topLevelAttribute = topLevelArray.length ? topLevelArray[0].id : '';\n\n // Determine all available attributes: sizeType, color, size, dimension\n var allAttributes = [];\n attrs.forEach(function (attr) {\n allAttributes.push(attr.id);\n if (attrsWithSwatches.indexOf(attr.id) > -1) {\n processSwatchValues(attr, productObject, $productContainer, topLevelAttribute);\n } else {\n processNonSwatchValues(attr, $productContainer, topLevelAttribute);\n }\n });\n\n // variantData and variantMatrix values are set in productDetails.isml and added to the\n // window object. Values are indexed by the master PID so multiple Quickview windows\n // are possible without overwriting these values.\n var pid = productObject.masterId;\n if (window.productCache && window.productCache[pid]) {\n var variantData = window.productCache[pid].variantData;\n var variantMatrix = window.productCache[pid].variantMatrix;\n\n hideShowValidSwatches($productContainer, attrs, topLevelAttribute, allAttributes, variantData, variantMatrix);\n }\n\n hideColorPriceGroups($productContainer);\n}\n\n/**\n * Updates the availability status in the Product Detail Page\n *\n * @param {Object} response - Ajax response object after an attribute value has been [de]selected\n * @param {jQuery} $productContainer - DOM element for a given product\n *\n * @param {Object} selectedAttributeID - attribute being updated\n */\nfunction updateAvailability(response, $productContainer, selectedAttributeID) {\n var availabilityValue = '';\n var availabilityMessages = response.product.availability.messages;\n // this boolean is to hide the \"In Stock\" message on PDP page\n var instockBool = response.product.availability.instock;\n var velocityValue = '';\n var velocityMessages = response.product.velocityMessage.messages;\n\n // Adding the condition if price is null then \"Availability message\" should be disabled\n if (!instockBool && response.product.readyToOrder && response.product.price.sales && response.product.price.sales.value && availabilityMessages.length) {\n availabilityValue += '
      ';\n availabilityMessages.forEach(function (message) {\n availabilityValue += '
      ' + message.content + '
      ';\n });\n availabilityValue += '
      ';\n }\n\n // Reset Notify Me form and messages\n $('.notifyMeFormMessage').hide();\n $('.js-notifyMeFormContainer').hide();\n\n if (velocityMessages.length) {\n velocityValue += '
      ';\n velocityMessages.forEach(function (message) {\n velocityValue += $('
      ', {\n class: message.cssClass ? message.cssClass : '',\n text: message.text\n })[0].outerHTML;\n });\n velocityValue += '
      ';\n // Reveal \"Notify Me\" button and update variant ID\n $('.notify-me.btn').show().data('cta', 'showForm').data('pid', response.product.id);\n } else {\n // hide notify me messages and button\n $('.product__message--velocity').hide();\n $('.notify-me.btn').hide();\n }\n\n // Remove initial loading state class\n $('.js-attribute').removeClass('loading-opacity');\n\n $($productContainer).trigger('product:updateAvailability', {\n product: response.product,\n $productContainer: $productContainer,\n selectedAttributeID: selectedAttributeID,\n message: availabilityValue,\n availabilityMessages,\n resources: response.resources,\n velocityMessage: velocityValue\n });\n}\n\n/**\n * Make \"notify me\" status visible on variant swatches\n */\nfunction setVariantNotifyMeStatus() {\n const variantMaster = $('.product-detail').data('master-pid');\n const colorSwatchID = $('.js-attribute-value.selected').data('attr-value');\n\n // In checkout, this object does not exist, causing an error to be thrown in the console.\n if (!window.productCache) {\n return;\n }\n\n const colorSwatchVariantArray = window.productCache[variantMaster].variantMatrix.color[colorSwatchID];\n\n if (colorSwatchVariantArray) {\n // Lookup variant sizes\n colorSwatchVariantArray.forEach(function (variant) {\n const variantSize = window.productCache[variantMaster].variantData[variant].size;\n const variantNotifyMe = window.productCache[variantMaster].variantData[variant].bisnflag;\n const $swatch = $('.js-size-swatch[data-attr-hover=\"' + variantSize + '\"]');\n\n // Flag swatches to indicate notify me status (see forceOOSNotifyMe)\n $swatch.toggleClass('js-notifyme-swatch', !!variantNotifyMe);\n });\n }\n}\n\n/**\n * Force notify me message to display if all variants are OOS\n */\nfunction forceOOSNotifyMe() {\n const $notifymeVariant = $('.js-notifyme-swatch.selected');\n const allOOS = $notifymeVariant.length &&\n $('.js-size-swatch.unselectable').length === $('.js-size-swatch').length;\n\n if (allOOS && $('.js-notifyMeFormContainer').is(':empty')) {\n const selectedAttributeID = $notifymeVariant.closest('.js-attribute').data('attr');\n const velocityMessage = $('.selectswatch-size-msg').text();\n const pid = $('.product-detail').data('pid');\n let $productContainer = $notifymeVariant.closest('.set-item');\n\n if (!$productContainer.length) {\n $productContainer = $notifymeVariant.closest('.product-detail');\n }\n\n $(window).trigger('product:triggerNotifyMe', { hideForm: true });\n\n $($productContainer).trigger('product:updateAvailability', {\n product: {\n id: pid,\n notifyme: true\n },\n $productContainer: $productContainer,\n selectedAttributeID: selectedAttributeID,\n velocityMessage: velocityMessage\n });\n }\n}\n\n/**\n * Generates callout message html for promotions\n *\n * @param {array} promotions - list of promotions\n * @return {string} - Compiled HTML\n */\nfunction getPromotionCalloutHtml(promotions) {\n if (!promotions) {\n return '';\n }\n\n var html = '';\n\n promotions.forEach(function (promotion) {\n // Verify that these are not member exclusive promotions and that calloutMsg has a valid value\n // promotion.details is optional\n if (!promotion.isExclusive) {\n promotion.callOutMessageDisplayPages.forEach(function (displayPage) {\n if (displayPage.value === 'PDP' && promotion.calloutMsg) {\n html += `
      ${promotion.calloutMsg}
      `;\n }\n });\n }\n });\n\n return html;\n}\n\n/**\n * Generates callout message html for exclusive member promotions\n *\n * @param {Object} promotion - promotion\n * @return {string} - Compiled HTML\n */\nfunction getExclusivePromotionCalloutHtml(promotion) {\n if (!promotion || !promotion.callOutMessageDisplayPages) {\n return '';\n }\n\n var html = '';\n\n // Verify that these are member exclusive promotions and that calloutMsg has a valid value\n // promotion.details is optional\n promotion.callOutMessageDisplayPages.forEach(function (displayPage) {\n if (displayPage.value === 'PDP' && promotion.calloutMsg) {\n const highlightClass = promotion.messageHighlight ? 'callout--highlight' : '';\n\n if (promotion.calloutOpenAccount) {\n html += `\n `;\n } else {\n html += `
      ${promotion.calloutMsg}
      `;\n }\n }\n });\n\n return html;\n}\n\n/**\n * Change product primary images when user hovers on color swatches\n * @param {Object} images - images to be updated\n * @param {Object} $productContainer - Product Details container reference\n */\nfunction onColorVariantHover(images, $productContainer) {\n // Update primary images\n if (images) {\n const $imageGalleries = $productContainer.find('.js-product-gallery, .js-product-gallery-thumb');\n const retinaEnabled = window.resources.images.retinaEnabled || false;\n const hiresImgUrlParams = window.resources.images.hiresImgUrlParams;\n const pdpImgUrlParams = window.resources.images.pdpProductImgAppend;\n const badgeData = $productContainer.data('badge');\n const pdpTechBadgeData = $productContainer.data('pdp-tech-badge');\n const isQuickView = $productContainer.hasClass('product-quickview');\n const enableStylitics = window.resources.stylitics && window.resources.stylitics.enabled;\n const MAX_QV_IMG_COUNT = 8; // Limit number of images on quickview\n\n $imageGalleries.each(function () {\n const $imageGallery = $(this);\n const $swiperWrapper = $imageGallery.find('.swiper-wrapper');\n const swiperSlideStyle = $swiperWrapper.find('.swiper-slide').first().attr('style') || '';\n const isThumbnail = $imageGallery.hasClass('js-product-gallery-thumb');\n let imageAltIdx = 1;\n\n $swiperWrapper.empty();\n\n for (let idx = 0; idx < images.length; idx++) {\n let imageData = images[idx];\n if (isQuickView && idx === MAX_QV_IMG_COUNT) {\n break;\n }\n\n if (!imageData) {\n continue;\n }\n\n let url = imageData.url;\n const alt = imageData.alt;\n const width = imageData.width;\n const height = imageData.height;\n const badgeHTML = Badge.displayBadge(badgeData);\n const techBadgeHTML = Badge.displayTechBadge(pdpTechBadgeData);\n let swiperSlideClass = '';\n let $swiperSlide;\n let $swiperImg;\n let $zoomControls;\n let $styliticsLink;\n\n if (url.indexOf('scene7') > 0 && url.indexOf('?') <= 0) {\n url += pdpImgUrlParams;\n }\n\n if (idx === 0) {\n swiperSlideClass = isThumbnail ? 'swiper-slide-thumb-active' : 'swiper-slide-active';\n } else if (idx === 1) {\n swiperSlideClass = 'swiper-slide-next';\n }\n\n if (imageData.videoUrl) {\n swiperSlideClass += ' swiper-slide-video';\n } else {\n swiperSlideClass += ' js-product-image';\n }\n\n $swiperSlide = $(`
    2. `);\n\n if (imageData.videoUrl) {\n if (isThumbnail) {\n $swiperImg = $(`\n \n \n \n \n `);\n } else {\n $swiperImg = $(`\n \n `);\n }\n } else {\n var onModelAttribute = imageData.modelData ? `data-onmodel=\"${encodeURIComponent(imageData.modelData)}\"` : '';\n\n // Do not attach zoom controls for QuickView\n $zoomControls = !isQuickView && !isThumbnail ? $(`\n \n `) : null;\n\n // Do not attach stylitics jumplink for QuickView\n $styliticsLink = enableStylitics && !isQuickView && !isThumbnail ? $(`\n \n `) : '';\n\n if (isThumbnail) {\n $swiperImg = $(`\n \n `);\n } else {\n $swiperImg = $(`\n
      \n ${badgeHTML}\n ${techBadgeHTML}\n
      \n \n
      \n
      \n `);\n }\n }\n\n $swiperImg.append($zoomControls);\n $swiperImg.append($styliticsLink);\n $swiperSlide.append($swiperImg);\n $swiperSlide.appendTo($swiperWrapper);\n }\n\n this.swiper.update();\n this.swiper.slideTo(0);\n });\n\n $('body').trigger('product:afterImageGalleryUpdate');\n }\n}\n\n/**\n * Create sketchfab asset\n * @param {Object} assetData - assets to be updated\n * @param {boolean} isThumbnail - if asset is a thumbnail\n * @return {jQuery} $asset\n */\nfunction createSketchfabAsset(assetData, isThumbnail) {\n let $asset;\n\n if (isThumbnail) {\n $asset = $(`\n
    3. \n \n
    4. \n `);\n } else {\n $asset = $(`\n
    5. \n \n
    6. \n `);\n }\n\n return $asset;\n}\n\n/**\n * Create video asset\n * @param {Object} assetData - assets to be updated\n * @param {boolean} isThumbnail - if asset is a thumbnail\n * @return {jQuery} $asset\n */\nfunction createVideoAsset(assetData, isThumbnail) {\n let $asset;\n let $swiperContent;\n\n if (isThumbnail) {\n $asset = $(`\n
    7. \n \n
    8. \n `);\n } else {\n $asset = $(`
    9. `);\n }\n\n $swiperContent = $(`\n \n \n \n `);\n\n $asset.prepend($swiperContent);\n\n return $asset;\n}\n\n/**\n * Create asset slide and thumbnail\n * @param {Object} assetData - assets to be updated\n * @param {string} assetType - Asset type: video or sketchfab\n */\nfunction createSwiperAssets(assetData, assetType) {\n const $imageGalleries = $mainPDPGallery.closest('.primary-images').find('.js-product-gallery, .js-product-gallery-thumb');\n\n $imageGalleries.each(function () {\n const $imageGallery = $(this);\n const $wrapper = $imageGallery.find('.swiper-wrapper');\n const isThumbnail = $imageGallery.hasClass('js-product-gallery-thumb');\n let $swiperSlide;\n\n if (assetType === 'sketchfab') {\n $swiperSlide = createSketchfabAsset(assetData, isThumbnail);\n } else if (assetType === 'video') {\n $swiperSlide = createVideoAsset(assetData, isThumbnail);\n } else {\n return;\n }\n\n $wrapper.append($swiperSlide);\n this.swiper.update();\n });\n}\n\n/**\n * Create asset element\n * @param {Object} assetData - asset to be updated\n * @param {string} assetType - Asset type: video or sketchfab\n * @param {Object} $productContainer - for product container\n */\nfunction createAssets(assetData, assetType) {\n if (assetData) {\n createSwiperAssets(assetData, assetType);\n }\n}\n\n/**\n * Create image container and hide existing images on products\n * @param {Object} images - images to be updated\n * @param {Object} $productContainer - Product Details container reference\n */\nfunction createImagesAndVideo(images, $productContainer) {\n // Update primary images\n if (images) {\n onColorVariantHover(images, $productContainer);\n }\n var altText = window.productThumbnailAltText ? window.productThumbnailAltText : 'null';\n if (window.product_VideoData) {\n var productVideoData = window.product_VideoData;\n var videoData = {\n videoType: productVideoData.videoType,\n videoID: productVideoData.videoID,\n productVideoThumbnail: productVideoData.productVideoThumbnail,\n productVideoThumbnailAltText: altText\n };\n createAssets(videoData, 'video');\n }\n\n // re-initialize video player after swiper update\n $(document).trigger('video:player:update');\n}\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n * attributes have been selected. Used partially to\n * determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n * @param {Object} selectedAttributeID - attribute being updated\n */\nfunction handleVariantResponse(response, $productContainer, selectedAttributeID) {\n const isChoiceOfBonusProducts = $productContainer.parents('.choose-bonus-product-dialog').length > 0;\n const $omnibusPrice = $('.omnibus-price');\n let isVariant;\n\n if (response.product.variationAttributes) {\n updateAttrs(response.product, $productContainer);\n isVariant = response.product.productType === 'variant';\n if (isChoiceOfBonusProducts && isVariant) {\n $productContainer.parent('.bonus-product-item')\n .data('pid', response.product.id);\n\n $productContainer.parent('.bonus-product-item')\n .data('ready-to-order', response.product.readyToOrder);\n }\n }\n\n if (selectedAttributeID === 'color' && !window.resources.enableServerSideGallery) {\n const primaryImage = response.product.images.large;\n\n // Update quickview/PDP primary images\n if ($('.quickview-modal').length) {\n createImagesAndVideo(primaryImage, $('.product-quickview'));\n } else if ($mainPDPGallery.length) {\n createImagesAndVideo(primaryImage, $('.product-detail'));\n }\n\n // Reset notify me status on variant swatches\n setVariantNotifyMeStatus();\n }\n\n // Store attribute selections in the URL\n if (!$('.product-quickview').length && selectedAttributeID !== 'inventory' && response.variantUrl) {\n history.replaceState({ updatedAttr: selectedAttributeID }, '', response.variantUrl);\n }\n\n // Update linked sizes URLs with attribute selections\n if (response.linkedSizesHtml) {\n $('.js-ext-size-type').replaceWith(response.linkedSizesHtml);\n }\n\n // Update pricing\n if (!isChoiceOfBonusProducts) {\n const $priceSelector = $('.prices .price', $productContainer).length\n ? $('.prices .price', $productContainer)\n : $('.prices .price');\n $priceSelector.replaceWith(response.product.price.html);\n }\n\n // Update Omnibus pricing\n if (!response.product.lowestPrice30Days) {\n $omnibusPrice.empty();\n } else if ($omnibusPrice.length) {\n $omnibusPrice.html(response.product.lowestPrice30Days.html);\n }\n\n // Update promotions\n $('.promotions').html(getPromotionCalloutHtml(response.product.promotions));\n $('.promotions').prepend(getExclusivePromotionCalloutHtml(response.product.exclusivePromotion));\n\n if (isChoiceOfBonusProducts) {\n const $selectButton = $productContainer.find('.select-bonus-product');\n $selectButton.trigger('bonusproduct:updateSelectButton', {\n product: response.product, $productContainer: $productContainer\n });\n } else {\n // Enable \"Add to Cart\" button if all required attributes have been selected\n $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').trigger('product:updateAddToCart', {\n product: response.product, $productContainer: $productContainer\n }).trigger('product:statusUpdate', response.product);\n }\n\n updateAvailability(response, $productContainer, selectedAttributeID);\n}\n\n\n/**\n * Get the selected swatches from the DOM. This data is used as a fallback to\n * retain the current user selections. Exclude the clicked attribute.\n *\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {jQuery} selectedAttributeID - The attribute that was last clicked (so we can exclude it)\n * @return {Object} - The results\n */\nfunction getUserSelectedAttributes($productContainer, selectedAttributeID) {\n var colorValue = $productContainer.find('.js-color-swatch.selected span').data('attr-value');\n var sizeValue = $productContainer.find('.js-size-swatch.selected').data('attr-value');\n var dimensionValue = $productContainer.find('.js-dimension-swatch.selected').data('attr-value');\n var obj = {};\n if (colorValue !== undefined || sizeValue !== undefined || dimensionValue !== undefined) {\n if (colorValue !== undefined && selectedAttributeID !== 'color') {\n obj['selection.color'] = colorValue;\n }\n if (sizeValue !== undefined && selectedAttributeID !== 'size') {\n obj['selection.size'] = sizeValue;\n }\n if (dimensionValue !== undefined && selectedAttributeID !== 'dimension') {\n obj['selection.dimension'] = dimensionValue;\n }\n }\n return obj;\n}\n\n/**\n * dimension value append in URL parameter\n *\n * @param {string} selectedAttrUrl - the Url for the selected variation value\n * @return {string} - new selected variation value url\n */\nfunction appendDimensionParams(selectedAttrUrl) {\n var $url = selectedAttrUrl;\n var $dimensionSwatches = $('.product-detail').find('div.js-attribute-dimension .js-dimension-swatch');\n if ($dimensionSwatches.length > 0) {\n if ($dimensionSwatches.length === 1 && $dimensionSwatches.hasClass('selected')) {\n $url = $url + '&dwvar_' + $('.product-detail').data('pid') + '_dimension=' + $dimensionSwatches.data('attr-value');\n } else if ($dimensionSwatches.length > 1) {\n var $selectedAttr = $('.product-detail').find('div.js-attribute-dimension .js-dimension-swatch.selectable');\n if ($selectedAttr.length === 1 && $selectedAttr.hasClass('selected')) {\n $url = $url + '&dwvar_' + $('.product-detail').data('pid') + '_dimension=' + $selectedAttr.data('attr-value');\n } else {\n $selectedAttr = $('.product-detail').find('div.js-attribute-dimension .js-dimension-swatch.unselectable');\n var len = $dimensionSwatches.length - $selectedAttr.length;\n if (len === 1) {\n $selectedAttr = $('.product-detail').find('div.js-attribute-dimension .js-dimension-swatch.selected');\n if ($selectedAttr.length === 1) {\n $url = $url + '&dwvar_' + $('.product-detail').data('pid') + '_dimension=' + $selectedAttr.data('attr-value');\n }\n }\n }\n }\n }\n return $url;\n}\n\n/**\n * - Appends or removes the old chemistry message on a specific UPC.\n * - Message will be appended right after the Prop 65 message\n * or at the end of the entire bulleted list if there is no Prop 65 message.\n * - Do nothing if the old chemistry message exists in the data object parameter,\n * but the message already exists in the DOM.\n * - If the no old chemistry message exists in the data object parameter,\n * then remove any existing old chemistry message from the DOM.\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction updateOldChemistryMessaging(data) {\n var $existingOldChemistryListItem = $('.js-old-chemistry');\n\n if (data.product && data.product.oldChemistryText) {\n if (!$existingOldChemistryListItem.length) {\n var $prop65ListItemElement = $('.accordion__details').find('.js-prop-65');\n var oldChemistryListItemHTMLString = '
    10. ' + data.product.oldChemistryText + '
    11. ';\n\n if ($prop65ListItemElement.length) {\n $prop65ListItemElement.after(oldChemistryListItemHTMLString);\n } else {\n $('.pdp-list').append(oldChemistryListItemHTMLString);\n }\n }\n } else {\n $existingOldChemistryListItem.remove();\n }\n}\n\n/**\n * updates the product view when a product attribute is selected or deselected\n *\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n * @param {string} selectedAttributeID - The ID of the swatch that was clicked (color, size, sizeType, dimension)\n */\nfunction attributeSelect(selectedValueUrl, $productContainer, selectedAttributeID) {\n if (selectedValueUrl) {\n const variantData = getUserSelectedAttributes($productContainer, selectedAttributeID);\n const galleryURL = (selectedAttributeID === 'color' && $('.js-color-swatch[data-attr-url=\"' + selectedValueUrl + '\"]').data('attr-gallery-url')) || null;\n\n $('body').trigger('product:beforeAttributeSelect', { url: selectedValueUrl, container: $productContainer });\n\n if (selectedAttributeID === 'color' && window.resources.enableServerSideGallery && galleryURL) {\n $.ajax({\n url: galleryURL,\n method: 'GET',\n data: variantData,\n success: function (data) {\n const $$productGalleryContainer = $productContainer.find('.primary-images');\n\n if (data && $$productGalleryContainer.length) {\n const $productGallery = $$productGalleryContainer.find('.js-product-gallery');\n const $productGalleryThumb = $$productGalleryContainer.find('.js-product-gallery-thumb');\n\n if ($productGallery.length && $productGalleryThumb.length) {\n $productGallery[0].swiper.destroy();\n $productGalleryThumb[0].swiper.destroy();\n }\n\n $$productGalleryContainer.replaceWith(data);\n $(document).trigger('product:swiper:update');\n }\n }\n });\n }\n\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n data: variantData, // This data used as fallback to retain current user selections\n success: function (data) {\n if (data) {\n handleVariantResponse(data, $productContainer, selectedAttributeID);\n if (window.preQuickViewModalDigitalData && 'dtmLayer' in data && 'digitalData' in window) {\n // Updating only the pageURL and product object in the digital data when variations are selected from the quick view modal.\n if (data.dtmLayer.page && window.digitalData.page) {\n window.digitalData.page.pageInfo.pageURL = data.dtmLayer.page.pageInfo.pageURL;\n window.digitalData.page.product = data.dtmLayer.page.product;\n }\n } else if ('dtmLayer' in data && 'digitalData' in window) {\n if (data.dtmLayer.page) {\n window.digitalData.page = data.dtmLayer.page;\n }\n if (data.dtmLayer.user) {\n window.digitalData.user = data.dtmLayer.user;\n }\n if (data.dtmLayer.cart) {\n window.digitalData.cart = data.dtmLayer.cart;\n }\n }\n\n $('body').trigger('product:afterAttributeSelect', { data: data, container: $productContainer });\n\n // using native JS .dispatchEvent() rather than jQuery .trigger()\n // so that Adobe Launch can listen for this custom event.\n document.body.dispatchEvent(new CustomEvent('product:afterAttributeSelect:dtm', {\n detail: {\n // data: data, // optionally, we can send the data to Launch rather than have it pull it from digitalData\n attributeType: selectedAttributeID\n }\n }));\n\n updateOOSColorVariants($productContainer);\n onModel.triggerOnModelDescription();\n\n updateOldChemistryMessaging(data);\n }\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @return {string} - The provided URL to use when adding a product to the cart\n */\nfunction getAddToCartUrl() {\n return $('.add-to-cart-url').val();\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nfunction parseHtml(html) {\n var $html = $('
      ').append($.parseHTML(html));\n\n var body = $html.find('.choice-of-bonus-product');\n var footer = $html.find('.modal-footer').children();\n\n return { body: body, footer: footer };\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction chooseBonusProducts(data) {\n $.spinner().start();\n $('#chooseBonusProductModal').remove();\n\n const bonusUrl = data.bonusChoiceRuleBased ? data.showProductsUrlRuleBased : data.showProductsUrlListBased;\n const htmlString = utils.createModalMarkup('', {\n modalId: 'chooseBonusProductModal',\n title: data.labels.selectprods,\n customClasses: 'choose-bonus-product-dialog'\n });\n $('body').append(htmlString);\n $('#chooseBonusProductModal .modal-dialog').data({\n 'total-qty': data.maxBonusItems,\n UUID: data.uuid,\n pliUUID: data.pliUUID,\n addToCartUrl: data.addToCartUrl,\n pageStart: 0,\n pageSize: data.pageSize,\n moreURL: data.showProductsUrlRuleBased,\n bonusChoiceRuleBased: data.bonusChoiceRuleBased\n });\n\n $.ajax({\n url: bonusUrl,\n method: 'GET',\n dataType: 'html',\n success: function (html) {\n var parsedHtml = parseHtml(html);\n $('#chooseBonusProductModal .modal-body').html(parsedHtml.body);\n $('#chooseBonusProductModal .modal-footer').html(parsedHtml.footer);\n $('#chooseBonusProductModal').modal('show');\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\n/**\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\n * @param {string} response - ajax response from clicking the add to cart button\n */\nfunction handlePostCartAdd(response) {\n if (response && $.isNumeric(response.quantityTotal)) {\n $(document).trigger('minicart:updatecount', response.quantityTotal);\n }\n\n // vars defined to make if/else logic easier to read\n let isReservable = response.reservableProduct;\n let hasError = response.error;\n\n if (isReservable) {\n // reservation banner\n let reservationTimerHelper = require('../components/reservationTimer');\n reservationTimerHelper.updateReservationData(response);\n } else if (hasError) {\n // Add to cart errors pop down a banner under the top menu\n $.alert({\n content: `

      ${response.message}

      `,\n placement: 'banner',\n theme: 'danger'\n });\n } else {\n // minicart\n $(document).trigger('minicart:show');\n\n var hideMinicartTimeout = setTimeout(function () {\n $(document).trigger('minicart:hide');\n }, 7000);\n\n $('body').one('mouseenter', '.minicart-drawer', function () {\n clearTimeout(hideMinicartTimeout);\n });\n }\n\n if ('_satellite' in window && 'dtmEvent' in response) {\n if (!!response.dtmEvent && response.dtmEvent.length) {\n response.dtmEvent.forEach((action) => {\n _satellite.track(action.event, action.data); //eslint-disable-line\n });\n }\n }\n}\n\n/**\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\n * items with their selected variants\n *\n * @return {string[]} - List of selected bundle product item ID's\n */\nfunction getChildProducts() {\n var childProducts = [];\n $('.bundle-item').each(function () {\n childProducts.push({\n pid: $(this).find('.product-id').data('pid'),\n quantity: parseInt($(this).find('label.quantity').data('quantity'), 10)\n });\n });\n\n return childProducts.length ? JSON.stringify(childProducts) : [];\n}\n\n/**\n * Retrieve product options\n *\n * @param {jQuery} $productContainer - DOM element for current product\n * @return {string} - Product options and their selected values\n */\nfunction getOptions($productContainer) {\n var options = $productContainer\n .find('.product-option')\n .map(function () {\n var $elOption = $(this).find('.options-select');\n var urlValue = $elOption.val();\n var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]')\n .data('value-id');\n return {\n optionId: $(this).data('option-id'),\n selectedValueId: selectedValueId\n };\n }).toArray();\n\n return JSON.stringify(options);\n}\n\n/**\n * Test to see if all available product attributes have been selected\n *\n * @param {jQuery} $addToCartButton - add to cart button that was clicked\n * @returns {boolean} Have all needed selections been made?\n */\nfunction isEverythingSelected($addToCartButton) {\n let $swatchAttributes;\n const commonParentSelector = '.js-product-content';\n const swatchGroupSelectors = '.js-color-attribute, .js-size-attribute, .js-dimension-attribute';\n\n if ($addToCartButton) {\n $swatchAttributes = $addToCartButton.closest(commonParentSelector).find(swatchGroupSelectors);\n } else {\n $swatchAttributes = $(swatchGroupSelectors);\n }\n\n let allAttributesSelected = true;\n $swatchAttributes.each(function () {\n let $thisAttribute = $(this);\n if (!$thisAttribute.find('.selected').length) {\n allAttributesSelected = false;\n }\n });\n\n return allAttributesSelected;\n}\n\n/**\n * Add positioning class to popup if necessary.\n * @param {jQuery} $el - DOM element parent element\n * @param {jQuery} $popup - DOM element current popup\n */\nfunction popupAlignment($el, $popup) {\n var viewportWidth = $(window).width();\n var positionLeft = $el.offset().left;\n var elementWidth = $el.outerWidth();\n var elementCenter = positionLeft + (elementWidth / 2);\n var popupHalfWidth = $popup.outerWidth() / 2;\n var left = elementCenter <= popupHalfWidth;\n var right = popupHalfWidth > (viewportWidth - elementCenter);\n\n $popup[left ? 'addClass' : 'removeClass']('left-arrow');\n $popup[right ? 'addClass' : 'removeClass']('right-arrow');\n}\n\n/**\n * Prana Only: Show out of stock popup on size swatch\n * @param {jQuery} $sizeSwatch - DOM element\n * @param {string} eventType - Event type\n */\nfunction showOutOfStockPopup($sizeSwatch, eventType) {\n // TODO: Needs information about \"Shop Our Partners\" functionality.\n var $popup = $sizeSwatch.find('.product-outofstock__popup');\n\n if ($popup.length) { // This only applicable for Prana\n var thisSwatch = $sizeSwatch;\n\n if (eventType === 'addToCart') {\n // Desktop/Mobile: Show \"Sold Out\" popup after clicking these \"Add to Cart/Out of Stock\" button.\n popupAlignment($sizeSwatch, $popup);\n $popup.removeClass('invisible');\n setTimeout(function () {\n $(thisSwatch).find('.product-outofstock__popup').addClass('invisible');\n }, 3000);\n } else if (breakpoints.isLowRes()) {\n // Mobile: Opens on click.\n if (eventType === 'click') {\n popupAlignment($sizeSwatch, $popup);\n $popup.removeClass('invisible');\n $(document).one('click', function () {\n $(thisSwatch).find('.product-outofstock__popup').addClass('invisible');\n });\n }\n } else {\n // Desktop: Opens on hover.\n if (eventType === 'mouseenter') { // eslint-disable-line\n popupAlignment($sizeSwatch, $popup);\n $popup.removeClass('invisible');\n } else if (eventType === 'mouseleave') {\n popupAlignment($sizeSwatch, $popup);\n $popup.addClass('invisible');\n }\n }\n }\n}\n\n/**\n * Restores the digitalData object.\n * @param {Object} data The data to set in the digitalData object\n */\nfunction restoreDTM(data) {\n if (!!data && 'digitalData' in window) {\n const propsToUpdate = ['pageInstanceID', 'page', 'user'];\n propsToUpdate.forEach((prop) => {\n if (data[prop]) {\n window.digitalData[prop] = data[prop];\n }\n });\n delete window.preQuickViewModalDigitalData;\n }\n}\n\n/**\n * Handle click on button.add-to-cart when it is disabled\n */\nfunction onClickAddToCartButtonDisabled() {\n var $productContainer = $(this).closest('.product-detail');\n\n // Scrolls to the top of the product__attributes section if they are not all set.\n // offset to view all product attributes after alert disapears.\n var offset = $('.siteheader').outerHeight();\n $('.product__attributes').scrollTo(offset, 750); // TODO: GSD-11472 - can we just listen for the alert.closed event?\n\n // Reveal \"Select a size\" message.\n var $sizeSwatchSelected = $productContainer.find('.js-attribute-size .selected');\n var isSizeSwatchSelected = $sizeSwatchSelected.length;\n if (!isSizeSwatchSelected) {\n $('.selectswatch-size-msg', $productContainer).removeClass('d-none');\n }\n\n // Reveal any \"Sold Out\" messaging.\n if ($sizeSwatchSelected.find('.product-outofstock__popup').length) {\n // For Prana reveal the popup \"Sold Out\" message.\n $('body').trigger('product:showOutOfStockPopup', $sizeSwatchSelected);\n } else {\n // For other brands, reveal \"Sold Out\" div if they are not empty\n $('.product__message--velocity:parent', $productContainer).show();\n $('.outofstock-combination-msg:parent', $productContainer).show();\n }\n $('.accordion').trigger('collapse-changed'); // Refresh hc-sticky to avoid ovelaping content if velocity message appears.\n}\n\n/**\n * Handles disabled add to cart button interactions\n */\nfunction disabledAddToCartHandler() {\n if ($('.add-to-cart__container .btn-add-to-cart').eq(0).prop('disabled')) { // if add to cart button is disabled\n var $dimElement = $('.js-dimension-attribute');\n var $sizeElement = $('.js-size-attribute');\n\n if ($dimElement.length) {\n $('.selectswatch-dimension-msg').toggleClass('d-none', !!$dimElement.find('a.selected').length);\n }\n\n if ($sizeElement.length) {\n $('.selectswatch-size-msg').toggleClass('d-none', !!$sizeElement.find('a.selected').length);\n }\n\n onClickAddToCartButtonDisabled();\n }\n}\n\n/**\n * Updates attribute label on swatch interaction\n * @param {jQuery} $swatch swatch element that was interacted with\n */\nfunction updateSwatchAttributeLabel($swatch) {\n let selectedValue;\n const attrType = $swatch.closest('.js-attribute').data('attr');\n\n if (attrType === 'color') {\n selectedValue = $swatch.find('.color-value').attr('title');\n } else {\n selectedValue = $swatch.data('attr-hover');\n }\n\n if (selectedValue !== undefined) {\n $swatch.closest('.js-attribute').find('.js-attr-label-value').text(selectedValue);\n }\n}\n\nmodule.exports = {\n initExclusiveEvents: function () {\n $(document).on('click', '.js-open-account', function (e) {\n const qvPid = $(e.target).closest('.product-quickview').data('pid');\n\n if (qvPid) {\n $(document).on('form:preauth:success.quickview', 'form.authGateway', function () {\n sessionStorage.setItem('quickview', qvPid);\n });\n\n $(document).on('click.quickview', '.js-loyalty-banner-signup-btn', function () {\n sessionStorage.setItem('quickview', qvPid);\n });\n\n // if drawer is closed assume user does not want to sign in/join now\n // remove event listeners and session storage for reopening quickview\n $(document).on('hide.drawer', function () {\n $(document).off('.quickview');\n sessionStorage.removeItem('quickview');\n });\n }\n\n $(document).trigger('accountDrawer:show');\n });\n },\n isEverythingSelected: isEverythingSelected,\n attributeSelect: attributeSelect,\n updateOOSColorVariants: updateOOSColorVariants,\n methods: {\n editBonusProducts: function (data) {\n chooseBonusProducts(data);\n }\n },\n selectAttribute: function () {\n $('.product-detail').find('.js-attribute a.selected').each(function () {\n updateSwatchAttributeLabel($(this));\n });\n\n // js event listener that accepts an html swatch element and runs attributeSelect() code to select that swatch\n document.body.addEventListener('selectAttribute', function (e) {\n const $swatch = $(e.detail);\n\n if ($swatch) {\n const url = $swatch.data('attr-url');\n const $container = $swatch.closest('.product-detail');\n const attrType = $swatch.closest('.js-attribute').data('attr');\n\n attributeSelect(url, $container, attrType);\n }\n });\n\n $(document).on('click touchend', '.product-detail .js-swatch', function (e) {\n e.preventDefault();\n const $swatchClicked = $(e.currentTarget);\n\n if ($swatchClicked.not('.js-notifyme-swatch').hasClass('selected') || $swatchClicked.hasClass('invalid') || $swatchClicked.hasClass('not-orderable')) {\n return;\n }\n\n $swatchClicked.off('mouseleave');\n $swatchClicked.trigger('attribute:click');\n\n updateSwatchAttributeLabel($swatchClicked);\n\n let $productContainer = $swatchClicked.closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $swatchClicked.closest('.product-detail');\n }\n\n const selectedAttributeID = $(this).closest('.js-attribute').data('attr');\n\n let $selectedAttrUrl = $swatchClicked.data('attr-url');\n if (selectedAttributeID === 'size') {\n $selectedAttrUrl = appendDimensionParams($selectedAttrUrl);\n }\n\n attributeSelect($selectedAttrUrl, $productContainer, selectedAttributeID);\n });\n\n // Color Swatch hover effects\n $(document).off('mouseenter').on('mouseenter', '.product-detail .js-swatch', function (e) {\n if (breakpoints.isHighRes()) {\n const $swatchEntered = $(e.currentTarget);\n\n // do not reload selected swatch\n if ($swatchEntered.hasClass('selected')) return;\n\n const currentLabelText = $swatchEntered.closest('.js-attribute').find('.js-attr-label-value').text();\n\n updateSwatchAttributeLabel($swatchEntered);\n\n $swatchEntered.one('mouseleave', function () {\n $swatchEntered.closest('.js-attribute').find('.js-attr-label-value').text(currentLabelText);\n });\n }\n });\n\n // Prana only: \"Sold Out\" popup which appears when hovering/clicking on an out of stock size/dimension swatch.\n $(document).on('mouseenter mouseleave click', '.product-detail .js-size-swatch.unselectable, .product-detail .js-dimension-swatch.unselectable', function (e) {\n showOutOfStockPopup($(this), e.type);\n });\n\n $('body').on('product:showOutOfStockPopup', function (e, sizeSwatch) {\n showOutOfStockPopup($(sizeSwatch), 'addToCart');\n });\n },\n quickViewSwatchFunctionality: function () {\n // On Page Load if a color/size/dimension is selected display the Swatch value in the label\n $('.quickview-modal .product-detail .js-attribute a.selected').each(function () {\n updateSwatchAttributeLabel($(this));\n });\n },\n availability: function () {\n /**\n * Quantity change event for the productlineitems\n * extended with pickupinstore\n */\n $(document).on('change', '.quantity-select', function (e) {\n e.preventDefault();\n\n var searchPID = $(this).closest('.product-detail').attr('data-pid');\n var selectorPrefix = '.product-detail[data-pid=\"' + searchPID + '\"]';\n\n if ($(selectorPrefix + ' .selected-store-with-inventory').is(':visible')) {\n return;\n }\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.modal-content').find('.product-quickview');\n }\n\n if ($('.bundle-items', $productContainer).length === 0) {\n base.attributeSelect($(e.currentTarget).find('option:selected').data('url'), $productContainer);\n }\n });\n },\n\n addToCart: function () {\n $(document).off('click', 'button.add-to-cart, button.add-to-cart-global').on('click', 'button.add-to-cart, button.add-to-cart-global', function () {\n var addToCartUrl;\n var pid;\n var pidsObj;\n var setPids;\n var $addToCartButton = $(this);\n\n if (!isEverythingSelected($addToCartButton)) {\n $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').attr('disabled', true);\n disabledAddToCartHandler();\n $.spinner().stop();\n } else {\n $('body').trigger('product:beforeAddToCart', this);\n\n if ($('.set-items').length && $(this).hasClass('add-to-cart-global')) {\n setPids = [];\n\n $('.product-detail').each(function () {\n if (!$(this).hasClass('product-set-detail')) {\n setPids.push({\n pid: $(this).find('.product-id').data('pid'),\n qty: 1,\n options: getOptions($(this))\n });\n }\n });\n pidsObj = JSON.stringify(setPids);\n }\n\n pid = getPidValue($(this));\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\n }\n\n addToCartUrl = getAddToCartUrl();\n\n var form = {\n pid: pid,\n pidsObj: pidsObj,\n childProducts: getChildProducts(),\n quantity: 1\n };\n\n if (!$('.bundle-item').length) {\n form.options = getOptions($productContainer);\n }\n\n $(this).trigger('updateAddToCartFormData', form);\n if (addToCartUrl) {\n $.ajax({\n url: addToCartUrl,\n method: 'POST',\n data: form,\n success: function (data) {\n $.spinner().stop();\n handlePostCartAdd(data);\n if (!data.error) {\n $('body').trigger('product:afterAddToCart', data);\n window.dispatchEvent(new Event('cart:updated:dtm'));\n }\n if (window.preQuickViewModalDigitalData) {\n // Restoring the digital data back to that of CLP page before opening the quick view modal.\n window.preQuickViewModalDigitalData = JSON.parse(window.preQuickViewModalDigitalData);\n setTimeout(function () {\n restoreDTM(window.preQuickViewModalDigitalData);\n }, 1000);\n } else if (data.dtmLayer && 'digitalData' in window) {\n if (data.dtmLayer.page) {\n window.digitalData.page = data.dtmLayer.page;\n }\n if (data.dtmLayer.user) {\n window.digitalData.user = data.dtmLayer.user;\n }\n }\n if (data.dtmLayer && data.dtmLayer.cart && 'digitalData' in window) {\n window.digitalData.cart = data.dtmLayer.cart;\n minicartSaleItemAlertBadge.toggleAlertBadge();\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n }\n });\n },\n getPidValue: getPidValue,\n setVariantNotifyMeStatus: setVariantNotifyMeStatus,\n forceOOSNotifyMe: forceOOSNotifyMe,\n overviewInit: Overview.init()\n};\n","'use strict';\n\nconst Swiper = require('swiper/swiper-bundle.min.js');\nconst breakpoints = require('../components/breakpoints');\nconst utils = require('../components/utils');\nconst onModel = require('./onModelDescription');\n\nlet $mainGallery;\nlet $thumbnailGallery;\n\n// swiper instances\nlet swiperMain;\nlet swiperThumb;\n\n// video player instance\nlet player;\n\n/**\n * Initialize Swiper Gallery\n * @param {jQuery} $main jQuery reference to main gallery element\n * @param {jQuery|undefined} $thumbnail jQuery reference to thumbnail gallery element\n */\nfunction initSwiperGallery($main, $thumbnail) {\n const swiperGalleryMain = $main[0];\n const swiperConfigMain = {\n centeredSlides: true,\n slidesPerView: 1,\n zoom: { toggle: false },\n navigation: {\n nextEl: '.swiper-button-next',\n prevEl: '.swiper-button-prev',\n disabledClass: 'd-none'\n },\n loop: false\n };\n const removeSlideSelectors = [\n '.product-quickview .video-slide'\n ];\n\n if ($thumbnail.length) {\n const swiperGalleryThumb = $thumbnail[0];\n\n swiperThumb = new Swiper(swiperGalleryThumb, {\n width: 44,\n slidesPerView: 'auto',\n loop: false,\n threshold: 1000 // arbitrary high value to prevent cancellation of click event\n });\n\n swiperConfigMain.thumbs = {\n swiper: swiperThumb\n };\n\n // Prevent screenreader from reading all alt tags whenever the gallery is updated\n $thumbnail.find('.swiper-wrapper').removeAttr('aria-live');\n }\n\n $(removeSlideSelectors.join(',')).each(function (i, slide) {\n $(slide).remove();\n });\n\n swiperMain = new Swiper(swiperGalleryMain, swiperConfigMain);\n\n // Prevent screenreader from reading all alt tags whenever the gallery is updated\n $main.find('.swiper-wrapper').removeAttr('aria-live');\n}\n\n/**\n * Initialize zoom container\n * @param {Object} $zoomModal: Reference to zoom container\n * @param {number} zoomIndex: The index to zoom on init\n */\nfunction initZoom($zoomModal, zoomIndex) {\n const $zoomViewer = $zoomModal.find('.js-product-zoom-viewer');\n const $bigImg = $zoomViewer.find('img');\n\n // On thumbnail click inside zoom viewer, change to the zoomed view of the clicked image\n $zoomModal\n .on('click', '.js-product-thumb', function (e) {\n e.preventDefault();\n const $elem = $(this);\n const hiResImage = $elem.data('img-hi-res');\n const altZoomThumbSubstring = 'Zoom thumbnail:';\n const altZoomSubstring = 'Zoom:';\n\n // Get alt description from thumbnail and modify for zoom image\n let alt = $elem.find('img').attr('alt');\n\n if (alt.substring(altZoomThumbSubstring)) {\n alt = alt.replace(altZoomThumbSubstring, altZoomSubstring);\n }\n\n $zoomModal.find('.js-product-thumb').removeClass('active');\n $elem.addClass('active');\n $bigImg.attr('src', hiResImage);\n $bigImg.attr('alt', alt);\n })\n // Move around the zoomed image with mouse\n .on('mousemove', '.js-product-zoom-viewer', function (e) {\n const viewerWidth = $zoomViewer.outerWidth();\n const viewerHeight = $zoomViewer.outerHeight();\n const difWidth = viewerWidth - $bigImg.outerWidth();\n const difHeight = viewerHeight - $bigImg.outerHeight();\n const viewerOffset = $zoomViewer.offset();\n // Track mouse movement on desktop\n let x = 0;\n let y = 0;\n let imgX;\n let imgY;\n if (difWidth < 0) {\n x = e.pageX - viewerOffset.left;\n imgX = difWidth * ((x / viewerWidth) - 0.5);\n } else {\n imgX = 0;\n }\n if (difHeight < 0) {\n y = e.pageY - viewerOffset.top;\n imgY = difHeight * ((y / viewerHeight) - 0.5);\n } else {\n imgY = 0;\n }\n $bigImg.css('transform', `translate3d(${imgX}px, ${imgY}px, 0)`);\n })\n .on('hide.bs.modal', function () {\n // slide swiper gallery to image that was open in zoom\n const activeIndex = $zoomModal.find('.js-product-thumb.active').data('index');\n swiperMain.slideTo(activeIndex);\n })\n .on('hidden.bs.modal', function () {\n // remove the modal markup completely\n $(this).remove();\n });\n\n // On init, open the last image that was being viewed in the product gallery\n const $activeThumb = $zoomModal.find('.js-product-thumb[data-index=\"' + zoomIndex + '\"]');\n if ($activeThumb.length) {\n $activeThumb.trigger('click');\n }\n}\n\n/**\n * Initialize video player\n */\nfunction initVideoPlayer() {\n const $videoSlide = $mainGallery.find('.js-video-player');\n\n // exit if no video player exists\n if (!$videoSlide.length) return;\n\n const playerHost = $videoSlide.data('host');\n const videoId = $videoSlide.data('video-id');\n const playerId = playerHost === 'youtube' ? 'ytPlayer_' + videoId : 'vimeoPlayer_' + videoId;\n\n // preload youtube video player dependency\n if (playerHost === 'youtube') {\n const tagId = 'youtube-api-script';\n const tagExists = document.getElementById(tagId);\n if (!tagExists) {\n const tag = document.createElement('script');\n tag.src = 'https://www.youtube.com/iframe_api';\n tag.id = tagId;\n const firstScriptTag = document.getElementsByTagName('script')[0];\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n }\n }\n\n // wait for video player node to be created\n const videoPlayerObserver = new MutationObserver(function () {\n player = window.videoPlayers[playerId];\n if (player) {\n videoPlayerObserver.disconnect();\n }\n });\n videoPlayerObserver.observe($videoSlide[0], { childList: true, subtree: true });\n\n // pause product video on slide change\n swiperMain.on('slideChange', function () {\n if (player) {\n if (playerHost === 'youtube') {\n player.pauseVideo();\n } else {\n player.pause();\n }\n }\n });\n}\n\n/**\n * Initialize product gallery events\n */\nfunction initGalleryEvents() {\n $mainGallery\n .off('.zoom')\n // prevent swiping when zoom icon is being interacted with\n .on('mousedown.zoom', '.js-pdp-gallery-zoom', function () {\n if (swiperMain.allowTouchMove) {\n swiperMain.allowTouchMove = false;\n\n setTimeout(() => {\n swiperMain.allowTouchMove = true;\n }, 500);\n }\n })\n // When zoom button is clicked, enable zoom\n .on('click.zoom', '.js-pdp-gallery-zoom', function () {\n if (breakpoints.isLowRes()) {\n swiperMain.zoom.toggle();\n } else {\n const $imageClicked = $(this).closest('.js-product-image');\n let url = $imageClicked.closest('.js-product-gallery').data('zoom-url');\n\n // If a color swatch has been selected\n const $selectedColorSwatch = $('[data-attr=\"color\"] .color-value.selected');\n if ($selectedColorSwatch.length && url) {\n const pid = $('.product-detail').data('pid').toString();\n const color = $selectedColorSwatch.data('attr-value');\n const urlPid = utils.getParamsFromURL(url).pid;\n\n if (pid !== urlPid) {\n url = utils.updateURLParam(url, 'pid', pid);\n }\n if (color && pid) {\n // get base pid without appended _S\n const basePid = pid.split('_')[0];\n url = utils.appendParamToURL(url, 'dwvar_' + basePid + '_color', color);\n }\n }\n\n if (!url) { return; }\n\n $.spinner().start();\n $.ajax({\n url: url,\n method: 'GET',\n dataType: 'html',\n success: function (html) {\n $.spinner().stop();\n\n const modalHTML = utils.createModalMarkup(html, { modalSizeClass: 'modal-fluid' });\n let $zoomModal = $(modalHTML).modal();\n\n let imageIndexToZoom = 0;\n if ($imageClicked.data('index')) {\n imageIndexToZoom = $imageClicked.data('index');\n }\n\n // fix for IE:\n const ua = window.navigator.userAgent;\n if (ua.indexOf('MSIE ') > -1 || ua.indexOf('Trident/') > -1) {\n $zoomModal.one('shown.bs.modal', function () {\n const $modalBody = $zoomModal.find('.modal-body');\n const zoomViewerHeight = $modalBody.find('.js-product-zoom-viewer').outerHeight();\n const modalBodyPadding = parseFloat($modalBody.css('padding-top')) + parseFloat($modalBody.css('padding-bottom'));\n $modalBody.css('height', zoomViewerHeight + modalBodyPadding);\n });\n }\n\n initZoom($zoomModal, imageIndexToZoom);\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n });\n\n // use to swap image low/high resolution when zoom button is clicked\n swiperMain.on('zoomChange', function (swiper, scale, imageEl) {\n // zoomChange fires with these params: swiper, scale, imageEl, slideEl\n let setImageUrl = $(imageEl).data('lowres');\n if (scale !== 1) {\n setImageUrl = $(imageEl).data('hires');\n }\n $(imageEl).attr('src', setImageUrl);\n });\n\n // re-initialize video player when swatch interaction refreshes gallery\n $(document).on('video:player:update', function () {\n initVideoPlayer();\n });\n}\n\n/**\n * Disable/hide zoom button\n */\nfunction disableZoom() {\n $('.js-pdp-gallery-zoom').addClass('d-none');\n}\n\n/**\n * Get jQuery elements required to build image gallery via configuration\n * @param {Object} config allowable options specified in configDefault\n * @returns {Object} jQuery elements required to build image gallery\n */\nfunction getGalleryElements(config) {\n const configDefault = {\n hasThumbnails: true,\n isQuickview: false,\n gallerySelector: '.js-product-gallery',\n thumbnailSelector: '.js-product-gallery-thumb',\n galleryContainerSelector: '.primary-images'\n };\n\n const options = $.extend({}, configDefault, config);\n\n const galleryElements = {};\n const $galleryContainer = $(options.galleryContainerSelector).first();\n\n if ($galleryContainer.length) {\n const $gallery = $galleryContainer.find(options.gallerySelector).first();\n\n if ($gallery.length) {\n galleryElements.$gallery = $gallery;\n galleryElements.$galleryContainer = $galleryContainer;\n galleryElements.isQuickview = !!options.isQuickview;\n\n if (options.hasThumbnails) {\n const $thumbnail = $galleryContainer.find(options.thumbnailSelector).first();\n\n if ($thumbnail.length) {\n galleryElements.$thumbnail = $thumbnail;\n galleryElements.hasThumbnails = true;\n }\n }\n }\n }\n\n return galleryElements;\n}\n\nmodule.exports = function (galleryConfig) {\n const galleryElements = getGalleryElements(galleryConfig);\n\n $mainGallery = galleryElements.$gallery;\n $thumbnailGallery = galleryElements.$thumbnail;\n const hasThumbnails = galleryElements.hasThumbnails;\n const isQuickview = galleryElements.isQuickview;\n\n if (!$mainGallery || !$mainGallery.length || $mainGallery[0].swiper) {\n return {\n init: function () {}\n };\n }\n\n this.$gallery = $mainGallery;\n\n if (hasThumbnails) {\n this.$thumbnailGallery = $thumbnailGallery;\n }\n\n this.init = function () {\n initSwiperGallery($mainGallery, $thumbnailGallery);\n\n if (!isQuickview) {\n initVideoPlayer();\n initGalleryEvents();\n onModel.triggerOnModelDescription();\n } else {\n disableZoom();\n }\n };\n\n return this;\n};\n","'use strict';\n\n/**\n * When a promotion multiplier is in effect, highlight the bonus reward\n * if a strikeout price (sibling element) is detected\n */\nfunction highlightMultiplierReward() {\n if ($('.js-rewards-highlight + s').length) {\n $('.js-rewards-highlight').addClass('forecasted-loyalty-rewards__text--highlight');\n }\n}\n\n/**\n * Displays the Loyalty points forecast on PDP\n * @param {HTML} html Product data passed on attribute selection\n */\nfunction updateLoyaltyForecastPoints(html) {\n const $rewardsContainer = $('.js-rewards-container');\n $rewardsContainer.html(html);\n highlightMultiplierReward();\n}\n\nmodule.exports = {\n init: function () {\n // Attribute Select Event\n $('body').on('product:afterAttributeSelect', function (e, response) {\n var rewardsData = response.data.product.rewardsHtml;\n if (rewardsData) {\n updateLoyaltyForecastPoints(rewardsData);\n }\n });\n highlightMultiplierReward();\n }\n};\n","'use strict';\n\n/**\n * Display badge based on product variant response\n * @param {Object} badgeData from product data\n * @return {string} HTML Output\n */\nfunction displayBadge(badgeData) {\n let result = '';\n\n if (!(badgeData && badgeData.gridBadge)) {\n return result;\n }\n\n const gridBadgeValue = badgeData.gridBadge.value || null;\n const gridBadgeDisplay = badgeData.gridBadge.display || null;\n const hasSaleSwatchSelected = $('.js-color-swatch.js-onsale.selected').length;\n const hideDynamicBadges = !!badgeData.gridBadge.hideDynamicBadges;\n // In contrast with the grid tile, the PDP 'Sale' badge will be omitted from this static type array and handled dynamically\n const staticTypes = ['BestSeller', 'New', 'Coming Soon'];\n const isStaticType = staticTypes.includes(badgeData.gridBadge.value);\n\n let badgeType;\n\n if (badgeData.svg) {\n result = `\n
      \n \n
      \n `;\n } else if (gridBadgeValue && gridBadgeDisplay && gridBadgeValue.toLowerCase() !== 'sale') {\n badgeType = gridBadgeValue.toLowerCase();\n } else if (!hideDynamicBadges && hasSaleSwatchSelected && !isStaticType) {\n badgeType = 'sale';\n }\n\n if (badgeType) {\n result = `\n
      \n ${gridBadgeDisplay}\n
      `;\n }\n\n return result;\n}\n\n/**\n * Display PDP image gallery tech badge based on product technology\n * @param {Object} badgeData from pdp data\n * @return {string} HTML Output\n */\nfunction displayTechBadge(badgeData) {\n let result = '';\n\n if (!badgeData) {\n return result;\n }\n\n result = `\n
      \n \n \n \n
      `;\n\n return result;\n}\n\nmodule.exports = {\n displayBadge,\n displayTechBadge\n};\n","'use strict';\n\n/**\n * Remove overview modal and backdrop\n */\nfunction closeModal() {\n $('.overview-modal, .modal-backdrop').remove();\n\n // Account for scrollbars to prevent CLS\n $.enableScroll();\n $('body').removeClass('modal-open').css('padding-right', '');\n $(window).trigger('scroll');\n}\n\n/**\n * Builds HTML element that will display the overview benefit modal contents\n * @param {HTML} html response used render modal content\n * @returns {HTMLElement} Reference to modal JQuery object\n */\nfunction buildModal(html) {\n const $modal = $.modal({\n content: html,\n customClasses: 'overview-modal',\n modalSizeClass: 'modal-lg'\n }).on('hidden.bs.modal', () => {\n closeModal();\n });\n\n return $modal;\n}\n\n/**\n * Fetches overview html from server and launches modal\n * @param {string} url - Overview controller endpoint url\n * @param {HTMLElement} $modal - Reference to modal JQuery object\n */\nfunction launchModal(url) {\n if (!url) {\n return;\n }\n\n $.ajax({\n url: url,\n method: 'GET',\n dataType: 'html',\n success: (data) => {\n buildModal(data);\n },\n complete: () => {\n $.spinner().stop();\n $.disableScroll();\n },\n error: () => {\n closeModal();\n }\n });\n}\n\nmodule.exports = {\n init: function () {\n $('body')\n .off('click.overview', '.js-overview-modal')\n .on('click.overview', '.js-overview-modal', (e) => {\n e.preventDefault();\n let $this = $(e.currentTarget);\n let link = $this.data('link') || $this.attr('href');\n\n launchModal(link);\n });\n },\n buildModal,\n launchModal,\n closeModal\n};\n","'use strict';\nvar breakpoints = require('../components/breakpoints');\nvar tabbedContainer = require('../aem/tabbedContainer');\n\n/**\n * Show unit toggle control if .js-no-unit-toggle class is not present\n */\nfunction showUnitToggle() {\n if ($('.tabbed-container__tabs .js-no-unit-toggle.active').is(':visible')) {\n $('.js-unit-toggle').addClass('d-none');\n } else {\n $('.js-unit-toggle').removeClass('d-none');\n }\n}\n\n/**\n *\n * @param {string} categorySuffix - the category to be shown\n * @param {string} sectionDiv - the section to be shown\n * @param {string} buttonText - the text to be replace the top accordion\n * @param {string} gender - text containing the gender option to show on the top most accordion upon selection\n */\nfunction toggleCategorySizeFit(categorySuffix, sectionDiv, buttonText, gender) {\n if (typeof categorySuffix === 'undefined' || typeof sectionDiv === 'undefined') {\n return;\n }\n\n var $categorySelected = $('div.size-guides-' + categorySuffix);\n var $divSelected = $('div.' + sectionDiv);\n var $activeCategory = $('.category-shown');\n var $activeSection = $('.section-shown');\n\n if ($activeCategory) {\n $activeCategory.addClass('d-none').removeClass('category-shown');\n }\n\n if ($activeSection) {\n $activeSection.addClass('d-none').removeClass('section-shown');\n }\n\n $categorySelected.removeClass('d-none').addClass('category-shown');\n $divSelected.removeClass('d-none').addClass('section-shown');\n var menuText = gender + ' > ' + buttonText;\n var $menu = $('a.selectedCategory div.accordion__title__text');\n $menu.html(menuText);\n\n // Determine if unit toggle control should display\n showUnitToggle();\n\n // Click tab to ensure proper tabbed content height\n $('.ofs__item.active:visible').trigger('click');\n\n var genderCategory = gender.replace(/[^\\w ]+/g, '').toLowerCase();\n\n $('#selectionCategory-' + genderCategory).collapse('toggle');\n $('#selectionAccordion').collapse('toggle');\n}\n\n/**\n * to select a category from the list\n * @param {Object} $element category id value\n */\nfunction selectCategory($element) {\n var elementIdParts = $element.id.split('-');\n var categorySuffix = elementIdParts[0] + '-' + $element.dataset.subcat;\n var genderToShow = $element.dataset.gendershow;\n var sectionDiv = elementIdParts[1];\n var buttonText = $element.innerText;\n toggleCategorySizeFit(categorySuffix, sectionDiv, buttonText, genderToShow);\n}\n\n/**\n * convert inches-to-centimeters and vice-versa\n * @param {boolean} useCentimeters if true then convert to centimeters, else convert to inches\n * @param {string} value value to convert\n * @returns {string} converted value\n */\nfunction unitConversion(useCentimeters, value) {\n var result;\n var radix = 10;\n var unit = (useCentimeters) ? 2.54 : 0.3937;\n if (value.indexOf('-') > -1) {\n var values = value.split('-');\n values.forEach(function (size) {\n if (!isNaN(size)) {\n result = (result == null) ? parseFloat((Number(size) * unit).toFixed(1), radix) : result + '-' + parseFloat((Number(size) * unit).toFixed(1), radix);\n }\n });\n } else if (!isNaN(value)) {\n result = parseFloat((Number(value) * unit).toFixed(1), radix);\n }\n\n return result;\n}\n\n/**\n * function to read the measurement values and set respective converted value\n * @param {boolean} useCentimeters if true then convert to centimeters, else convert to inches\n */\nfunction toggleMeasurements(useCentimeters) {\n const $toggleTables = $('.size-chart-asset table');\n\n $toggleTables.each(function () {\n const $toggleTable = $(this);\n const $columnHeaders = $toggleTable.find('thead th'); // get table column headers\n\n $toggleTable.find('.js-convert-column').each(function () {\n const nthIndex = $columnHeaders.index(this) + 1; // index of .js-convert-column element relative to it's siblings\n const $toggleCells = $toggleTable.find('tbody td:nth-child(' + nthIndex + ')'); // get table cells in the same column as .js-convert-column\n\n $toggleCells.each(function () {\n const $toggleCell = $(this);\n const convertedValue = unitConversion(useCentimeters, $toggleCell.text()); // convert values on relevant table cells\n\n if (convertedValue) {\n $toggleCell.text(convertedValue);\n }\n });\n });\n });\n}\n\n/**\n * Clear table of all styling classes\n * @param {Object} $tableElement - the table that will have the styling removed from its elements\n */\nfunction clearTableClasses($tableElement) {\n $tableElement.find('th, td').removeClass('selected-table-element cross-section-header cross-section-data');\n}\n\n/** Adds the appropriate styling to the table element being passed\n * @param {Object} $tableElement - element to be styled, based of th/td tag\n */\nfunction applyTableElementStyle($tableElement) {\n var className;\n className = $tableElement.is('th') ? 'cross-section-header' : 'cross-section-data';\n $tableElement.addClass(className);\n}\n\n/** For the table in the measurement section\n * @param {Object} tableElement - table element to be focussed on for cross section\n * @returns {boolean} - false to break the loop, true to move on to the next iteration in the each loop.\n */\nfunction tableCrossSection(tableElement) {\n var $tdElement = $(tableElement);\n var $trElement = $tdElement.closest('tr');\n var containsTdElement = $trElement.has('td').length;\n var elementIndex = $tdElement.index();\n var $tableElement = $tdElement.closest('table');\n clearTableClasses($tableElement);\n $tdElement.addClass('selected-table-element');\n\n // Check if row contains td element, if not it is the header row and\n // cross section doesn't need to be calculated\n if (containsTdElement && elementIndex) {\n // Loop through each table row and apply cross section styling\n $tableElement.find('tr').each(function (iterator, rowElement) {\n var $rowElement = $(rowElement);\n\n // If table row does not contain the moused over cell,\n // apply styling to the cell in the same column\n if (!$rowElement.has('td.selected-table-element').length) {\n var $rowCell = $($rowElement.find('th, td')[elementIndex]);\n applyTableElementStyle($rowCell);\n } else {\n // Apply styling to the entire row, prior to the moused over element\n $rowElement.children().each(function (columnIndex, childElement) {\n var $childElement = $(childElement);\n if (columnIndex < elementIndex) {\n applyTableElementStyle($childElement);\n }\n });\n return false;\n }\n return true;\n });\n }\n return true;\n}\n\n/**\n * Create scroll buttons when the table is larger than the size of the screen\n * TODO: Tech Debt: https://columbia.atlassian.net/browse/GSD-18362 - Remove createScrollButtons()\n */\nfunction createScrollButtons() {\n var $activeContent = $('.js-sizefit-content:visible .tabbed-container__content.active');\n var overflow = $activeContent.find('table.size-chart-asset__table').outerWidth() - $activeContent.outerWidth();\n if (overflow > 0 && breakpoints.isLowRes()) {\n $('.js-scroll-button').remove(); // remove old instances\n var tableHeaderHeight = $activeContent.find('table.size-chart-asset__table th').css('height');\n var marginLeft = parseInt($activeContent.find('table.size-chart-asset__table th').css('width'), 10) + 1 + 'px'; // Adds extra pixel for outline\n var $rightScrollButton = ``;\n var $leftScrollButton = ``;\n $activeContent.append($leftScrollButton);\n $activeContent.append($rightScrollButton);\n }\n}\n\n/**\n * Switches position of scroll buttons\n * @param {Object} $container - jQuery element of table element\n */\nfunction scrollButtonPosition($container) {\n var $table = $container.find('table.size-chart-asset__table');\n var tableOverflow = $table.outerWidth() - $container.outerWidth();\n var $tableOffset = $table.offset();\n var offsetLeft = $tableOffset.left - 48; // remove 3rem offset\n\n if (tableOverflow + offsetLeft < 2) {\n $('.scroll-table-right').addClass('d-none');\n $('.js-scroll-button.scroll-table-left.d-none').removeClass('d-none');\n } else if (offsetLeft < 2 && offsetLeft > 0) {\n $('.scroll-table-left').addClass('d-none');\n $('.js-scroll-button.scroll-table-right.d-none').removeClass('d-none');\n }\n}\n\n/**\n * Highlights fit selection in Fit Guide content asset\n */\nfunction highlightFitSelection() {\n const $sizeFitModal = $('.sizefit-modal');\n const fitAsset = $('.js-apparel-fit').data('fit-asset');\n const selection = $sizeFitModal.find('[id*=\"' + fitAsset + '\"]');\n\n // Adds outline to content asset wrapper\n selection.addClass('outline');\n}\n\nmodule.exports = {\n initSizeFit: function () {\n const $unitToggles = $('.js-unit-toggle');\n\n createScrollButtons();\n highlightFitSelection(); // Highlight apparel fit in content asset\n\n // TODO: Add event delegation / investigate if needed.\n $('.js-sizefit-option').on('click', function () {\n selectCategory(this);\n $(window).trigger('resize'); // this fixes the height of the overflow slider tabs\n });\n\n // inches/cm toggle\n $unitToggles.on('click', function () {\n var $element = $(this);\n var useCentimeters = false;\n if ($element.hasClass('inches')) {\n $unitToggles.addClass('centi').removeClass('inches');\n useCentimeters = true;\n } else {\n $unitToggles.addClass('inches').removeClass('centi');\n }\n\n toggleMeasurements(useCentimeters);\n });\n\n $('body').on('click', '.ofs__item', function () {\n createScrollButtons();\n });\n\n $('body').on('click', '.js-no-unit-toggle', function () {\n showUnitToggle();\n });\n\n $('.js-sizefit-content').on('shown.bs.collapse', function () {\n $(window).trigger('resize'); // this fixes the height of the overflow slider tabs\n // and this fixes the height of the active content container which was hidden, so had a height of 0:\n $(this).find('.tabbed-container__content-container').each((index, container) => {\n var $container = $(container);\n return $container.css('height', $container.find('.active').outerHeight());\n });\n createScrollButtons();\n });\n\n $('body').on('click', '.js-scroll-button', function () {\n var $activeTable = $('.js-sizefit-content:visible .tabbed-container__content.active .size-chart-asset');\n var $currentScrollButton = $(this);\n $activeTable.animate({ scrollLeft: $currentScrollButton.data('overflow') }, 200, function () {\n scrollButtonPosition($activeTable);\n });\n });\n $('body').on('mouseover', '.size-chart-asset__table td, .size-chart-asset__table th', function () {\n tableCrossSection(this);\n });\n $('body').on('mouseleave', 'table', function () {\n var $tableElement = $(this);\n clearTableClasses($tableElement);\n });\n $('.size-chart-asset').on('scroll', function () {\n var $container = $(this);\n scrollButtonPosition($container);\n });\n },\n getSizeFitGuideContent: function ($modalContentWrapper, url) {\n var successHandler = (html) => {\n // append the template HTML of the interactive size/fit guide to the '.modal-body'\n $modalContentWrapper.find('.modal-body').html(html);\n\n // initialize the event handlers and interactive behavior\n $modalContentWrapper.find('.overflow-slider').overflowSlider();\n tabbedContainer.init();\n $modalContentWrapper.find('.tabbed-container__content-container .active').siblings().hide(); // full page load already happened so we need to do this explicitly\n this.initSizeFit();\n };\n\n // fetch the HTML content for the interactive size/fit guide and\n $.ajax({\n url: url,\n method: 'GET',\n dataType: 'json',\n success: (data) => {\n if (!$modalContentWrapper[0].parentElement) {\n // success was called before the modal is shown.\n $modalContentWrapper.on('shown.bs.modal', () => {\n successHandler(data.renderedTemplate);\n });\n } else {\n successHandler(data.renderedTemplate);\n }\n },\n error: () => {\n $modalContentWrapper.modal('hide');\n }\n });\n }\n};\n","'use strict';\nconst checkoutConstants = require('../checkoutConstants');\nconst SFCC_ADYEN_PAYMENT_NAME = (checkoutConstants.PAYMENT_METHODS && checkoutConstants.PAYMENT_METHODS.ADYEN_COMPONENT) || '';\n\n/**\n * set the credit card field as required or not\n * @param {boolen} value to set the required\n */\nfunction updateCreditCardFieldsAsRequired(value) {\n $('#cardNumber').prop('required', value).parent().toggleClass('required', value);\n $('#securityCode').prop('required', value).parent().toggleClass('required', value);\n $('#expirationMonth').prop('required', value).parent().toggleClass('required', value);\n $('#expirationYear').prop('required', value).parent().toggleClass('required', value);\n $('#holderName').prop('required', value).parent().toggleClass('required', value);\n}\n\n/**\n * Updates product line item price\n * @param {dw.catalog.Product[]} basketItems Line items in the current basket\n */\nfunction updateProductSummary(basketItems) {\n basketItems.forEach(function (item) {\n $(`.product-line-item[data-product-line-item='${item.UUID}'] .product-line-item__qty-price`)\n .find('.price')\n .remove()\n .end()\n .append(item.priceItem.renderedPrice);\n });\n}\n\nmodule.exports = {\n updateGiftCardlist: (data) => {\n var $giftCardContainer = $('.js-gift-card-list');\n\n if (data && data.paymentInstrumentsDetails && data.paymentInstrumentsDetails.giftCardDetails) {\n var giftCardDetails = data.paymentInstrumentsDetails.giftCardDetails;\n\n // Hide all Gift card related stuffs\n $giftCardContainer.hide().empty();\n\n if (giftCardDetails.appliedGiftCards.giftCards &&\n giftCardDetails.appliedGiftCards.giftCards.length > 0) {\n var giftCards = giftCardDetails.appliedGiftCards.giftCards;\n\n for (var index = 0; index < giftCards.length; index++) {\n var card = giftCards[index];\n var $tpl = $('#appliedGiftCardTpl')\n .clone()\n .removeClass('d-none')\n .removeAttr('id');\n\n $tpl.find('.btn-remove-gift-refund').data('uuid', card.piUUID);\n $tpl.find('.js-gift-card-number').text(card.giftCardCode);\n $tpl.find('.js-gift-card-amount').text(card.giftCardAmount);\n\n $giftCardContainer.append($tpl);\n }\n\n $giftCardContainer.show();\n }\n\n $('body').trigger('checkout:toggleKlarnaPaymentOption');\n }\n },\n\n updatePaymentsection: (data) => {\n if (data && data.paymentInstrumentsDetails) {\n var paymentInstruments = data.paymentInstrumentsDetails;\n var notFullyCoveredByAny = data.paymentInstrumentsDetails.isNotFullyCoveredByAny;\n var $loyaltyRewardsContainer = $('body').find('.js-apply-loyalty-rewards');\n var isRewardsAnyIncrement = $loyaltyRewardsContainer.find('.rewards-balance-redemption-banner').length;\n\n if (notFullyCoveredByAny) {\n $('.gift-card-promo-entry-content').slideDown();\n $('.payment-section-heading').removeClass('d-none');\n\n var $billingPaymentOptionsBlock = $('.billing-payment-options-block');\n if ($billingPaymentOptionsBlock.is(':hidden')) {\n $billingPaymentOptionsBlock.slide('show');\n }\n\n if (isRewardsAnyIncrement) {\n $loyaltyRewardsContainer.slide(data.totals.subTotalAfterOrderDiscounts && data.totals.subTotalAfterOrderDiscounts.value ? 'show' : 'hide');\n } else if (data.loyaltyRewards && data.loyaltyRewards.loyaltyRewardDropDownOptions && data.loyaltyRewards.loyaltyRewardDropDownOptions.length) {\n $loyaltyRewardsContainer.slide('show');\n }\n\n var checkedPaymentMethod = $('#paymentMethodsList').find('input[type=radio]:checked').val();\n if ($('#selectedPaymentOption').val() === 'GIFT_CERTIFICATE') {\n var selectedPaymentOptionValue = checkedPaymentMethod === 'PayPal' || checkedPaymentMethod === 'PayByLink' ? checkedPaymentMethod : SFCC_ADYEN_PAYMENT_NAME;\n $('#selectedPaymentOption').val(selectedPaymentOptionValue);\n }\n\n // \"credit_card\" is the common radio button component that holds the \"scheme\" and \"storedCard\" adyen components\n const isCcOrPbl = checkedPaymentMethod === 'credit_card' || checkedPaymentMethod === 'PayByLink';\n const isPayPalAuthorized = !!(checkedPaymentMethod === checkoutConstants.PAYMENT_METHODS.PAYPAL && $('#braintreePaypalNonce').val());\n\n updateCreditCardFieldsAsRequired(isCcOrPbl);\n\n $('.btn-checkout.submit-payment').toggleClass('d-none', !isCcOrPbl && !isPayPalAuthorized).toggleClass('d-block', isCcOrPbl || isPayPalAuthorized);\n } else {\n if (paymentInstruments.giftCardDetails && paymentInstruments.giftCardDetails.isFullyCovered) {\n $('#selectedPaymentOption').val('GIFT_CERTIFICATE');\n }\n\n if (!(paymentInstruments.loyaltyRewardsDetails && paymentInstruments.loyaltyRewardsDetails.isLoyaltyRewardsApplied)) {\n $loyaltyRewardsContainer.slide('hide');\n }\n\n $('.gift-card-promo-entry-content').slideUp();\n $('.billing-payment-options-block').slideUp();\n $('.payment-section-heading').addClass('d-none');\n\n updateCreditCardFieldsAsRequired(false);\n\n $('.btn-checkout.submit-payment').toggleClass('d-block', true).toggleClass('d-none', false);\n $('.checkout-accordion.review').toggleClass('d-none', false);\n }\n }\n },\n\n updateOrderSummary: (totals) => {\n var $summaryContainer = $('.order-total-summary, .order-totals-wrapper');\n\n let freeShippingText = (window.resources && window.resources.localizedFreeShippingText);\n var isAdjustedShippingCostFree = freeShippingText && totals.adjustedShippingTotalCost.toLowerCase() === freeShippingText.toLowerCase();\n\n // .js-subtotal-value is in cart order summary and under header, and in minicart\n // .sub-total is in checkout order summary\n $summaryContainer.find('.js-subtotal-value, .sub-total').text(totals.subTotal);\n\n // Order-level discount\n $summaryContainer.find('.order-discount').toggleClass('hide-order-discount', !totals.orderLevelDiscountTotal.value);\n $summaryContainer.find('.order-discount-total .value').text(`- ${totals.orderLevelDiscountTotal.formatted}`);\n\n // \"You Save\" discount details\n $('.total-discount').toggleClass('hide-order-discount', !(totals.discountTotal && totals.discountTotal.value));\n $('.total-discount-text').text((totals.discountTotal && totals.discountTotal.text) || '');\n\n if (totals.discounts) {\n const $discountDetailsContainer = $('#discountDetails');\n const discountDetailMarkup = (label, value) => `\n
      \n
      ${label}
      \n
      ${value}
      \n
      \n `;\n\n $discountDetailsContainer.empty();\n totals.discounts.forEach((discount) => {\n if (discount.applied && discount.relationship) {\n discount.relationship.forEach((discountRelationship) => {\n $discountDetailsContainer.append(discountDetailMarkup(\n discountRelationship.name || discountRelationship.promotionID,\n discountRelationship.formattedPrice\n ));\n });\n } else if (!('applied' in discount)) {\n $discountDetailsContainer.append(discountDetailMarkup(discount.lineItemText, discount.price));\n }\n });\n }\n\n if (totals.showLoyaltyTotal && totals.loyalty && totals.loyalty.value > 0) {\n $('.order-loyalty, .loyalty-discount').removeClass('d-none');\n $('.order-loyalty-total, .loyalty-discount-total').text('- ' + totals.loyalty.formatted);\n } else {\n $('.order-loyalty, .loyalty-discount').addClass('d-none');\n }\n\n $summaryContainer.find('.shipping-total-cost').text(isAdjustedShippingCostFree ? totals.adjustedShippingTotalCost : totals.totalShippingCost);\n $summaryContainer.find('.shipping-discount').toggleClass('d-none', (!totals.shippingLevelDiscountTotal.value || isAdjustedShippingCostFree));\n $summaryContainer.find('.shipping-discount-total').text(`- ${totals.shippingLevelDiscountTotal.formatted}`);\n $summaryContainer.find('.tax-total').text(totals.totalTax);\n $summaryContainer.find('.grand-total-sum').text(totals.grandTotal);\n\n if (totals.showGiftCardTotal) {\n $summaryContainer.find('.amount-gift-card').text(totals.giftCardTotal.formatted);\n $summaryContainer.find('.row-amount-gift-card').show();\n $summaryContainer.find('.grand-total-sum').text(totals.amountDue.formatted);\n } else {\n $summaryContainer.find('.amount-gift-card').text('');\n $summaryContainer.find('.row-amount-gift-card').hide();\n }\n\n // After GC/PromoCode applied or Removed update the PayPal config amount in data-braintree-config\n var $payPalButtonContainer = $('.js_braintree_paypal_billing_button');\n if ($payPalButtonContainer.length) {\n $('body').trigger('checkout:updateBrainTreeConfig');\n }\n\n // update Klarna Placements\n var klarnaPriceValue = totals.grandTotal.replace(/\\D/g, ''); // $1,234.56 -> 123456 (Klarna wants micro amount)\n $('klarna-placement').attr('data-purchase-amount', klarnaPriceValue); // CAN NOT USE .data() HERE. Gotta update the attribute directly.\n if (window.Klarna && window.Klarna.OnsiteMessaging) {\n window.Klarna.OnsiteMessaging.refresh();\n }\n },\n\n updateCreditCardFields: (value) => {\n updateCreditCardFieldsAsRequired(value);\n },\n updateProductSummary: updateProductSummary\n};\n","'use strict';\n\nmodule.exports = function () {\n /**\n * overflowSlider - a jQuery plugin that allows for content to be dragged by\n * the mouse or by touch if it overflows the container.\n *\n * Struction of the markup:\n *
      \n *
      \n *
      \n *
      Item
      \n *
      Item
      \n *
      ...
      \n *
      \n *
      \n *
      \n *\n * @param {Object} options JSON object containing optional settings.\n * @return {Object} jQuery object of the selected element.\n */\n $.fn.overflowSlider = function (options) {\n var settings = $.extend({}, $.fn.overflowSlider.defaults, options);\n\n var collection = this;\n\n // TODO: define these per instance, not on the collection.\n var containerSelector = '.' + settings.containerClass;\n var sliderSelector = '.' + settings.sliderClass;\n var arrowLeftSelector = '.' + settings.arrowLeftClass;\n var arrowRightSelector = '.' + settings.arrowRightClass;\n\n // functions (avoid no-use-before-define lint errors)\n var slideByAmount;\n var slideToItem;\n var slideToX;\n var dragStart;\n var dragging;\n var dragEnd;\n var toggleArrows;\n var listenForArrowClicks;\n var setHeight;\n var init;\n var clamp;\n\n /**\n * Slides the slider by the given percentage of the overflow-slider.\n * @param {Object} $ofs This instance of the overflow slider.\n * @param {number} percentToSlide The amount to slide the slider within the container. 0 - 1.\n */\n slideByAmount = function ($ofs, percentToSlide) {\n var newXPos = 0;\n var endX = $ofs.prop('ofs').endX;\n var startXPos = parseFloat($ofs.find(sliderSelector).css('left')) || 0; // parse float to drop the 'px'\n var containerSize = $ofs.find(containerSelector).innerWidth();\n var sliderSize = $ofs.find(sliderSelector).outerWidth(true);\n if ($ofs.prop('ofs').settings.centered && containerSize > sliderSize) {\n // center the slider within the container\n newXPos = (containerSize - sliderSize) / 2;\n $ofs.find(sliderSelector).stop().animate({ left: newXPos }, {\n always: function () {\n toggleArrows($ofs, newXPos, 0, endX);\n }\n });\n } else {\n var slideSize = $ofs.innerWidth() * percentToSlide;\n newXPos = startXPos + slideSize;\n slideToX($ofs, newXPos);\n }\n };\n\n /**\n * Slide the slider to the specified item if it is overflowing the slider.\n * @param {Object} $ofs This instance of the overflow slider.\n * @param {Object} $item jQuery object of the item within the slider.\n */\n slideToItem = function ($ofs, $item) {\n var itemLeft = $item.position().left;\n var $slider = $ofs.find(sliderSelector);\n var currentSliderXPos = parseFloat($slider.css('left')) || 0;\n var sliderMargin = parseFloat($slider.css('margin-left'));\n var endX = $ofs.prop('ofs').endX;\n var arrowSize = 0;\n if ($ofs.prop('ofs').settings.showArrows) {\n // add the width of the arrows\n arrowSize = $ofs.find(arrowRightSelector).outerWidth(true) || $ofs.find(arrowLeftSelector).outerWidth(true) || 0;\n }\n\n var containerSize = $ofs.find(containerSelector).innerWidth();\n var sliderSize = $ofs.find(sliderSelector).outerWidth(true);\n if (containerSize > sliderSize) {\n // there's enough space to show the entire slider\n if ($ofs.prop('ofs').settings.centered) {\n // center the slider within the container\n var newXPos = (containerSize - sliderSize) / 2;\n $ofs.find(sliderSelector).stop().animate({ left: newXPos }, {\n always: function () {\n toggleArrows($ofs, newXPos, 0, endX);\n }\n });\n } else {\n slideToX($ofs, 0);\n }\n } else if (itemLeft + currentSliderXPos < 0 + arrowSize) {\n // the active item is off to the left\n slideToX($ofs, (itemLeft * -1) - (sliderMargin - arrowSize));\n } else {\n var itemRight = itemLeft + $item.outerWidth(true);\n var ofsWidth = $ofs.find(containerSelector).innerWidth();\n if (itemRight + currentSliderXPos + sliderMargin > ofsWidth - arrowSize) {\n // the active item is off to the right\n slideToX($ofs, (ofsWidth - itemRight - sliderMargin - arrowSize));\n } else {\n // the slider is wider than the container, but the active item is in view.\n toggleArrows($ofs, currentSliderXPos, 0, endX);\n }\n }\n };\n\n /**\n * Slide the slider to the specified x position.\n * @param {Object} $ofs This instance of the overflow slider.\n * @param {number} x The slider left position to slide to.\n */\n slideToX = function ($ofs, x) {\n var endX = $ofs.prop('ofs').endX;\n var newXPos = clamp(x, endX, 0);\n $ofs.find(sliderSelector).stop().animate({ left: newXPos }, {\n always: function () {\n toggleArrows($ofs, newXPos, 0, endX);\n }\n });\n };\n\n /**\n * when the user initiates a mouse click or touch dragging event\n * @param {Event} e The event that triggered the start of a drag.\n */\n dragStart = function (e) {\n // 'this' is the .overflow-slider element\n var $ofs = $(this);\n\n if ($ofs.prop('ofs').settings.preventDefault && e.type !== 'touchstart') {\n e.preventDefault();\n }\n\n if ($ofs.prop('ofs').settings.centered) {\n var containerSize = $ofs.find(containerSelector).innerWidth();\n var sliderSize = $ofs.find(sliderSelector).outerWidth(true);\n if (containerSize > sliderSize) {\n // The slider fits within the container. No dragging needed.\n return;\n }\n }\n\n // mouse is down on the slider. get data.\n if (e.type === 'touchstart') {\n this.ofs.mouseX = e.touches[0].clientX;\n } else {\n this.ofs.mouseX = e.clientX;\n }\n this.ofs.sliderX = parseFloat($ofs.find(sliderSelector).css('left')) || 0;\n\n // start listening for movement\n $ofs.on('mousemove.ofs', dragging);\n $ofs.on('touchmove.ofs', dragging);\n // $ofs.on('pointermove.ofs', dragging); // for IE\n\n // start listening for a mouse up anywhere on the page\n $(document).one('mouseup.ofs', dragEnd);\n $(document).one('touchend.ofs', dragEnd);\n // $(document).one('pointerup.ofs', dragEnd); // for IE\n };\n\n /**\n * \"on dragging\" functionality that takes in either touch event or on click event types and updates the x position of the slider within the container.\n * @param {Event} e The event triggering the drag.\n */\n dragging = function (e) {\n // 'this' is the .overflow-slider element\n var $ofs = $(this);\n\n if ($ofs.prop('ofs').settings.preventDefault) {\n e.preventDefault();\n }\n\n this.ofs.isDragging = true;\n var clientX;\n if (e.type === 'touchmove') {\n clientX = e.touches[0].clientX;\n } else {\n clientX = e.clientX;\n }\n // update the left postion\n var currentSliderXPos = this.ofs.sliderX;\n var mouseDownXPos = this.ofs.mouseX;\n var endX = this.ofs.endX;\n var newXPos = currentSliderXPos + (clientX - mouseDownXPos);\n newXPos = clamp(newXPos, endX, 0);\n $ofs.find(sliderSelector).css('left', newXPos);\n };\n\n /**\n * This is called when the user releases the mouse click or touch dragging event\n * @param {Event} e The mouseup/touchend event.\n */\n dragEnd = function () {\n // 'this' is document\n // stop listening for movement\n $(collection).off('mousemove.ofs');\n $(collection).off('touchmove.ofs');\n // $ofs.off('pointermove.ofs'); // for IE\n\n $(collection).each(function () {\n if (this.ofs.isDragging) {\n this.ofs.isDragging = false;\n var newXPos = parseFloat($(this).find(sliderSelector).css('left')) || 0;\n var endX = this.ofs.endX;\n // this.ofs.sliderX = newXPos;\n toggleArrows($(this), newXPos, 0, endX);\n } else {\n // mouse did not move. this is a regular click.\n this.ofs.isDragging = false;\n }\n });\n };\n\n /**\n * Uses the x position of the slider to hide or show the left and right arrows.\n * If we're within 3px (see threshold) of the left or right position, the arrow will be hidden.\n * @param {Object} $ofs This instance of the overflow slider.\n * @param {number} x The current x position of the slider.\n * @param {number} left The minimum x position of the slider.\n * @param {number} right The maximum x position of the slider.\n */\n toggleArrows = function ($ofs, x, left, right) {\n // threshold is an arbitrary minimum distance the slider must travel\n // before the arrows will show. If the slider is within 3px of the min\n // or max, the arrow will not show.\n var threshold = 3;\n $ofs.find(arrowLeftSelector).toggle(x < left - threshold);\n $ofs.find(arrowRightSelector).toggle(x > right + threshold);\n };\n\n /**\n * this binds a click event to the arrows. The settings for slideAmount are defined in the .overflowSlider.defaults\n * @param {Object} $ofs This instance of the overflow slider.\n */\n listenForArrowClicks = function ($ofs) {\n var slideAmount = $ofs.prop('ofs').settings.slideAmount;\n $ofs.on('click.ofs', arrowLeftSelector, function () {\n slideByAmount($ofs, slideAmount); // slide 75% of the swiper width to the right (positive is right)\n });\n $ofs.on('click.ofs', arrowRightSelector, function () {\n slideByAmount($ofs, (-1 * slideAmount)); // slide 75% of the swiper width to the left (negative is left)\n });\n };\n\n /**\n * Set the height of the slider container.\n * @param {Object} $ofs This instance of the overflow slider.\n * @param {Object} instanceSettings Options this instance of the overflow slider; if undefined, $.extend will be ignore it\n */\n setHeight = function ($ofs, instanceSettings) {\n var sliderHeight = $ofs.find(sliderSelector).outerHeight();\n var $sliderContainer = $ofs.find(containerSelector);\n settings = $.extend({}, $.fn.overflowSlider.defaults, instanceSettings);\n\n if (settings.expectedHeight && parseInt(settings.expectedHeight, 10) > 0) {\n $sliderContainer.css('height', settings.expectedHeight);\n } else if (sliderHeight) {\n $sliderContainer.css('height', sliderHeight);\n } else {\n // oh well, we tried.\n // the height is still 0 and we don't have an expectedHeight. Is the slider hidden?\n }\n };\n\n /**\n * Initialiizing function that establishes defaults for each instance of selected colletion.\n * @param {Object} $ofs This instance of the overflow slider.\n */\n init = function ($ofs) {\n var instanceSettings = settings;\n // get settings from a data attribute\n // this will override any settings set in JS.\n if ($ofs.data('ofs-options')) {\n // var attrOptions = JSON.parse($ofs.data('ofs-options')); // TODO: error handling\n var attrOptions = $ofs.data('ofs-options');\n instanceSettings = $.extend({}, settings, attrOptions);\n }\n\n var elem = $ofs[0]; // this is needed to avoid the no-param-reassign eslint error.\n\n // var itemSelector = '.' + instanceSettings.itemClass;\n elem.containerSelector = '.' + instanceSettings.containerClass;\n elem.sliderSelector = '.' + instanceSettings.sliderClass;\n elem.arrowLeftSelector = '.' + instanceSettings.arrowLeftClass;\n elem.arrowRightSelector = '.' + instanceSettings.arrowRightClass;\n\n var endX = $ofs.find(elem.containerSelector).innerWidth() - $ofs.find(elem.sliderSelector).outerWidth(true); // had to place this value here because endX was diplaying the incorrect value or NaN value\n\n $ofs.addClass('overflow-slider'); // in case a different selector was used.\n\n // the slider is positioned absolutely, so the $ofs has a height of 0.\n // it should match the height of the slider.\n setHeight($ofs, instanceSettings);\n var $imgsInSlider = $ofs.find(elem.sliderSelector).find('img');\n var imgLoadedTimeoutID;\n $imgsInSlider.each(function () {\n if (!this.complete) {\n // the image has not finished loading.\n $(this).one('load', function () {\n clearTimeout(imgLoadedTimeoutID);\n imgLoadedTimeoutID = setTimeout(function () {\n elem.ofs.setHeight($ofs);\n }, 100);\n });\n }\n });\n\n // elem.ofs = $.extend({}, $ofs.prop('ofs'), {\n elem.ofs = {\n settings: instanceSettings,\n isDragging: false,\n sliderX: 0, // keep track of the x position of the slider\n mouseX: null, // the x position of the mouse at the time of the last mouseDown\n endX: endX, // the x position of the slider when it is slid to the left. 0 is the start, the right position.\n clickedTab: null, // record clicked tab, so we can activate it if we don't drag.\n init: init,\n setHeight: setHeight,\n toggleArrows: toggleArrows,\n slideToX: slideToX,\n slideToItem: slideToItem\n };\n\n var $items = $ofs.find(elem.sliderSelector).children();\n $items.addClass(instanceSettings.itemClass);\n\n if (instanceSettings.showArrows) {\n // check for arrows, add if not found.\n if ($ofs.find(elem.arrowRightSelector).length < 1) {\n var arrowBtns = `\n \n \n `;\n $ofs.append(arrowBtns);\n }\n listenForArrowClicks($ofs);\n\n if (instanceSettings.alignArrowsToImgs) {\n // try to center the left/right arrows on the images\n var firstImg = $ofs.find('img:first');\n if (firstImg) {\n var imgHeight = firstImg.height();\n $ofs.find('.' + instanceSettings.arrowClass).css('top', imgHeight / 2);\n }\n }\n }\n\n setTimeout(function () {\n // ensure the slider is properly positioned at the start.\n var $activeItem = $ofs.find('.' + instanceSettings.activeItemClass);\n if ($activeItem.length) {\n slideToItem($ofs, $activeItem);\n } else {\n slideByAmount($ofs, 0);\n }\n }, 0);\n };\n\n /**\n * Resize listener to re-initalize the sliders, and to adjust position if necessary.\n */\n var windowResizeTimeoutId;\n var resizeHandler = function () {\n clearTimeout(windowResizeTimeoutId);\n windowResizeTimeoutId = setTimeout(function () {\n $(collection).each(function () {\n var $ofs = $(this);\n init($ofs);\n });\n }, 500);\n };\n $(window).on('resize.ofs', resizeHandler);\n\n /**\n * This constrains x btween two numbers. min <= x <= max\n * @param {number} x The number to clamp within the min and max\n * @param {number} min The minimum allowed value\n * @param {number} max The maximum allowed value\n * @return {number} x, clamped between min and max. This will be equal to min, x, or max.\n */\n clamp = function (x, min, max) {\n var c = Math.min(Math.max(x, min), max);\n return c;\n };\n\n /**\n * This is the start of the functionality which supports multiple instances of .overflowSlider.\n * \"this\" is a jQuery object containing one or more matching element. For each element, an overflow slider is created.\n */\n return this.each(function () {\n // \"this\" is one of the selected elements\n var $ofs = $(this);\n\n init($ofs); // why is this miscalculating the endX?\n // setTimeout(init($ofs), 0); // why do I need to init twice?!\n\n // on mouse down within the overflowSlider...\n $ofs.on('mousedown.ofs', dragStart);\n $ofs.on('touchstart.ofs', dragStart);\n // $ofs.on('pointerdown.ofs', dragStart); // for IE\n\n var itemSelector = '.' + $ofs.prop('ofs').settings.itemClass;\n $ofs.on('focus', itemSelector, function () {\n slideToItem($ofs, $(this));\n });\n\n return this;\n });\n };\n\n /**\n * Default settings for the overflow sliders.\n */\n $.fn.overflowSlider.defaults = {\n arrowClass: 'ofs__arrow',\n arrowLeftClass: 'ofs__arrow--left',\n arrowRightClass: 'ofs__arrow--right',\n arrowLeftLabel: 'Slide Right',\n arrowRightLabel: 'Slide Left',\n containerClass: 'ofs__container',\n sliderClass: 'ofs__slider',\n itemClass: 'ofs__item',\n showArrows: true,\n alignArrowsToImgs: false, // attempt to align left/right arrows to the images\n slideAmount: 0.75, // slide up to 75% of the container width when left/right buttons are clicked\n centered: true, // when the slider fits within the container, should it be centered or left-aligned?\n activeItemClass: 'active', // active and selected item at overflowSlider\n expectedHeight: 0, // set to the approximate height of the slider content, to prevent a 0 height slider when the height is measured before content has finished loading.\n preventDefault: true // should be prevented default events?\n };\n\n /**\n * For each element having the \"overflow-slider\" class, initialize the overflowSlider\n * with the default settings.\n */\n $(function () {\n // set up the overflow sliders\n // this one line will initialize multiple sliders all having the same settings.\n $('.overflow-slider').overflowSlider();\n });\n};\n\n","'use strict';\n\n// TODO: https://columbia.atlassian.net/browse/GSD-16533 Update URL functions to use the JS URL API\n/**\n * Append a parameter to a url\n * @param {string} url - a url\n * @param {string} name - key\n * @param {string} value - value\n * @return {string} url with param appended\n */\nfunction appendParamToURL(url, name, value) {\n var c = '?';\n if (url.indexOf(c) !== -1) {\n c = '&';\n }\n return url + c + name + '=' + encodeURIComponent(value);\n}\n\n/**\n * Helper function for getParamsFromURL. Split a url string into key/value pairs.\n * @param {string} str - url parameter string\n * @return {Object} object with params split into key/value pairs\n */\nfunction keyValueArray(str) {\n var kvp = str.split('&');\n var x;\n var k;\n var v;\n var output = {};\n\n for (var i = kvp.length - 1; i >= 0; i--) {\n if (kvp[i].length) { // No empty strings...\n x = kvp[i].split('=');\n k = x[0];\n v = '';\n if (x.length > 1) {\n v = x[1];\n }\n output[k] = v;\n }\n }\n\n return output;\n}\n\n/**\n * Split a url string into key/value pairs.\n * @param {string} url - url parameter string\n * @return {Object} object with params split into key/value pairs\n */\nfunction getParamsFromURL(url) {\n var arr = url.split('?');\n var search = '';\n var searchHash = '';\n var postHash = false;\n\n if (arr.length > 1) {\n var arrHash = arr[1].split('#');\n search = arrHash[0];\n\n if (arrHash.length > 1) {\n postHash = true;\n searchHash = arrHash[1];\n }\n }\n\n var output = {};\n if (search.length) {\n output = keyValueArray(search);\n }\n if (postHash) {\n if (searchHash.length) {\n var output2 = keyValueArray(searchHash);\n Object.keys(output2).forEach(function (prop) {\n output[prop] = output2[prop]; // Merge them...\n });\n }\n }\n\n return output;\n}\n\n/**\n * Update an existing url param\n * https://stackoverflow.com/questions/1090948/change-url-parameters\n * @param {string} url - Url to be updated\n * @param {string} param - param to be updated\n * @param {string} paramVal - new parameter value\n * @returns {string} - updated url\n */\nfunction updateURLParam(url, param, paramVal) {\n var newAdditionalURL = '';\n var tempArray = url.split('?');\n var baseURL = tempArray[0];\n var additionalURL = tempArray[1];\n var temp = '';\n if (additionalURL) {\n tempArray = additionalURL.split('&');\n for (var i = 0; i < tempArray.length; i++) {\n if (tempArray[i].split('=')[0] !== param) {\n newAdditionalURL += temp + tempArray[i];\n temp = '&';\n }\n }\n }\n\n var rowsText = temp + '' + param + '=' + paramVal;\n return baseURL + '?' + newAdditionalURL + rowsText;\n}\n\n/**\n * Turn the URL query string into a JSON object to make it easier to add/update/delete key/value pairs.\n * @param {string} url the URL string from which to get the querystring. Null or empty string to use the location.href.\n * @returns {obejct} the query string as an object.\n */\nfunction queryStringToObject(url) {\n var search;\n if (!url) {\n // get the query string from window.location.search\n search = location.search.substring(1); // exclude the leading ?\n } else {\n // find the query string in the given url\n var startIndex = url.indexOf('?') + 1;\n var endIndex = url.indexOf('#');\n endIndex = endIndex >= startIndex ? endIndex : url.length;\n // examples:\n // 'key=val#hash', '/?key=val#hash' => 'key=val'\n // '?key#hash' => 'key'\n search = url.substring(startIndex, endIndex);\n if (startIndex === 0 && search.indexOf('=') === -1) {\n // this string doesn't look like a query string (no '?' and no '=')\n // examples: 'key#hash', '/#hash'\n search = '';\n }\n }\n\n var result = {};\n if (search) {\n var pairs = search.split('&');\n pairs.forEach(function (pair) {\n var nameVal = pair.split('=');\n result[nameVal[0]] = decodeURIComponent(nameVal[1] || '');\n });\n }\n\n return JSON.parse(JSON.stringify(result));\n}\n\n/**\n * Convert an object into a serialized string; the opposite of queryStringToObject().\n * @param {Object} obj The object to be serialized into a string\n * @param {string} urlString An optional url into which to insert the querystring. Any existing query string will be replaced.\n * @returns {string} The resulting query or URL string.\n */\nfunction objectToQueryString(obj, urlString) {\n var url = urlString || '';\n var path = '';\n var hash = '';\n if (url) {\n var qsIndex = url.indexOf('?');\n var hashIndex = url.indexOf('#');\n var index;\n if (hashIndex > -1) {\n index = hashIndex;\n hash = url.substring(hashIndex);\n }\n if (qsIndex > -1) {\n index = qsIndex;\n }\n path = url.substring(0, index); // if index is undefined, path is the entire string.\n }\n return path + '?' + $.param(obj) + hash;\n}\n\n/**\n * Update a URL with a key/value pair. This will insert or update a pair.\n * @param {string} url The url to be updated.\n * @param {string} name The key name to use in the query string.\n * @param {string} val The value of the key to be set.\n * @returns {string} The updated URL.\n */\nfunction setUrlKeyValue(url, name, val) {\n var qs = queryStringToObject(url);\n qs[name] = encodeURIComponent(val);\n return objectToQueryString(qs, url);\n}\n\n/**\n * Update a URL with multiple key/value pairs. This will insert new or update existing keys.\n * @param {string} url The url to be updated.\n * @param {Object} obj an object of name/value pairs to be inserted/updated in the url query string.\n * @returns {string} The updated URL.\n */\nfunction setUrlData(url, obj) {\n var qs = queryStringToObject(url);\n var mergedQs = $.extend({}, qs, obj);\n return objectToQueryString(mergedQs, url);\n}\n\n/**\n * DecodeURIComponent cannot be used directly to parse query parameters from a URL. It needs a bit of preparation.\n * reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent\n * @param {string} val The query param value to be decoded.\n * @returns {string} The decoded query param value.\n */\nfunction decodeQueryParam(val) {\n return decodeURIComponent(val.replace(/\\+/g, ' '));\n}\n\n/**\n * Remove the queryparam from the url\n * @param {string} queryparam queryparam to be removed\n * @param {string} urlString url to be manipulated\n * @returns {URL} new url without provided queryparam\n */\nfunction removeQueryParam(queryparam, urlString) {\n var url = new URL(urlString);\n url.searchParams.delete(queryparam);\n return url;\n}\n\n/**\n * Remove the queryparam from the url, and replace the state\n * @param {string} queryparam queryparam to be removed\n */\nfunction removeQueryParamFromCurrentUrl(queryparam) {\n var url = removeQueryParam(queryparam, window.location.href);\n history.replaceState(null, '', url);\n}\n\n/**\n * Returns an array with values that exist in both arrays\n * @param {array} a1 - Array\n * @param {array} a2 - Array\n * @return {array} - Values that appear in both arrays\n */\nfunction arrayIntersection(a1, a2) {\n var intersect = $.map(a1,\n function (v) {\n return $.inArray(v, a2) < 0 ? null : v;\n }\n );\n return intersect;\n}\n\n/**\n * Creates and returns the markup required to display a modal.\n * The calling script should then use the bootstrap $.modal() method to display the modal.\n * Example 1:\n * var modalMarkup = createModalMarkup('

      Hello World

      ', {title: 'Greeting'});\n * var $modal = $(modalMarkup).modal();\n * Example 2:\n * var $modal = $(createModalMarkup('')); // create empty modal\n * $modal.find('.modal-body').html(data); // inject content into the returned markup\n * $modal.modal();\n * @param {string} content The content to put in the modal. Pass empty string to just get the modal markup.\n * @param {Object} options Additional settings.\n * @return {string} The completed markup.\n */\nfunction createModalMarkup(content = '', options = {}) {\n /* Bootstrap Modal documentation: https://getbootstrap.com/docs/4.0/components/modal/ */\n const defaults = {\n title: '',\n showCloseBtn: true,\n enableLayeredDrawers: false,\n modalSizeClass: 'modal-lg', // possible values: modal-sm, modal-md (or empty string), modal-lg, modal-fluid\n centeredClass: 'modal-dialog-centered', // pass empty string to top-align the modal\n customClasses: '', // additional classes to be added to the modal\n modalId: '', // Custom id for the modal\n buttons: [\n // example markup (this will also dismiss the modal on click):\n // ''\n ]\n };\n const settings = $.extend({}, defaults, options);\n\n // additional uncommon bootstrap options go into data attributes\n const dataAttributes = [];\n ['backdrop', 'keyboard', 'focus', 'show'].forEach(param => {\n if (settings[param] !== undefined) {\n dataAttributes.push(`data-${param}=\"${settings[param]}\"`);\n }\n });\n\n let header = '
      ';\n if (settings.title) {\n header += `
      ${settings.title}
      `;\n }\n if (settings.showCloseBtn) {\n header += '';\n }\n header += '
      ';\n\n let idAttribute = '';\n if (settings.modalId) {\n idAttribute = `id=\"${settings.modalId}\"`;\n }\n\n let footer = '';\n let footerBtns = '';\n for (let btn of settings.buttons) {\n footerBtns += btn;\n }\n if (footerBtns) {\n footer = `
      ${footerBtns}
      `;\n }\n\n // tabindex=\"-1\" is necessary to allow the modal to close when ESC key is pressed.\n // https://stackoverflow.com/questions/12630156/how-do-you-enable-the-escape-key-close-functionality-in-a-twitter-bootstrap-moda\n const html = `
      \n
      \n
      \n ${header}\n
      \n ${content}\n
      \n ${footer}\n
      \n
      \n
      `;\n\n return html;\n}\n/**\n * Creates a backdrop element and appends it to the body tag.\n * @param {string} customClass An optional class to apply to the backdrop.\n */\nfunction createBackdrop(customClass) {\n var cls = customClass || '';\n var html = '
      ';\n $('body').append(html);\n}\n\n/**\n * Removes from the page the backdrop with the passed in class, or all backdrops if nothing is passed.\n * @param {string} customClass An optional class for selecting a backdrop to be removed. All will be removed if this is null.\n */\nfunction removeBackdrop(customClass) {\n var selector = '.backdrop' + (customClass ? '.' + customClass : '');\n $('body').find(selector).remove();\n}\n\n/**\n * display element in viewport\n * @param {string} el element in viewport\n * @param {string} offsetToTop off set top position\n * @return {boolean} element view port\n */\nfunction elementInViewport(el, offsetToTop) {\n var top = el.offsetTop;\n var left = el.offsetLeft;\n var width = el.offsetWidth;\n var height = el.offsetHeight;\n\n while (el.offsetParent) {\n el = el.offsetParent; // eslint-disable-line no-param-reassign\n top += el.offsetTop;\n left += el.offsetLeft;\n }\n\n if (typeof offsetToTop !== 'undefined') {\n top -= offsetToTop;\n }\n\n if (window.pageXOffset !== null) {\n return (\n top < (window.pageYOffset + window.innerHeight) &&\n left < (window.pageXOffset + window.innerWidth) &&\n (top + height) > window.pageYOffset &&\n (left + width) > window.pageXOffset\n );\n }\n\n if (document.compatMode === 'CSS1Compat') {\n return (\n top < (window.document.documentElement.scrollTop + window.document.documentElement.clientHeight) &&\n left < (window.document.documentElement.scrollLeft + window.document.documentElement.clientWidth) &&\n (top + height) > window.document.documentElement.scrollTop &&\n (left + width) > window.document.documentElement.scrollLeft\n );\n }\n\n return false;\n}\n\n/**\n * append script to body tag\n * @param {string} src url of the script to append\n * @param {function} callback optional callback to fire after load\n */\nfunction loadScript(src, callback) {\n var script = document.createElement('script');\n script.type = 'text/javascript';\n script.src = src;\n document.getElementsByTagName('body')[0].appendChild(script);\n\n if (callback) {\n script.onload = callback;\n }\n}\n\n/**\n * load script to DOM if document ready state is complete or load after window load\n * @param {string} src url of the script to append\n * @param {function} callback optional callback to fire after load\n */\nfunction loadJsAfterWindowLoad(src, callback) {\n if (document.readyState === 'complete') {\n loadScript(src, callback);\n } else {\n window.addEventListener('load', function () {\n loadScript(src, callback);\n });\n }\n}\n\n/**\n * Inserts pasted text at cursor location in input or textarea elements.\n * If a range of text is selected in the input, that range will be replaced by the new text\n * If no text in the input is selected, the string will be inserted at the end\n * @param {selector} formInput - DOM element for the target form input\n * @param {string} str - string to insert into the form\n */\nfunction insertAtInputCursor(formInput, str) {\n var input = formInput;\n var start = input.selectionStart;\n var end = input.selectionEnd;\n\n // Inserts str between selection start and end positions\n input.value = input.value.substring(0, start) + str + input.value.substring(end);\n // Update cursor position\n input.selectionStart = start + str.length;\n input.selectionEnd = input.selectionStart;\n}\n\n/**\n * Returns validity of date\n * @param {string} stageMessage The name of the stage we're going to.\n * @returns {string} Returns true if the day is within the month. Returns false if it is an invalid date.\n */\nfunction getTimeAndHours(stageMessage) {\n var date = new Date();\n var hours = date.getHours();\n var minutes = date.getMinutes();\n var ampm = hours >= 12 ? 'PM' : 'AM';\n hours %= 12;\n hours = hours || 12; // the hour '0' should be '12'\n minutes = minutes < 10 ? '0' + minutes : minutes;\n var strTime = hours + ':' + minutes + ' ' + ampm;\n return stageMessage + ' ' + strTime;\n}\n// intentionally export loadJsAfterWindowLoad onto global scope\nglobal.cscUtils = global.cscUtils || {};\nglobal.cscUtils.loadJsAfterWindowLoad = loadJsAfterWindowLoad;\n\n/**\n * Converts a string to Title Case.\n * @example\n * 'fRiEnDsHiP is MAGIC' -> 'Friendship Is Magic'\n * 'don't uppercase contractions' -> 'Don't Uppercase Contractions'\n * 'hyphenated-strings work too' -> 'Hyphenated-Strings Work Too'\n * @param {string} str The string to be title cased.\n * @returns {string} The original string in title case.\n */\nfunction stringToTitleCase(str) {\n return str.replace(/[^\\s/-]+/g, function (word) {\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n });\n}\n\n/** Function to heapify a subtree rooted with node ndx\n * @param {Array} list - The array to heapify\n * @param {number} ndx - The index of the root of the subtree to heapify\n * @param {number} heapSize - The size of the heap\n * @param {string} key - The object key to find the highest numbers for\n */\nfunction heapify(list, ndx, heapSize, key) {\n let largest = ndx;\n // eslint-disable-next-line no-mixed-operators\n const left = 2 * ndx + 1;\n // eslint-disable-next-line no-mixed-operators\n const right = 2 * ndx + 2;\n\n // Check if left child is larger than root\n if (left < heapSize && list[left][key] > list[largest][key]) {\n largest = left;\n }\n\n // Check if right child is larger than root\n if (right < heapSize && list[right][key] > list[largest][key]) {\n largest = right;\n }\n\n // If largest is not root\n if (largest !== ndx) {\n // Swap array[i] and array[largest]\n // eslint-disable-next-line no-param-reassign\n [list[ndx], list[largest]] = [list[largest], list[ndx]];\n // Recursively heapify the affected sub-tree\n heapify(list, largest, heapSize, key);\n }\n}\n\n/** Function to heapify the array into max heap\n * @param {Array} list - The array to heapify\n * @param {string} key - The object key to find the highest numbers for\n */\nfunction heapifyMax(list, key) {\n const arrayLength = list.length;\n\n // Build max heap\n for (let ndx = Math.floor(arrayLength / 2) - 1; ndx >= 0; ndx--) {\n heapify(list, ndx, arrayLength, key);\n }\n\n for (let ndx = arrayLength - 1; ndx > 0; ndx--) {\n let firstListItem = list[0];\n // eslint-disable-next-line no-param-reassign\n list[0] = list[ndx];\n // eslint-disable-next-line no-param-reassign\n list[ndx] = firstListItem;\n\n heapify(list, 0, ndx, key);\n }\n}\n\n/** Function to find the n highest numbers in an array\n * @param {Array} list - The array to find the n highest numbers in\n * @param {number} n - The number of highest numbers to find\n * @param {string} key - The object key to find the highest numbers for\n * @returns {Array} The n highest numbers\n */\nfunction findNHighest(list, n, key) {\n if (list.length < n) {\n // eslint-disable-next-line no-param-reassign\n n = list.length;\n }\n\n const listToUse = JSON.parse(JSON.stringify(list)); // Deep copy the list\n const result = [];\n\n // Build max heap\n heapifyMax(listToUse, key);\n\n for (let i = 0; i < n; i++) {\n // Extract max element from the max heap\n result.push(listToUse.pop());\n }\n\n return result;\n}\n\n/** Function to compare two objects for deep equality\n * @param {Object} obj1 - The first object to compare\n * @param {Object} obj2 - The second object to compare\n * @returns {boolean} Whether the two objects are deep equal\n */\nfunction deepEqual(obj1, obj2) {\n return (obj1 && obj2 && typeof obj1 === 'object' && typeof obj2 === 'object') ?\n (Object.keys(obj1).length === Object.keys(obj2).length) &&\n Object.keys(obj1).reduce(function (isEqual, key) {\n return isEqual && deepEqual(obj1[key], obj2[key]);\n }, true) : (obj1 === obj2);\n}\n\nmodule.exports = {\n appendParamToURL: appendParamToURL,\n keyValueArray: keyValueArray,\n getParamsFromURL: getParamsFromURL,\n updateURLParam: updateURLParam,\n arrayIntersection: arrayIntersection,\n createModalMarkup: createModalMarkup,\n queryStringToObject: queryStringToObject,\n objectToQueryString: objectToQueryString,\n removeQueryParam: removeQueryParam,\n removeQueryParamFromCurrentUrl: removeQueryParamFromCurrentUrl,\n createBackdrop: createBackdrop,\n removeBackdrop: removeBackdrop,\n setUrlKeyValue: setUrlKeyValue,\n setUrlData: setUrlData,\n decodeQueryParam: decodeQueryParam,\n elementInViewport: elementInViewport,\n loadJsAfterWindowLoad: loadJsAfterWindowLoad,\n insertAtInputCursor: insertAtInputCursor,\n stringToTitleCase,\n getTimeAndHours: getTimeAndHours,\n findNHighest: findNHighest,\n deepEqual: deepEqual\n};\n","'use strict';\nconst formHelpers = require('../checkout/formErrors');\nconst giftCardHelpers = require('../helper/giftCardHelper');\nconst basketHelper = require('../helper/basketHelper');\nconst checkoutConstants = require('../checkoutConstants');\n\n/**\n * Displays an error modal with the given content.\n * @param {string} content The content to display in the modal.\n */\nfunction errorModal(content) {\n $.modal({\n title: 'ERROR',\n content: content,\n customClasses: 'modal--error',\n buttons: [\n ''\n ]\n });\n}\n\n/**\n * Updates the forecasted rewards message. \"You are earning $x.xx in Rewards on this purchase.\"\n * @param {Object} rewards The forecasted rewards data\n */\nfunction updateForecastedRewards(rewards) {\n const $forecastedRewardsMessage = $('.js-forecasted-rewards');\n\n if (!$forecastedRewardsMessage.length) {\n return;\n }\n\n let calculatedRewards;\n\n if (rewards) {\n calculatedRewards = rewards.promoRewards || rewards.baseRewards;\n }\n\n if (!calculatedRewards || calculatedRewards.value === 0) {\n $forecastedRewardsMessage.hide();\n } else {\n $forecastedRewardsMessage.show().find('.js-loyalty-rewards-earning').text(calculatedRewards.formatted);\n\n // if we have strikethrough rewards in the message, update that too.\n if (rewards && rewards.baseRewards) {\n $forecastedRewardsMessage.find('s').text(rewards.baseRewards.formatted);\n }\n }\n}\n\n/**\n * Function that handles toggling the rewards balance/redemption banner, based on if loyalty is applied or not\n * @param {boolean} isRewardsApplied - if true, the rewards balance/redemption banner will show the loyalty applied experience\n * @param {string} textRemainingBalance - the remaining balance message to show when rewards are applied\n * @param {boolean} suppressActionButton - if true, we will not show the apply/remove button when toggling\n */\nfunction rewardsBalanceBannerToggle(isRewardsApplied, textRemainingBalance, suppressActionButton) {\n const $rewardsBalanceRedemptionBanner = $('.rewards-balance-redemption-banner');\n const $redemptionBannerPrimaryText = $rewardsBalanceRedemptionBanner.find('.js-rewards-redemption-banner-primary-text');\n const $redemptionBannerSecondaryText = $rewardsBalanceRedemptionBanner.find('.js-rewards-redemption-banner-secondary-text');\n const $applyRewardsButton = $rewardsBalanceRedemptionBanner.find('.js-btn-apply-loyalty-rewards');\n const $removeRewardsButton = $rewardsBalanceRedemptionBanner.find('.js-btn-remove-loyalty-rewards');\n const $loyaltyForm = $('form.js-apply-loyalty-rewards');\n\n if (isRewardsApplied) {\n $redemptionBannerPrimaryText.text($redemptionBannerPrimaryText.data('appliedRewardsMsg'));\n $redemptionBannerSecondaryText.text(textRemainingBalance);\n\n $applyRewardsButton.hide();\n\n if (!suppressActionButton) {\n $removeRewardsButton.removeClass('d-none').show();\n }\n\n $loyaltyForm.attr('action', $loyaltyForm.data('cancelUrl'));\n } else {\n $redemptionBannerPrimaryText.text($redemptionBannerPrimaryText.data('availableRewardsMsg'));\n $redemptionBannerSecondaryText.text($redemptionBannerSecondaryText.data('availableRewardsMsg'));\n\n if (!suppressActionButton) {\n $applyRewardsButton.removeClass('d-none').show();\n }\n\n $loyaltyForm.attr('action', $loyaltyForm.data('applyUrl'));\n\n $removeRewardsButton.hide();\n }\n}\n\nmodule.exports = {\n init: (shouldRedirectOnSignUp) => {\n let loyaltySuccessMessage = sessionStorage.getItem('loyaltySuccessMessage');\n if (loyaltySuccessMessage) {\n $.alert({\n content: loyaltySuccessMessage,\n placement: 'banner',\n theme: 'info'\n });\n sessionStorage.removeItem('loyaltySuccessMessage');\n }\n $('.loyalty-form__toggle-btn').on('click', () => {\n $('.loyalty-form__summary').slideUp();\n $('.loyalty-form__toggle-form').slideDown();\n });\n\n /**\n * Sign up for loyalty membership on checkout page or order confirmation page.\n */\n $('#loyaltyShippingForm, form.checkout-registration').on('submit', function (e) {\n e.preventDefault();\n let $form = $(this);\n let url = $form.attr('action');\n let formData = $form.serialize();\n\n // if we're on the checkout page, append the shipping form to the POST data.\n const $shippingForm = $('#dwfrm_shipping');\n if ($shippingForm.length) {\n let shippingFormStr = $shippingForm.serialize();\n formData += '&' + shippingFormStr;\n }\n\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'POST',\n dataType: 'json',\n data: formData\n }).done((data) => {\n if (data.success) {\n // don't stop the spinner - the reload or redirect will do it.\n if (data.redirectUrl && shouldRedirectOnSignUp) {\n location.href = data.redirectUrl;\n } else {\n sessionStorage.setItem('loyaltySuccessMessage', $form.data('success-message'));\n location.reload();\n }\n } else if (data.error) {\n $.spinner().stop();\n // display error modal\n errorModal(data.error);\n } else if (data.fields) {\n $.spinner().stop();\n // expand the loyalty section\n $('.loyalty-form__summary').hide();\n $('.loyalty-form__toggle-form').show();\n // field errors\n formHelpers.loadFormErrors($('#loyaltyShippingForm'), data.fields);\n }\n }).fail(() => {\n $.spinner().stop();\n // display error modal\n errorModal('Something went wrong. Please try again. If the problem persists, please contact customer support.');\n });\n });\n\n /**\n * Apply OR Remove loyalty rewards to order in checkout\n */\n $('form.js-apply-loyalty-rewards').on('submit', function (e) {\n e.preventDefault();\n let $form = $(this);\n let url = $form.attr('action');\n $.spinner().start();\n $.ajax({\n url: url, // Loyalty-Apply\n type: 'POST',\n dataType: 'json',\n data: $form.serialize()\n }).done((data) => {\n $.spinner().stop();\n if (data.error) {\n if (window.digitalData && window.digitalData.user && window.digitalData.user.rewardsRedeemed) {\n delete window.digitalData.user.rewardsRedeemed;\n }\n errorModal(data.errorMessage);\n return false;\n }\n const $availableCerts = $('.js-available-reward-certs');\n const $appliedRewardsAlert = $('.js-loyalty-applied-alert');\n const $loyaltyOrderSummary = $('.loyalty-discount');\n const $paymentOptionsBlock = $('.billing-payment-options-block');\n // loyalty rewards applied to cart\n if (data.result && data.result.appliedRewards) {\n $form.data('applied-rewards', data.result.appliedRewards.value);\n $form.attr('action', $form.data('cancelUrl'));\n\n // If we are using the loyalty rewards drop down experience\n if ($availableCerts.length && $appliedRewardsAlert.length) {\n $availableCerts.slideUp();\n $appliedRewardsAlert.find('.alert__content').html(data.result.appliedRewards.redeemedAmountText);\n $appliedRewardsAlert.slide('show');\n } else {\n const rewardsAppliedMsg = $('.js-rewards-redemption-banner-primary-text').data('appliedRewardsMsg');\n const toasterContent = `\n ${rewardsAppliedMsg}\n
      ${data.result.appliedRewards.redeemedAmountText}
      \n `;\n\n $.alert({\n content: toasterContent,\n theme: 'success',\n placement: 'toast'\n });\n\n rewardsBalanceBannerToggle(true, data.result.appliedRewards.textRemainingBalance);\n }\n\n // update order summary\n $loyaltyOrderSummary.removeClass('d-none').find('.loyalty-discount-total').text(`- ${data.result.totals.loyalty.formatted}`);\n if (data && 'dtmLayer' in data && 'digitalData' in window) {\n if (data.dtmLayer.user && window.digitalData.user) {\n window.digitalData.user.rewardsRedeemed = data.dtmLayer.user.rewardsRedeemed;\n }\n }\n } else { // Removing rewards that had been previously applied.\n $form.data('applied-rewards', 0);\n $form.attr('action', $form.data('applyUrl'));\n\n // If we are using the loyalty rewards drop down experience\n if ($availableCerts.length && $appliedRewardsAlert.length) {\n $availableCerts.slide('show');\n $appliedRewardsAlert.slideUp();\n } else {\n rewardsBalanceBannerToggle(false);\n }\n\n var checkedPaymentMethod = $('#paymentMethodsList').find('input[type=radio]:checked').val();\n var isCcOrPbl = (checkedPaymentMethod === 'credit_card' || checkedPaymentMethod === 'PayByLink');\n if (!isCcOrPbl) {\n $('.submit-payment').removeClass('d-block').addClass('d-none');\n }\n\n // update order summary and billing section\n $loyaltyOrderSummary.addClass('d-none');\n if (data.paymentInstrumentsDetails && !data.paymentInstrumentsDetails.isNotFullyCoveredByAny) {\n $('.gift-card-promo-entry-content').slideDown();\n }\n if (window.digitalData && window.digitalData.user && window.digitalData.user.rewardsRedeemed) {\n delete window.digitalData.user.rewardsRedeemed;\n }\n }\n $('.grand-total-sum').text(data.result.totals.grandTotal);\n\n // Toggle the disabled state of the Klarna payment option\n $('body').trigger('checkout:toggleKlarnaPaymentOption');\n\n // After Rewards applied or Removed update the PayPal config amount in data-braintree-config\n let $payPalButtonContainer = $('.js_braintree_paypal_billing_button');\n if ($payPalButtonContainer.length) {\n $('body').trigger('checkout:updateBrainTreeConfig');\n }\n\n const $selectedPaymentOption = $('#selectedPaymentOption');\n\n if (data.paymentInstrumentsDetails.isNotFullyCoveredByAny) {\n if ($selectedPaymentOption.val() === checkoutConstants.PAYMENT_METHODS.LOYALTY) {\n $('#selectedPaymentOption').val('');\n }\n\n $('.gift-card-promo-entry-content').slideDown();\n $paymentOptionsBlock.removeClass('d-none').slideDown().data('fully-covered', false);\n } else {\n $paymentOptionsBlock.slideUp().data('fully-covered', true);\n\n $('.submit-payment').removeClass('d-none').addClass('d-block');\n $('.checkout-accordion.review').removeClass('d-none');\n\n $('#selectedPaymentOption').val(checkoutConstants.PAYMENT_METHODS.LOYALTY);\n $('.gift-card-promo-entry-content').slideUp();\n giftCardHelpers.updateCreditCardFields(false);\n }\n\n giftCardHelpers.updatePaymentsection(data.result);\n updateForecastedRewards(data.result.rewards);\n basketHelper.updateRewardsCardAndBanner(data);\n return true;\n }).fail(() => {\n if (window.digitalData && window.digitalData.user && window.digitalData.user.rewardsRedeemed) {\n delete window.digitalData.user.rewardsRedeemed;\n }\n $.spinner().stop();\n // display error modal\n errorModal('Something went wrong. Please try again. If the problem persists, please contact customer support.');\n });\n });\n\n // Currently we are using a site preference for toggling between the drop down and any increment. As such, we need to look for both selectors\n let $loyaltyRemoveButton = $('.js-loyalty-applied-alert').find('.alert__close-btn');\n\n if (!$loyaltyRemoveButton.length) {\n $loyaltyRemoveButton = $('.js-btn-remove-loyalty-rewards');\n }\n\n $loyaltyRemoveButton.on('click', function (e) {\n e.preventDefault(); // prevent the close button from closing the alert\n const $form = $('form.js-apply-loyalty-rewards');\n $form.attr('action', $form.data('cancelUrl'));\n $form.trigger('submit');\n });\n },\n updateForecastedRewards: updateForecastedRewards,\n rewardsBalanceBannerToggle\n};\n","'use strict';\n\n/**\n * Product Details Module\n */\n\nvar ImageGallery = require('./imageGallery');\nvar loyalty = require('./loyalty');\nvar breakpoints = require('../components/breakpoints');\nvar utils = require('../components/utils');\nvar base = require('./base');\nvar sizefitJs = require('../sizefit/sizefit');\nvar tabbedContainer = require('../aem/tabbedContainer');\nvar overflowSlider = require('../aem/overflowSlider');\nvar _ = require('underscore');\nvar pollWriteAReviewButtonInterval = 250;\nvar pollCountMax = 5;\nvar initialPageLoad = true;\n\n/**\n * Make the Add to Cart Button Sticky\n */\nfunction stickyAddToCart() {\n var $stickyButton = $('.add-to-cart__container');\n\n if ($stickyButton.length === 0 || breakpoints.isHighRes()) {\n return;\n }\n\n var stickyButtonOffsetTop = $stickyButton.offset().top;\n\n $(window)\n .off('scroll.stickyAddToCart')\n .on('scroll.stickyAddToCart', _.throttle(function () {\n var $discountPercentage = $stickyButton.find('.js-discount-percent');\n var $pranaRating = $stickyButton.find('.js-prana-rating');\n if ($(this).scrollTop() > stickyButtonOffsetTop) {\n $('html').addClass('is-addToCart-sticky');\n $discountPercentage.addClass('d-none');\n $pranaRating.removeClass('d-none d-lg-inline-block');\n $('.footer-container__copyright').addClass('mb-8');\n } else {\n $('html').removeClass('is-addToCart-sticky');\n $discountPercentage.removeClass('d-none');\n $pranaRating.addClass('d-none d-lg-inline-block');\n $('.footer-container__copyright').removeClass('mb-8');\n }\n }, 100));\n}\n\n/**\n * Klarna Placements\n * The data.price object does not always contain the price that is displayed on the page,\n * So to get the displayed price, we'll scrape it from the page.\n */\nfunction refreshKlarnaPlacements() {\n var displayedPrice = $('.prices .value:first').attr('content'); // content attribute is the unformatted value.\n var klarnaPriceValue = displayedPrice ? Math.round(displayedPrice * 100) : 1;\n $('klarna-placement').attr('data-purchase-amount', klarnaPriceValue); // CAN NOT USE .data() HERE. Gotta update the attribute directly.\n if (window.Klarna && window.Klarna.OnsiteMessaging) {\n window.Klarna.OnsiteMessaging.refresh();\n }\n}\n\n/**\n * Update Product Attributes and Details\n */\nfunction updateAttributesAndDetails() {\n $('body').on('product:statusUpdate', function (e, data) {\n /**\n * Get a reference to the product container\n */\n var $productContainer = $('.product-detail[data-pid=\"' + data.id + '\"]');\n\n /**\n * Product Description and Details\n */\n $productContainer.find('.description-and-detail .product-attributes')\n .empty()\n .html(data.attributesHtml);\n\n if (data.shortDescription) {\n $productContainer.find('.description-and-detail .description')\n .removeClass('hidden-xl-down');\n $productContainer.find('.description-and-detail .description .content')\n .empty()\n .html(data.shortDescription);\n } else {\n $productContainer.find('.description-and-detail .description')\n .addClass('hidden-xl-down');\n }\n\n if (data.longDescription) {\n $productContainer.find('.description-and-detail .details')\n .removeClass('hidden-xl-down');\n $productContainer.find('.description-and-detail .details .content')\n .empty()\n .html(data.longDescription);\n } else {\n $productContainer.find('.description-and-detail .details')\n .addClass('hidden-xl-down');\n }\n\n /**\n * Product In-Store Pickup\n */\n var $inStorePickupContainer = $('.product-detail .product-instore__inventory');\n\n if ($inStorePickupContainer.length > 0) {\n if (data.availableForInStorePickup) {\n $inStorePickupContainer.removeClass('d-none');\n } else {\n $inStorePickupContainer.addClass('d-none');\n }\n }\n\n /**\n * Klarna Placements\n */\n refreshKlarnaPlacements();\n });\n}\n\n/**\n * Show the Spinner\n */\nfunction showSpinner() {\n if (window.resources.enableServerSideGallery) {\n $('body').on('product:beforeAddToCart', function () {\n $.spinner().start();\n });\n } else {\n $('body').on('product:beforeAddToCart product:beforeAttributeSelect', function () {\n $.spinner().start();\n });\n }\n}\n\n/**\n * Update Product Attributes\n */\nfunction updateAttribute() {\n $('body').on('product:afterAttributeSelect', function (e, response) {\n if ($('.product-detail>.bundle-items').length) {\n $(response.container).data('pid', response.data.product.id);\n $(response.container).find('.product-id')\n .data('pid', response.data.product.id)\n .text(response.data.product.masterId);\n } else if ($('.product-set-detail').eq(0)) {\n $(response.container).data('pid', response.data.product.id);\n $(response.container).find('.product-id')\n .data('pid', response.data.product.id)\n .text(response.data.product.masterId);\n } else {\n $('.product-id').data('pid', response.data.product.id)\n .text(response.data.product.masterId);\n $('.product-detail:not(\".bundle-item\")').data('pid', response.data.product.id);\n }\n });\n}\n\n/**\n * Update the Add To Cart Button\n */\nfunction updateAddToCart() {\n $('body').on('product:updateAddToCart', function (e, response) {\n // update local add to cart (for sets)\n if (response.product.readyToOrder && !response.product.available) {\n $('.js-product__message--partners').show();\n }\n\n if (base.isEverythingSelected()) {\n $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').attr('disabled', false);\n }\n\n // Upon initial load, products are not ready for order because a size isn't selected (unless O/S or only one size in stock).\n // At that time, the button to add to cart should be enabled until the customer clicks it.\n // After that, the button should disabled and the customer should follow displayed messaging regarding making a selection.\n const disableAddToCart = !response.product.available || (!response.product.readyToOrder && !initialPageLoad);\n $('button.add-to-cart, button.update-cart-product-global', response.$productContainer)\n .attr('disabled', disableAddToCart)\n .text(response.product.buttonText);\n\n if (disableAddToCart) {\n initialPageLoad = false;\n }\n\n let enable = $('.product-availability').toArray().every(function (item) {\n return $(item).data('available') && $(item).data('ready-to-order');\n });\n\n if (enable) {\n $('.js-product__message--partners').hide();\n }\n });\n}\n\n/**\n * Update Product Availability\n */\nfunction updateAvailability() {\n $('body').on('product:updateAvailability', function (e, response) {\n $('div.availability', response.$productContainer)\n .data('ready-to-order', response.product.readyToOrder)\n .data('available', response.product.available);\n\n // Might need to preface with div.availability\n const $availabilityMsgContainer = $('.availability-msg', response.$productContainer).toggleClass('d-none', !response.message);\n\n if (response.availabilityMessages && response.availabilityMessages.length) {\n response.availabilityMessages.forEach(message => {\n $availabilityMsgContainer.alert({\n content: message.content,\n theme: message.theme,\n dismissible: false,\n autoClose: false\n });\n });\n }\n\n $('.product__message--velocity', response.$productContainer)\n .empty()\n .html(response.velocityMessage);\n\n $('.selectswatch-' + response.selectedAttributeID + '-msg', response.$productContainer).removeClass('d-inline').addClass('d-none');\n\n $('.outofstock-combination-msg', response.$productContainer);\n\n if (response.product.notifyme && !response.product.isMaster) {\n $('.product__add-to-cart', response.$productContainer).hide();\n $('.product__notify-me', response.$productContainer).show();\n $('.product__message--velocity', response.$productContainer).addClass('product__message--velocity--notifyme').show();\n $('.outofstock-combination-msg', response.$productContainer).show();\n $('input[name=variantPID]', response.$productContainer).val(response.product.id);\n } else {\n $('.product__add-to-cart', response.$productContainer).show();\n $('.product__notify-me', response.$productContainer).hide();\n $('input[name=variantPID]', response.$productContainer).val('');\n\n // Display inventory threshold message\n if (response.velocityMessage !== '') {\n $('.product__message--velocity', response.$productContainer).removeClass('product__message--velocity--notifyme').show();\n }\n }\n\n if ($('.global-availability').length) {\n // This is used for a Product Bundles and Product Sets. Checks all the\n // sub-products for Available and Ready. If all selected variants are\n // selected, then update the global-availability data.\n var allAvailable = $('.product-availability').toArray()\n .every(function (item) { return $(item).data('available'); });\n\n var allReady = $('.product-availability').toArray()\n .every(function (item) { return $(item).data('ready-to-order'); });\n\n $('.global-availability')\n .data('ready-to-order', allReady)\n .data('available', allAvailable);\n\n $('.global-availability .availability-msg').empty(); // response.resources.info_selectforstock\n\n if (response.availabilityMessages && response.availabilityMessages.length) {\n response.availabilityMessages.forEach(message => {\n $availabilityMsgContainer.alert({\n content: message.content,\n theme: message.theme,\n dismissible: false,\n autoClose: false\n });\n });\n }\n }\n $('.accordion').trigger('collapse-changed'); // Refresh hc-sticky to avoid ovelaping content\n $('body').trigger('product:checkOutOfStock', response);\n });\n}\n\n/**\n * Scroll the viewport to the a given accordion section\n *\n * @param {string} sectionSelector - Accordian Section to scroll to\n * @param {JQuery} $productDetailsContainer - Reference to product detail container\n */\nfunction scrollToAccordionSection(sectionSelector, $productDetailsContainer) {\n var $productAccordianDrawer = $productDetailsContainer.find(sectionSelector);\n\n if ($productAccordianDrawer.length) {\n $productAccordianDrawer.collapse('show');\n\n var headerHeight = $('.js-site-header').height();\n\n $('html, body').animate({\n scrollTop: $productAccordianDrawer.closest('.accordion__section').offset().top - headerHeight - 10\n }, 300);\n }\n}\n\n/**\n * Initialize the Image Gallery\n */\nfunction initGallery() {\n const swiperImageGallery = new ImageGallery();\n swiperImageGallery.init();\n}\n\n/**\n * Hide Size Fit Modal\n */\nvar hideSizeFitModal = () => {\n $('.sizefit-modal').remove(); // this class is added to the modal when it is created, in createQVModal().\n // also remove the backdrop\n $('.modal-backdrop').remove();\n $('body').removeClass('modal-open').css('padding-right', '');\n $.enableScroll();\n $(window).trigger('scroll');\n};\n\n/**\n * Create Modal for SizeFIt Guide\n * @returns {HTMLElement} $modal - Reference to modal JQuery object\n */\nvar createSizeFitModal = () => {\n var isMobile = breakpoints.isLowRes();\n var modalConfig = {\n customClasses: 'sizefit-modal'\n };\n if (isMobile) {\n modalConfig.centeredClass = 'modal-dialog-scrollable banner-size-fit';\n }\n let modalMarkup = utils.createModalMarkup('', modalConfig);\n let $modal = $(modalMarkup).modal();\n $modal.on('hidden.bs.modal', () => {\n hideSizeFitModal();\n });\n return $modal;\n};\n\n/**\n * Fetches sizefitguide html from server and launches modal\n * @param {string} sizeGuideUrl - SizeFit Guide view controller endpoint url\n * @param {HTMLElement} $modal - Reference to modal JQuery object\n */\nvar launchSizeGuide = (sizeGuideUrl, $modal) => {\n if (!sizeGuideUrl) {\n return;\n }\n\n if (!$modal) {\n $modal = createSizeFitModal(); // eslint-disable-line no-param-reassign\n }\n\n $modal.modal('show');\n $.spinner().start();\n\n let successHandler = (html, unitType) => {\n $modal.find('.modal-body').html(html);\n tabbedContainer.init();\n overflowSlider();\n if (window.ssp) {\n window.ssp('start', 'fitpredictor');\n }\n if (sizeGuideUrl.indexOf('GarmentGuide') > -1) {\n var sizefitSwitch = $modal.find('.js-garment-sizefit');\n var toggleHTML = `
      \n
      \n \n
      \n
      `;\n sizefitSwitch.html(toggleHTML);\n }\n sizefitJs.initSizeFit();\n };\n\n $.ajax({\n url: sizeGuideUrl,\n method: 'GET',\n dataType: 'json',\n success: (data) => {\n if (!$modal[0].parentElement) {\n // success was called before the modal is shown.\n $modal.on('shown.bs.modal', () => {\n successHandler(data.renderedTemplate, data.unitType);\n });\n } else {\n successHandler(data.renderedTemplate, data.unitType);\n }\n },\n complete: () => {\n $.spinner().stop();\n $.disableScroll();\n },\n error: () => {\n hideSizeFitModal();\n }\n });\n};\n\n/**\n * Sets Out of Stock status text based on the selectable/unselectable state of the attribute\n * @param {jQuery} $swatchEntered - targeted swatch on click/hover\n * @param {string} selectedValue - selected text value\n * @param {jQuery} $attributeLabelValue - selected text element\n * @param {jQuery} $auxSwatch optional parameter that indicates an auxiliary swatch should be updated\n */\nfunction setSelectedInventoryStatus($swatchEntered, selectedValue, $attributeLabelValue, $auxSwatch) {\n const outOfStockText = $swatchEntered.closest('[data-attr-oos-text]').data('attr-oos-text');\n\n if (selectedValue !== undefined) {\n if ($swatchEntered.hasClass('unselectable')) {\n $attributeLabelValue.text(selectedValue + ' ' + outOfStockText).addClass('text-danger');\n if ($auxSwatch) {\n $auxSwatch.attr('data-attr-oos', outOfStockText);\n } else {\n $swatchEntered.attr('data-attr-oos', outOfStockText);\n }\n } else {\n $attributeLabelValue.text(selectedValue).removeClass('text-danger');\n if ($auxSwatch) {\n $auxSwatch.attr('data-attr-oos', '');\n } else {\n $swatchEntered.attr('data-attr-oos', '');\n }\n }\n }\n}\n\n/**\n * Custom events on Attribute click and hover\n */\nfunction onSelectAttribute() {\n // Color Attribute click event to display selected/selectable status\n $('.js-product-content').on('attribute:click', '.js-color-swatch, .js-size-swatch, .js-dimension-swatch', function (e) {\n const $swatchClicked = $(e.currentTarget);\n const attrType = $swatchClicked.closest('.js-attribute').data('attr');\n const $attrValue = $swatchClicked.closest('.js-attribute').find('.js-attr-label-value');\n let selectedValue;\n\n if (attrType === 'color') {\n selectedValue = $swatchClicked.find('.color-value').attr('title');\n } else {\n const $selectedColorSwatch = $('.js-attribute-color .js-color-swatch.selected');\n const $colorValue = $selectedColorSwatch.closest('.js-attribute').find('.js-attr-label-value');\n const colorSelected = $selectedColorSwatch.find('.color-value').attr('title');\n selectedValue = $swatchClicked.data('attr-hover');\n\n // Color label may also need to be updated to reflect inventory status when a size/dimension swatchis selected\n setSelectedInventoryStatus($swatchClicked, colorSelected, $colorValue, $selectedColorSwatch);\n }\n\n setSelectedInventoryStatus($swatchClicked, selectedValue, $attrValue);\n });\n\n // Attribute Select event to get the new attribute selected/selectable status for Size/Dimension attributes\n $(document).on('attribute:select', '.product-detail .js-size-swatch, .product-detail .js-dimension-swatch', function (e, $attrValue, attrValue) {\n const outOfStockText = $attrValue.closest('[data-attr-oos-text]').data('attr-oos-text');\n const attributeLabelValue = $attrValue.closest('.js-attribute').find('.js-attr-label-value');\n attributeLabelValue.text($attrValue.data('attr-hover'));\n if (!attrValue.selectable) {\n attributeLabelValue.addClass('text-danger').text($attrValue.data('attr-hover') + ' ' + outOfStockText);\n $attrValue.attr('data-attr-oos', outOfStockText);\n } else {\n attributeLabelValue.removeClass('text-danger').text($attrValue.data('attr-hover'));\n $attrValue.attr('data-attr-oos', '');\n }\n });\n}\n\n/**\n * Poll to see when the write a review button loads in the ratings and reviews accordion section.\n * - activate by setting url param: bvOpenWriteReview=true\n */\nfunction onWriteReviewButtonPoll() {\n var pollCallback = function () {\n var queryString = utils.getParamsFromURL(window.location.search);\n\n if (queryString && queryString.bvOpenWriteReview && queryString.bvOpenWriteReview === 'true') {\n if (pollCountMax > 0) {\n pollCountMax -= 1;\n var $button = $('.bv-write-review.bv-submission-button:button');\n if ($button.length === 1) {\n $button.click();\n } else {\n setTimeout(pollCallback, pollWriteAReviewButtonInterval);\n }\n }\n }\n };\n\n setTimeout(pollCallback, pollWriteAReviewButtonInterval);\n}\n\n/**\n * Method to observe review drawer and check if any comments are added\n */\nfunction observeReviewDrawer() {\n const $targetNode = $('.js-review-drawer')[0];\n const config = { attributes: true, childList: true, subtree: true };\n const observer = new MutationObserver(function (mutationsList) {\n for (const mutation of mutationsList) {\n if (mutation.type === 'childList') {\n if ($('.js-review-drawer').find('ol li').length >= 1) {\n var $bvReviewRatings = $('.js-true-to-size');\n if ($bvReviewRatings.length) {\n $bvReviewRatings.removeClass('d-none');\n observer.disconnect();\n }\n }\n }\n }\n });\n // Start observing the target node for configured mutations\n if ($targetNode) {\n observer.observe($targetNode, config);\n }\n}\n\n/**\n * Ensure proper formatting of global process variable\n */\nfunction enforceGlobalProcessFormatting() {\n let internalProcessValue;\n let processCopy = window.process; // get initial process value if it exists\n\n /**\n * Checks if param is an object\n * @param {*} param to check type of\n * @returns {boolean} if param is an object\n */\n function isObject(param) {\n return typeof param === 'object' && param !== null && !Array.isArray(param);\n }\n\n Object.defineProperty(window, 'process', {\n get: function () {\n if (typeof internalProcessValue === 'undefined') { // if value not previously set\n const processValue = isObject(processCopy) ? processCopy : {}; // process must be an object\n processValue.env = isObject(processValue.env) ? processValue.env : {}; // process.env must be an object\n\n internalProcessValue = processValue;\n }\n\n return internalProcessValue;\n },\n set: function (param) {\n processCopy = isObject(processCopy) ? processCopy : {}; // process must be an object\n const processParam = isObject(param) ? param : {}; // process must be an object\n const processValue = Object.assign({}, processCopy, processParam); // combine existing and new process properties\n processValue.env = isObject(processValue.env) ? processValue.env : {}; // process.env must be an object\n\n processCopy = processValue; // update copied process value\n internalProcessValue = processValue;\n }\n });\n}\n\n/**\n * PLEASE NOTE\n * THE FOLLOWING METHODS HAVE BEEN INCLUDED GLOBALLY IN product/pdpActions.js FOR QUICKVIEW,\n * SO NO NEED TO INCLUDE THEM HERE\n *\n * selectAttribute: base.selectAttribute,\n * availabilty: base.avaliability,\n * addToCart: base.addToCart,\n **/\n\nmodule.exports = {\n /**\n * This is necessary for page load if the product variant is already selected.\n *\n * Edit productDetails.isml to add the master ID\n *\n *\n * Check Quick View\n *\n *\n * Also check to make sure everything is selected\n *\n * Check Gift Card\n *\n * * Check to see if the data-pid is the same as the master id, if it is do the following:\n *\n * may only need to call attributeSelect once, pick the first and then fire\n *\n */\n init: function () {\n const $productContainer = $('.product-detail');\n const $dimensionSwatchSelected = $('.product__attributes .js-dimension-swatch.selected.selectable');\n const $sizeSwatchSelected = $('.product__attributes .js-size-swatch.selected');\n const $selectedColorSwatch = $('.js-attribute-color .js-color-swatch.selected');\n const $colorValue = $selectedColorSwatch.closest('.js-attribute').find('.js-attr-label-value');\n const colorSelected = $selectedColorSwatch.find('.color-value').attr('title');\n const queryScOnLoad = utils.getParamsFromURL(window.location.search);\n\n observeReviewDrawer();\n\n if (queryScOnLoad && queryScOnLoad.scOnLoad && queryScOnLoad.scOnLoad.toUpperCase() === 'Y') {\n launchSizeGuide($('.js-sizeguide-modal').attr('data-link'), '');\n }\n\n if ($productContainer.data('pid') === $productContainer.data('master-pid')) {\n if (base.isEverythingSelected()) {\n const $swatchSelected = $('.product__attributes a.selected').first();\n const selectedAttributeID = $swatchSelected.closest('.js-attribute').data('attr');\n\n base.attributeSelect($swatchSelected.data('attr-url'), $productContainer, selectedAttributeID);\n } else if ($dimensionSwatchSelected.length && !$sizeSwatchSelected.length) {\n base.attributeSelect($dimensionSwatchSelected.data('attr-url'), $productContainer, 'dimension');\n }\n }\n\n // Refresh Product-Variation data based on initial selection\n if ($productContainer.data('availability-refresh')) {\n var customValueUrl = $('.js-color-swatch.selected').data('attr-url');\n base.attributeSelect(customValueUrl, $productContainer, 'inventory');\n }\n\n base.updateOOSColorVariants($productContainer);\n setSelectedInventoryStatus($sizeSwatchSelected, colorSelected, $colorValue, $selectedColorSwatch);\n refreshKlarnaPlacements();\n\n // Flag swatches to indicate notify me status (see base.forceOOSNotifyMe)\n base.setVariantNotifyMeStatus();\n },\n initProcess: enforceGlobalProcessFormatting,\n stickyAddToCart: stickyAddToCart,\n updateAttributesAndDetails: updateAttributesAndDetails,\n showSpinner: showSpinner,\n updateAttribute: updateAttribute,\n updateAddToCart: updateAddToCart,\n updateAvailability: updateAvailability,\n onScrollToDetails: () => {\n $(document).on('click', '.js-view-details-jumplink', function (e) {\n e.preventDefault();\n var $productDetailsContainer = $(this).closest('.product-detail');\n scrollToAccordionSection('#product-accordion-details', $productDetailsContainer);\n });\n },\n initGallery: function () {\n initGallery();\n\n $(document).on('product:swiper:update', function () {\n initGallery();\n });\n },\n initLoyalty: loyalty.init,\n onClickReviewStars: function () {\n $(window).on('load', function () {\n $(document).on('click', '.product-detail .ratings, .js-accordion-reviews, .true-to-size, .bv_modal_component_container .bv_button_buttonFull', function (e) {\n e.preventDefault();\n var $productDetailsContainer = $(this).closest('.product-detail');\n if (!$productDetailsContainer.length) {\n $productDetailsContainer = $('.product-detail');\n }\n scrollToAccordionSection('#product-accordion-reviews', $productDetailsContainer);\n });\n // Reviews Drawer should be open on page load while clicking review rating from product list page.\n var queryParamProductReviews = utils.getParamsFromURL(window.location.search);\n if (queryParamProductReviews && queryParamProductReviews.bvOpen && queryParamProductReviews.bvOpen.toUpperCase() === 'TRUE') {\n scrollToAccordionSection('#product-accordion-reviews', $('.product-detail'));\n }\n });\n },\n launchOmnibusReviewModal: function () {\n $('body')\n .off('click', '.js-omnibus-review-msg')\n .on('click', '.js-omnibus-review-msg', (e) => {\n e.preventDefault();\n const $this = $(e.currentTarget);\n const modalTitle = $this.data('message-title');\n const modalContent = $this.data('message-content');\n $.modal({\n title: modalTitle,\n content: modalContent,\n modalSizeClass: 'modal-md modal-pad-fix'\n });\n });\n },\n launchSizeGuideModal: function () {\n $('body')\n .off('click', '.js-sizeguide-modal')\n .on('click', '.js-sizeguide-modal', (e) => {\n e.preventDefault();\n let $this = $(e.currentTarget);\n let $modal = createSizeFitModal();\n launchSizeGuide($this.data('link'), $modal);\n });\n },\n onSelectAttribute: onSelectAttribute,\n onWriteReviewButtonPoll: onWriteReviewButtonPoll,\n forceOOSNotifyMe: base.forceOOSNotifyMe\n};\n","'use strict';\n\nvar processInclude = require('./components/processInclude');\nvar jqueryDatepicker = require('jquery-datepicker');\njqueryDatepicker($);\n\n$(document).ready(function () {\n processInclude(require('./product/detail'));\n processInclude(require('./giftcard/checkBalance'));\n processInclude(require('./giftcard/details'));\n processInclude(require('./giftcard/giftCardCheckout'));\n});\n","(function (global, factory) {\n\tif (typeof define === \"function\" && define.amd) {\n\t\tdefine([\"module\", \"exports\"], factory);\n\t} else if (typeof exports !== \"undefined\") {\n\t\tfactory(module, exports);\n\t} else {\n\t\tvar mod = {\n\t\t\texports: {}\n\t\t};\n\t\tfactory(mod, mod.exports);\n\t\tglobal.jqueryDatepicker = mod.exports;\n\t}\n})(this, function (module, exports) {\n\t\"use strict\";\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t\tvalue: true\n\t});\n\n\texports.default = function ($) {\n\n\t\t$.extend($.ui, { datepicker: { version: \"1.12.1\" } });\n\n\t\tvar datepicker_instActive;\n\n\t\tfunction datepicker_getZindex(elem) {\n\t\t\tvar position, value;\n\t\t\twhile (elem.length && elem[0] !== document) {\n\n\t\t\t\t// Ignore z-index if position is set to a value where z-index is ignored by the browser\n\t\t\t\t// This makes behavior of this function consistent across browsers\n\t\t\t\t// WebKit always returns auto if the element is positioned\n\t\t\t\tposition = elem.css(\"position\");\n\t\t\t\tif (position === \"absolute\" || position === \"relative\" || position === \"fixed\") {\n\n\t\t\t\t\t// IE returns 0 when zIndex is not specified\n\t\t\t\t\t// other browsers return a string\n\t\t\t\t\t// we ignore the case of nested elements with an explicit value of 0\n\t\t\t\t\t//
      \n\t\t\t\t\tvalue = parseInt(elem.css(\"zIndex\"), 10);\n\t\t\t\t\tif (!isNaN(value) && value !== 0) {\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telem = elem.parent();\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\t\t/* Date picker manager.\n Use the singleton instance of this class, $.datepicker, to interact with the date picker.\n Settings for (groups of) date pickers are maintained in an instance object,\n allowing multiple different settings on the same page. */\n\n\t\tfunction Datepicker() {\n\t\t\tthis._curInst = null; // The current instance in use\n\t\t\tthis._keyEvent = false; // If the last event was a key event\n\t\t\tthis._disabledInputs = []; // List of date picker inputs that have been disabled\n\t\t\tthis._datepickerShowing = false; // True if the popup picker is showing , false if not\n\t\t\tthis._inDialog = false; // True if showing within a \"dialog\", false if not\n\t\t\tthis._mainDivId = \"ui-datepicker-div\"; // The ID of the main datepicker division\n\t\t\tthis._inlineClass = \"ui-datepicker-inline\"; // The name of the inline marker class\n\t\t\tthis._appendClass = \"ui-datepicker-append\"; // The name of the append marker class\n\t\t\tthis._triggerClass = \"ui-datepicker-trigger\"; // The name of the trigger marker class\n\t\t\tthis._dialogClass = \"ui-datepicker-dialog\"; // The name of the dialog marker class\n\t\t\tthis._disableClass = \"ui-datepicker-disabled\"; // The name of the disabled covering marker class\n\t\t\tthis._unselectableClass = \"ui-datepicker-unselectable\"; // The name of the unselectable cell marker class\n\t\t\tthis._currentClass = \"ui-datepicker-current-day\"; // The name of the current day marker class\n\t\t\tthis._dayOverClass = \"ui-datepicker-days-cell-over\"; // The name of the day hover marker class\n\t\t\tthis.regional = []; // Available regional settings, indexed by language code\n\t\t\tthis.regional[\"\"] = { // Default regional settings\n\t\t\t\tcloseText: \"Done\", // Display text for close link\n\t\t\t\tprevText: \"Prev\", // Display text for previous month link\n\t\t\t\tnextText: \"Next\", // Display text for next month link\n\t\t\t\tcurrentText: \"Today\", // Display text for current month link\n\t\t\t\tmonthNames: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"], // Names of months for drop-down and formatting\n\t\t\t\tmonthNamesShort: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"], // For formatting\n\t\t\t\tdayNames: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"], // For formatting\n\t\t\t\tdayNamesShort: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"], // For formatting\n\t\t\t\tdayNamesMin: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"], // Column headings for days starting at Sunday\n\t\t\t\tweekHeader: \"Wk\", // Column header for week of the year\n\t\t\t\tdateFormat: \"mm/dd/yy\", // See format options on parseDate\n\t\t\t\tfirstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...\n\t\t\t\tisRTL: false, // True if right-to-left language, false if left-to-right\n\t\t\t\tshowMonthAfterYear: false, // True if the year select precedes month, false for month then year\n\t\t\t\tyearSuffix: \"\" // Additional text to append to the year in the month headers\n\t\t\t};\n\t\t\tthis._defaults = { // Global defaults for all the date picker instances\n\t\t\t\tshowOn: \"focus\", // \"focus\" for popup on focus,\n\t\t\t\t// \"button\" for trigger button, or \"both\" for either\n\t\t\t\tshowAnim: \"fadeIn\", // Name of jQuery animation for popup\n\t\t\t\tshowOptions: {}, // Options for enhanced animations\n\t\t\t\tdefaultDate: null, // Used when field is blank: actual date,\n\t\t\t\t// +/-number for offset from today, null for today\n\t\t\t\tappendText: \"\", // Display text following the input box, e.g. showing the format\n\t\t\t\tbuttonText: \"...\", // Text for trigger button\n\t\t\t\tbuttonImage: \"\", // URL for trigger button image\n\t\t\t\tbuttonImageOnly: false, // True if the image appears alone, false if it appears on a button\n\t\t\t\thideIfNoPrevNext: false, // True to hide next/previous month links\n\t\t\t\t// if not applicable, false to just disable them\n\t\t\t\tnavigationAsDateFormat: false, // True if date formatting applied to prev/today/next links\n\t\t\t\tgotoCurrent: false, // True if today link goes back to current selection instead\n\t\t\t\tchangeMonth: false, // True if month can be selected directly, false if only prev/next\n\t\t\t\tchangeYear: false, // True if year can be selected directly, false if only prev/next\n\t\t\t\tyearRange: \"c-10:c+10\", // Range of years to display in drop-down,\n\t\t\t\t// either relative to today's year (-nn:+nn), relative to currently displayed year\n\t\t\t\t// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)\n\t\t\t\tshowOtherMonths: false, // True to show dates in other months, false to leave blank\n\t\t\t\tselectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable\n\t\t\t\tshowWeek: false, // True to show week of the year, false to not show it\n\t\t\t\tcalculateWeek: this.iso8601Week, // How to calculate the week of the year,\n\t\t\t\t// takes a Date and returns the number of the week for it\n\t\t\t\tshortYearCutoff: \"+10\", // Short year values < this are in the current century,\n\t\t\t\t// > this are in the previous century,\n\t\t\t\t// string value starting with \"+\" for current year + value\n\t\t\t\tminDate: null, // The earliest selectable date, or null for no limit\n\t\t\t\tmaxDate: null, // The latest selectable date, or null for no limit\n\t\t\t\tduration: \"fast\", // Duration of display/closure\n\t\t\t\tbeforeShowDay: null, // Function that takes a date and returns an array with\n\t\t\t\t// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or \"\",\n\t\t\t\t// [2] = cell title (optional), e.g. $.datepicker.noWeekends\n\t\t\t\tbeforeShow: null, // Function that takes an input field and\n\t\t\t\t// returns a set of custom settings for the date picker\n\t\t\t\tonSelect: null, // Define a callback function when a date is selected\n\t\t\t\tonChangeMonthYear: null, // Define a callback function when the month or year is changed\n\t\t\t\tonClose: null, // Define a callback function when the datepicker is closed\n\t\t\t\tnumberOfMonths: 1, // Number of months to show at a time\n\t\t\t\tshowCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)\n\t\t\t\tstepMonths: 1, // Number of months to step back/forward\n\t\t\t\tstepBigMonths: 12, // Number of months to step back/forward for the big links\n\t\t\t\taltField: \"\", // Selector for an alternate field to store selected dates into\n\t\t\t\taltFormat: \"\", // The date format to use for the alternate field\n\t\t\t\tconstrainInput: true, // The input is constrained by the current date format\n\t\t\t\tshowButtonPanel: false, // True to show button panel, false to not show it\n\t\t\t\tautoSize: false, // True to size the input for the date format, false to leave as is\n\t\t\t\tdisabled: false // The initial disabled state\n\t\t\t};\n\t\t\t$.extend(this._defaults, this.regional[\"\"]);\n\t\t\tthis.regional.en = $.extend(true, {}, this.regional[\"\"]);\n\t\t\tthis.regional[\"en-US\"] = $.extend(true, {}, this.regional.en);\n\t\t\tthis.dpDiv = datepicker_bindHover($(\"
      \"));\n\t\t}\n\n\t\t$.extend(Datepicker.prototype, {\n\t\t\t/* Class name added to elements to indicate already configured with a date picker. */\n\t\t\tmarkerClassName: \"hasDatepicker\",\n\n\t\t\t//Keep track of the maximum number of rows displayed (see #7043)\n\t\t\tmaxRows: 4,\n\n\t\t\t// TODO rename to \"widget\" when switching to widget factory\n\t\t\t_widgetDatepicker: function () {\n\t\t\t\treturn this.dpDiv;\n\t\t\t},\n\n\t\t\t/* Override the default settings for all instances of the date picker.\n * @param settings object - the new settings to use as defaults (anonymous object)\n * @return the manager object\n */\n\t\t\tsetDefaults: function (settings) {\n\t\t\t\tdatepicker_extendRemove(this._defaults, settings || {});\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t/* Attach the date picker to a jQuery selection.\n * @param target\telement - the target input field or division or span\n * @param settings object - the new settings to use for this date picker instance (anonymous)\n */\n\t\t\t_attachDatepicker: function (target, settings) {\n\t\t\t\tvar nodeName, inline, inst;\n\t\t\t\tnodeName = target.nodeName.toLowerCase();\n\t\t\t\tinline = nodeName === \"div\" || nodeName === \"span\";\n\t\t\t\tif (!target.id) {\n\t\t\t\t\tthis.uuid += 1;\n\t\t\t\t\ttarget.id = \"dp\" + this.uuid;\n\t\t\t\t}\n\t\t\t\tinst = this._newInst($(target), inline);\n\t\t\t\tinst.settings = $.extend({}, settings || {});\n\t\t\t\tif (nodeName === \"input\") {\n\t\t\t\t\tthis._connectDatepicker(target, inst);\n\t\t\t\t} else if (inline) {\n\t\t\t\t\tthis._inlineDatepicker(target, inst);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/* Create a new instance object. */\n\t\t\t_newInst: function (target, inline) {\n\t\t\t\tvar id = target[0].id.replace(/([^A-Za-z0-9_\\-])/g, \"\\\\\\\\$1\"); // escape jQuery meta chars\n\t\t\t\treturn { id: id, input: target, // associated target\n\t\t\t\t\tselectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection\n\t\t\t\t\tdrawMonth: 0, drawYear: 0, // month being drawn\n\t\t\t\t\tinline: inline, // is datepicker inline or not\n\t\t\t\t\tdpDiv: !inline ? this.dpDiv : // presentation div\n\t\t\t\t\tdatepicker_bindHover($(\"
      \")) };\n\t\t\t},\n\n\t\t\t/* Attach the date picker to an input field. */\n\t\t\t_connectDatepicker: function (target, inst) {\n\t\t\t\tvar input = $(target);\n\t\t\t\tinst.append = $([]);\n\t\t\t\tinst.trigger = $([]);\n\t\t\t\tif (input.hasClass(this.markerClassName)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis._attachments(input, inst);\n\t\t\t\tinput.addClass(this.markerClassName).on(\"keydown\", this._doKeyDown).on(\"keypress\", this._doKeyPress).on(\"keyup\", this._doKeyUp);\n\t\t\t\tthis._autoSize(inst);\n\t\t\t\t$.data(target, \"datepicker\", inst);\n\n\t\t\t\t//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)\n\t\t\t\tif (inst.settings.disabled) {\n\t\t\t\t\tthis._disableDatepicker(target);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/* Make attachments based on settings. */\n\t\t\t_attachments: function (input, inst) {\n\t\t\t\tvar showOn,\n\t\t\t\t buttonText,\n\t\t\t\t buttonImage,\n\t\t\t\t appendText = this._get(inst, \"appendText\"),\n\t\t\t\t isRTL = this._get(inst, \"isRTL\");\n\n\t\t\t\tif (inst.append) {\n\t\t\t\t\tinst.append.remove();\n\t\t\t\t}\n\t\t\t\tif (appendText) {\n\t\t\t\t\tinst.append = $(\"\" + appendText + \"\");\n\t\t\t\t\tinput[isRTL ? \"before\" : \"after\"](inst.append);\n\t\t\t\t}\n\n\t\t\t\tinput.off(\"focus\", this._showDatepicker);\n\n\t\t\t\tif (inst.trigger) {\n\t\t\t\t\tinst.trigger.remove();\n\t\t\t\t}\n\n\t\t\t\tshowOn = this._get(inst, \"showOn\");\n\t\t\t\tif (showOn === \"focus\" || showOn === \"both\") {\n\t\t\t\t\t// pop-up date picker when in the marked field\n\t\t\t\t\tinput.on(\"focus\", this._showDatepicker);\n\t\t\t\t}\n\t\t\t\tif (showOn === \"button\" || showOn === \"both\") {\n\t\t\t\t\t// pop-up date picker when button clicked\n\t\t\t\t\tbuttonText = this._get(inst, \"buttonText\");\n\t\t\t\t\tbuttonImage = this._get(inst, \"buttonImage\");\n\t\t\t\t\tinst.trigger = $(this._get(inst, \"buttonImageOnly\") ? $(\"\").addClass(this._triggerClass).attr({ src: buttonImage, alt: buttonText, title: buttonText }) : $(\"\").addClass(this._triggerClass).html(!buttonImage ? buttonText : $(\"\").attr({ src: buttonImage, alt: buttonText, title: buttonText })));\n\t\t\t\t\tinput[isRTL ? \"before\" : \"after\"](inst.trigger);\n\t\t\t\t\tinst.trigger.on(\"click\", function () {\n\t\t\t\t\t\tif ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) {\n\t\t\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t\t\t} else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) {\n\t\t\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t\t\t\t$.datepicker._showDatepicker(input[0]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$.datepicker._showDatepicker(input[0]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/* Apply the maximum length for the date format. */\n\t\t\t_autoSize: function (inst) {\n\t\t\t\tif (this._get(inst, \"autoSize\") && !inst.inline) {\n\t\t\t\t\tvar findMax,\n\t\t\t\t\t max,\n\t\t\t\t\t maxI,\n\t\t\t\t\t i,\n\t\t\t\t\t date = new Date(2009, 12 - 1, 20),\n\t\t\t\t\t // Ensure double digits\n\t\t\t\t\tdateFormat = this._get(inst, \"dateFormat\");\n\n\t\t\t\t\tif (dateFormat.match(/[DM]/)) {\n\t\t\t\t\t\tfindMax = function (names) {\n\t\t\t\t\t\t\tmax = 0;\n\t\t\t\t\t\t\tmaxI = 0;\n\t\t\t\t\t\t\tfor (i = 0; i < names.length; i++) {\n\t\t\t\t\t\t\t\tif (names[i].length > max) {\n\t\t\t\t\t\t\t\t\tmax = names[i].length;\n\t\t\t\t\t\t\t\t\tmaxI = i;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn maxI;\n\t\t\t\t\t\t};\n\t\t\t\t\t\tdate.setMonth(findMax(this._get(inst, dateFormat.match(/MM/) ? \"monthNames\" : \"monthNamesShort\")));\n\t\t\t\t\t\tdate.setDate(findMax(this._get(inst, dateFormat.match(/DD/) ? \"dayNames\" : \"dayNamesShort\")) + 20 - date.getDay());\n\t\t\t\t\t}\n\t\t\t\t\tinst.input.attr(\"size\", this._formatDate(inst, date).length);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/* Attach an inline date picker to a div. */\n\t\t\t_inlineDatepicker: function (target, inst) {\n\t\t\t\tvar divSpan = $(target);\n\t\t\t\tif (divSpan.hasClass(this.markerClassName)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tdivSpan.addClass(this.markerClassName).append(inst.dpDiv);\n\t\t\t\t$.data(target, \"datepicker\", inst);\n\t\t\t\tthis._setDate(inst, this._getDefaultDate(inst), true);\n\t\t\t\tthis._updateDatepicker(inst);\n\t\t\t\tthis._updateAlternate(inst);\n\n\t\t\t\t//If disabled option is true, disable the datepicker before showing it (see ticket #5665)\n\t\t\t\tif (inst.settings.disabled) {\n\t\t\t\t\tthis._disableDatepicker(target);\n\t\t\t\t}\n\n\t\t\t\t// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements\n\t\t\t\t// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height\n\t\t\t\tinst.dpDiv.css(\"display\", \"block\");\n\t\t\t},\n\n\t\t\t/* Pop-up the date picker in a \"dialog\" box.\n * @param input element - ignored\n * @param date\tstring or Date - the initial date to display\n * @param onSelect function - the function to call when a date is selected\n * @param settings object - update the dialog date picker instance's settings (anonymous object)\n * @param pos int[2] - coordinates for the dialog's position within the screen or\n *\t\t\t\t\tevent - with x/y coordinates or\n *\t\t\t\t\tleave empty for default (screen centre)\n * @return the manager object\n */\n\t\t\t_dialogDatepicker: function (input, date, onSelect, settings, pos) {\n\t\t\t\tvar id,\n\t\t\t\t browserWidth,\n\t\t\t\t browserHeight,\n\t\t\t\t scrollX,\n\t\t\t\t scrollY,\n\t\t\t\t inst = this._dialogInst; // internal instance\n\n\t\t\t\tif (!inst) {\n\t\t\t\t\tthis.uuid += 1;\n\t\t\t\t\tid = \"dp\" + this.uuid;\n\t\t\t\t\tthis._dialogInput = $(\"\");\n\t\t\t\t\tthis._dialogInput.on(\"keydown\", this._doKeyDown);\n\t\t\t\t\t$(\"body\").append(this._dialogInput);\n\t\t\t\t\tinst = this._dialogInst = this._newInst(this._dialogInput, false);\n\t\t\t\t\tinst.settings = {};\n\t\t\t\t\t$.data(this._dialogInput[0], \"datepicker\", inst);\n\t\t\t\t}\n\t\t\t\tdatepicker_extendRemove(inst.settings, settings || {});\n\t\t\t\tdate = date && date.constructor === Date ? this._formatDate(inst, date) : date;\n\t\t\t\tthis._dialogInput.val(date);\n\n\t\t\t\tthis._pos = pos ? pos.length ? pos : [pos.pageX, pos.pageY] : null;\n\t\t\t\tif (!this._pos) {\n\t\t\t\t\tbrowserWidth = document.documentElement.clientWidth;\n\t\t\t\t\tbrowserHeight = document.documentElement.clientHeight;\n\t\t\t\t\tscrollX = document.documentElement.scrollLeft || document.body.scrollLeft;\n\t\t\t\t\tscrollY = document.documentElement.scrollTop || document.body.scrollTop;\n\t\t\t\t\tthis._pos = // should use actual width/height below\n\t\t\t\t\t[browserWidth / 2 - 100 + scrollX, browserHeight / 2 - 150 + scrollY];\n\t\t\t\t}\n\n\t\t\t\t// Move input on screen for focus, but hidden behind dialog\n\t\t\t\tthis._dialogInput.css(\"left\", this._pos[0] + 20 + \"px\").css(\"top\", this._pos[1] + \"px\");\n\t\t\t\tinst.settings.onSelect = onSelect;\n\t\t\t\tthis._inDialog = true;\n\t\t\t\tthis.dpDiv.addClass(this._dialogClass);\n\t\t\t\tthis._showDatepicker(this._dialogInput[0]);\n\t\t\t\tif ($.blockUI) {\n\t\t\t\t\t$.blockUI(this.dpDiv);\n\t\t\t\t}\n\t\t\t\t$.data(this._dialogInput[0], \"datepicker\", inst);\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t/* Detach a datepicker from its control.\n * @param target\telement - the target input field or division or span\n */\n\t\t\t_destroyDatepicker: function (target) {\n\t\t\t\tvar nodeName,\n\t\t\t\t $target = $(target),\n\t\t\t\t inst = $.data(target, \"datepicker\");\n\n\t\t\t\tif (!$target.hasClass(this.markerClassName)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tnodeName = target.nodeName.toLowerCase();\n\t\t\t\t$.removeData(target, \"datepicker\");\n\t\t\t\tif (nodeName === \"input\") {\n\t\t\t\t\tinst.append.remove();\n\t\t\t\t\tinst.trigger.remove();\n\t\t\t\t\t$target.removeClass(this.markerClassName).off(\"focus\", this._showDatepicker).off(\"keydown\", this._doKeyDown).off(\"keypress\", this._doKeyPress).off(\"keyup\", this._doKeyUp);\n\t\t\t\t} else if (nodeName === \"div\" || nodeName === \"span\") {\n\t\t\t\t\t$target.removeClass(this.markerClassName).empty();\n\t\t\t\t}\n\n\t\t\t\tif (datepicker_instActive === inst) {\n\t\t\t\t\tdatepicker_instActive = null;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/* Enable the date picker to a jQuery selection.\n * @param target\telement - the target input field or division or span\n */\n\t\t\t_enableDatepicker: function (target) {\n\t\t\t\tvar nodeName,\n\t\t\t\t inline,\n\t\t\t\t $target = $(target),\n\t\t\t\t inst = $.data(target, \"datepicker\");\n\n\t\t\t\tif (!$target.hasClass(this.markerClassName)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tnodeName = target.nodeName.toLowerCase();\n\t\t\t\tif (nodeName === \"input\") {\n\t\t\t\t\ttarget.disabled = false;\n\t\t\t\t\tinst.trigger.filter(\"button\").each(function () {\n\t\t\t\t\t\tthis.disabled = false;\n\t\t\t\t\t}).end().filter(\"img\").css({ opacity: \"1.0\", cursor: \"\" });\n\t\t\t\t} else if (nodeName === \"div\" || nodeName === \"span\") {\n\t\t\t\t\tinline = $target.children(\".\" + this._inlineClass);\n\t\t\t\t\tinline.children().removeClass(\"ui-state-disabled\");\n\t\t\t\t\tinline.find(\"select.ui-datepicker-month, select.ui-datepicker-year\").prop(\"disabled\", false);\n\t\t\t\t}\n\t\t\t\tthis._disabledInputs = $.map(this._disabledInputs, function (value) {\n\t\t\t\t\treturn value === target ? null : value;\n\t\t\t\t}); // delete entry\n\t\t\t},\n\n\t\t\t/* Disable the date picker to a jQuery selection.\n * @param target\telement - the target input field or division or span\n */\n\t\t\t_disableDatepicker: function (target) {\n\t\t\t\tvar nodeName,\n\t\t\t\t inline,\n\t\t\t\t $target = $(target),\n\t\t\t\t inst = $.data(target, \"datepicker\");\n\n\t\t\t\tif (!$target.hasClass(this.markerClassName)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tnodeName = target.nodeName.toLowerCase();\n\t\t\t\tif (nodeName === \"input\") {\n\t\t\t\t\ttarget.disabled = true;\n\t\t\t\t\tinst.trigger.filter(\"button\").each(function () {\n\t\t\t\t\t\tthis.disabled = true;\n\t\t\t\t\t}).end().filter(\"img\").css({ opacity: \"0.5\", cursor: \"default\" });\n\t\t\t\t} else if (nodeName === \"div\" || nodeName === \"span\") {\n\t\t\t\t\tinline = $target.children(\".\" + this._inlineClass);\n\t\t\t\t\tinline.children().addClass(\"ui-state-disabled\");\n\t\t\t\t\tinline.find(\"select.ui-datepicker-month, select.ui-datepicker-year\").prop(\"disabled\", true);\n\t\t\t\t}\n\t\t\t\tthis._disabledInputs = $.map(this._disabledInputs, function (value) {\n\t\t\t\t\treturn value === target ? null : value;\n\t\t\t\t}); // delete entry\n\t\t\t\tthis._disabledInputs[this._disabledInputs.length] = target;\n\t\t\t},\n\n\t\t\t/* Is the first field in a jQuery collection disabled as a datepicker?\n * @param target\telement - the target input field or division or span\n * @return boolean - true if disabled, false if enabled\n */\n\t\t\t_isDisabledDatepicker: function (target) {\n\t\t\t\tif (!target) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tfor (var i = 0; i < this._disabledInputs.length; i++) {\n\t\t\t\t\tif (this._disabledInputs[i] === target) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\n\t\t\t/* Retrieve the instance data for the target control.\n * @param target element - the target input field or division or span\n * @return object - the associated instance data\n * @throws error if a jQuery problem getting data\n */\n\t\t\t_getInst: function (target) {\n\t\t\t\ttry {\n\t\t\t\t\treturn $.data(target, \"datepicker\");\n\t\t\t\t} catch (err) {\n\t\t\t\t\tthrow \"Missing instance data for this datepicker\";\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/* Update or retrieve the settings for a date picker attached to an input field or division.\n * @param target element - the target input field or division or span\n * @param name\tobject - the new settings to update or\n *\t\t\t\tstring - the name of the setting to change or retrieve,\n *\t\t\t\twhen retrieving also \"all\" for all instance settings or\n *\t\t\t\t\"defaults\" for all global defaults\n * @param value any - the new value for the setting\n *\t\t\t\t(omit if above is an object or to retrieve a value)\n */\n\t\t\t_optionDatepicker: function (target, name, value) {\n\t\t\t\tvar settings,\n\t\t\t\t date,\n\t\t\t\t minDate,\n\t\t\t\t maxDate,\n\t\t\t\t inst = this._getInst(target);\n\n\t\t\t\tif (arguments.length === 2 && typeof name === \"string\") {\n\t\t\t\t\treturn name === \"defaults\" ? $.extend({}, $.datepicker._defaults) : inst ? name === \"all\" ? $.extend({}, inst.settings) : this._get(inst, name) : null;\n\t\t\t\t}\n\n\t\t\t\tsettings = name || {};\n\t\t\t\tif (typeof name === \"string\") {\n\t\t\t\t\tsettings = {};\n\t\t\t\t\tsettings[name] = value;\n\t\t\t\t}\n\n\t\t\t\tif (inst) {\n\t\t\t\t\tif (this._curInst === inst) {\n\t\t\t\t\t\tthis._hideDatepicker();\n\t\t\t\t\t}\n\n\t\t\t\t\tdate = this._getDateDatepicker(target, true);\n\t\t\t\t\tminDate = this._getMinMaxDate(inst, \"min\");\n\t\t\t\t\tmaxDate = this._getMinMaxDate(inst, \"max\");\n\t\t\t\t\tdatepicker_extendRemove(inst.settings, settings);\n\n\t\t\t\t\t// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided\n\t\t\t\t\tif (minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined) {\n\t\t\t\t\t\tinst.settings.minDate = this._formatDate(inst, minDate);\n\t\t\t\t\t}\n\t\t\t\t\tif (maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined) {\n\t\t\t\t\t\tinst.settings.maxDate = this._formatDate(inst, maxDate);\n\t\t\t\t\t}\n\t\t\t\t\tif (\"disabled\" in settings) {\n\t\t\t\t\t\tif (settings.disabled) {\n\t\t\t\t\t\t\tthis._disableDatepicker(target);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis._enableDatepicker(target);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis._attachments($(target), inst);\n\t\t\t\t\tthis._autoSize(inst);\n\t\t\t\t\tthis._setDate(inst, date);\n\t\t\t\t\tthis._updateAlternate(inst);\n\t\t\t\t\tthis._updateDatepicker(inst);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Change method deprecated\n\t\t\t_changeDatepicker: function (target, name, value) {\n\t\t\t\tthis._optionDatepicker(target, name, value);\n\t\t\t},\n\n\t\t\t/* Redraw the date picker attached to an input field or division.\n * @param target element - the target input field or division or span\n */\n\t\t\t_refreshDatepicker: function (target) {\n\t\t\t\tvar inst = this._getInst(target);\n\t\t\t\tif (inst) {\n\t\t\t\t\tthis._updateDatepicker(inst);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/* Set the dates for a jQuery selection.\n * @param target element - the target input field or division or span\n * @param date\tDate - the new date\n */\n\t\t\t_setDateDatepicker: function (target, date) {\n\t\t\t\tvar inst = this._getInst(target);\n\t\t\t\tif (inst) {\n\t\t\t\t\tthis._setDate(inst, date);\n\t\t\t\t\tthis._updateDatepicker(inst);\n\t\t\t\t\tthis._updateAlternate(inst);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/* Get the date(s) for the first entry in a jQuery selection.\n * @param target element - the target input field or division or span\n * @param noDefault boolean - true if no default date is to be used\n * @return Date - the current date\n */\n\t\t\t_getDateDatepicker: function (target, noDefault) {\n\t\t\t\tvar inst = this._getInst(target);\n\t\t\t\tif (inst && !inst.inline) {\n\t\t\t\t\tthis._setDateFromField(inst, noDefault);\n\t\t\t\t}\n\t\t\t\treturn inst ? this._getDate(inst) : null;\n\t\t\t},\n\n\t\t\t/* Handle keystrokes. */\n\t\t\t_doKeyDown: function (event) {\n\t\t\t\tvar onSelect,\n\t\t\t\t dateStr,\n\t\t\t\t sel,\n\t\t\t\t inst = $.datepicker._getInst(event.target),\n\t\t\t\t handled = true,\n\t\t\t\t isRTL = inst.dpDiv.is(\".ui-datepicker-rtl\");\n\n\t\t\t\tinst._keyEvent = true;\n\t\t\t\tif ($.datepicker._datepickerShowing) {\n\t\t\t\t\tswitch (event.keyCode) {\n\t\t\t\t\t\tcase 9:\n\t\t\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t\t\t\thandled = false;\n\t\t\t\t\t\t\tbreak; // hide on tab out\n\t\t\t\t\t\tcase 13:\n\t\t\t\t\t\t\tsel = $(\"td.\" + $.datepicker._dayOverClass + \":not(.\" + $.datepicker._currentClass + \")\", inst.dpDiv);\n\t\t\t\t\t\t\tif (sel[0]) {\n\t\t\t\t\t\t\t\t$.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tonSelect = $.datepicker._get(inst, \"onSelect\");\n\t\t\t\t\t\t\tif (onSelect) {\n\t\t\t\t\t\t\t\tdateStr = $.datepicker._formatDate(inst);\n\n\t\t\t\t\t\t\t\t// Trigger custom callback\n\t\t\t\t\t\t\t\tonSelect.apply(inst.input ? inst.input[0] : null, [dateStr, inst]);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn false; // don't submit the form\n\t\t\t\t\t\tcase 27:\n\t\t\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t\t\t\tbreak; // hide on escape\n\t\t\t\t\t\tcase 33:\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, event.ctrlKey ? -$.datepicker._get(inst, \"stepBigMonths\") : -$.datepicker._get(inst, \"stepMonths\"), \"M\");\n\t\t\t\t\t\t\tbreak; // previous month/year on page up/+ ctrl\n\t\t\t\t\t\tcase 34:\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, event.ctrlKey ? +$.datepicker._get(inst, \"stepBigMonths\") : +$.datepicker._get(inst, \"stepMonths\"), \"M\");\n\t\t\t\t\t\t\tbreak; // next month/year on page down/+ ctrl\n\t\t\t\t\t\tcase 35:\n\t\t\t\t\t\t\tif (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t\t$.datepicker._clearDate(event.target);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\t\tbreak; // clear on ctrl or command +end\n\t\t\t\t\t\tcase 36:\n\t\t\t\t\t\t\tif (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t\t$.datepicker._gotoToday(event.target);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\t\tbreak; // current on ctrl or command +home\n\t\t\t\t\t\tcase 37:\n\t\t\t\t\t\t\tif (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, isRTL ? +1 : -1, \"D\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\n\t\t\t\t\t\t\t// -1 day on ctrl or command +left\n\t\t\t\t\t\t\tif (event.originalEvent.altKey) {\n\t\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, event.ctrlKey ? -$.datepicker._get(inst, \"stepBigMonths\") : -$.datepicker._get(inst, \"stepMonths\"), \"M\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// next month/year on alt +left on Mac\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 38:\n\t\t\t\t\t\t\tif (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, -7, \"D\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\t\tbreak; // -1 week on ctrl or command +up\n\t\t\t\t\t\tcase 39:\n\t\t\t\t\t\t\tif (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, isRTL ? -1 : +1, \"D\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\n\t\t\t\t\t\t\t// +1 day on ctrl or command +right\n\t\t\t\t\t\t\tif (event.originalEvent.altKey) {\n\t\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, event.ctrlKey ? +$.datepicker._get(inst, \"stepBigMonths\") : +$.datepicker._get(inst, \"stepMonths\"), \"M\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// next month/year on alt +right\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 40:\n\t\t\t\t\t\t\tif (event.ctrlKey || event.metaKey) {\n\t\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, +7, \"D\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\t\tbreak; // +1 week on ctrl or command +down\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\thandled = false;\n\t\t\t\t\t}\n\t\t\t\t} else if (event.keyCode === 36 && event.ctrlKey) {\n\t\t\t\t\t// display the date picker on ctrl+home\n\t\t\t\t\t$.datepicker._showDatepicker(this);\n\t\t\t\t} else {\n\t\t\t\t\thandled = false;\n\t\t\t\t}\n\n\t\t\t\tif (handled) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/* Filter entered characters - based on date format. */\n\t\t\t_doKeyPress: function (event) {\n\t\t\t\tvar chars,\n\t\t\t\t chr,\n\t\t\t\t inst = $.datepicker._getInst(event.target);\n\n\t\t\t\tif ($.datepicker._get(inst, \"constrainInput\")) {\n\t\t\t\t\tchars = $.datepicker._possibleChars($.datepicker._get(inst, \"dateFormat\"));\n\t\t\t\t\tchr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);\n\t\t\t\t\treturn event.ctrlKey || event.metaKey || chr < \" \" || !chars || chars.indexOf(chr) > -1;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/* Synchronise manual entry and field/alternate field. */\n\t\t\t_doKeyUp: function (event) {\n\t\t\t\tvar date,\n\t\t\t\t inst = $.datepicker._getInst(event.target);\n\n\t\t\t\tif (inst.input.val() !== inst.lastVal) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tdate = $.datepicker.parseDate($.datepicker._get(inst, \"dateFormat\"), inst.input ? inst.input.val() : null, $.datepicker._getFormatConfig(inst));\n\n\t\t\t\t\t\tif (date) {\n\t\t\t\t\t\t\t// only if valid\n\t\t\t\t\t\t\t$.datepicker._setDateFromField(inst);\n\t\t\t\t\t\t\t$.datepicker._updateAlternate(inst);\n\t\t\t\t\t\t\t$.datepicker._updateDatepicker(inst);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t/* Pop-up the date picker for a given input field.\n * If false returned from beforeShow event handler do not show.\n * @param input element - the input field attached to the date picker or\n *\t\t\t\t\tevent - if triggered by focus\n */\n\t\t\t_showDatepicker: function (input) {\n\t\t\t\tinput = input.target || input;\n\t\t\t\tif (input.nodeName.toLowerCase() !== \"input\") {\n\t\t\t\t\t// find from button/image trigger\n\t\t\t\t\tinput = $(\"input\", input.parentNode)[0];\n\t\t\t\t}\n\n\t\t\t\tif ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) {\n\t\t\t\t\t// already here\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar inst, beforeShow, beforeShowSettings, isFixed, offset, showAnim, duration;\n\n\t\t\t\tinst = $.datepicker._getInst(input);\n\t\t\t\tif ($.datepicker._curInst && $.datepicker._curInst !== inst) {\n\t\t\t\t\t$.datepicker._curInst.dpDiv.stop(true, true);\n\t\t\t\t\tif (inst && $.datepicker._datepickerShowing) {\n\t\t\t\t\t\t$.datepicker._hideDatepicker($.datepicker._curInst.input[0]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbeforeShow = $.datepicker._get(inst, \"beforeShow\");\n\t\t\t\tbeforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};\n\t\t\t\tif (beforeShowSettings === false) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tdatepicker_extendRemove(inst.settings, beforeShowSettings);\n\n\t\t\t\tinst.lastVal = null;\n\t\t\t\t$.datepicker._lastInput = input;\n\t\t\t\t$.datepicker._setDateFromField(inst);\n\n\t\t\t\tif ($.datepicker._inDialog) {\n\t\t\t\t\t// hide cursor\n\t\t\t\t\tinput.value = \"\";\n\t\t\t\t}\n\t\t\t\tif (!$.datepicker._pos) {\n\t\t\t\t\t// position below input\n\t\t\t\t\t$.datepicker._pos = $.datepicker._findPos(input);\n\t\t\t\t\t$.datepicker._pos[1] += input.offsetHeight; // add the height\n\t\t\t\t}\n\n\t\t\t\tisFixed = false;\n\t\t\t\t$(input).parents().each(function () {\n\t\t\t\t\tisFixed |= $(this).css(\"position\") === \"fixed\";\n\t\t\t\t\treturn !isFixed;\n\t\t\t\t});\n\n\t\t\t\toffset = { left: $.datepicker._pos[0], top: $.datepicker._pos[1] };\n\t\t\t\t$.datepicker._pos = null;\n\n\t\t\t\t//to avoid flashes on Firefox\n\t\t\t\tinst.dpDiv.empty();\n\n\t\t\t\t// determine sizing offscreen\n\t\t\t\tinst.dpDiv.css({ position: \"absolute\", display: \"block\", top: \"-1000px\" });\n\t\t\t\t$.datepicker._updateDatepicker(inst);\n\n\t\t\t\t// fix width for dynamic number of date pickers\n\t\t\t\t// and adjust position before showing\n\t\t\t\toffset = $.datepicker._checkOffset(inst, offset, isFixed);\n\t\t\t\tinst.dpDiv.css({ position: $.datepicker._inDialog && $.blockUI ? \"static\" : isFixed ? \"fixed\" : \"absolute\", display: \"none\",\n\t\t\t\t\tleft: offset.left + \"px\", top: offset.top + \"px\" });\n\n\t\t\t\tif (!inst.inline) {\n\t\t\t\t\tshowAnim = $.datepicker._get(inst, \"showAnim\");\n\t\t\t\t\tduration = $.datepicker._get(inst, \"duration\");\n\t\t\t\t\tinst.dpDiv.css(\"z-index\", datepicker_getZindex($(input)) + 1);\n\t\t\t\t\t$.datepicker._datepickerShowing = true;\n\n\t\t\t\t\tif ($.effects && $.effects.effect[showAnim]) {\n\t\t\t\t\t\tinst.dpDiv.show(showAnim, $.datepicker._get(inst, \"showOptions\"), duration);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tinst.dpDiv[showAnim || \"show\"](showAnim ? duration : null);\n\t\t\t\t\t}\n\n\t\t\t\t\tif ($.datepicker._shouldFocusInput(inst)) {\n\t\t\t\t\t\tinst.input.trigger(\"focus\");\n\t\t\t\t\t}\n\n\t\t\t\t\t$.datepicker._curInst = inst;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/* Generate the date picker content. */\n\t\t\t_updateDatepicker: function (inst) {\n\t\t\t\tthis.maxRows = 4; //Reset the max number of rows being displayed (see #7043)\n\t\t\t\tdatepicker_instActive = inst; // for delegate hover events\n\t\t\t\tinst.dpDiv.empty().append(this._generateHTML(inst));\n\t\t\t\tthis._attachHandlers(inst);\n\n\t\t\t\tvar origyearshtml,\n\t\t\t\t numMonths = this._getNumberOfMonths(inst),\n\t\t\t\t cols = numMonths[1],\n\t\t\t\t width = 17,\n\t\t\t\t activeCell = inst.dpDiv.find(\".\" + this._dayOverClass + \" a\");\n\n\t\t\t\tif (activeCell.length > 0) {\n\t\t\t\t\tdatepicker_handleMouseover.apply(activeCell.get(0));\n\t\t\t\t}\n\n\t\t\t\tinst.dpDiv.removeClass(\"ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4\").width(\"\");\n\t\t\t\tif (cols > 1) {\n\t\t\t\t\tinst.dpDiv.addClass(\"ui-datepicker-multi-\" + cols).css(\"width\", width * cols + \"em\");\n\t\t\t\t}\n\t\t\t\tinst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? \"add\" : \"remove\") + \"Class\"](\"ui-datepicker-multi\");\n\t\t\t\tinst.dpDiv[(this._get(inst, \"isRTL\") ? \"add\" : \"remove\") + \"Class\"](\"ui-datepicker-rtl\");\n\n\t\t\t\tif (inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput(inst)) {\n\t\t\t\t\tinst.input.trigger(\"focus\");\n\t\t\t\t}\n\n\t\t\t\t// Deffered render of the years select (to avoid flashes on Firefox)\n\t\t\t\tif (inst.yearshtml) {\n\t\t\t\t\torigyearshtml = inst.yearshtml;\n\t\t\t\t\tsetTimeout(function () {\n\n\t\t\t\t\t\t//assure that inst.yearshtml didn't change.\n\t\t\t\t\t\tif (origyearshtml === inst.yearshtml && inst.yearshtml) {\n\t\t\t\t\t\t\tinst.dpDiv.find(\"select.ui-datepicker-year:first\").replaceWith(inst.yearshtml);\n\t\t\t\t\t\t}\n\t\t\t\t\t\torigyearshtml = inst.yearshtml = null;\n\t\t\t\t\t}, 0);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// #6694 - don't focus the input if it's already focused\n\t\t\t// this breaks the change event in IE\n\t\t\t// Support: IE and jQuery <1.9\n\t\t\t_shouldFocusInput: function (inst) {\n\t\t\t\treturn inst.input && inst.input.is(\":visible\") && !inst.input.is(\":disabled\") && !inst.input.is(\":focus\");\n\t\t\t},\n\n\t\t\t/* Check positioning to remain on screen. */\n\t\t\t_checkOffset: function (inst, offset, isFixed) {\n\t\t\t\tvar dpWidth = inst.dpDiv.outerWidth(),\n\t\t\t\t dpHeight = inst.dpDiv.outerHeight(),\n\t\t\t\t inputWidth = inst.input ? inst.input.outerWidth() : 0,\n\t\t\t\t inputHeight = inst.input ? inst.input.outerHeight() : 0,\n\t\t\t\t viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()),\n\t\t\t\t viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());\n\n\t\t\t\toffset.left -= this._get(inst, \"isRTL\") ? dpWidth - inputWidth : 0;\n\t\t\t\toffset.left -= isFixed && offset.left === inst.input.offset().left ? $(document).scrollLeft() : 0;\n\t\t\t\toffset.top -= isFixed && offset.top === inst.input.offset().top + inputHeight ? $(document).scrollTop() : 0;\n\n\t\t\t\t// Now check if datepicker is showing outside window viewport - move to a better place if so.\n\t\t\t\toffset.left -= Math.min(offset.left, offset.left + dpWidth > viewWidth && viewWidth > dpWidth ? Math.abs(offset.left + dpWidth - viewWidth) : 0);\n\t\t\t\toffset.top -= Math.min(offset.top, offset.top + dpHeight > viewHeight && viewHeight > dpHeight ? Math.abs(dpHeight + inputHeight) : 0);\n\n\t\t\t\treturn offset;\n\t\t\t},\n\n\t\t\t/* Find an object's position on the screen. */\n\t\t\t_findPos: function (obj) {\n\t\t\t\tvar position,\n\t\t\t\t inst = this._getInst(obj),\n\t\t\t\t isRTL = this._get(inst, \"isRTL\");\n\n\t\t\t\twhile (obj && (obj.type === \"hidden\" || obj.nodeType !== 1 || $.expr.filters.hidden(obj))) {\n\t\t\t\t\tobj = obj[isRTL ? \"previousSibling\" : \"nextSibling\"];\n\t\t\t\t}\n\n\t\t\t\tposition = $(obj).offset();\n\t\t\t\treturn [position.left, position.top];\n\t\t\t},\n\n\t\t\t/* Hide the date picker from view.\n * @param input element - the input field attached to the date picker\n */\n\t\t\t_hideDatepicker: function (input) {\n\t\t\t\tvar showAnim,\n\t\t\t\t duration,\n\t\t\t\t postProcess,\n\t\t\t\t onClose,\n\t\t\t\t inst = this._curInst;\n\n\t\t\t\tif (!inst || input && inst !== $.data(input, \"datepicker\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (this._datepickerShowing) {\n\t\t\t\t\tshowAnim = this._get(inst, \"showAnim\");\n\t\t\t\t\tduration = this._get(inst, \"duration\");\n\t\t\t\t\tpostProcess = function () {\n\t\t\t\t\t\t$.datepicker._tidyDialog(inst);\n\t\t\t\t\t};\n\n\t\t\t\t\t// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed\n\t\t\t\t\tif ($.effects && ($.effects.effect[showAnim] || $.effects[showAnim])) {\n\t\t\t\t\t\tinst.dpDiv.hide(showAnim, $.datepicker._get(inst, \"showOptions\"), duration, postProcess);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tinst.dpDiv[showAnim === \"slideDown\" ? \"slideUp\" : showAnim === \"fadeIn\" ? \"fadeOut\" : \"hide\"](showAnim ? duration : null, postProcess);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!showAnim) {\n\t\t\t\t\t\tpostProcess();\n\t\t\t\t\t}\n\t\t\t\t\tthis._datepickerShowing = false;\n\n\t\t\t\t\tonClose = this._get(inst, \"onClose\");\n\t\t\t\t\tif (onClose) {\n\t\t\t\t\t\tonClose.apply(inst.input ? inst.input[0] : null, [inst.input ? inst.input.val() : \"\", inst]);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._lastInput = null;\n\t\t\t\t\tif (this._inDialog) {\n\t\t\t\t\t\tthis._dialogInput.css({ position: \"absolute\", left: \"0\", top: \"-100px\" });\n\t\t\t\t\t\tif ($.blockUI) {\n\t\t\t\t\t\t\t$.unblockUI();\n\t\t\t\t\t\t\t$(\"body\").append(this.dpDiv);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis._inDialog = false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/* Tidy up after a dialog display. */\n\t\t\t_tidyDialog: function (inst) {\n\t\t\t\tinst.dpDiv.removeClass(this._dialogClass).off(\".ui-datepicker-calendar\");\n\t\t\t},\n\n\t\t\t/* Close date picker if clicked elsewhere. */\n\t\t\t_checkExternalClick: function (event) {\n\t\t\t\tif (!$.datepicker._curInst) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar $target = $(event.target),\n\t\t\t\t inst = $.datepicker._getInst($target[0]);\n\n\t\t\t\tif ($target[0].id !== $.datepicker._mainDivId && $target.parents(\"#\" + $.datepicker._mainDivId).length === 0 && !$target.hasClass($.datepicker.markerClassName) && !$target.closest(\".\" + $.datepicker._triggerClass).length && $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) || $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst) {\n\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/* Adjust one of the date sub-fields. */\n\t\t\t_adjustDate: function (id, offset, period) {\n\t\t\t\tvar target = $(id),\n\t\t\t\t inst = this._getInst(target[0]);\n\n\t\t\t\tif (this._isDisabledDatepicker(target[0])) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis._adjustInstDate(inst, offset, period);\n\t\t\t\tthis._updateDatepicker(inst);\n\t\t\t},\n\n\t\t\t/* Action for current link. */\n\t\t\t_gotoToday: function (id) {\n\t\t\t\tvar date,\n\t\t\t\t target = $(id),\n\t\t\t\t inst = this._getInst(target[0]);\n\n\t\t\t\tif (this._get(inst, \"gotoCurrent\") && inst.currentDay) {\n\t\t\t\t\tinst.selectedDay = inst.currentDay;\n\t\t\t\t\tinst.drawMonth = inst.selectedMonth = inst.currentMonth;\n\t\t\t\t\tinst.drawYear = inst.selectedYear = inst.currentYear;\n\t\t\t\t} else {\n\t\t\t\t\tdate = new Date();\n\t\t\t\t\tinst.selectedDay = date.getDate();\n\t\t\t\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\t\t\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\t\t\t}\n\t\t\t\tthis._notifyChange(inst);\n\t\t\t\tthis._adjustDate(target);\n\t\t\t},\n\n\t\t\t/* Action for selecting a new month/year. */\n\t\t\t_selectMonthYear: function (id, select, period) {\n\t\t\t\tvar target = $(id),\n\t\t\t\t inst = this._getInst(target[0]);\n\n\t\t\t\tinst[\"selected\" + (period === \"M\" ? \"Month\" : \"Year\")] = inst[\"draw\" + (period === \"M\" ? \"Month\" : \"Year\")] = parseInt(select.options[select.selectedIndex].value, 10);\n\n\t\t\t\tthis._notifyChange(inst);\n\t\t\t\tthis._adjustDate(target);\n\t\t\t},\n\n\t\t\t/* Action for selecting a day. */\n\t\t\t_selectDay: function (id, month, year, td) {\n\t\t\t\tvar inst,\n\t\t\t\t target = $(id);\n\n\t\t\t\tif ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tinst = this._getInst(target[0]);\n\t\t\t\tinst.selectedDay = inst.currentDay = $(\"a\", td).html();\n\t\t\t\tinst.selectedMonth = inst.currentMonth = month;\n\t\t\t\tinst.selectedYear = inst.currentYear = year;\n\t\t\t\tthis._selectDate(id, this._formatDate(inst, inst.currentDay, inst.currentMonth, inst.currentYear));\n\t\t\t},\n\n\t\t\t/* Erase the input field and hide the date picker. */\n\t\t\t_clearDate: function (id) {\n\t\t\t\tvar target = $(id);\n\t\t\t\tthis._selectDate(target, \"\");\n\t\t\t},\n\n\t\t\t/* Update the input field with the selected date. */\n\t\t\t_selectDate: function (id, dateStr) {\n\t\t\t\tvar onSelect,\n\t\t\t\t target = $(id),\n\t\t\t\t inst = this._getInst(target[0]);\n\n\t\t\t\tdateStr = dateStr != null ? dateStr : this._formatDate(inst);\n\t\t\t\tif (inst.input) {\n\t\t\t\t\tinst.input.val(dateStr);\n\t\t\t\t}\n\t\t\t\tthis._updateAlternate(inst);\n\n\t\t\t\tonSelect = this._get(inst, \"onSelect\");\n\t\t\t\tif (onSelect) {\n\t\t\t\t\tonSelect.apply(inst.input ? inst.input[0] : null, [dateStr, inst]); // trigger custom callback\n\t\t\t\t} else if (inst.input) {\n\t\t\t\t\tinst.input.trigger(\"change\"); // fire the change event\n\t\t\t\t}\n\n\t\t\t\tif (inst.inline) {\n\t\t\t\t\tthis._updateDatepicker(inst);\n\t\t\t\t} else {\n\t\t\t\t\tthis._hideDatepicker();\n\t\t\t\t\tthis._lastInput = inst.input[0];\n\t\t\t\t\tif (typeof inst.input[0] !== \"object\") {\n\t\t\t\t\t\tinst.input.trigger(\"focus\"); // restore focus\n\t\t\t\t\t}\n\t\t\t\t\tthis._lastInput = null;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/* Update any alternate field to synchronise with the main field. */\n\t\t\t_updateAlternate: function (inst) {\n\t\t\t\tvar altFormat,\n\t\t\t\t date,\n\t\t\t\t dateStr,\n\t\t\t\t altField = this._get(inst, \"altField\");\n\n\t\t\t\tif (altField) {\n\t\t\t\t\t// update alternate field too\n\t\t\t\t\taltFormat = this._get(inst, \"altFormat\") || this._get(inst, \"dateFormat\");\n\t\t\t\t\tdate = this._getDate(inst);\n\t\t\t\t\tdateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));\n\t\t\t\t\t$(altField).val(dateStr);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/* Set as beforeShowDay function to prevent selection of weekends.\n * @param date Date - the date to customise\n * @return [boolean, string] - is this date selectable?, what is its CSS class?\n */\n\t\t\tnoWeekends: function (date) {\n\t\t\t\tvar day = date.getDay();\n\t\t\t\treturn [day > 0 && day < 6, \"\"];\n\t\t\t},\n\n\t\t\t/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.\n * @param date Date - the date to get the week for\n * @return number - the number of the week within the year that contains this date\n */\n\t\t\tiso8601Week: function (date) {\n\t\t\t\tvar time,\n\t\t\t\t checkDate = new Date(date.getTime());\n\n\t\t\t\t// Find Thursday of this week starting on Monday\n\t\t\t\tcheckDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));\n\n\t\t\t\ttime = checkDate.getTime();\n\t\t\t\tcheckDate.setMonth(0); // Compare with Jan 1\n\t\t\t\tcheckDate.setDate(1);\n\t\t\t\treturn Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;\n\t\t\t},\n\n\t\t\t/* Parse a string value into a date object.\n * See formatDate below for the possible formats.\n *\n * @param format string - the expected format of the date\n * @param value string - the date in the above format\n * @param settings Object - attributes include:\n *\t\t\t\t\tshortYearCutoff number - the cutoff year for determining the century (optional)\n *\t\t\t\t\tdayNamesShort\tstring[7] - abbreviated names of the days from Sunday (optional)\n *\t\t\t\t\tdayNames\t\tstring[7] - names of the days from Sunday (optional)\n *\t\t\t\t\tmonthNamesShort string[12] - abbreviated names of the months (optional)\n *\t\t\t\t\tmonthNames\t\tstring[12] - names of the months (optional)\n * @return Date - the extracted date value or null if value is blank\n */\n\t\t\tparseDate: function (format, value, settings) {\n\t\t\t\tif (format == null || value == null) {\n\t\t\t\t\tthrow \"Invalid arguments\";\n\t\t\t\t}\n\n\t\t\t\tvalue = typeof value === \"object\" ? value.toString() : value + \"\";\n\t\t\t\tif (value === \"\") {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tvar iFormat,\n\t\t\t\t dim,\n\t\t\t\t extra,\n\t\t\t\t iValue = 0,\n\t\t\t\t shortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff,\n\t\t\t\t shortYearCutoff = typeof shortYearCutoffTemp !== \"string\" ? shortYearCutoffTemp : new Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10),\n\t\t\t\t dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,\n\t\t\t\t dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,\n\t\t\t\t monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,\n\t\t\t\t monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,\n\t\t\t\t year = -1,\n\t\t\t\t month = -1,\n\t\t\t\t day = -1,\n\t\t\t\t doy = -1,\n\t\t\t\t literal = false,\n\t\t\t\t date,\n\n\n\t\t\t\t// Check whether a format character is doubled\n\t\t\t\tlookAhead = function (match) {\n\t\t\t\t\tvar matches = iFormat + 1 < format.length && format.charAt(iFormat + 1) === match;\n\t\t\t\t\tif (matches) {\n\t\t\t\t\t\tiFormat++;\n\t\t\t\t\t}\n\t\t\t\t\treturn matches;\n\t\t\t\t},\n\n\n\t\t\t\t// Extract a number from the string value\n\t\t\t\tgetNumber = function (match) {\n\t\t\t\t\tvar isDoubled = lookAhead(match),\n\t\t\t\t\t size = match === \"@\" ? 14 : match === \"!\" ? 20 : match === \"y\" && isDoubled ? 4 : match === \"o\" ? 3 : 2,\n\t\t\t\t\t minSize = match === \"y\" ? size : 1,\n\t\t\t\t\t digits = new RegExp(\"^\\\\d{\" + minSize + \",\" + size + \"}\"),\n\t\t\t\t\t num = value.substring(iValue).match(digits);\n\t\t\t\t\tif (!num) {\n\t\t\t\t\t\tthrow \"Missing number at position \" + iValue;\n\t\t\t\t\t}\n\t\t\t\t\tiValue += num[0].length;\n\t\t\t\t\treturn parseInt(num[0], 10);\n\t\t\t\t},\n\n\n\t\t\t\t// Extract a name from the string value and convert to an index\n\t\t\t\tgetName = function (match, shortNames, longNames) {\n\t\t\t\t\tvar index = -1,\n\t\t\t\t\t names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {\n\t\t\t\t\t\treturn [[k, v]];\n\t\t\t\t\t}).sort(function (a, b) {\n\t\t\t\t\t\treturn -(a[1].length - b[1].length);\n\t\t\t\t\t});\n\n\t\t\t\t\t$.each(names, function (i, pair) {\n\t\t\t\t\t\tvar name = pair[1];\n\t\t\t\t\t\tif (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) {\n\t\t\t\t\t\t\tindex = pair[0];\n\t\t\t\t\t\t\tiValue += name.length;\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tif (index !== -1) {\n\t\t\t\t\t\treturn index + 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow \"Unknown name at position \" + iValue;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\n\t\t\t\t// Confirm that a literal character matches the string value\n\t\t\t\tcheckLiteral = function () {\n\t\t\t\t\tif (value.charAt(iValue) !== format.charAt(iFormat)) {\n\t\t\t\t\t\tthrow \"Unexpected literal at position \" + iValue;\n\t\t\t\t\t}\n\t\t\t\t\tiValue++;\n\t\t\t\t};\n\n\t\t\t\tfor (iFormat = 0; iFormat < format.length; iFormat++) {\n\t\t\t\t\tif (literal) {\n\t\t\t\t\t\tif (format.charAt(iFormat) === \"'\" && !lookAhead(\"'\")) {\n\t\t\t\t\t\t\tliteral = false;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcheckLiteral();\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tswitch (format.charAt(iFormat)) {\n\t\t\t\t\t\t\tcase \"d\":\n\t\t\t\t\t\t\t\tday = getNumber(\"d\");\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"D\":\n\t\t\t\t\t\t\t\tgetName(\"D\", dayNamesShort, dayNames);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"o\":\n\t\t\t\t\t\t\t\tdoy = getNumber(\"o\");\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"m\":\n\t\t\t\t\t\t\t\tmonth = getNumber(\"m\");\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\t\t\tmonth = getName(\"M\", monthNamesShort, monthNames);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"y\":\n\t\t\t\t\t\t\t\tyear = getNumber(\"y\");\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"@\":\n\t\t\t\t\t\t\t\tdate = new Date(getNumber(\"@\"));\n\t\t\t\t\t\t\t\tyear = date.getFullYear();\n\t\t\t\t\t\t\t\tmonth = date.getMonth() + 1;\n\t\t\t\t\t\t\t\tday = date.getDate();\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"!\":\n\t\t\t\t\t\t\t\tdate = new Date((getNumber(\"!\") - this._ticksTo1970) / 10000);\n\t\t\t\t\t\t\t\tyear = date.getFullYear();\n\t\t\t\t\t\t\t\tmonth = date.getMonth() + 1;\n\t\t\t\t\t\t\t\tday = date.getDate();\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\t\t\tif (lookAhead(\"'\")) {\n\t\t\t\t\t\t\t\t\tcheckLiteral();\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tcheckLiteral();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (iValue < value.length) {\n\t\t\t\t\textra = value.substr(iValue);\n\t\t\t\t\tif (!/^\\s+/.test(extra)) {\n\t\t\t\t\t\tthrow \"Extra/unparsed characters found in date: \" + extra;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (year === -1) {\n\t\t\t\t\tyear = new Date().getFullYear();\n\t\t\t\t} else if (year < 100) {\n\t\t\t\t\tyear += new Date().getFullYear() - new Date().getFullYear() % 100 + (year <= shortYearCutoff ? 0 : -100);\n\t\t\t\t}\n\n\t\t\t\tif (doy > -1) {\n\t\t\t\t\tmonth = 1;\n\t\t\t\t\tday = doy;\n\t\t\t\t\tdo {\n\t\t\t\t\t\tdim = this._getDaysInMonth(year, month - 1);\n\t\t\t\t\t\tif (day <= dim) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmonth++;\n\t\t\t\t\t\tday -= dim;\n\t\t\t\t\t} while (true);\n\t\t\t\t}\n\n\t\t\t\tdate = this._daylightSavingAdjust(new Date(year, month - 1, day));\n\t\t\t\tif (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) {\n\t\t\t\t\tthrow \"Invalid date\"; // E.g. 31/02/00\n\t\t\t\t}\n\t\t\t\treturn date;\n\t\t\t},\n\n\t\t\t/* Standard date formats. */\n\t\t\tATOM: \"yy-mm-dd\", // RFC 3339 (ISO 8601)\n\t\t\tCOOKIE: \"D, dd M yy\",\n\t\t\tISO_8601: \"yy-mm-dd\",\n\t\t\tRFC_822: \"D, d M y\",\n\t\t\tRFC_850: \"DD, dd-M-y\",\n\t\t\tRFC_1036: \"D, d M y\",\n\t\t\tRFC_1123: \"D, d M yy\",\n\t\t\tRFC_2822: \"D, d M yy\",\n\t\t\tRSS: \"D, d M y\", // RFC 822\n\t\t\tTICKS: \"!\",\n\t\t\tTIMESTAMP: \"@\",\n\t\t\tW3C: \"yy-mm-dd\", // ISO 8601\n\n\t\t\t_ticksTo1970: ((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) + Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000,\n\n\t\t\t/* Format a date object into a string value.\n * The format can be combinations of the following:\n * d - day of month (no leading zero)\n * dd - day of month (two digit)\n * o - day of year (no leading zeros)\n * oo - day of year (three digit)\n * D - day name short\n * DD - day name long\n * m - month of year (no leading zero)\n * mm - month of year (two digit)\n * M - month name short\n * MM - month name long\n * y - year (two digit)\n * yy - year (four digit)\n * @ - Unix timestamp (ms since 01/01/1970)\n * ! - Windows ticks (100ns since 01/01/0001)\n * \"...\" - literal text\n * '' - single quote\n *\n * @param format string - the desired format of the date\n * @param date Date - the date value to format\n * @param settings Object - attributes include:\n *\t\t\t\t\tdayNamesShort\tstring[7] - abbreviated names of the days from Sunday (optional)\n *\t\t\t\t\tdayNames\t\tstring[7] - names of the days from Sunday (optional)\n *\t\t\t\t\tmonthNamesShort string[12] - abbreviated names of the months (optional)\n *\t\t\t\t\tmonthNames\t\tstring[12] - names of the months (optional)\n * @return string - the date in the above format\n */\n\t\t\tformatDate: function (format, date, settings) {\n\t\t\t\tif (!date) {\n\t\t\t\t\treturn \"\";\n\t\t\t\t}\n\n\t\t\t\tvar iFormat,\n\t\t\t\t dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,\n\t\t\t\t dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,\n\t\t\t\t monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,\n\t\t\t\t monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,\n\n\n\t\t\t\t// Check whether a format character is doubled\n\t\t\t\tlookAhead = function (match) {\n\t\t\t\t\tvar matches = iFormat + 1 < format.length && format.charAt(iFormat + 1) === match;\n\t\t\t\t\tif (matches) {\n\t\t\t\t\t\tiFormat++;\n\t\t\t\t\t}\n\t\t\t\t\treturn matches;\n\t\t\t\t},\n\n\n\t\t\t\t// Format a number, with leading zero if necessary\n\t\t\t\tformatNumber = function (match, value, len) {\n\t\t\t\t\tvar num = \"\" + value;\n\t\t\t\t\tif (lookAhead(match)) {\n\t\t\t\t\t\twhile (num.length < len) {\n\t\t\t\t\t\t\tnum = \"0\" + num;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn num;\n\t\t\t\t},\n\n\n\t\t\t\t// Format a name, short or long as requested\n\t\t\t\tformatName = function (match, value, shortNames, longNames) {\n\t\t\t\t\treturn lookAhead(match) ? longNames[value] : shortNames[value];\n\t\t\t\t},\n\t\t\t\t output = \"\",\n\t\t\t\t literal = false;\n\n\t\t\t\tif (date) {\n\t\t\t\t\tfor (iFormat = 0; iFormat < format.length; iFormat++) {\n\t\t\t\t\t\tif (literal) {\n\t\t\t\t\t\t\tif (format.charAt(iFormat) === \"'\" && !lookAhead(\"'\")) {\n\t\t\t\t\t\t\t\tliteral = false;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\toutput += format.charAt(iFormat);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tswitch (format.charAt(iFormat)) {\n\t\t\t\t\t\t\t\tcase \"d\":\n\t\t\t\t\t\t\t\t\toutput += formatNumber(\"d\", date.getDate(), 2);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase \"D\":\n\t\t\t\t\t\t\t\t\toutput += formatName(\"D\", date.getDay(), dayNamesShort, dayNames);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase \"o\":\n\t\t\t\t\t\t\t\t\toutput += formatNumber(\"o\", Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase \"m\":\n\t\t\t\t\t\t\t\t\toutput += formatNumber(\"m\", date.getMonth() + 1, 2);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\t\t\t\toutput += formatName(\"M\", date.getMonth(), monthNamesShort, monthNames);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase \"y\":\n\t\t\t\t\t\t\t\t\toutput += lookAhead(\"y\") ? date.getFullYear() : (date.getFullYear() % 100 < 10 ? \"0\" : \"\") + date.getFullYear() % 100;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase \"@\":\n\t\t\t\t\t\t\t\t\toutput += date.getTime();\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase \"!\":\n\t\t\t\t\t\t\t\t\toutput += date.getTime() * 10000 + this._ticksTo1970;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\t\t\t\tif (lookAhead(\"'\")) {\n\t\t\t\t\t\t\t\t\t\toutput += \"'\";\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\toutput += format.charAt(iFormat);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn output;\n\t\t\t},\n\n\t\t\t/* Extract all possible characters from the date format. */\n\t\t\t_possibleChars: function (format) {\n\t\t\t\tvar iFormat,\n\t\t\t\t chars = \"\",\n\t\t\t\t literal = false,\n\n\n\t\t\t\t// Check whether a format character is doubled\n\t\t\t\tlookAhead = function (match) {\n\t\t\t\t\tvar matches = iFormat + 1 < format.length && format.charAt(iFormat + 1) === match;\n\t\t\t\t\tif (matches) {\n\t\t\t\t\t\tiFormat++;\n\t\t\t\t\t}\n\t\t\t\t\treturn matches;\n\t\t\t\t};\n\n\t\t\t\tfor (iFormat = 0; iFormat < format.length; iFormat++) {\n\t\t\t\t\tif (literal) {\n\t\t\t\t\t\tif (format.charAt(iFormat) === \"'\" && !lookAhead(\"'\")) {\n\t\t\t\t\t\t\tliteral = false;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tchars += format.charAt(iFormat);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tswitch (format.charAt(iFormat)) {\n\t\t\t\t\t\t\tcase \"d\":case \"m\":case \"y\":case \"@\":\n\t\t\t\t\t\t\t\tchars += \"0123456789\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"D\":case \"M\":\n\t\t\t\t\t\t\t\treturn null; // Accept anything\n\t\t\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\t\t\tif (lookAhead(\"'\")) {\n\t\t\t\t\t\t\t\t\tchars += \"'\";\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tchars += format.charAt(iFormat);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn chars;\n\t\t\t},\n\n\t\t\t/* Get a setting value, defaulting if necessary. */\n\t\t\t_get: function (inst, name) {\n\t\t\t\treturn inst.settings[name] !== undefined ? inst.settings[name] : this._defaults[name];\n\t\t\t},\n\n\t\t\t/* Parse existing date and initialise date picker. */\n\t\t\t_setDateFromField: function (inst, noDefault) {\n\t\t\t\tif (inst.input.val() === inst.lastVal) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar dateFormat = this._get(inst, \"dateFormat\"),\n\t\t\t\t dates = inst.lastVal = inst.input ? inst.input.val() : null,\n\t\t\t\t defaultDate = this._getDefaultDate(inst),\n\t\t\t\t date = defaultDate,\n\t\t\t\t settings = this._getFormatConfig(inst);\n\n\t\t\t\ttry {\n\t\t\t\t\tdate = this.parseDate(dateFormat, dates, settings) || defaultDate;\n\t\t\t\t} catch (event) {\n\t\t\t\t\tdates = noDefault ? \"\" : dates;\n\t\t\t\t}\n\t\t\t\tinst.selectedDay = date.getDate();\n\t\t\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\t\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\t\t\tinst.currentDay = dates ? date.getDate() : 0;\n\t\t\t\tinst.currentMonth = dates ? date.getMonth() : 0;\n\t\t\t\tinst.currentYear = dates ? date.getFullYear() : 0;\n\t\t\t\tthis._adjustInstDate(inst);\n\t\t\t},\n\n\t\t\t/* Retrieve the default date shown on opening. */\n\t\t\t_getDefaultDate: function (inst) {\n\t\t\t\treturn this._restrictMinMax(inst, this._determineDate(inst, this._get(inst, \"defaultDate\"), new Date()));\n\t\t\t},\n\n\t\t\t/* A date may be specified as an exact value or a relative one. */\n\t\t\t_determineDate: function (inst, date, defaultDate) {\n\t\t\t\tvar offsetNumeric = function (offset) {\n\t\t\t\t\tvar date = new Date();\n\t\t\t\t\tdate.setDate(date.getDate() + offset);\n\t\t\t\t\treturn date;\n\t\t\t\t},\n\t\t\t\t offsetString = function (offset) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn $.datepicker.parseDate($.datepicker._get(inst, \"dateFormat\"), offset, $.datepicker._getFormatConfig(inst));\n\t\t\t\t\t} catch (e) {\n\n\t\t\t\t\t\t// Ignore\n\t\t\t\t\t}\n\n\t\t\t\t\tvar date = (offset.toLowerCase().match(/^c/) ? $.datepicker._getDate(inst) : null) || new Date(),\n\t\t\t\t\t year = date.getFullYear(),\n\t\t\t\t\t month = date.getMonth(),\n\t\t\t\t\t day = date.getDate(),\n\t\t\t\t\t pattern = /([+\\-]?[0-9]+)\\s*(d|D|w|W|m|M|y|Y)?/g,\n\t\t\t\t\t matches = pattern.exec(offset);\n\n\t\t\t\t\twhile (matches) {\n\t\t\t\t\t\tswitch (matches[2] || \"d\") {\n\t\t\t\t\t\t\tcase \"d\":case \"D\":\n\t\t\t\t\t\t\t\tday += parseInt(matches[1], 10);break;\n\t\t\t\t\t\t\tcase \"w\":case \"W\":\n\t\t\t\t\t\t\t\tday += parseInt(matches[1], 10) * 7;break;\n\t\t\t\t\t\t\tcase \"m\":case \"M\":\n\t\t\t\t\t\t\t\tmonth += parseInt(matches[1], 10);\n\t\t\t\t\t\t\t\tday = Math.min(day, $.datepicker._getDaysInMonth(year, month));\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"y\":case \"Y\":\n\t\t\t\t\t\t\t\tyear += parseInt(matches[1], 10);\n\t\t\t\t\t\t\t\tday = Math.min(day, $.datepicker._getDaysInMonth(year, month));\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatches = pattern.exec(offset);\n\t\t\t\t\t}\n\t\t\t\t\treturn new Date(year, month, day);\n\t\t\t\t},\n\t\t\t\t newDate = date == null || date === \"\" ? defaultDate : typeof date === \"string\" ? offsetString(date) : typeof date === \"number\" ? isNaN(date) ? defaultDate : offsetNumeric(date) : new Date(date.getTime());\n\n\t\t\t\tnewDate = newDate && newDate.toString() === \"Invalid Date\" ? defaultDate : newDate;\n\t\t\t\tif (newDate) {\n\t\t\t\t\tnewDate.setHours(0);\n\t\t\t\t\tnewDate.setMinutes(0);\n\t\t\t\t\tnewDate.setSeconds(0);\n\t\t\t\t\tnewDate.setMilliseconds(0);\n\t\t\t\t}\n\t\t\t\treturn this._daylightSavingAdjust(newDate);\n\t\t\t},\n\n\t\t\t/* Handle switch to/from daylight saving.\n * Hours may be non-zero on daylight saving cut-over:\n * > 12 when midnight changeover, but then cannot generate\n * midnight datetime, so jump to 1AM, otherwise reset.\n * @param date (Date) the date to check\n * @return (Date) the corrected date\n */\n\t\t\t_daylightSavingAdjust: function (date) {\n\t\t\t\tif (!date) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tdate.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);\n\t\t\t\treturn date;\n\t\t\t},\n\n\t\t\t/* Set the date(s) directly. */\n\t\t\t_setDate: function (inst, date, noChange) {\n\t\t\t\tvar clear = !date,\n\t\t\t\t origMonth = inst.selectedMonth,\n\t\t\t\t origYear = inst.selectedYear,\n\t\t\t\t newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));\n\n\t\t\t\tinst.selectedDay = inst.currentDay = newDate.getDate();\n\t\t\t\tinst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();\n\t\t\t\tinst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();\n\t\t\t\tif ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) {\n\t\t\t\t\tthis._notifyChange(inst);\n\t\t\t\t}\n\t\t\t\tthis._adjustInstDate(inst);\n\t\t\t\tif (inst.input) {\n\t\t\t\t\tinst.input.val(clear ? \"\" : this._formatDate(inst));\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/* Retrieve the date(s) directly. */\n\t\t\t_getDate: function (inst) {\n\t\t\t\tvar startDate = !inst.currentYear || inst.input && inst.input.val() === \"\" ? null : this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay));\n\t\t\t\treturn startDate;\n\t\t\t},\n\n\t\t\t/* Attach the onxxx handlers. These are declared statically so\n * they work with static code transformers like Caja.\n */\n\t\t\t_attachHandlers: function (inst) {\n\t\t\t\tvar stepMonths = this._get(inst, \"stepMonths\"),\n\t\t\t\t id = \"#\" + inst.id.replace(/\\\\\\\\/g, \"\\\\\");\n\t\t\t\tinst.dpDiv.find(\"[data-handler]\").map(function () {\n\t\t\t\t\tvar handler = {\n\t\t\t\t\t\tprev: function () {\n\t\t\t\t\t\t\t$.datepicker._adjustDate(id, -stepMonths, \"M\");\n\t\t\t\t\t\t},\n\t\t\t\t\t\tnext: function () {\n\t\t\t\t\t\t\t$.datepicker._adjustDate(id, +stepMonths, \"M\");\n\t\t\t\t\t\t},\n\t\t\t\t\t\thide: function () {\n\t\t\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttoday: function () {\n\t\t\t\t\t\t\t$.datepicker._gotoToday(id);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tselectDay: function () {\n\t\t\t\t\t\t\t$.datepicker._selectDay(id, +this.getAttribute(\"data-month\"), +this.getAttribute(\"data-year\"), this);\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tselectMonth: function () {\n\t\t\t\t\t\t\t$.datepicker._selectMonthYear(id, this, \"M\");\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tselectYear: function () {\n\t\t\t\t\t\t\t$.datepicker._selectMonthYear(id, this, \"Y\");\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t$(this).on(this.getAttribute(\"data-event\"), handler[this.getAttribute(\"data-handler\")]);\n\t\t\t\t});\n\t\t\t},\n\n\t\t\t/* Generate the HTML for the current state of the date picker. */\n\t\t\t_generateHTML: function (inst) {\n\t\t\t\tvar maxDraw,\n\t\t\t\t prevText,\n\t\t\t\t prev,\n\t\t\t\t nextText,\n\t\t\t\t next,\n\t\t\t\t currentText,\n\t\t\t\t gotoDate,\n\t\t\t\t controls,\n\t\t\t\t buttonPanel,\n\t\t\t\t firstDay,\n\t\t\t\t showWeek,\n\t\t\t\t dayNames,\n\t\t\t\t dayNamesMin,\n\t\t\t\t monthNames,\n\t\t\t\t monthNamesShort,\n\t\t\t\t beforeShowDay,\n\t\t\t\t showOtherMonths,\n\t\t\t\t selectOtherMonths,\n\t\t\t\t defaultDate,\n\t\t\t\t html,\n\t\t\t\t dow,\n\t\t\t\t row,\n\t\t\t\t group,\n\t\t\t\t col,\n\t\t\t\t selectedDate,\n\t\t\t\t cornerClass,\n\t\t\t\t calender,\n\t\t\t\t thead,\n\t\t\t\t day,\n\t\t\t\t daysInMonth,\n\t\t\t\t leadDays,\n\t\t\t\t curRows,\n\t\t\t\t numRows,\n\t\t\t\t printDate,\n\t\t\t\t dRow,\n\t\t\t\t tbody,\n\t\t\t\t daySettings,\n\t\t\t\t otherMonth,\n\t\t\t\t unselectable,\n\t\t\t\t tempDate = new Date(),\n\t\t\t\t today = this._daylightSavingAdjust(new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())),\n\t\t\t\t // clear time\n\t\t\t\tisRTL = this._get(inst, \"isRTL\"),\n\t\t\t\t showButtonPanel = this._get(inst, \"showButtonPanel\"),\n\t\t\t\t hideIfNoPrevNext = this._get(inst, \"hideIfNoPrevNext\"),\n\t\t\t\t navigationAsDateFormat = this._get(inst, \"navigationAsDateFormat\"),\n\t\t\t\t numMonths = this._getNumberOfMonths(inst),\n\t\t\t\t showCurrentAtPos = this._get(inst, \"showCurrentAtPos\"),\n\t\t\t\t stepMonths = this._get(inst, \"stepMonths\"),\n\t\t\t\t isMultiMonth = numMonths[0] !== 1 || numMonths[1] !== 1,\n\t\t\t\t currentDate = this._daylightSavingAdjust(!inst.currentDay ? new Date(9999, 9, 9) : new Date(inst.currentYear, inst.currentMonth, inst.currentDay)),\n\t\t\t\t minDate = this._getMinMaxDate(inst, \"min\"),\n\t\t\t\t maxDate = this._getMinMaxDate(inst, \"max\"),\n\t\t\t\t drawMonth = inst.drawMonth - showCurrentAtPos,\n\t\t\t\t drawYear = inst.drawYear;\n\n\t\t\t\tif (drawMonth < 0) {\n\t\t\t\t\tdrawMonth += 12;\n\t\t\t\t\tdrawYear--;\n\t\t\t\t}\n\t\t\t\tif (maxDate) {\n\t\t\t\t\tmaxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(), maxDate.getMonth() - numMonths[0] * numMonths[1] + 1, maxDate.getDate()));\n\t\t\t\t\tmaxDraw = minDate && maxDraw < minDate ? minDate : maxDraw;\n\t\t\t\t\twhile (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {\n\t\t\t\t\t\tdrawMonth--;\n\t\t\t\t\t\tif (drawMonth < 0) {\n\t\t\t\t\t\t\tdrawMonth = 11;\n\t\t\t\t\t\t\tdrawYear--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tinst.drawMonth = drawMonth;\n\t\t\t\tinst.drawYear = drawYear;\n\n\t\t\t\tprevText = this._get(inst, \"prevText\");\n\t\t\t\tprevText = !navigationAsDateFormat ? prevText : this.formatDate(prevText, this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)), this._getFormatConfig(inst));\n\n\t\t\t\tprev = this._canAdjustMonth(inst, -1, drawYear, drawMonth) ? \"\" + prevText + \"\" : hideIfNoPrevNext ? \"\" : \"\" + prevText + \"\";\n\n\t\t\t\tnextText = this._get(inst, \"nextText\");\n\t\t\t\tnextText = !navigationAsDateFormat ? nextText : this.formatDate(nextText, this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)), this._getFormatConfig(inst));\n\n\t\t\t\tnext = this._canAdjustMonth(inst, +1, drawYear, drawMonth) ? \"\" + nextText + \"\" : hideIfNoPrevNext ? \"\" : \"\" + nextText + \"\";\n\n\t\t\t\tcurrentText = this._get(inst, \"currentText\");\n\t\t\t\tgotoDate = this._get(inst, \"gotoCurrent\") && inst.currentDay ? currentDate : today;\n\t\t\t\tcurrentText = !navigationAsDateFormat ? currentText : this.formatDate(currentText, gotoDate, this._getFormatConfig(inst));\n\n\t\t\t\tcontrols = !inst.inline ? \"\" : \"\";\n\n\t\t\t\tbuttonPanel = showButtonPanel ? \"
      \" + (isRTL ? controls : \"\") + (this._isInRange(inst, gotoDate) ? \"\" : \"\") + (isRTL ? \"\" : controls) + \"
      \" : \"\";\n\n\t\t\t\tfirstDay = parseInt(this._get(inst, \"firstDay\"), 10);\n\t\t\t\tfirstDay = isNaN(firstDay) ? 0 : firstDay;\n\n\t\t\t\tshowWeek = this._get(inst, \"showWeek\");\n\t\t\t\tdayNames = this._get(inst, \"dayNames\");\n\t\t\t\tdayNamesMin = this._get(inst, \"dayNamesMin\");\n\t\t\t\tmonthNames = this._get(inst, \"monthNames\");\n\t\t\t\tmonthNamesShort = this._get(inst, \"monthNamesShort\");\n\t\t\t\tbeforeShowDay = this._get(inst, \"beforeShowDay\");\n\t\t\t\tshowOtherMonths = this._get(inst, \"showOtherMonths\");\n\t\t\t\tselectOtherMonths = this._get(inst, \"selectOtherMonths\");\n\t\t\t\tdefaultDate = this._getDefaultDate(inst);\n\t\t\t\thtml = \"\";\n\n\t\t\t\tfor (row = 0; row < numMonths[0]; row++) {\n\t\t\t\t\tgroup = \"\";\n\t\t\t\t\tthis.maxRows = 4;\n\t\t\t\t\tfor (col = 0; col < numMonths[1]; col++) {\n\t\t\t\t\t\tselectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));\n\t\t\t\t\t\tcornerClass = \" ui-corner-all\";\n\t\t\t\t\t\tcalender = \"\";\n\t\t\t\t\t\tif (isMultiMonth) {\n\t\t\t\t\t\t\tcalender += \"
      \";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcalender += \"
      \" + (/all|left/.test(cornerClass) && row === 0 ? isRTL ? next : prev : \"\") + (/all|right/.test(cornerClass) && row === 0 ? isRTL ? prev : next : \"\") + this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate, row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers\n\t\t\t\t\t\t\"
      \" + \"\";\n\t\t\t\t\t\tthead = showWeek ? \"\" : \"\";\n\t\t\t\t\t\tfor (dow = 0; dow < 7; dow++) {\n\t\t\t\t\t\t\t// days of the week\n\t\t\t\t\t\t\tday = (dow + firstDay) % 7;\n\t\t\t\t\t\t\tthead += \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcalender += thead + \"\";\n\t\t\t\t\t\tdaysInMonth = this._getDaysInMonth(drawYear, drawMonth);\n\t\t\t\t\t\tif (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) {\n\t\t\t\t\t\t\tinst.selectedDay = Math.min(inst.selectedDay, daysInMonth);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tleadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;\n\t\t\t\t\t\tcurRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate\n\t\t\t\t\t\tnumRows = isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows; //If multiple months, use the higher number of rows (see #7043)\n\t\t\t\t\t\tthis.maxRows = numRows;\n\t\t\t\t\t\tprintDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));\n\t\t\t\t\t\tfor (dRow = 0; dRow < numRows; dRow++) {\n\t\t\t\t\t\t\t// create date picker rows\n\t\t\t\t\t\t\tcalender += \"\";\n\t\t\t\t\t\t\ttbody = !showWeek ? \"\" : \"\";\n\t\t\t\t\t\t\tfor (dow = 0; dow < 7; dow++) {\n\t\t\t\t\t\t\t\t// create date picker days\n\t\t\t\t\t\t\t\tdaySettings = beforeShowDay ? beforeShowDay.apply(inst.input ? inst.input[0] : null, [printDate]) : [true, \"\"];\n\t\t\t\t\t\t\t\totherMonth = printDate.getMonth() !== drawMonth;\n\t\t\t\t\t\t\t\tunselectable = otherMonth && !selectOtherMonths || !daySettings[0] || minDate && printDate < minDate || maxDate && printDate > maxDate;\n\t\t\t\t\t\t\t\ttbody += \"\"; // display selectable date\n\t\t\t\t\t\t\t\tprintDate.setDate(printDate.getDate() + 1);\n\t\t\t\t\t\t\t\tprintDate = this._daylightSavingAdjust(printDate);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcalender += tbody + \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdrawMonth++;\n\t\t\t\t\t\tif (drawMonth > 11) {\n\t\t\t\t\t\t\tdrawMonth = 0;\n\t\t\t\t\t\t\tdrawYear++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcalender += \"
      \" + this._get(inst, \"weekHeader\") + \"= 5 ? \" class='ui-datepicker-week-end'\" : \"\") + \">\" + \"\" + dayNamesMin[day] + \"
      \" + this._get(inst, \"calculateWeek\")(printDate) + \"\" + ( // actions\n\t\t\t\t\t\t\t\totherMonth && !showOtherMonths ? \" \" : // display for other months\n\t\t\t\t\t\t\t\tunselectable ? \"\" + printDate.getDate() + \"\" : \"\" + printDate.getDate() + \"\") + \"
      \" + (isMultiMonth ? \"
      \" + (numMonths[0] > 0 && col === numMonths[1] - 1 ? \"
      \" : \"\") : \"\");\n\t\t\t\t\t\tgroup += calender;\n\t\t\t\t\t}\n\t\t\t\t\thtml += group;\n\t\t\t\t}\n\t\t\t\thtml += buttonPanel;\n\t\t\t\tinst._keyEvent = false;\n\t\t\t\treturn html;\n\t\t\t},\n\n\t\t\t/* Generate the month and year header. */\n\t\t\t_generateMonthYearHeader: function (inst, drawMonth, drawYear, minDate, maxDate, secondary, monthNames, monthNamesShort) {\n\n\t\t\t\tvar inMinYear,\n\t\t\t\t inMaxYear,\n\t\t\t\t month,\n\t\t\t\t years,\n\t\t\t\t thisYear,\n\t\t\t\t determineYear,\n\t\t\t\t year,\n\t\t\t\t endYear,\n\t\t\t\t changeMonth = this._get(inst, \"changeMonth\"),\n\t\t\t\t changeYear = this._get(inst, \"changeYear\"),\n\t\t\t\t showMonthAfterYear = this._get(inst, \"showMonthAfterYear\"),\n\t\t\t\t html = \"
      \",\n\t\t\t\t monthHtml = \"\";\n\n\t\t\t\t// Month selection\n\t\t\t\tif (secondary || !changeMonth) {\n\t\t\t\t\tmonthHtml += \"\" + monthNames[drawMonth] + \"\";\n\t\t\t\t} else {\n\t\t\t\t\tinMinYear = minDate && minDate.getFullYear() === drawYear;\n\t\t\t\t\tinMaxYear = maxDate && maxDate.getFullYear() === drawYear;\n\t\t\t\t\tmonthHtml += \"\";\n\t\t\t\t}\n\n\t\t\t\tif (!showMonthAfterYear) {\n\t\t\t\t\thtml += monthHtml + (secondary || !(changeMonth && changeYear) ? \" \" : \"\");\n\t\t\t\t}\n\n\t\t\t\t// Year selection\n\t\t\t\tif (!inst.yearshtml) {\n\t\t\t\t\tinst.yearshtml = \"\";\n\t\t\t\t\tif (secondary || !changeYear) {\n\t\t\t\t\t\thtml += \"\" + drawYear + \"\";\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// determine range of years to display\n\t\t\t\t\t\tyears = this._get(inst, \"yearRange\").split(\":\");\n\t\t\t\t\t\tthisYear = new Date().getFullYear();\n\t\t\t\t\t\tdetermineYear = function (value) {\n\t\t\t\t\t\t\tvar year = value.match(/c[+\\-].*/) ? drawYear + parseInt(value.substring(1), 10) : value.match(/[+\\-].*/) ? thisYear + parseInt(value, 10) : parseInt(value, 10);\n\t\t\t\t\t\t\treturn isNaN(year) ? thisYear : year;\n\t\t\t\t\t\t};\n\t\t\t\t\t\tyear = determineYear(years[0]);\n\t\t\t\t\t\tendYear = Math.max(year, determineYear(years[1] || \"\"));\n\t\t\t\t\t\tyear = minDate ? Math.max(year, minDate.getFullYear()) : year;\n\t\t\t\t\t\tendYear = maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear;\n\t\t\t\t\t\tinst.yearshtml += \"\";\n\n\t\t\t\t\t\thtml += inst.yearshtml;\n\t\t\t\t\t\tinst.yearshtml = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\thtml += this._get(inst, \"yearSuffix\");\n\t\t\t\tif (showMonthAfterYear) {\n\t\t\t\t\thtml += (secondary || !(changeMonth && changeYear) ? \" \" : \"\") + monthHtml;\n\t\t\t\t}\n\t\t\t\thtml += \"
      \"; // Close datepicker_header\n\t\t\t\treturn html;\n\t\t\t},\n\n\t\t\t/* Adjust one of the date sub-fields. */\n\t\t\t_adjustInstDate: function (inst, offset, period) {\n\t\t\t\tvar year = inst.selectedYear + (period === \"Y\" ? offset : 0),\n\t\t\t\t month = inst.selectedMonth + (period === \"M\" ? offset : 0),\n\t\t\t\t day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period === \"D\" ? offset : 0),\n\t\t\t\t date = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day)));\n\n\t\t\t\tinst.selectedDay = date.getDate();\n\t\t\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\t\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\t\t\tif (period === \"M\" || period === \"Y\") {\n\t\t\t\t\tthis._notifyChange(inst);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/* Ensure a date is within any min/max bounds. */\n\t\t\t_restrictMinMax: function (inst, date) {\n\t\t\t\tvar minDate = this._getMinMaxDate(inst, \"min\"),\n\t\t\t\t maxDate = this._getMinMaxDate(inst, \"max\"),\n\t\t\t\t newDate = minDate && date < minDate ? minDate : date;\n\t\t\t\treturn maxDate && newDate > maxDate ? maxDate : newDate;\n\t\t\t},\n\n\t\t\t/* Notify change of month/year. */\n\t\t\t_notifyChange: function (inst) {\n\t\t\t\tvar onChange = this._get(inst, \"onChangeMonthYear\");\n\t\t\t\tif (onChange) {\n\t\t\t\t\tonChange.apply(inst.input ? inst.input[0] : null, [inst.selectedYear, inst.selectedMonth + 1, inst]);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/* Determine the number of months to show. */\n\t\t\t_getNumberOfMonths: function (inst) {\n\t\t\t\tvar numMonths = this._get(inst, \"numberOfMonths\");\n\t\t\t\treturn numMonths == null ? [1, 1] : typeof numMonths === \"number\" ? [1, numMonths] : numMonths;\n\t\t\t},\n\n\t\t\t/* Determine the current maximum date - ensure no time components are set. */\n\t\t\t_getMinMaxDate: function (inst, minMax) {\n\t\t\t\treturn this._determineDate(inst, this._get(inst, minMax + \"Date\"), null);\n\t\t\t},\n\n\t\t\t/* Find the number of days in a given month. */\n\t\t\t_getDaysInMonth: function (year, month) {\n\t\t\t\treturn 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();\n\t\t\t},\n\n\t\t\t/* Find the day of the week of the first of a month. */\n\t\t\t_getFirstDayOfMonth: function (year, month) {\n\t\t\t\treturn new Date(year, month, 1).getDay();\n\t\t\t},\n\n\t\t\t/* Determines if we should allow a \"next/prev\" month display change. */\n\t\t\t_canAdjustMonth: function (inst, offset, curYear, curMonth) {\n\t\t\t\tvar numMonths = this._getNumberOfMonths(inst),\n\t\t\t\t date = this._daylightSavingAdjust(new Date(curYear, curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));\n\n\t\t\t\tif (offset < 0) {\n\t\t\t\t\tdate.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));\n\t\t\t\t}\n\t\t\t\treturn this._isInRange(inst, date);\n\t\t\t},\n\n\t\t\t/* Is the given date in the accepted range? */\n\t\t\t_isInRange: function (inst, date) {\n\t\t\t\tvar yearSplit,\n\t\t\t\t currentYear,\n\t\t\t\t minDate = this._getMinMaxDate(inst, \"min\"),\n\t\t\t\t maxDate = this._getMinMaxDate(inst, \"max\"),\n\t\t\t\t minYear = null,\n\t\t\t\t maxYear = null,\n\t\t\t\t years = this._get(inst, \"yearRange\");\n\t\t\t\tif (years) {\n\t\t\t\t\tyearSplit = years.split(\":\");\n\t\t\t\t\tcurrentYear = new Date().getFullYear();\n\t\t\t\t\tminYear = parseInt(yearSplit[0], 10);\n\t\t\t\t\tmaxYear = parseInt(yearSplit[1], 10);\n\t\t\t\t\tif (yearSplit[0].match(/[+\\-].*/)) {\n\t\t\t\t\t\tminYear += currentYear;\n\t\t\t\t\t}\n\t\t\t\t\tif (yearSplit[1].match(/[+\\-].*/)) {\n\t\t\t\t\t\tmaxYear += currentYear;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn (!minDate || date.getTime() >= minDate.getTime()) && (!maxDate || date.getTime() <= maxDate.getTime()) && (!minYear || date.getFullYear() >= minYear) && (!maxYear || date.getFullYear() <= maxYear);\n\t\t\t},\n\n\t\t\t/* Provide the configuration settings for formatting/parsing. */\n\t\t\t_getFormatConfig: function (inst) {\n\t\t\t\tvar shortYearCutoff = this._get(inst, \"shortYearCutoff\");\n\t\t\t\tshortYearCutoff = typeof shortYearCutoff !== \"string\" ? shortYearCutoff : new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10);\n\t\t\t\treturn { shortYearCutoff: shortYearCutoff,\n\t\t\t\t\tdayNamesShort: this._get(inst, \"dayNamesShort\"), dayNames: this._get(inst, \"dayNames\"),\n\t\t\t\t\tmonthNamesShort: this._get(inst, \"monthNamesShort\"), monthNames: this._get(inst, \"monthNames\") };\n\t\t\t},\n\n\t\t\t/* Format the given date for display. */\n\t\t\t_formatDate: function (inst, day, month, year) {\n\t\t\t\tif (!day) {\n\t\t\t\t\tinst.currentDay = inst.selectedDay;\n\t\t\t\t\tinst.currentMonth = inst.selectedMonth;\n\t\t\t\t\tinst.currentYear = inst.selectedYear;\n\t\t\t\t}\n\t\t\t\tvar date = day ? typeof day === \"object\" ? day : this._daylightSavingAdjust(new Date(year, month, day)) : this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay));\n\t\t\t\treturn this.formatDate(this._get(inst, \"dateFormat\"), date, this._getFormatConfig(inst));\n\t\t\t}\n\t\t});\n\n\t\t/*\n * Bind hover events for datepicker elements.\n * Done via delegate so the binding only occurs once in the lifetime of the parent div.\n * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.\n */\n\t\tfunction datepicker_bindHover(dpDiv) {\n\t\t\tvar selector = \"button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a\";\n\t\t\treturn dpDiv.on(\"mouseout\", selector, function () {\n\t\t\t\t$(this).removeClass(\"ui-state-hover\");\n\t\t\t\tif (this.className.indexOf(\"ui-datepicker-prev\") !== -1) {\n\t\t\t\t\t$(this).removeClass(\"ui-datepicker-prev-hover\");\n\t\t\t\t}\n\t\t\t\tif (this.className.indexOf(\"ui-datepicker-next\") !== -1) {\n\t\t\t\t\t$(this).removeClass(\"ui-datepicker-next-hover\");\n\t\t\t\t}\n\t\t\t}).on(\"mouseover\", selector, datepicker_handleMouseover);\n\t\t}\n\n\t\tfunction datepicker_handleMouseover() {\n\t\t\tif (!$.datepicker._isDisabledDatepicker(datepicker_instActive.inline ? datepicker_instActive.dpDiv.parent()[0] : datepicker_instActive.input[0])) {\n\t\t\t\t$(this).parents(\".ui-datepicker-calendar\").find(\"a\").removeClass(\"ui-state-hover\");\n\t\t\t\t$(this).addClass(\"ui-state-hover\");\n\t\t\t\tif (this.className.indexOf(\"ui-datepicker-prev\") !== -1) {\n\t\t\t\t\t$(this).addClass(\"ui-datepicker-prev-hover\");\n\t\t\t\t}\n\t\t\t\tif (this.className.indexOf(\"ui-datepicker-next\") !== -1) {\n\t\t\t\t\t$(this).addClass(\"ui-datepicker-next-hover\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/* jQuery extend now ignores nulls! */\n\t\tfunction datepicker_extendRemove(target, props) {\n\t\t\t$.extend(target, props);\n\t\t\tfor (var name in props) {\n\t\t\t\tif (props[name] == null) {\n\t\t\t\t\ttarget[name] = props[name];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn target;\n\t\t}\n\n\t\t/* Invoke the datepicker functionality.\n @param options string - a command, optionally followed by additional parameters or\n \t\t\t\t\tObject - settings for attaching new datepicker functionality\n @return jQuery object */\n\t\t$.fn.datepicker = function (options) {\n\n\t\t\t/* Verify an empty collection wasn't passed - Fixes #6976 */\n\t\t\tif (!this.length) {\n\t\t\t\treturn this;\n\t\t\t}\n\n\t\t\t/* Initialise the date picker. */\n\t\t\tif (!$.datepicker.initialized) {\n\t\t\t\t$(document).on(\"mousedown\", $.datepicker._checkExternalClick);\n\t\t\t\t$.datepicker.initialized = true;\n\t\t\t}\n\n\t\t\t/* Append datepicker main container to body if not exist. */\n\t\t\tif ($(\"#\" + $.datepicker._mainDivId).length === 0) {\n\t\t\t\t$(\"body\").append($.datepicker.dpDiv);\n\t\t\t}\n\n\t\t\tvar otherArgs = Array.prototype.slice.call(arguments, 1);\n\t\t\tif (typeof options === \"string\" && (options === \"isDisabled\" || options === \"getDate\" || options === \"widget\")) {\n\t\t\t\treturn $.datepicker[\"_\" + options + \"Datepicker\"].apply($.datepicker, [this[0]].concat(otherArgs));\n\t\t\t}\n\t\t\tif (options === \"option\" && arguments.length === 2 && typeof arguments[1] === \"string\") {\n\t\t\t\treturn $.datepicker[\"_\" + options + \"Datepicker\"].apply($.datepicker, [this[0]].concat(otherArgs));\n\t\t\t}\n\t\t\treturn this.each(function () {\n\t\t\t\ttypeof options === \"string\" ? $.datepicker[\"_\" + options + \"Datepicker\"].apply($.datepicker, [this].concat(otherArgs)) : $.datepicker._attachDatepicker(this, options);\n\t\t\t});\n\t\t};\n\n\t\t$.datepicker = new Datepicker(); // singleton instance\n\t\t$.datepicker.initialized = false;\n\t\t$.datepicker.uuid = new Date().getTime();\n\t\t$.datepicker.version = \"1.12.1\";\n\n\t\treturn $.datepicker;\n\t};\n\n\t; /*!\n * jQuery UI Datepicker 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n\tmodule.exports = exports[\"default\"];\n});","'use strict';\nvar breakpoints = require('../components/breakpoints');\n$(function () {\n /**\n * Control the Check Balance form embedded in the Gift Card Landing page.\n *\n * Enter Card Number and PIN to check balance.\n */\n $('#CheckBalanceButton').on('click', function (e) {\n e.preventDefault();\n\n var $checkBalanceForm = $(this).closest('form');\n var actionURL = $checkBalanceForm.attr('action');\n var gcID = $('input[name=giftCertID]').val();\n var gcPin = $('input[name=giftCertPin]').val();\n var data = $checkBalanceForm.serialize();\n\n $('.checkBalanceError').hide();\n\n // Simple check for non-empty fields.\n var inputError = false;\n var errorMessage;\n if (gcID === '') {\n errorMessage = $checkBalanceForm.data('missing-card');\n $('.checkBalanceError').html(`
      ${errorMessage}
      `).show();\n inputError = true;\n } else if (gcPin === '') {\n errorMessage = $checkBalanceForm.data('missing-pin');\n $('.checkBalanceError').html(`
      ${errorMessage}
      `).show();\n inputError = true;\n }\n\n if (inputError === false) {\n $.ajax({\n url: actionURL,\n type: 'post',\n dataType: 'json',\n data: data,\n success: function (dataResponse) {\n if (dataResponse.success === true) {\n // Success\n var responsePayload = JSON.parse(dataResponse.giftCertificate);\n if (responsePayload && responsePayload.valid) {\n var balanceMessage = responsePayload.amount;\n var cardNumber = responsePayload.code;\n $('.gc-balance-value').text(balanceMessage);\n $('.gc-card-number').text(cardNumber);\n $('.check-balance-success').removeClass('d-none');\n $('.check-balance').hide();\n $('.js-gc-balance-container .js-hide-on-success').hide();\n if (breakpoints.isLowRes()) {\n var totalHeightFromTop = $('.js-gc-balance-container').offset().top - $('.js-site-header').height() - 10; // subtracted 10 for space between header and balance container\n $('html, body').animate({ scrollTop: totalHeightFromTop }, 300);\n }\n } else {\n // Error\n $('.checkBalanceError').html(`
      ${responsePayload.message}
      `).show();\n }\n if ('dtmLayer' in dataResponse && 'digitalData' in window) {\n if (dataResponse.dtmLayer.page && dataResponse.dtmLayer.page.form) {\n window.digitalData.page.form = dataResponse.dtmLayer.page.form;\n }\n\n if (dataResponse.dtmLayer.user) {\n window.digitalData.user = dataResponse.dtmLayer.user;\n }\n\n if (dataResponse.dtmLayer.cart) {\n window.digitalData.cart = dataResponse.dtmLayer.cart;\n }\n }\n } else {\n if ('dtmLayer' in dataResponse && 'digitalData' in window) {\n if (dataResponse.dtmLayer.page && dataResponse.dtmLayer.page.form) {\n delete window.digitalData.page.form.giftCardNumber;\n delete window.digitalData.page.form.giftCardBalance;\n }\n }\n // Error\n $('.checkBalanceError').html(`
      ${dataResponse.message}
      `).show();\n }\n },\n error: function (dataResponse) {\n // Error\n errorMessage = dataResponse.message;\n if (errorMessage.length === 0) {\n errorMessage = $checkBalanceForm.data('error-communication');\n }\n $('.checkBalanceError').html(`
      ${errorMessage}
      `).show();\n }\n });\n }\n });\n\n // Check balance on a different card\n $('.check-another-balance').on('click', function (e) {\n e.preventDefault();\n\n $('input[name=giftCertID]').val('');\n $('input[name=giftCertPin]').val('');\n $('.check-balance-success').addClass('d-none');\n $('.checkBalanceError').hide();\n $('.check-balance').show();\n $('.js-gc-balance-container .js-hide-on-success').show();\n });\n\n $('.bulk-order .giftcard_link').on('click', function () {\n $('.card.gift-card-card').removeClass('d-none');\n });\n\n $('.bulk-order-close').on('click', function () {\n $('.card.gift-card-card').addClass('d-none');\n });\n});\n","'use strict';\n\nvar formValidation = require('../components/formValidation');\nvar clientSideValidation = require('../components/clientSideValidation');\nvar utils = require('brand_core/components/utils');\n\nconst virtualCardFields = ['giftCardRecipientEmail', 'giftCardFromName', 'giftCardRecipientName', 'giftMessage', 'giftCardSendDate', 'giftCardCustomAmount'];\nconst physicalCardFields = ['giftCardFromName', 'giftCardRecipientName', 'giftMessage', 'giftCardCustomAmount'];\n\n/**\n * Get the summary validation status for the provided input fields\n * @param {selector} $container product details container\n * @param {*} fields array contains the field ids to check\n * @return {boolean} true in case if all fields are valid\n */\nfunction getFieldsValidationStatus($container, fields) {\n var validationStatus = true;\n\n for (var fieldName of fields) { // eslint-disable-line\n var $field = $container.find('#' + fieldName);\n if ($field.length) {\n validationStatus = validationStatus && $field[0].validity.valid;\n }\n }\n return validationStatus;\n}\n\n/**\n * Get the object contains names and values of all provided input fields\n * @param {selector} $container product details container\n * @param {*} fields array contains the field ids\n * @return {Object} object contains pairs of field names and its values\n */\nfunction getFieldsData($container, fields) {\n var fieldsData = {};\n\n for (var idx in fields) { // eslint-disable-line\n if (typeof fields[idx] === 'string') {\n var selector = $container.find('#' + fields[idx]);\n fieldsData[selector.attr('name')] = selector.val();\n }\n }\n return fieldsData;\n}\n\n/**\n * Returns selected Gift Card type\n * @param {selector} $container product details container\n * @returns {string} Gift card type (virtual|physical)\n */\nfunction getSelectedGiftCardType($container) {\n return $container.find('[data-attr=\"giftCardTypeVariation\"] button.selected span').data('attr-value');\n}\n\n/**\n * Updates the attributes section class according to the selected card type\n * @param {selector} $container jQuery selector which points to the gift card custom attributes form\n */\nfunction updateCardAttributesFormClass($container) {\n var selectedType = getSelectedGiftCardType($container);\n var $attributesFormContainer = $container.find('.js-gc-attributes');\n $attributesFormContainer.find('form').attr('data-dtm-name', selectedType + ' gift card form');\n $attributesFormContainer.find('form').data('dtm-name', selectedType + ' gift card form');\n\n $container.find('.js-giftcard-icon').addClass('d-none');\n\n var designType = $container.find('[data-attr=\"giftCardDesignVariation\"] button.selected span').data('attr-value');\n $container.find('[data-attr=\"giftCardDesignVariation\"] label span')\n .text(designType);\n\n if (selectedType === 'virtual') {\n $attributesFormContainer.addClass('gc-virtual');\n $attributesFormContainer.removeClass('gc-physical');\n $container.find('.gc-physical-hidden').show();\n $container.find('.gc-virtual-hidden').hide();\n $container.find('.js-giftcard-email').removeClass('d-none');\n } else {\n $attributesFormContainer.addClass('gc-physical');\n $attributesFormContainer.removeClass('gc-virtual');\n $container.find('.gc-physical-hidden').hide();\n $container.find('.gc-virtual-hidden').show();\n $container.find('.js-giftcard-delivery').removeClass('d-none');\n }\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction processValues(attr, $productContainer) {\n var $attr = '[data-attr=\"' + attr.id + '\"]';\n\n attr.values.forEach(function (attrValue, idx) {\n var isTypePhysicalSwatch = attr.attributeId === 'giftCardTypeVariation' && attrValue.value === 'physical';\n var isCustomValueSwatch = attr.attributeId === 'giftCardValueVariation' && attrValue.value === 'CUSTOM';\n\n var $attrValue = $productContainer.find($attr + ' [data-attr-value=\"' + attrValue.value + '\"]');\n var $swatchAnchor = $attrValue.parent();\n\n if (isCustomValueSwatch) {\n if (!attrValue.selected) {\n $('[name$=\"_giftCardCustomAmount\"]').val('');\n }\n\n $swatchAnchor = $attrValue;\n }\n\n if (!isTypePhysicalSwatch) {\n if (attrValue.url) {\n $swatchAnchor.data('attr-url', attrValue.url);\n } else {\n $swatchAnchor.data('attr-url', '');\n }\n }\n\n $attrValue.removeClass('disabled selectable unselectable');\n $swatchAnchor.removeClass('disabled selectable unselectable');\n\n if (!attrValue.selectable && !isTypePhysicalSwatch) {\n $swatchAnchor.addClass('disabled unselectable');\n $attrValue.addClass('disabled unselectable');\n } else {\n $swatchAnchor.addClass('selectable');\n $attrValue.addClass('selectable');\n }\n\n if (attrValue.selected) {\n $attrValue.addClass('selected');\n $swatchAnchor.addClass('selected');\n } else {\n $attrValue.removeClass('selected');\n $swatchAnchor.removeClass('selected');\n }\n\n if (attrValue.images) {\n var swatch = (attrValue.images || {}).swatch || [];\n $productContainer.find($attr + ' img').eq(idx)\n .attr('src', swatch[0] ? swatch[0].url : '');\n }\n });\n}\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n * attributes have been selected. Used partially to\n * determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n */\nfunction handleVariantResponse(response, $productContainer) {\n if (response.product.variationAttributes) {\n var attrs = response.product.variationAttributes;\n\n var isLargeImages = (response.product.images.large || {}).length;\n if (isLargeImages) {\n $productContainer.find('.primary-images img')\n .attr('src', response.product.images.large[0].url);\n }\n\n attrs.forEach(function (attr) {\n processValues(attr, $productContainer);\n });\n }\n}\n\n/**\n * Updates the digitalData object.\n * @param {Object} data The data to set in the digitalData object\n */\nconst updateDTM = (data) => {\n if (!!data && 'dtmLayer' in data && 'digitalData' in window) {\n const propsToUpdate = ['page', 'user', 'cart'];\n propsToUpdate.forEach((prop) => {\n if (data.dtmLayer[prop]) {\n window.digitalData[prop] = data.dtmLayer[prop];\n }\n });\n }\n};\n\n/**\n * updates the product view when a product attribute is selected or deselected\n *\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction attributeSelect(selectedValueUrl, $productContainer) {\n if (selectedValueUrl) {\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n success: function (data) {\n handleVariantResponse(data, $productContainer);\n $('body').trigger('product:afterAttributeSelect',\n { data: data, container: $productContainer });\n updateDTM(data);\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n}\n\n/**\n * setup datepicker plugin\n */\nfunction setupDatepicker() {\n var $dpInput = $('.gcdetails .js-gift-card-datepicker');\n\n if (!$dpInput.length) {\n return;\n }\n\n /**\n * hide datepicker\n */\n function closeDP() {\n $dpInput.datepicker('hide');\n $dpInput.blur();\n }\n\n /**\n * format desiredDate mm/dd/yyyy\n * @param {date} desiredDate - desiredDate\n */\n function setDatePickerDate(desiredDate) {\n $dpInput.val(desiredDate.toLocaleDateString('en-US', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n }));\n }\n\n /**\n * if date less than today set to today\n */\n function ensurePickerHasCurrentOrFutureDate() {\n var todaysDate = new Date();\n if ($dpInput.val() && Date.parse($dpInput.val())) {\n var inputDate = new Date($dpInput.val());\n if (inputDate.setHours(0, 0, 0, 0) < todaysDate.setHours(0, 0, 0, 0)) {\n setDatePickerDate(todaysDate);\n }\n } else if (!Date.parse($dpInput.val())) {\n setDatePickerDate(todaysDate);\n }\n }\n\n $dpInput.datepicker({\n minDate: 0,\n maxDate: '+4m',\n constrainInput: true,\n defaultDate: +1,\n dayNamesMin: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n onClose: function () {\n $dpInput.data('datepicker').inline = false;\n }\n });\n\n $dpInput.on('focusin', function () {\n $dpInput.data('previous-value', $dpInput.val());\n });\n\n $dpInput.on('keydown', function (event) {\n if (event.keyCode === 13) { // enter key\n $dpInput.val($dpInput.data('selected-value'));\n ensurePickerHasCurrentOrFutureDate();\n closeDP();\n }\n });\n\n $dpInput.on('focusout', function () {\n ensurePickerHasCurrentOrFutureDate();\n });\n}\n\nmodule.exports = {\n init: function () {\n setupDatepicker();\n },\n\n /**\n * Input for gift custom amount\n */\n handleCustomValue: function () {\n $('[name$=\"_giftCardCustomAmount\"]').focus(function (e) {\n var $swatchClicked = $(e.currentTarget);\n var $productContainer = $swatchClicked.closest('.product-detail');\n var customValueUrl = $swatchClicked.closest('[data-attr-value=\"CUSTOM\"]').data('attr-url');\n attributeSelect(customValueUrl, $productContainer);\n });\n },\n\n /**\n * When custom amount is removed, the first tile amount should be pre-selected.\n */\n handleCustomValueBlur: function () {\n $('[name$=\"_giftCardCustomAmount\"]').on('blur', function () {\n var customAmount = $(this).val();\n if (window.digitalData && window.digitalData.page && window.digitalData.page.product && window.digitalData.page.product.productInfo) {\n window.digitalData.page.product.productInfo.giftCardValue = customAmount;\n window.digitalData.page.product.productInfo.price = customAmount;\n }\n if (customAmount === '') {\n clientSideValidation.functions.clearFieldInvalidState($('#giftCardCustomAmount')[0]);\n $('[data-attr=\"giftCardValueVariation\"] button').first().trigger('click');\n }\n });\n },\n\n /**\n * Gift message character countdown\n */\n giftMessageCount: function () {\n // Regex pattern will look for specific invalid characters or any character outside of the range U+0020 - U+00ff, U+2019 (right single quote)\n var invalidChars = /[#*>^`~]|[^\\u0020-\\u00ff\\u2019]/g;\n var textMax = 200;\n var textLength;\n\n $('#giftMessage').on('input change paste', function (e) {\n if (e.type === 'paste') {\n var paste = (e.originalEvent.clipboardData || window.clipboardData).getData('text');\n paste = paste.replace(invalidChars, ''); // Remove any invalid characters\n\n // Override the default behavior using event.preventDefault(),\n // then insert modified string manually.\n e.preventDefault();\n utils.insertAtInputCursor(this, paste);\n } else {\n $(this).val($('#giftMessage').val().replace(invalidChars, ''));\n }\n\n $(this).val($('#giftMessage').val().slice(0, textMax));\n textLength = $('#giftMessage').val().length;\n\n var textRemaining = textMax - textLength;\n var $countMessage = $('.count-message');\n var $countNumber = $('.count-message__number');\n\n $countNumber.html(textRemaining);\n $countMessage.toggleClass('exceeded', !textRemaining).toggleClass('active', !!textRemaining); // ! and !! to coerce the int to booleans\n\n return true;\n });\n },\n\n updateAddToCartFormData: function () {\n $('body').on('product:beforeAddToCart', function (evt, element) {\n var $container = $(element).closest('.product-detail');\n var fieldsToProcess = getSelectedGiftCardType($container) === 'virtual' ? virtualCardFields : physicalCardFields;\n\n $(element).on('updateAddToCartFormData', function (e, formObj) {\n var gcdetailsFormData = getFieldsData($container, fieldsToProcess);\n $.extend(formObj, gcdetailsFormData);\n });\n });\n },\n\n handleFormValidation: function () {\n $('body').on('product:afterAddToCart', function (e, data) {\n if (!data.success) {\n formValidation('form.gcdetails', data);\n } else {\n $('#giftMessage')[0].form.reset();\n // select the first value variation\n var $firstValueVariation = $('[data-attr=\"giftCardValueVariation\"] button').first();\n $firstValueVariation.addClass('selected');\n attributeSelect($firstValueVariation.data('attr-url'), $firstValueVariation.closest('.product-detail'));\n // reset the characters remaining count\n $('#giftMessage').trigger('change');\n }\n });\n },\n\n handleAddOrUpdateCardToCart: function () {\n $(document).on('click', 'button.add-card-to-cart, button.update-card-to-cart', function () {\n var $container = $(this).closest('.product-detail');\n var fieldsToProcess = getSelectedGiftCardType($container) === 'virtual' ? virtualCardFields : physicalCardFields;\n\n var isFormValid = getFieldsValidationStatus($container, fieldsToProcess);\n if (isFormValid) {\n if ($(this).hasClass('add-card-to-cart')) {\n $(this).parent().find('button.add-to-cart').trigger('click');\n } else {\n $('body').trigger('giftcard:updateCart');\n }\n } else {\n $container.find('form.gcdetails').trigger('submit');\n }\n });\n },\n\n updateCardAttributesForm: function () {\n $('body').on('product:afterAttributeSelect', function (e, response) {\n updateCardAttributesFormClass(response.container);\n });\n $('.product-detail').each(function () {\n updateCardAttributesFormClass($(this));\n });\n },\n\n selectAttribute: function () {\n $(document).on('click', '[data-attr=\"giftCardTypeVariation\"] button, [data-attr=\"giftCardDesignVariation\"] button, [data-attr=\"giftCardValueVariation\"] button', function (e) {\n e.preventDefault();\n var $swatchClicked = $(e.currentTarget);\n if ($swatchClicked.hasClass('disabled')) {\n return;\n }\n var $productContainer = $swatchClicked.closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $swatchClicked.closest('.product-detail');\n }\n\n $swatchClicked.off('mouseleave');\n attributeSelect($swatchClicked.data('attr-url'), $productContainer);\n });\n },\n\n updateToCart: function () {\n $('body').on('giftcard:updateCart', function () {\n $('body').trigger('product:beforeAddToCart', $('button.update-card-to-cart').get('0'));\n\n var updateProductUrl = $('.update-cart-url').val();\n var uuid = $('input[name$=_giftCardPliUUID]').val();\n var pid = $('.product-detail:not(\".bundle-item\")').data('pid');\n var form = {\n uuid: uuid,\n pid: pid,\n quantity: 1\n };\n\n $('button.update-card-to-cart').trigger('updateAddToCartFormData', form);\n\n global.quickview.startSpinner();\n\n $.ajax({\n url: updateProductUrl,\n type: 'post',\n context: this,\n data: form,\n dataType: 'json',\n success: function (data) {\n $('body').trigger('product:afterAddToCart', data);\n $.spinner().stop();\n if (data.success) {\n window.location = data.redirectUrl;\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n },\n /**\n * Gift card Custom amount length restrict to 3 digits\n * to compatible with the older versions of browsers like mozilla and IE10, IE11 we need to check the charachter code aswell\n */\n giftCardCustomAmountLength: function () {\n $('#giftCardCustomAmount').keypress(function (evt) {\n var charCode = (evt.which) ? evt.which : evt.keyCode;\n if ((charCode > 31 && (charCode < 48 || charCode > 57)) || this.value.length >= 3) {\n return false;\n }\n return true;\n });\n },\n giftCardInspirationModal: function () {\n $('body')\n .off('click', '.js-giftcard-inspiration-link')\n .on('click', '.js-giftcard-inspiration-link', () => {\n const modalContent = $('.js-giftcard-inspiration-asset').html();\n if (modalContent.length) {\n window.gcInspoModal = $.modal({\n content: modalContent,\n modalSizeClass: 'modal-xl modal-pad-fix js-giftcard-inspiration-modal'\n });\n }\n });\n\n $('body')\n .off('click', '.js-giftcard-inspiration-modal a')\n .on('click', '.js-giftcard-inspiration-modal a', (e) => {\n e.preventDefault();\n const attrValue = $(e.currentTarget).attr('href').replace(/\\D/g, '');\n const attrSelector = `[data-attr-value=${attrValue}]`;\n const $attrElement = $(attrSelector);\n\n if ($attrElement.length) {\n $attrElement.parent().trigger('click');\n }\n\n window.gcInspoModal.modal('hide');\n });\n }\n};\n","'use strict';\nconst giftCardHelpers = require('../helper/giftCardHelper');\nconst loyaltyHelpers = require('../checkout/loyalty');\nconst basketHelper = require('../helper/basketHelper');\n\n// GIFT CARD : Module contains all the functions for Gift card.\nconst giftCard = () => {\n /**\n * Add method is used to apply a gift card, method invoked on click of apply button.\n * once a card is successfully applied, refresh the Order total.\n * @param {string} giftCardId GiftCertificated ID\n * @param {string} giftCardPin Gift Certificate Pin\n * @param {string} csrfToken - csrfToken to use in request\n * @param {string} addGCUrl DW service url to add the gift card\n */\n const addGiftCard = (giftCardId, giftCardPin, csrfToken, addGCUrl) => {\n $.spinner().start();\n $.ajax({\n url: addGCUrl,\n type: 'POST',\n data: {\n giftCertID: giftCardId,\n giftCertPin: giftCardPin,\n csrf_token: csrfToken\n }\n })\n .always(() => {\n $.spinner().stop();\n })\n .done((data) => {\n if (data.giftCard) {\n if (data.giftCard.valid) {\n // clear the form so another gift card can be entered\n $('#gift-refund-code, #gift-refund-pin').val('').trigger('change')\n .closest('.form-group')\n .removeClass('focus-fill');\n // remove invalid error\n $('#gift-refund-code').removeClass('is-invalid')\n .closest('.form-group')\n .removeClass('is-invalid');\n // display a success banner\n $.alert({\n content: data.giftCard.successMsg,\n placement: 'banner',\n theme: 'success'\n });\n if (data.giftCard.isFullCovered) {\n giftCardHelpers.updateCreditCardFields(false);\n $('#selectedPaymentOption').val('GIFT_CERTIFICATE');\n $('.billing-payment-options-block').data('fully-covered', data.giftCard.isFullCovered);\n\n const $rewardsBannerRedemption = $('.rewards-balance-redemption-banner');\n if ($rewardsBannerRedemption.length && data.basket.paymentInstrumentsDetails && data.basket.paymentInstrumentsDetails.loyaltyRewardsDetails && !data.basket.paymentInstrumentsDetails.loyaltyRewardsDetails.isLoyaltyRewardsApplied) {\n $('.js-apply-loyalty-rewards').hide();\n }\n }\n } else {\n $('#gift-refund-code').addClass('is-invalid').closest('.form-group').addClass('is-invalid');\n $('.csc-checkout-gift-card-error').text(data.giftCard.status.message).show()\n .closest('.form-group')\n .addClass('has-danger');\n }\n }\n\n if (data.basket) {\n giftCardHelpers.updateGiftCardlist(data.basket);\n giftCardHelpers.updatePaymentsection(data.basket);\n giftCardHelpers.updateOrderSummary(data.basket.totals);\n loyaltyHelpers.updateForecastedRewards(data.basket.rewards);\n }\n\n if (data.rewardsCard) {\n basketHelper.updateRewardsCardAndBanner(data);\n }\n });\n };\n\n /**\n * removeGiftCard method is used to remove an applied gift card, method is invoked on click of remove button in billing section.\n * once removed, the Order total needs to be refreshed.\n * @param {string} uuid Transaction id for the Gift Card\n * @param {string} removeGCUrl DW service url to remove the gift card\n */\n const removeGiftCard = (uuid, removeGCUrl) => {\n $.ajax({\n url: removeGCUrl,\n type: 'POST',\n data: {\n uuid: uuid\n }\n })\n .done((data) => {\n if (data.giftCard && data.giftCard.valid && data.basket) {\n giftCardHelpers.updateGiftCardlist(data.basket);\n giftCardHelpers.updatePaymentsection(data.basket);\n giftCardHelpers.updateOrderSummary(data.basket.totals);\n loyaltyHelpers.updateForecastedRewards(data.basket.rewards);\n $('.billing-payment-options-block').data('fully-covered', false);\n }\n\n if (data.rewardsCard) {\n basketHelper.updateRewardsCardAndBanner(data);\n }\n });\n };\n\n\n // Public API\n return {\n addGiftCard: addGiftCard,\n removeGiftCard: removeGiftCard\n };\n};\n\n\n/* ########## INITIALIZATION ########## */\n(() => {\n /**\n * event triggered on click of apply button in checkout-payment stage.\n * Gift card ID and pin sent to server. on successful validation it's added to cart.\n */\n $(document).on('click', '.btn-apply-gift-refund', function () {\n const $giftCardId = $('#gift-refund-code');\n const csrfToken = $('.js-gc-csrf').val();\n const $giftCardPin = $('#gift-refund-pin');\n const giftCardIdVal = $giftCardId.val().trim();\n const giftCardPinVal = $giftCardPin.val();\n let hasError = false;\n\n // clear error states\n $('.csc-checkout-gift-card-error').text('').hide()\n .closest('.form-group')\n .removeClass('has-danger');\n $giftCardId.parent().find('.invalid-feedback').text('').hide();\n $giftCardPin.parent().find('.invalid-feedback').text('').hide();\n\n $giftCardId.val(giftCardIdVal);\n if (!giftCardIdVal) {\n $giftCardId.parent().find('.invalid-feedback').text($giftCardId.data('missing-error')).show();\n $giftCardId.addClass('is-invalid').closest('.form-group').addClass('is-invalid');\n hasError = true;\n } else if (/\\D/.test(giftCardIdVal)) {\n $giftCardId.parent().find('.invalid-feedback').text($giftCardId.data('parse-error')).show();\n $giftCardId.addClass('is-invalid').closest('.form-group').addClass('is-invalid');\n hasError = true;\n }\n\n if (!giftCardPinVal) {\n $giftCardPin.parent().find('.invalid-feedback').text($giftCardPin.data('missing-error')).show();\n hasError = true;\n } else if (/\\D/.test(giftCardPinVal)) {\n $giftCardPin.parent().find('.invalid-feedback').text($giftCardPin.data('parse-error')).show();\n hasError = true;\n }\n\n if (!hasError) {\n const addGCUrl = $(this).data('action');\n giftCard().addGiftCard(giftCardIdVal, giftCardPinVal, csrfToken, addGCUrl);\n }\n });\n\n /**\n * event triggered on click of remove button in checkout-payment stage.\n * if the transaction ID is valid, corresponding Gift card is removed from cart and amount is reclaimed.\n */\n $(document).on('click', '.btn-remove-gift-refund', function () {\n const $removeBtn = $(this);\n giftCard().removeGiftCard($removeBtn.data('uuid'), $removeBtn.data('action'));\n });\n\n /**\n * On load hide the gift card table in checkout page.\n */\n $('.js-gift-card-list').hide();\n $('.row-amount-due').hide();\n\n $('#gift-refund-code, #gift-refund-pin').stripInvalidChars(/\\D/g);\n})();\n\nmodule.exports = giftCard;\n"],"sourceRoot":""}