{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///(webpack)/buildin/global.js","webpack:///./.tmp/app_sor_core/js/components/utils.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/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:///./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/helper/basketHelper.js","webpack:///./.tmp/app_sor_core/js/util.js","webpack:///./cartridges/app_brand_core/cartridge/client/default/js/components/utils.js","webpack:///./cartridges/app_brand_core/cartridge/client/default/js/components/breakpoints.js","webpack:///./.tmp/app_sor_core/js/components/cartutils.js","webpack:///./.tmp/app_sor_core/js/order/promoCode.js","webpack:///./cartridges/app_brand_core/cartridge/client/default/js/product/onModelDescription.js","webpack:///./.tmp/app_sor_core/js/cart.js","webpack:///./.tmp/app_sor_core/js/cart/cart.js","webpack:///./cartridges/app_brand_core/cartridge/client/default/js/product/quickView.js","webpack:///./cartridges/app_brand_core/cartridge/client/default/js/product/base.js","webpack:///./cartridges/app_brand_core/cartridge/client/default/js/product/badge.js","webpack:///./cartridges/app_brand_core/cartridge/client/default/js/product/overview.js","webpack:///./cartridges/app_brand_core/cartridge/client/default/js/components/minicartSaleItemAlertBadge.js","webpack:///./cartridges/app_brand_core/cartridge/client/default/js/components/reservationTimer.js","webpack:///./cartridges/app_brand_core/cartridge/client/default/js/product/loyalty.js","webpack:///./cartridges/app_brand_core/cartridge/client/default/js/product/imageGallery.js","webpack:///./node_modules/lodash/throttle.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","freeGlobal","require","freeSelf","self","root","isObject","now","toNumber","nativeMax","max","nativeMin","min","func","wait","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","TypeError","invokeFunc","time","args","thisArg","apply","leadingEdge","setTimeout","timerExpired","shouldInvoke","timeSinceLastCall","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","arguments","clearTimeout","cancel","flush","baseGetTag","isObjectLike","reservationTimerIdSelector","getExpireTime","data","destroyTimer","$timerBanner","reservationInterval","clearInterval","resources","reservation","reservationSecondsRemaining","trigger","getRemainingSeconds","expireTime","getTime","secondsRemaining","parseInt","popBanners","messages","remainingSeconds","msgKeys","msgKey","msg","startTime","message","additionalContent","alert","placement","theme","id","containerId","timeToLive","createTimeString","mins","secs","updateReservationTimer","text","toggleClass","startTimer","initialTimeStr","timeRemainingMessage","setInterval","autoClose","init","not","getDestroyTimer","updateReservationData","response","getRawTag","objectToString","symToStringTag","baseTrim","isSymbol","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","other","valueOf","isBinary","test","trimmedEndIndex","reTrimStart","string","reWhitespace","objectProto","nativeObjectToString","toString","isOwn","tag","unmasked","toggleAlertBadge","$icon","hasAlertWrapper","parent","hasClass","clientData","priceDropModalEnabled","sessionStorage","getItem","hasSaleItemInCart","digitalData","cart","item","some","isSaleItem","wrap","unwrap","focusHelper","getPidValue","$el","closest","getQuantitySelector","quantitySelected","quantitySelectedModal","quantitySelectedPDP","getQuantitySelected","handleVariantResponse","$productContainer","isVaraint","isChoiceOfBonusProducts","parents","product","variationAttributes","attrs","msgs","attrsWithSwatches","attr","values","attrValue","$attrValue","$swatchButton","selected","addClass","siblings","assistiveSelectedText","removeClass","empty","removeAttr","selectable","processSwatchValues","$attr","resetUrl","processNonSwatchValues","updateAttrs","productType","readyToOrder","imgs","carousel","carouselId","alt","appendTo","first","detach","createCarousel","images","large","replaceWith","price","promotionsHtml","availabilityValue","availabilityMessages","availability","info_selectforstock","updateAvailability","attributes","attributeGroup","ID","attribute","label","getAttributesHtml","attributeSelect","selectedValueUrl","container","ajax","method","success","optionsHtml","updateOptions","quantities","quantity","updateQuantities","spinner","stop","error","parseHtml","$html","parseHTML","body","children","chooseBonusProducts","bonusUrl","bonusChoiceRuleBased","showProductsUrlRuleBased","showProductsUrlListBased","htmlString","maxBonusItems","uuid","pliUUID","addToCartUrl","pageSize","labels","selectprods","dataType","parsedHtml","renderedTemplate","enterDialogMessage","closeButtonText","modal","getOptions","$elOption","urlValue","selectedValueId","optionId","toArray","miniCartReportingUrl","methods","editBonusProducts","focusChooseBonusProductModal","on","focus","onClosingChooseBonusProductModal","trapChooseBonusProductModalFocus","focusParams","event","containerSelector","firstElementSelector","lastElementSelector","setTabNextFocus","colorAttribute","preventDefault","selectAttribute","currentTarget","addToCart","pid","pidsObj","setPids","each","qty","childProducts","form","messageType","newBonusDiscountLineItem","handlePostCartAdd","reportingURL","selectBonusProduct","$choiceOfBonusProduct","maxPids","submittedQty","totalQty","optionID","valueId","selectedBonusProductHtml","removeBonusProduct","$selected","count","enableBonusProductSelection","available","showMoreBonusProducts","addBonusProductsToCart","$readyToOrderBonusProducts","queryString","pidsObject","bonusProducts","qtyOption","option","productId","errorMessage","msgSuccess","reload","keyCode","firstFocusableEl","lastFocusableEl","is","nextToLastElementSelector","linkElements","shiftKey","constructor","target","ssrDocument","removeEventListener","activeElement","blur","nodeName","querySelector","querySelectorAll","getElementById","createEvent","initEvent","childNodes","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","__proto__","set","makeReactive","super","Array","arrayFlat","res","isArray","arrayFilter","filter","context","trim","toCreate","tempParent","innerHTML","a","nodeType","uniqueArray","fn","support","deviceCached","browser","Methods","classes","classNames","classList","add","className","contains","toggle","getAttribute","attrName","removeAttribute","transform","transition","duration","transitionDuration","eventType","targetSelector","listener","capture","handleLiveEvent","eventData","dom7EventData","unshift","handleEvent","j","events","dom7LiveListeners","proxyListener","dom7Listeners","off","handlers","handler","dom7proxy","splice","evt","detail","bubbles","cancelable","dataIndex","dispatchEvent","transitionEnd","dom","fireCallBack","outerWidth","includeMargins","styles","parseFloat","outerHeight","offset","box","getBoundingClientRect","clientTop","clientLeft","scrollY","scrollX","css","props","textContent","compareWith","matches","webkitMatchesSelector","msMatchesSelector","child","previousSibling","eq","returnIndex","newChild","els","tempDiv","firstChild","prepend","insertBefore","next","nextElementSibling","nextAll","nextEls","prev","previousElementSibling","prevAll","prevEls","parentNode","foundElements","found","removeChild","nextTick","delay","getTranslate","matrix","curTransform","transformMatrix","axis","curStyle","currentStyle","WebKitCSSMatrix","webkitTransform","MozTransform","OTransform","MsTransform","msTransform","m41","m42","node","to","noExtend","nextSource","HTMLElement","keysArray","nextIndex","len","nextKey","desc","getOwnPropertyDescriptor","__swiper__","setCSSProperty","varName","varValue","setProperty","animateCSSModeScroll","side","swiper","targetPosition","startPosition","translate","params","speed","wrapperEl","scrollSnapType","cssModeFrameID","dir","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","match","ipad","ipod","iphone","windows","macos","os","getBrowser","isSafari","isWebView","transitionEmit","step","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","stopPropagation","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","stopImmediatePropagation","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","once","onceHandler","__emitterProxy","onAny","eventsAnyListeners","offAny","eventHandler","update","Number","isNaN","size","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","ceil","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","initial","Error","indexAsNumber","isFinite","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","sort","b","wasLocked","lastSlideIndex","lastSlideRightEdge","addClasses","suffixes","entries","prefix","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","wrapper","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","cache","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","timeout","mousewheel","releaseOnEdges","invert","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","position","sticky","shift","prevEvent","firstEvent","snapToThreshold","autoplayDisableOnInteraction","getEl","toggleEl","disabled","disabledClass","tagName","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","render","paginationHTML","numberOfBullets","dragStartPos","dragSize","trackSize","divider","dragTimeout","scrollbar","$dragEl","newSize","newPos","hide","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","array","interpolate","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","random","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","minicartSaleItemAlertBadge","isCartPage","createErrorNotification","removeProductModal","$this","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","include","isCurrentBreakpointAbbreviation","breakpointAbbreviation","$breakpointIndicator","isLowRes","isCurrentBreakpoint","isHighRes","abbreviation","getCurrentBreakpoint","currentBP","$bpIndicator","toggleGoToContent","show","toggleErrorOnCSRF","$promoCSRFErrorContainer","csrferror","isPromoCodeApplied","totals","promoCode","discounts","applied","$mainPDPGallery","$modelDescription","getOnModelData","onModelValue","modelKey","modelObject","onModelObj","modelValue","variantUPC","modelDescription","imageModelData","modelDataValue","modelImg","triggerOnModelDescription","imageclick","processInclude","ready","quantityChangeDebounce","$idMeDrawer","baseQuickViewJS","cartutils","throttle","basketHelper","lineItem","$productCard","$availabilityMsgContainer","dismissible","removeDeletedProductCards","uuidArray","updateAllProductCards","UUID","isBonusProductLineItem","renderedPromotions","priceTotal","renderedPrice","isGiftCard","priceItem","$velocityMessageContainer","velocityMessage","updateVelocityMessaging","quantityOptions","minQuantity","minOrderQuantity","maxQuantity","maxOrderQuantity","qtyValue","updateProductQuantity","itemWillEarnRewards","Boolean","updateCartTotals","numberOfItems","$summaryContainer","freeShippingText","localizedFreeShippingText","isAdjustedShippingCostFree","adjustedShippingTotalCost","subTotal","totalShippingCost","totalTax","grandTotal","$orderDiscountRow","orderLevelDiscountTotal","discountTotal","$discountDetailsContainer","discountDetailMarkup","discount","relationship","discountRelationship","promotionID","formattedPrice","lineItemText","$loyaltyDiscountRow","showLoyaltyTotal","loyalty","shippingMethods","$shippingMethodSelect","selectedShippingMethod","shippingMethod","displayName","shippingCost","updateShippingMethodsSelect","shipments","klarnaPriceValue","Klarna","OnsiteMessaging","refresh","createApproachingDiscountContent","progressPct","showDetails","discountDetails","discountEarned","conditionThreshold","distanceFromThreshold","discountMsg","approachingDiscountsText","updateApproachingDiscounts","approachingDiscounts","$approachingDiscountsBox","maxDiscountAlerts","limit","alertContent","icon","progressArc","slideDown","slideUp","updateDTM","propsToUpdate","validateBasket","valid","emptyCartMsg","addPromoCode","$form","$couponCodeField","$errorMessageDiv","promoCodeToBeAdded","serialize","successMsg","discountSuccessText","isFullyCoveredByPromoCode","resetShareCartForm","$cartShareModal","$shareForm","reset","asyncLoadProductCards","requestUrl","$cartContainer","$sflContainer","pageUrl","newUrl","asyncProductLineItemsURL","$markup","$cart","$sfl","$cardContainer","$productsList","newQuantity","quantityUpdated","editBonusProduct","pageStart","moreURL","always","editLineItemSuccessHandler","sizeId","cartModel","hideQuickview","newProductId","small","colorAttr","attributeId","sizeAttr","dimensionAttr","displayValue","$sizeElement","additionalSizeOptions","sizeOption","$sku","sales","decimalPrice","updateProductDetails","uuidToBeDeleted","cartUpdated","numberOfReservableProducts","preQuickViewModalDigitalData","restoreDTM","idMe","showIdMeSuccess","idMeSuccessMessage","dw","applepay","ApplePaySession","canMakePayments","currentVal","$thisQtyField","preSelectQty","maxValue","prevQuantity","quantityUpdate","editProductUrl","launchEditProduct","isSaveForLater","autoUpdatedItems","itemList","$dialog","$globalAvailability","updateGlobalAddToCart","source","$updateCartUrl","startSpinner","open","drawer","destroyOnClose","returnFocusTo","methodID","$existingModal","then","$modal","$modalForm","$recaptchaBtn","registerButtonAsRecaptchaTrigger","$emailInvalidFeedback","$emailHelpText","validateForm","isValidEmail","parentSelector","containerAttachment","maxLength","originalSize","targetUrl","selectedQuantity","targetData","updateItemSize","$productElement","hideInvalidProducts","hideValidProducts","$validProducts","$invalidProducts","discountsHtml","autoDeletedItems","isOrderable","initialBonusProducts","currentBonusProducts","addedBonusProducts","currentItem","initialItem","removedBonusProducts","handleCartBonusProductChanges","tooltip","$stickyCheckout","$standardCheckout","displayStickyCheckout","isInViewport","initStickyCheckoutOnLoad","initStickyCheckoutButton","ImageGallery","initialPageLoad","createQVModal","modalMarkup","initGallery","isQuickview","galleryContainerSelector","launchQuickview","quickViewUrl","successHandler","$modalContainer","looksPdpUrl","basePDPUrl","setItem","setItemMulti","slick","infinite","slidesToScroll","slidesToShow","responsive","isEverythingSelected","$swatchSelected","selectedAttributeID","quickViewSwatchFunctionality","updateOOSColorVariants","forceOOSNotifyMe","parentElement","pageInfo","pageHier","disableScroll","updateViewDetailsURL","OOSSelectedProductUrl","responseDataProduct","selectedProductUrl","masterId","$pdpLinks","OOSSelectedAttributes","urlSizeParameter","initQuickview","link","qvPid","$productTile","qvLink","removeItem","initExclusiveEvents","$modalBody","beforeAddToCart","afterAddToCart","updateAttribute","materialStyleNumber","updateAddToCart","disableAddToCart","buttonText","every","variationAttr","prevObject","notifyme","isMaster","allAvailable","allReady","closeQuickview","closeQuickviewButton","onSelectAttribute","selectedValue","$swatchClicked","attrType","attributeLabelValue","$swatchEntered","outOfStockText","setSelectedValue","onModel","Badge","Overview","oosData","$productObject","topLevelAttribute","$swatchSpan","$swatchAnchor","swatchOutOfStockText","enableNotifyMe","variantData","color","bisnflag","isNotifyMeEnabled","preventScroll","masterSelectable","pdpUrl","getSkuValues","skuArray","attributeID","sku","attributeValue","getSelectedSwatchValue","variantID","swatchArrays","swatchKeys","markOOSColorVariants","colorVariantArrays","colorVariantKeys","colorVarKey","masterID","String","productCache","variantMatrix","inventory","sizeVariantArrays","sizeVariantKeys","dimVariantArrays","dimension","dimVariantKeys","selectedSize","selectedDim","oosVariants","variant","productObject","topLevelArray","allAttributes","selectedCount","attrOutOfStockText","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","idx","imageData","badgeHTML","displayBadge","techBadgeHTML","displayTechBadge","swiperSlideClass","$swiperImg","$zoomControls","$styliticsLink","videoUrl","productVideoAltText","posterUrl","onModelAttribute","modelData","jumplinkCta","retinaUrl","onColorVariantHover","altText","productThumbnailAltText","product_VideoData","productVideoData","videoData","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","class","cssClass","outerHTML","colorValue","sizeValue","dimensionValue","getUserSelectedAttributes","galleryURL","$$productGalleryContainer","$productGallery","$productGalleryThumb","pageURL","attributeType","$existingOldChemistryListItem","oldChemistryText","$prop65ListItemElement","oldChemistryListItemHTMLString","after","updateOldChemistryMessaging","$addToCartButton","$swatchAttributes","swatchGroupSelectors","allAttributesSelected","popupAlignment","$popup","viewportWidth","elementCenter","popupHalfWidth","showOutOfStockPopup","$sizeSwatch","thisSwatch","disabledAddToCartHandler","$dimElement","$sizeSwatchSelected","onClickAddToCartButtonDisabled","updateSwatchAttributeLabel","$swatch","$selectedAttrUrl","selectedAttrUrl","$url","$dimensionSwatches","$selectedAttr","appendDimensionParams","currentLabelText","sizeSwatch","searchPID","isNumeric","quantityTotal","isReservable","reservableProduct","hasError","hideMinicartTimeout","$notifymeVariant","hideForm","overviewInit","gridBadge","badgeType","gridBadgeValue","gridBadgeDisplay","hasSaleSwatchSelected","hideDynamicBadges","isStaticType","svg","svgClass","svgWidth","svgHeight","svgID","closeModal","buildModal","launchModal","highlightMultiplierReward","rewardsData","rewardsHtml","$mainGallery","$thumbnailGallery","swiperMain","swiperThumb","player","initVideoPlayer","$videoSlide","playerHost","videoId","playerId","tagId","firstScriptTag","videoPlayerObserver","videoPlayers","subtree","pauseVideo","initGalleryEvents","$imageClicked","$selectedColorSwatch","basePid","modalHTML","$zoomModal","imageIndexToZoom","zoomViewerHeight","modalBodyPadding","zoomIndex","$zoomViewer","$bigImg","$elem","hiResImage","imgX","imgY","viewerWidth","viewerHeight","difWidth","difHeight","viewerOffset","$activeThumb","initZoom","setImageUrl","galleryConfig","galleryElements","config","hasThumbnails","gallerySelector","thumbnailSelector","$galleryContainer","$gallery","$thumbnail","getGalleryElements","$main","swiperGalleryMain","swiperConfigMain","swiperGalleryThumb","initSwiperGallery","debounce"],"mappings":"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","file":"cart.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 = 108);\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","/**\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","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';\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');\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","'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// 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\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","'use strict';\nvar utils = require('../components/utils');\n\n/**\n * to show go to text message in case discount coupon are applied directly on cart\n * @param {string} show flag to enable/disable gototext container\n * @param {Object} data data object holding the content to append to the div container\n */\nfunction toggleGoToContent(show, data) {\n if (show && data.content) {\n var html = utils.createModalMarkup(data.content, { title: 'Error' });\n var $modal = $(html).modal();\n\n // listen for events\n $modal\n .on('shown.bs.modal', function () {\n }).on('hide.bs.modal', function () {\n });\n } else {\n $('.promo-goto-link').remove();\n $('.promo-goto-text').remove();\n $('.promo-goto-text-container').addClass('d-none');\n }\n}\n\n/**\n * to show error message when CSRF issue is encountered in case discount coupon are applied on cart or checkout or discount program page\n * @param {string} show flag to enable/disable gototext container\n * @param {Object} data data object holding the alert content\n */\nfunction toggleErrorOnCSRF(show, data) {\n const $promoCSRFErrorContainer = $('.js-promo-error-on-csrf-container');\n\n if (show && data.csrferror) {\n $promoCSRFErrorContainer.alert({\n content: data.csrferror,\n theme: 'danger',\n autoClose: false\n });\n } else {\n $promoCSRFErrorContainer.empty();\n }\n}\n\nmodule.exports = {\n toggleGoToContent: toggleGoToContent,\n toggleErrorOnCSRF: toggleErrorOnCSRF\n};\n","/**\n * Checks if a promo code is applied to the given totals object\n * @param {totals} totals totals with promo code added\n * @param {string} promoCode Promo or coupon code to check\n * @returns {boolean} True if the coupon is present and applied, false otherwise\n */\nconst isPromoCodeApplied = function (totals, promoCode) {\n return !!(totals.discounts.find(function (d) {\n return d.couponCode === promoCode && d.applied;\n }));\n};\n\nmodule.exports = {\n isPromoCodeApplied\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\nvar processInclude = require('./util');\n\n$(document).ready(function () {\n processInclude(require('./cart/cart'));\n});\n","'use strict';\n\n/* global _satellite */\n\nconst baseQuickViewJS = require('brand_core/product/quickView');\nconst breakpoints = require('brand_core/components/breakpoints');\nconst utils = require('../components/utils');\nconst cartutils = require('../components/cartutils');\nconst throttle = require('lodash/throttle');\nconst promoCode = require('../order/promoCode');\nconst basketHelper = require('../helper/basketHelper');\nconst minicartSaleItemAlertBadge = require('../components/minicartSaleItemAlertBadge');\n\nlet quantityChangeDebounce;\nlet $idMeDrawer;\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 * Dynamically creates modal. Used by `.js-cart-modal` on `.share-my-cart .btn`\n * @param {Object} $this - element from create login modal event\n */\nfunction createModal($this) {\n const $existingModal = $(`#${$this.data('id')}`);\n if (!$existingModal.length) {\n $.get($this.data('url')).then((data) => {\n const $modal = $.modal({\n title: $this.data('title'),\n content: data,\n modalSizeClass: 'modal-md',\n modalId: $this.data('id'),\n customClasses: $this.data('customClasses')\n });\n\n $modal.on('shown.bs.modal', () => {\n const $modalForm = $modal.find('form');\n const $recaptchaBtn = $modalForm.find('.btn-recaptcha');\n /* global registerButtonAsRecaptchaTrigger */\n registerButtonAsRecaptchaTrigger($recaptchaBtn);\n $modalForm.trigger('form:created');\n });\n });\n } else {\n $existingModal.modal('show');\n }\n}\n\n/**\n * Updates the shipping methods select box with new/updated options.\n * @param {Array} shippingMethods array of shipping methods data\n */\nfunction updateShippingMethodsSelect(shippingMethods) {\n if (shippingMethods && shippingMethods.length) {\n const $shippingMethodSelect = $('.shippingMethods');\n const selectedShippingMethod = $shippingMethodSelect.find(':selected').val();\n $shippingMethodSelect.empty();\n\n shippingMethods.forEach((shippingMethod) => {\n $shippingMethodSelect.append(``);\n });\n }\n}\n\n/**\n * Updates the availability of a product line item\n * @param {Object} lineItem - AJAX response from the server\n * @param {jQuery} $productCard - The product card in which to update the availability messaging\n */\nfunction updateAvailability(lineItem, $productCard) {\n const $availabilityMsgContainer = $productCard.find('.product-card__availability').empty();\n\n if (lineItem.availability && lineItem.availability.messages) {\n lineItem.availability.messages.forEach(function (message) {\n $availabilityMsgContainer.alert({\n content: message.content,\n theme: message.theme,\n dismissible: false,\n autoClose: false\n });\n });\n }\n}\n\n/**\n * Updates the availability of a product line item\n * @param {Array} uuidArray - An array of product line item UUIDs that had their quantity auto-updated by the server\n */\nfunction updateCartQuantityChangeMessage(uuidArray) {\n uuidArray.forEach(uuid => {\n const $productCard = $(`.product-card[data-uuid=${uuid}]`);\n const newQuantity = $productCard.find('.js-quantity').val();\n\n const syntheticLineItem = {\n availability: {\n messages: [{\n content: window.resources.quantityUpdated.replace('{0}', newQuantity),\n theme: 'danger',\n dismissible: true\n }]\n }\n };\n updateAvailability(syntheticLineItem, $productCard);\n });\n}\n\n/**\n * Removes product card when an item has been automatically deleted by cart middleware\n * @param {Array} uuidArray - An array of product line item UUIDs deleted by the server\n */\nfunction removeDeletedProductCards(uuidArray) {\n uuidArray.forEach(uuid => {\n const $productCard = $(`.product-card[data-uuid=${uuid}]`);\n $productCard.remove();\n });\n}\n\n/**\n * Updates the velocity messaging of a product line item (\"Only 4 left, order soon\")\n * @param {Object} lineItem - AJAX response from the server\n * @param {jQuery} $productCard - The product card in which to update the velocity messaging\n */\nfunction updateVelocityMessaging(lineItem, $productCard) {\n const $velocityMessageContainer = $productCard.find('.line-item__message--velocity').empty();\n\n if (lineItem.velocityMessage && lineItem.velocityMessage.messages && lineItem.velocityMessage.messages.length) {\n lineItem.velocityMessage.messages.forEach(message => {\n $velocityMessageContainer.append(`\n
      \n \n ${message.text}\n
      \n `);\n });\n }\n}\n\n/**\n * Updates product's quantity drop-down options on cart page\n * @param {Object} lineItem - AJAX response from the server\n */\nfunction updateProductQuantity(lineItem) {\n if (lineItem && lineItem.quantityOptions && lineItem.quantity) {\n const minQuantity = lineItem.quantityOptions.minOrderQuantity;\n const maxQuantity = lineItem.quantityOptions.maxOrderQuantity;\n\n if (minQuantity && maxQuantity && minQuantity <= maxQuantity) {\n const $qtyField = $(`.product-card[data-uuid=${lineItem.UUID}]`).find('.js-quantity');\n const qtyValue = Math.min(Math.max(lineItem.quantity, minQuantity), maxQuantity); // make sure qty is between min and max\n\n $qtyField.attr({ min: minQuantity, max: maxQuantity });\n $qtyField.val(qtyValue);\n\n if (!lineItem.isGiftCard) {\n $qtyField.closest('.input-group').find('.js-quantity-add')\n .prop('disabled', (qtyValue >= maxQuantity)); // toggle disabled state of + button\n }\n }\n }\n}\n\n/**\n * Updates all the product cards on the cart page\n * @param {Object} items Response data from server\n */\nfunction updateAllProductCards(items) {\n items.forEach(function (lineItem) {\n const $productCard = $(`.product-card[data-uuid=${lineItem.UUID}]`);\n\n if (!lineItem.isBonusProductLineItem) {\n $productCard.find('.line-item-promo').html(lineItem.renderedPromotions);\n }\n\n $productCard.find(`.item-total-${lineItem.UUID}`).html(lineItem.priceTotal.renderedPrice);\n\n if (!lineItem.isGiftCard) {\n $productCard.find('.product-card__price .price').html(lineItem.priceItem.renderedPrice);\n }\n\n updateAvailability(lineItem, $productCard);\n updateVelocityMessaging(lineItem, $productCard);\n updateProductQuantity(lineItem);\n\n // Forecasted Loyalty\n const itemWillEarnRewards = Boolean(lineItem.rewards && lineItem.rewards.promoRewards.value > 0);\n $productCard.find('.js-cart-rewards-message').toggleClass('d-none', !itemWillEarnRewards);\n $productCard.find('.js-cart-rewards-message-zero').toggleClass('d-none', itemWillEarnRewards);\n\n if (itemWillEarnRewards) {\n $productCard.find('.js-cart-loyalty-actual').text(lineItem.rewards.promoRewards.formatted);\n $productCard.find('.js-cart-loyalty-strike').html(lineItem.rewards.strikeThrough); // This value contains HTML tags, hence html() vs text()\n }\n });\n}\n\n/**\n * re-renders the order totals and the number of items in the cart\n * @param {Object} data - AJAX response from the server\n */\nfunction updateCartTotals(data) {\n $('.js-number-items').text(data.resources.numberOfItems);\n\n // broadcast events\n $(document).trigger('addRemoveCoupon:updateShippingMethod', data);\n $(document).trigger('minicart:updatecount', data.numItems);\n window.dispatchEvent(new Event('cart:updated:dtm'));\n\n const $summaryContainer = $('.order-totals-wrapper');\n const freeShippingText = window.resources && window.resources.localizedFreeShippingText;\n const isAdjustedShippingCostFree = freeShippingText && data.totals.adjustedShippingTotalCost.toLowerCase() === freeShippingText.toLowerCase();\n\n // Subtotal, shipping, tax, grand total\n $('.js-subtotal-value').text(data.totals.subTotal);\n $summaryContainer.find('.shipping-total-cost').text(isAdjustedShippingCostFree ? data.totals.adjustedShippingTotalCost : data.totals.totalShippingCost);\n $summaryContainer.find('.tax-total').text(data.totals.totalTax);\n $summaryContainer.find('.grand-total-sum').text(data.totals.grandTotal);\n\n // Order-level discount\n const $orderDiscountRow = $summaryContainer.find('.order-discount');\n $orderDiscountRow.toggleClass('hide-order-discount', !data.totals.orderLevelDiscountTotal.value);\n $orderDiscountRow.find('.value').text(`- ${data.totals.orderLevelDiscountTotal.formatted}`);\n\n // \"You Save\" discount details\n $('.total-discount').toggleClass('hide-order-discount', !(data.totals.discountTotal && data.totals.discountTotal.value));\n $('.total-discount-text').text((data.totals.discountTotal && data.totals.discountTotal.formatted) || '');\n\n if (data.totals.discounts) {\n const $discountDetailsContainer = $('#discountDetails');\n const discountDetailMarkup = (label, value) => `\n
      \n
      ${label}
      \n
      ${value}
      \n
      \n `;\n\n $discountDetailsContainer.empty();\n data.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 // Loyalty discount\n const $loyaltyDiscountRow = $summaryContainer.find('.loyalty-discount');\n $loyaltyDiscountRow.toggleClass('hide-order-discount', !(data.totals.showLoyaltyTotal && data.totals.loyalty && data.totals.loyalty.value > 0));\n $loyaltyDiscountRow.find('.loyalty-discount-total').text(`- ${(data.totals.loyalty && data.totals.loyalty.formatted) || ''}`);\n\n // Update shipping methods list\n updateShippingMethodsSelect(data.shipments[0].shippingMethods);\n\n // update Klarna Placements\n const klarnaPriceValue = data.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 // Update PayPal option amount.\n if ($('.js_braintree_paypal_cart_button').length) {\n $('body').trigger('braintree:updateCartTotals');\n }\n}\n\n/**\n * Render approaching discount template\n * @param {Object} discount - cart model approachingDiscount object\n * @returns {string} alertContent - HTML string for the approaching discount alert content.\n * Should match the approachingDiscounts.isml template\n */\nfunction createApproachingDiscountContent(discount) {\n const showDetails = discount.discountDetails && discount.discountDetails !== 'null';\n let progressPct;\n if (discount.discountEarned) {\n progressPct = 100;\n } else {\n progressPct = discount.conditionThreshold ? (discount.conditionThreshold - discount.distanceFromThreshold) / discount.conditionThreshold : 0;\n }\n\n const alertContent = `
      \n
      \n \n
      \n
      \n ${discount.discountMsg}\n \n
      \n
      `;\n\n return alertContent;\n}\n/**\n * Re-renders the approaching discount messages. First remove any existing alerts\n * Next loop through the discounts that were returned and display the alert.\n * Q3 2024 update: display approaching discount messages - max set by site preference maxDiscountAlerts\n * @param {Object} approachingDiscounts - updated approaching discounts and earned bonus product discounts for the cart\n */\nfunction updateApproachingDiscounts(approachingDiscounts) {\n const $approachingDiscountsBox = $('.approaching-discount');\n const maxDiscountAlerts = (window.resources && window.resources.cart && window.resources.cart.maxDiscountAlerts) || 3;\n\n $('.approaching-discount .alert').remove();\n\n if (approachingDiscounts.length) {\n const limit = approachingDiscounts.length <= maxDiscountAlerts ? approachingDiscounts.length : maxDiscountAlerts;\n\n for (let i = 0; i < limit; i++) {\n const discount = approachingDiscounts[i];\n const alertContent = createApproachingDiscountContent(discount);\n\n $approachingDiscountsBox.alert({\n content: alertContent,\n theme: 'info',\n icon: '',\n placement: 'inline',\n containerId: 'approaching-discount',\n dismissible: false,\n autoClose: false\n });\n $(`.approaching-discount .alert .js-discount-alert[data-alert-id=\"${discount.ID}\"]`).find('.progress').progressArc();\n }\n\n $approachingDiscountsBox.slideDown();\n } else {\n $approachingDiscountsBox.slideUp();\n }\n}\n\n/**\n * Re-order products, moving \"error\" products into cart-products__invalid\n * @param {Object} items - AJAX response from the server\n */\nfunction updateProductOrder(items) {\n let $productElement;\n let hideInvalidProducts = true;\n let hideValidProducts = true;\n const $validProducts = $('.cart-products__valid');\n const $invalidProducts = $('.cart-products__invalid');\n\n items.forEach(lineItem => {\n $productElement = $(`.product-card[data-uuid=${lineItem.UUID}]`);\n\n if ($productElement.length) {\n // Re-order products, moving \"error\" products into cart-products__invalid\n if (!lineItem.available || !lineItem.isOrderable) {\n hideInvalidProducts = false;\n if ($productElement.parent('.cart-products__valid').length) {\n $invalidProducts.prepend($productElement);\n }\n } else {\n hideValidProducts = false;\n if ($productElement.parent('.cart-products__invalid').length) {\n $validProducts.prepend($productElement);\n }\n }\n }\n });\n\n $invalidProducts.toggleClass('d-none', hideInvalidProducts);\n $validProducts.toggleClass('d-none', hideValidProducts);\n}\n\n/**\n * Updates window.digitalData with the given data.\n * @param {Object} dtmLayer The data to update in window.digitalData\n * @param {Array} propsToUpdate The properties to be udpated.\n */\nfunction updateDTM(dtmLayer, propsToUpdate = ['pageInstanceID', 'page', 'user', 'cart']) {\n if (dtmLayer && 'digitalData' in window) {\n propsToUpdate.forEach(prop => {\n if (dtmLayer[prop]) {\n window.digitalData[prop] = dtmLayer[prop];\n }\n });\n minicartSaleItemAlertBadge.toggleAlertBadge();\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 * Checks whether the basket is valid. if invalid displays error message and disables checkout button\n * @param {Object} data - AJAX response from the server\n */\nfunction validateBasket(data) {\n $('.cart-error').empty();\n\n if (data.valid.error) {\n if (data.valid.message) {\n createErrorNotification(data.valid.message);\n } else {\n $('.grid__items').html(`

      ${data.resources.emptyCartMsg}

      `);\n $('.js-number-items').text(data.resources.numberOfItems);\n $(document).trigger('minicart:updatecount', data.numItems);\n $(document).trigger('minicart:hide');\n }\n }\n\n $('.checkout-btn, .btn-checkout').toggleClass('disabled', data.valid.error);\n $('.apple-pay-container').toggleClass('d-none', data.valid.error);\n}\n\n/**\n * Handles changes to cart bonus products. Cart attribute initialBonusProducts\n * represents an array of bonus product UUIDs that were present at the start of\n * the operation.\n * - If bonus products were added, refresh the page\n * - If bonus products were removed, remove the card\n * @param {Ojbect} data - AJAX response from server\n */\nfunction handleCartBonusProductChanges(data) {\n const initialBonusProducts = data.initialBonusProducts || [];\n const currentBonusProducts = data.items.filter(item => item.isBonusProductLineItem);\n\n if (!initialBonusProducts.length && !currentBonusProducts.length) {\n // no bonus products\n return;\n }\n\n const addedBonusProducts = currentBonusProducts.filter(currentItem => !initialBonusProducts.find(initialItem => currentItem.UUID === initialItem.UUID));\n const removedBonusProducts = initialBonusProducts\n .filter(initialItem => !data.items.find(currentItem => currentItem.UUID === initialItem.UUID))\n .map(obj => obj.UUID);\n\n if (addedBonusProducts.length) {\n $('body').trigger('cart:refresh');\n } else if (removedBonusProducts.length) {\n removeDeletedProductCards(removedBonusProducts);\n }\n}\n\n/**\n * Update selected delivery method and reflects in cart\n * @param {Object} $shippingMethodSelect - jQuery target of event\n */\nfunction updateDeliveryMethod($shippingMethodSelect) {\n const url = $shippingMethodSelect.data('action-url');\n const urlParams = {\n methodID: $shippingMethodSelect.find(':selected').attr('data-shipping-id')\n };\n\n $.spinner().start();\n $('body').trigger('cart:beforeShippingMethodSelected');\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: urlParams\n }).done(function (data) {\n if (data.error) {\n window.location.href = data.redirectUrl;\n } else {\n $('body').trigger('cart:update', data);\n }\n $('body').trigger('cart:shippingMethodSelected', data); // relic of app_storefront_base. Not handled.\n\n if (data.dtmEvent) {\n $('body').trigger('cart:emitEvents', { events: data.dtmEvent });\n }\n\n $.spinner().stop();\n }).fail(function (err) {\n if (err.redirectUrl) {\n window.location.href = err.redirectUrl;\n } else {\n createErrorNotification(err.responseJSON.errorMessage);\n $.spinner().stop();\n }\n });\n}\n\n/**\n * Updates cart and total when quantiy changed\n * @param {Object} $thisQtyField - this from quantity change event\n */\nfunction quantityUpdate($thisQtyField) {\n let quantity = parseInt($thisQtyField.val(), 10);\n const preSelectQty = parseInt($thisQtyField.data('pre-select-qty'), 10);\n if (isNaN(quantity)) { // invalid number / blank space\n quantity = preSelectQty;\n $thisQtyField.val(quantity);\n }\n const $productCard = $thisQtyField.closest('.product-card');\n\n if (quantity < 1) {\n const $removeBtn = $productCard.find('.js-remove-product');\n $removeBtn.trigger('click');\n return;\n }\n\n // else\n const maxValue = parseInt($thisQtyField.attr('max'), 10);\n if (quantity > maxValue) {\n quantity = maxValue;\n // Fixes edge case where we are at max currently and the below update won't process\n $thisQtyField.val(quantity);\n }\n\n const uuid = $productCard.data('uuid');\n\n if (preSelectQty !== quantity) {\n const urlParams = {\n pid: $productCard.data('pid'),\n quantity: quantity,\n prevQuantity: preSelectQty,\n uuid: uuid\n };\n const url = utils.setUrlData($thisQtyField.data('action'), urlParams);\n\n $.spinner().start();\n\n const reservationTimerHelper = require('../components/reservationTimer');\n $.ajax({\n url: url,\n type: 'get',\n context: $thisQtyField,\n dataType: 'json'\n }).done(data => {\n if (data.error) {\n $('body').trigger('cart:update', data);\n } else {\n const lineItem = data.items.find(item => item.UUID === uuid);\n const newQuantity = lineItem.quantity;\n\n $thisQtyField.val(newQuantity).data('pre-select-qty', newQuantity);\n $thisQtyField.closest('.input-group').find('.js-quantity-add')\n .prop('disabled', (newQuantity >= lineItem.quantityOptions.maxOrderQuantity)); // toggle disabled state of + button\n\n $('body').trigger('cart:update', data);\n\n $.alert({\n content: window.resources.cartUpdated,\n placement: 'banner',\n theme: 'info'\n });\n\n if ($productCard.hasClass('bonus-product-line-item')) {\n location.reload();\n }\n\n reservationTimerHelper.updateReservationData(data);\n\n if (data.dtmEvent) {\n $('body').trigger('cart:emitEvents', { events: data.dtmEvent });\n }\n\n if ('dtmLayer' in data) {\n updateDTM(data.dtmLayer, ['page', 'user', 'cart']);\n }\n }\n }).fail(err => {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else if (!err.responseJSON.reservation) {\n createErrorNotification(err.responseJSON.errorMessage);\n $thisQtyField.val(parseInt(preSelectQty, 10));\n } else {\n // Show a banner\n reservationTimerHelper.updateReservationData(err.responseJSON);\n }\n }).always(() => {\n $.spinner().stop();\n });\n }\n return;\n}\n\n/**\n * Triggers alert when promo successfully added\n * @param {string} successMsg - text for successful promo code add message\n */\nfunction promoCodeSuccess(successMsg) {\n $('.promo-code-form').hide();\n $.alert({\n content: successMsg,\n placement: 'banner',\n theme: 'success'\n });\n}\n\n/**\n * Sumbmits promo code form and applies to cart if successful\n * @returns {boolean} false;\n */\nfunction addPromoCode() {\n const $form = $('.promo-code-form');\n const $couponCodeField = $form.find('#couponCode');\n const $errorMessageDiv = $form.find('.promo-code-input .invalid-feedback');\n const promoCodeToBeAdded = $couponCodeField.val().trim();\n\n if (!promoCodeToBeAdded) {\n $couponCodeField.addClass('is-invalid');\n $errorMessageDiv.html($couponCodeField.data('missing-error'));\n return false;\n }\n\n $.spinner().start();\n $couponCodeField.removeClass('is-invalid');\n $errorMessageDiv.empty();\n\n $('body').trigger('promotion:beforeUpdate');\n\n $.ajax({\n url: $form.attr('action'),\n type: 'GET',\n dataType: 'json',\n data: $form.serialize()\n }).done(data => {\n if (data.error) {\n $couponCodeField.addClass('is-invalid');\n $errorMessageDiv.html(data.errorMessage);\n } else if (data.csrferror) {\n cartutils.toggleErrorOnCSRF(true, data);\n } else {\n $('body').trigger('cart:update', data);\n $('body').trigger('promotion:success', data); // relic of app_storefront_base. Not handled.\n\n // if user is trying to add a fans/followers code or partner code, this will show a modal instructing them to go to the entry page\n cartutils.toggleGoToContent(true, data);\n\n // if promo code was applied, show message\n if (promoCode.isPromoCodeApplied(data.totals, promoCodeToBeAdded)) {\n promoCodeSuccess(data.totals.discountSuccessText);\n }\n\n if (data.isFullyCoveredByPromoCode) {\n $('.js_braintree_paypal_cart_button').addClass('disabled');\n }\n\n if (data.dtmEvent) {\n $('body').trigger('cart:emitEvents', { events: data.dtmEvent });\n }\n }\n\n $couponCodeField.val('').trigger('change');\n $couponCodeField.closest('.form-group').removeClass('focus-fill');\n $.spinner().stop();\n\n if ('dtmLayer' in data) {\n updateDTM(data.dtmLayer);\n }\n }).fail(err => {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification(err.errorMessage);\n $.spinner().stop();\n }\n });\n return false;\n}\n\n/**\n * Reset the form and open/close share my cart form.\n * @param {Object} $cartShareModal - cart share form bootstrap modal\n */\nfunction resetShareCartForm($cartShareModal) {\n // reset the form\n const $shareForm = $('#cart-share').find('form');\n $shareForm[0].reset();\n $shareForm.find('.focus-fill').removeClass('focus-fill');\n $shareForm.find('.is-invalid').removeClass('is-invalid');\n // reset the characters remaining text\n $('#share-message').trigger('keyup');\n\n // hide the modal\n $cartShareModal.modal('hide');\n}\n\n/**\n * Updates character counter as user types message for cart share modal\n * @param {Object} $this - jQuery target of event\n * @returns {boolean} isValid - returns true as long as message is shorter than max length\n */\nfunction shareCartCharacterCount($this) {\n const maxLength = $this.attr('maxlength');\n const len = $this.val().length;\n const isValid = len <= maxLength;\n if (isValid) {\n $('#share-cart-char-remaining').text(maxLength - len);\n }\n return isValid;\n}\n\n/**\n * This event check the email mandatory and Ajax service call to send the\n * email templates from EcommHub for share my cart.\n * and show the alert message.\n */\nfunction shareCart() {\n const $cartShareModal = $('#cart-share');\n const $form = $('.cart-share-form');\n const $emailInvalidFeedback = $form.find('input[type=email]~.invalid-feedback');\n const $emailHelpText = $form.find('input[type=email]~.form-help-text');\n\n $('.modal-content').spinner().start();\n\n $emailInvalidFeedback.html('').hide();\n $emailHelpText.show();\n\n if ($form.validateForm()) {\n $.ajax({\n url: $form.attr('action'),\n type: 'post',\n dataType: 'json',\n data: $form.serialize()\n }).done((data) => {\n if (data.success === true) {\n resetShareCartForm($cartShareModal);\n $.alert({\n content: data.message,\n placement: 'banner',\n theme: 'success'\n });\n } else if (data.isValidEmail === false) {\n $emailInvalidFeedback.html(data.message).show();\n $emailHelpText.hide();\n } else {\n $.alert({\n content: data.message,\n placement: 'banner',\n theme: 'danger',\n parentSelector: '.modal.show .modal-content',\n containerAttachment: 'prepend'\n });\n }\n }).fail((err) => {\n $.alert({\n content: err.responseJSON.message,\n placement: 'banner',\n theme: 'danger',\n parentSelector: '.modal.show .modal-content',\n containerAttachment: 'prepend'\n });\n resetShareCartForm($cartShareModal);\n });\n }\n $.spinner().stop();\n}\n\n/**\n * On scroll function to check if standard checkout button offscreen\n * to show the sticky checkout button\n */\nfunction initStickyCheckoutButton() {\n if (breakpoints.isHighRes()) {\n return;\n }\n\n const $stickyCheckout = $('.checkout-continue__mobile');\n const $standardCheckout = $('.checkout-continue__desktop');\n\n const displayStickyCheckout = () => {\n if ($standardCheckout.isInViewport(true, true)) {\n $stickyCheckout.slideUp();\n } else {\n $stickyCheckout.slideDown();\n }\n };\n\n // add padding to footer to prevent sticky container from overlapping footer content.\n $('footer').css('padding-bottom', $stickyCheckout.outerHeight());\n\n if (window.resources && window.resources.initStickyCheckoutOnLoad) {\n displayStickyCheckout();\n }\n\n // on scroll, if the static checkout buttons are out of the viewport, show the sticky buttons. Else hide them.\n window.addEventListener('scroll',\n throttle(displayStickyCheckout, 500, true),\n { passive: true }\n );\n}\n\n/**\n * Asynchronously loads the product cards. Used on page load and every time the Cart or Save For Later list is updated.\n */\nfunction asyncLoadProductCards() {\n const $cartContainer = $('.cart-product-line-items-container');\n const $sflContainer = $('.sfl-product-line-items-container');\n\n let requestUrl;\n if (location.search.includes('savedPageSize')) {\n const pageUrl = new URL(location.href);\n const newUrl = new URL(window.resources.asyncProductLineItemsURL, pageUrl.origin);\n newUrl.searchParams.set('savedPageSize', pageUrl.searchParams.get('savedPageSize'));\n requestUrl = newUrl.toString();\n } else {\n requestUrl = window.resources.asyncProductLineItemsURL;\n }\n\n $.get(requestUrl).done((htmlString) => {\n $.spinner().stop();\n const $markup = $(htmlString);\n const $cart = $markup.find('.js-cart-items');\n $cartContainer.html($cart.html());\n\n if ($sflContainer.length) {\n const $sfl = $markup.find('.js-sfl-items');\n $sflContainer.html($sfl.html());\n if ($sflContainer.find('.product-info').length) {\n $('.js-save-for-later-container').slideDown();\n }\n }\n\n // Add availability message when cart qty has been automatically changed to available amt\n const $cardContainer = $('.cart-product-line-items-container');\n const $productsList = $cardContainer.data('auto-updated-uuids');\n if ($productsList) {\n const productsToUpdate = $productsList.split(',');\n productsToUpdate.forEach(uuid => {\n const $productCard = $(`.uuid-${uuid}`);\n const newQuantity = $productCard.find('.js-quantity').val();\n const syntheticLineItem = {\n availability: {\n messages: [{\n content: window.resources.quantityUpdated.replace('{0}', newQuantity),\n theme: 'danger',\n dismissible: true\n }]\n }\n };\n updateAvailability(syntheticLineItem, $productCard);\n });\n $cardContainer.data('auto-updated-uuids', '');\n }\n });\n}\n\n/**\n * Allows user to edit the bonus product in their cart\n * @param {Object} $this - jQuery target of event\n */\nfunction editBonusProduct($this) {\n /**\n * Stolen from product/base.js so we don't need to import and execute the whole file.\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n * @return {Object} - Object with properties body and footer.\n */\n const parseHtml = function (html) {\n const $html = $('
      ').append($.parseHTML(html));\n const body = $html.find('.choice-of-bonus-product');\n const footer = $html.find('.modal-footer').children();\n\n return { body, footer };\n };\n\n $.spinner().start();\n $.ajax({\n url: $this.data('url'),\n method: 'GET',\n dataType: 'json'\n }).done(data => {\n // This handler was stolen from product/base.js so we don't need to import and execute the whole file.\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\n $('body').append(htmlString);\n\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 }).done(html => {\n const parsedHtml = parseHtml(html);\n $('#chooseBonusProductModal .modal-body').html(parsedHtml.body);\n $('#chooseBonusProductModal .modal-footer').html(parsedHtml.footer);\n $('#chooseBonusProductModal').modal('show');\n }).always(() => {\n $.spinner().stop();\n });\n }).fail(() => {\n $.spinner().stop();\n });\n}\n\n/**\n * Triggerd edit gift card quantity and amount from cart\n * @param {Object} $this - jQuery target of event\n */\nfunction editCartProduct($this) {\n const editProductUrl = $this.attr('href');\n const isGiftCard = $this.data('isgiftcard');\n if (isGiftCard) {\n window.location = editProductUrl;\n return;\n }\n baseQuickViewJS.launchEditProduct(editProductUrl);\n}\n\n/**\n * Updates global cart editability\n * @param {Object} response - event response\n */\nfunction updateGlobalAddToCart(response) {\n const $dialog = response.$productContainer;\n const $globalAvailability = $dialog.find('.global-availability');\n\n $dialog.find('.update-cart-product-global').attr('disabled',\n !$globalAvailability.data('ready-to-order') ||\n !$globalAvailability.data('available')\n );\n}\n\n/**\n * Updates details of a product line item\n * @param {Object} lineItem - AJAX response from the server\n * @param {string} newProductId - The product id of the product line item to update\n * @param {string?} sizeId - The ID of the selected size option. Valued if called from the size dropdown change event.\n */\nfunction updateProductDetails(lineItem, newProductId, sizeId) {\n const $productCard = $(`.product-card[data-uuid=${lineItem.UUID}]`);\n $productCard.data('pid', newProductId);\n\n $productCard.find('.product-image').attr({\n src: lineItem.images.small[0].url,\n alt: lineItem.images.small[0].alt,\n title: lineItem.images.small[0].title\n });\n\n if (lineItem.variationAttributes) {\n const colorAttr = lineItem.variationAttributes.find(attr => attr.attributeId === 'color');\n const sizeAttr = lineItem.variationAttributes.find(attr => attr.attributeId === 'size');\n const dimensionAttr = lineItem.variationAttributes.find(attr => attr.attributeId === 'dimension');\n\n if (colorAttr) {\n $(`.${colorAttr.displayName}-${lineItem.UUID} .value`).text(colorAttr.displayValue);\n }\n\n if (sizeAttr) {\n const $sizeElement = $(`.${sizeAttr.displayName}-${lineItem.UUID} .value`);\n\n if ($sizeElement.hasClass('js-cart-size-selector')) {\n // update the select box\n $sizeElement.empty();\n\n if (lineItem.additionalSizeOptions && lineItem.additionalSizeOptions.length) {\n lineItem.additionalSizeOptions.forEach(sizeOption => {\n $sizeElement.append(``);\n });\n $sizeElement.data('sizeid', sizeId);\n } else {\n $sizeElement.append(``);\n }\n\n const $sku = $sizeElement.parent().siblings('.js-sku-value');\n if ($sku.length > 0) {\n $sku.text(sizeId);\n }\n } else {\n // this is a span element\n $sizeElement.text(sizeAttr.displayValue);\n }\n }\n\n if (dimensionAttr) {\n $(`.${dimensionAttr.displayName}-${lineItem.UUID} .value`).text(dimensionAttr.displayValue);\n }\n }\n\n $productCard.find('.js-remove-product').data('pid', newProductId);\n $productCard.find('.js-saveForLater-product').data('pid', newProductId);\n $productCard.find('.price .sales .value').text(lineItem.price.sales.formatted).attr('content', lineItem.price.sales.decimalPrice);\n\n if (lineItem.price.list) {\n $productCard.find('.price .list .value').text(lineItem.price.list.formatted).attr('content', lineItem.price.list.decimalPrice);\n }\n}\n\n/**\n * Handles the response when editing a line item (from quickview or from changing the size attribute)\n * @param {Object} data - AJAX response from the server\n * @param {string} uuid - The uuid of the product line item to update\n * @param {string?} sizeId - The ID of the selected size option. Valued if called from the size dropdown change event.\n */\nfunction editLineItemSuccessHandler(data, uuid, sizeId) {\n const reservationTimerHelper = require('../components/reservationTimer');\n const lineItem = data.cartModel.items.find(item => item.UUID === uuid);\n\n baseQuickViewJS.hideQuickview();\n\n $('body').trigger('cart:update', data.cartModel);\n updateProductDetails(lineItem, data.newProductId, sizeId); // updates image, attributes, prices\n\n if (data.uuidToBeDeleted) {\n $(`.product-card[data-uuid=${data.uuidToBeDeleted}`).remove();\n }\n\n window.dispatchEvent(new Event('cart:updated:dtm'));\n\n if (!data.reservation) {\n // if you no longer have a reservable product...\n if (window.resources.reservation && !data.numberOfReservableProducts) {\n // ... but you did before, remove the reservation.\n reservationTimerHelper.getDestroyTimer();\n delete window.resources.reservation;\n }\n // display the standard \"Your cart has been updated\" banner.\n $.alert({\n content: window.resources.cartUpdated,\n placement: 'banner',\n theme: 'info'\n });\n } else {\n // you now have (or still have) a reservable product. Update the data.\n if (!data.reservation.messages) {\n data.reservation.messages = {}; // eslint-disable-line no-param-reassign\n $.alert({\n content: window.resources.cartUpdated,\n placement: 'banner',\n theme: 'info'\n });\n }\n reservationTimerHelper.updateReservationData(data);\n }\n if (window.preQuickViewModalDigitalData) {\n // Restoring the digital data back to that of cart 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 ('dtmLayer' in data) {\n updateDTM(data.dtmLayer, ['pageInstance', 'page', 'user']);\n }\n\n if (data.dtmEvent) {\n $('body').trigger('cart:emitEvents', { events: data.dtmEvent });\n }\n\n updateDTM(data.dtmLayer, ['cart']);\n\n // Update Stylitics widget if it exists\n $('body').trigger('stylitics:update');\n}\n\n/**\n * Event handler for when the product size select element is changed.\n * @param {Object} $this - jQuery target of event\n */\nfunction updateItemSize($this) {\n const newProductId = $this.val();\n\n if (!newProductId) {\n return;\n }\n\n const originalSize = $this.data('sizeid');\n const uuid = $this.data('uuid');\n const targetUrl = $this.data('size-update-url');\n const selectedQuantity = $(`#quantity-${uuid}`).val();\n const targetData = {\n uuid: uuid,\n pid: newProductId,\n quantity: parseInt(selectedQuantity, 10)\n };\n\n $.spinner().start();\n\n $.ajax({\n url: targetUrl,\n type: 'post',\n data: targetData,\n dataType: 'json'\n }).done(function (data) {\n if (data.error) {\n $.alert({\n content: data.errorMessage,\n theme: 'danger',\n placement: 'banner',\n dismissible: true\n });\n // Reset dropdown to original value\n $this.find(`option[value=${originalSize}]`).prop('selected', true);\n } else {\n editLineItemSuccessHandler(data, uuid, newProductId);\n }\n }).fail(function (error) {\n $.alert({\n content: error.message || 'An unknown error occurred',\n theme: 'danger',\n placement: 'banner',\n dismissible: true\n });\n // Reset dropdown to original value\n $this.find(`option[value=${originalSize}]`).prop('selected', true);\n }).always(function () {\n $.spinner().stop();\n });\n}\n\n/**\n * Updates product attributes in quick view\n * @param {Object} source - dom element of event (the Add to Cart button)\n */\nfunction updateQuickViewProduct(source) {\n const $updateCartUrl = $(source).closest('.cart-and-ipay').find('.update-cart-url');\n const uuid = $updateCartUrl.data('uuid');\n\n const form = {\n uuid: uuid,\n pid: basketHelper.getPidFromQuickview($(source)),\n quantity: $updateCartUrl.data('selected-quantity')\n };\n\n baseQuickViewJS.startSpinner();\n $('body').trigger('cart:beforeUpdate');\n\n $.ajax({\n url: $updateCartUrl.val(),\n type: 'post',\n context: source,\n data: form,\n dataType: 'json'\n }).done(data => {\n $.spinner().stop();\n editLineItemSuccessHandler(data, uuid);\n }).fail(err => {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else if (err.responseJSON.reservation && typeof resources !== 'undefined') {\n const reservationTimerHelper = require('../components/reservationTimer');\n $.spinner().stop();\n baseQuickViewJS.hideQuickview();\n // show the error banner\n reservationTimerHelper.updateReservationData(err.responseJSON);\n } else {\n $.spinner().stop();\n createErrorNotification(err.responseJSON.errorMessage);\n }\n });\n}\n\n/**\n * Click handler for when user clicks the add to cart button on a product in the save for later section\n * @param {Object} $this - jQuery target of event (the clicked button)\n */\nfunction moveToCart($this) {\n let pid = $this.data('pid').toString();\n let url = $('.js-save-for-later-container').data('movetocart-url');\n let formData = {\n pid: pid,\n isSaveForLater: true,\n quantity: 1\n };\n\n $.spinner().start();\n $('body').trigger('cart:beforeUpdate');\n $.ajax({\n url: url, // Cart-AddProduct\n type: 'POST',\n data: formData,\n dataType: 'json'\n }).done(function (data) {\n if (data.error) {\n $.spinner().stop();\n createErrorNotification(data.message);\n return;\n }\n\n // Saves uuids that were updated in cart middleware\n if (data.autoUpdatedItems && data.autoUpdatedItems.length > 0) {\n const itemList = data.autoUpdatedItems.join(',');\n const $cardContainer = $('.cart-product-line-items-container');\n $cardContainer.data('auto-updated-uuids', itemList);\n }\n\n if ($('.js-cart-empty').length) {\n location.reload(); // cart was previously empty. reload page to get the real cart page.\n return;\n }\n\n $.spinner().stop();\n\n asyncLoadProductCards();\n\n $.alert({\n content: data.alertMsg,\n theme: 'success',\n placement: 'banner'\n });\n\n $('.js-saveforlater-listsize').html(data.listSizeMsg).data('listsize', data.lineItemsTotalCount);\n if (!data.lineItemsTotalCount) {\n // list is empty\n $('.js-save-for-later-container').slideUp();\n }\n\n // update stuff\n updateCartTotals(data.cart);\n validateBasket(data.cart);\n updateApproachingDiscounts(data.cart.approachingDiscounts);\n basketHelper.updateRewardsCardAndBanner(data.cart);\n\n if (data.dtmEvent) {\n $('body').trigger('cart:emitEvents', { events: data.dtmEvent });\n }\n\n if ('dtmLayer' in data) {\n updateDTM(data.dtmLayer, ['pageInstance', 'page', 'user', 'cart']);\n }\n\n // Update Stylitics widget if present\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\nif (window.resources && window.resources.idMe && window.resources.idMe.showIdMeSuccess) {\n $.alert({\n content: window.resources.idMe.idMeSuccessMessage,\n theme: 'success'\n });\n\n delete window.resources.idMe.showIdMeSuccess;\n}\n\nif (window.dw &&\n window.dw.applepay &&\n window.ApplePaySession &&\n window.ApplePaySession.canMakePayments()) {\n $('body').addClass('apple-pay-enabled');\n}\n\nmodule.exports = {\n init: function () {\n asyncLoadProductCards();\n\n $('body')\n .on('click', '.js-oos-remove', function (e) {\n e.preventDefault();\n $(this).closest('.product-card').find('.js-remove-product').trigger('click');\n })\n .on('click', '.js-quantity-add', function () {\n const $qtyField = $(this).closest('.input-group').find('.js-quantity');\n let currentVal = parseInt($qtyField.val(), 10);\n if (currentVal < parseInt($qtyField.attr('max'), 10)) {\n $qtyField.val(++currentVal).trigger('change');\n }\n })\n .on('click', '.js-quantity-remove', function () {\n const $qtyField = $(this).closest('.input-group').find('.js-quantity');\n let currentVal = parseInt($qtyField.val(), 10);\n if (currentVal > 1) {\n $qtyField.val(--currentVal).trigger('change');\n } else {\n $qtyField.closest('.product-card').find('.js-remove-product').trigger('click');\n }\n })\n .on('change', '.js-quantity', function () {\n clearTimeout(quantityChangeDebounce);\n const $qtyField = $(this);\n quantityChangeDebounce = setTimeout(function () {\n quantityUpdate($qtyField);\n }, 500);\n })\n .on('click', '.cart-page .bonus-product-button', function () {\n editBonusProduct($(this));\n })\n .on('click', '.cart-page .js-edit-product', function (e) {\n e.preventDefault();\n editCartProduct($(this));\n })\n .on('click', '.cart-page .js-oos-edit', function (e) {\n e.preventDefault();\n $(this).closest('.product-card').find('.js-edit-product').trigger('click');\n })\n .on('click', '.js-saveForLater-add-to-cart', function (e) {\n e.preventDefault();\n moveToCart($(this));\n })\n .on('product:updateAddToCart', function (e, response) {\n updateGlobalAddToCart(response);\n })\n .on('click', '.update-cart-product-global', function (e) {\n e.preventDefault();\n updateQuickViewProduct(this);\n })\n .on('click', '.js-idme-drawer', function () {\n const $this = $(this);\n\n if (!$idMeDrawer) {\n $idMeDrawer = $.drawer({\n title: $this.data('drawer-title'),\n src: $this.data('drawer-src'),\n size: 'sm',\n destroyOnClose: false,\n returnFocusTo: '.js-idme-drawer'\n });\n } else {\n $idMeDrawer.open();\n }\n })\n .on('click', '.js-remove-id-me', function () {\n const $this = $(this);\n const url = $this.data('url');\n if (url) {\n $.ajax({\n url: url,\n type: 'post',\n success: function () {\n window.location.reload();\n }\n });\n }\n })\n .on('change', '.shippingMethods', function () {\n updateDeliveryMethod($(this));\n })\n .on('submit', '.promo-code-form', function (e) {\n e.preventDefault();\n addPromoCode();\n })\n .on('click', '.share-my-cart__link', function (e) {\n e.preventDefault();\n resetShareCartForm();\n })\n .on('click', '.js-cart-modal', function (e) {\n e.preventDefault();\n createModal($(this));\n })\n .on('click', '.js-close-share-cart-modal, #cart-share .close', function () {\n resetShareCartForm($(this));\n })\n .on('submit', '.cart-share-form', function (e) {\n e.preventDefault();\n shareCart();\n })\n .on('keyup', '#share-message', function () {\n shareCartCharacterCount($(this));\n })\n .on('change', '.js-cart-size-selector', function () {\n updateItemSize($(this));\n })\n .on('cart:update', function (e, basket) {\n // triggered from basketHelper.js when removing item from cart\n if (basket.totals && basket.totals.discountsHtml) {\n $('.js-coupons-and-promos').html(basket.totals.discountsHtml);\n }\n updateCartTotals(basket);\n updateAllProductCards(basket.items); // this calls updateAvailability() and updateProductQuantity()\n\n if (Array.isArray(basket.autoUpdatedItems)) {\n updateCartQuantityChangeMessage(basket.autoUpdatedItems);\n }\n\n if (Array.isArray(basket.autoDeletedItems)) {\n removeDeletedProductCards(basket.autoDeletedItems);\n }\n\n updateApproachingDiscounts(basket.approachingDiscounts);\n updateProductOrder(basket.items); // moves invalid products into .cart-products__invalid\n basketHelper.updateRewardsCardAndBanner(basket);\n validateBasket(basket);\n $('body').trigger('setShippingMethodSelection', basket); // handled in cartInStorePickup.js\n handleCartBonusProductChanges(basket); // may trigger cart:refresh\n })\n .on('cart:refresh', function () {\n asyncLoadProductCards();\n });\n\n $('[data-toggle=\"tooltip\"]').tooltip();\n $('.approaching-discount .progress').progressArc();\n\n initStickyCheckoutButton();\n basketHelper.processOnloadEvents();\n }\n};\n","'use strict';\nconst utils = require('../components/utils');\nconst base = require('./base');\nconst loyalty = require('./loyalty');\nconst ImageGallery = require('./imageGallery');\nlet initialPageLoad = true;\n\n/**\n * Hide Quickview Modal\n */\nvar hideQuickview = () => {\n if ($('.product-gallery--quickview').swiper) {\n $('.product-gallery--quickview').swiper.destroy();\n }\n\n $('.quickview-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 $.enableScroll();\n $('body').removeClass('modal-open').css('padding-right', '');\n $(window).trigger('scroll');\n};\n\nvar createQVModal = () => {\n let modalMarkup = utils.createModalMarkup('', {\n title: ' ', // Passing a blank / space character creates a blank header-title element in the modal.\n customClasses: 'quickview-modal',\n enableLayeredDrawers: true\n });\n let $modal = $(modalMarkup).modal();\n $modal\n .on('hidden.bs.modal', () => {\n hideQuickview();\n });\n return $modal;\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 = ['pageInstanceID', '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 * Restores the digitalData object.\n * @param {Object} data The data to set in the digitalData object\n */\nconst 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 * Initialize prodict image gallery\n */\nconst initGallery = () => {\n const quickviewGalleryConfig = {\n isQuickview: true,\n galleryContainerSelector: '.product-quickview .primary-images'\n };\n\n const swiperImageGallery = new ImageGallery(quickviewGalleryConfig);\n swiperImageGallery.init();\n};\n\n/**\n * Fetches quickview html from server and launches modal\n * @param {string} quickViewUrl - Quick view controller endpoint url\n * @param {HTMLElement} $modal - Reference to modal JQuery object\n */\nvar launchQuickview = (quickViewUrl, $modal) => {\n if (!quickViewUrl) {\n return;\n }\n\n if (!$modal) {\n $modal = createQVModal(); // eslint-disable-line no-param-reassign\n }\n\n $modal.modal('show');\n $modal.find('.modal-body').spinner().start();\n\n let successHandler = (html) => {\n $modal.find('.modal-body').html(html);\n // updated the header\n let $modalContainer = $modal.find('.product-quickview');\n\n window.dispatchEvent(new Event('quickview:shown:dtm'));\n\n initGallery();\n\n $(document).on('product:swiper:update', function () {\n initGallery();\n });\n\n if ($('.quickview-modal-looks').length) {\n // conditional for Looks We Love specific modal to account for multiple Product url review links for the Product Set\n for (let i = 0; i < $('.set-item').length; i++) {\n let looksPdpUrl = $('.set-item-' + i + ' .looks-pdp-url').attr('href');\n $('.set-item-' + i + ' .qv-ratings').attr('data-link', looksPdpUrl + '?bvOpen=true');\n // check custom preference 'redirectToReviewFromQuickViewLink'\n if ($('.qv-ratings').data('review-link')) {\n $('.set-item-' + i + ' .qv-ratings').on('click', function (e) {\n e.preventDefault();\n looksPdpUrl = utils.setUrlKeyValue(looksPdpUrl, 'bvOpen', true);\n window.location.href = looksPdpUrl;\n });\n }\n }\n } else if ($('.qv-ratings').data('review-link')) {\n $('.qv-ratings').on('click', function (e) {\n e.preventDefault();\n let basePDPUrl = $modalContainer.find('.js-qv-pdp-url').attr('href');\n basePDPUrl = utils.setUrlKeyValue(basePDPUrl, 'bvOpen', true);\n window.location.href = basePDPUrl.replace('#void', '');\n });\n }\n\n /*\n * On click of a LWL Multi View thumbnail alternate, display the corresponding alternate LWL Multi View product\n */\n $('.set-item-multi').on('click', function () {\n let setItem = $('.set-item-' + $(this).data('index'));\n let setItemMulti = $('.set-item-multi-' + $(this).data('index'));\n $('.set-items').find('.set-item.d-block').removeClass('d-block');\n $('.set-items-looks').find('.set-item-multi.active').removeClass('active');\n $(setItem).toggleClass('d-block');\n $(setItemMulti).toggleClass('active');\n\n // Instantiate new Swiper object on click for alternate products with swiperData config values\n initGallery();\n });\n\n $('.set-items-wrapper').slick({\n infinite: false,\n slidesToScroll: 1,\n slidesToShow: 5,\n responsive: [\n {\n breakpoint: 576,\n settings: {\n slidesToScroll: 1,\n slidesToShow: 2\n }\n }\n ]\n });\n\n /**\n * Necessary to make sure single variants can be added to the cart on load\n * Also: Call attributeSelect if enableRefreshAvailabilityOnload is set to \"Yes\"\n */\n var $productContainer = $modal.find('.product-detail');\n\n if (\n $productContainer.data('availability-refresh') ||\n ($productContainer.data('pid') === $productContainer.data('master-pid') && base.isEverythingSelected())\n ) {\n var $swatchSelected = $modal.find('.product__attributes a.selected').first();\n var selectedAttributeID = $swatchSelected.closest('.js-attribute').data('attr');\n\n base.attributeSelect($swatchSelected.data('attr-url'), $productContainer, selectedAttributeID);\n }\n\n base.quickViewSwatchFunctionality();\n base.updateOOSColorVariants($productContainer);\n base.forceOOSNotifyMe();\n };\n\n // Persisting the digital data before opening the quick view modal, to restore it back once the modal is closed.\n // Digital data is stringified and stored in another variable as direct assignment results in copying by reference because of which change in original variable results in change of the target one.\n window.preQuickViewModalDigitalData = JSON.stringify(window.digitalData);\n $.ajax({\n url: quickViewUrl,\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 updateDTM(data);\n // Copying the pageHier attribute from the source page of quick view modal.\n var preQuickViewModalDigitalData = JSON.parse(window.preQuickViewModalDigitalData);\n if (preQuickViewModalDigitalData && preQuickViewModalDigitalData.page && preQuickViewModalDigitalData.page.pageInfo) {\n window.digitalData.page.pageInfo.pageHier = preQuickViewModalDigitalData.page.pageInfo.pageHier + ':QuickView';\n }\n successHandler(data.renderedTemplate);\n });\n } else {\n updateDTM(data);\n // Copying the pageHier attribute from the source page of quick view modal.\n var preQuickViewModalDigitalData = JSON.parse(window.preQuickViewModalDigitalData);\n if (preQuickViewModalDigitalData && preQuickViewModalDigitalData.page && preQuickViewModalDigitalData.page.pageInfo) {\n window.digitalData.page.pageInfo.pageHier = preQuickViewModalDigitalData.page.pageInfo.pageHier + ':QuickView';\n }\n successHandler(data.renderedTemplate);\n }\n $modal.on('hidden.bs.modal', () => {\n window.preQuickViewModalDigitalData = JSON.parse(window.preQuickViewModalDigitalData);\n // Restores the digital data back to what it was before the quick view modal.\n restoreDTM(window.preQuickViewModalDigitalData);\n });\n // updates forecasted loyalty points\n loyalty.init();\n },\n complete: () => {\n $.spinner().stop();\n $.disableScroll();\n $(window).trigger('load.countdown'); // Trigger countdown\n },\n error: () => {\n hideQuickview();\n }\n });\n};\n\n/**\n * Start spinned inside QV\n */\nconst startSpinner = () => {\n const $modalBody = $('.quickview-modal .modal-body');\n if ($modalBody.length) {\n $modalBody.spinner().start();\n }\n};\n\n/**\n * Sets Out of Stock status text based on the selectable/unselectable state of the attribute\n * @param {HTMLElement} $swatchEntered - targeted swatch on click/hover\n * @param {string} selectedValue - selected text value\n * @param {HTMLElement} attributeLabelValue - selected text element\n */\nconst setSelectedValue = ($swatchEntered, selectedValue, attributeLabelValue) => {\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 } else {\n attributeLabelValue.text(selectedValue).removeClass('text-danger');\n }\n }\n};\n\n/**\n * QuickView Custom events on Attribute click and hover\n */\nconst onSelectAttribute = () => {\n // Color Attribute click event to display selected/selectable status\n $('.js-product-content').on('attribute:click', '.js-swatch', function (e) {\n const $swatchClicked = $(e.currentTarget);\n const attrType = $swatchClicked.closest('.js-attribute').data('attr');\n const attributeLabelValue = $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 selectedValue = $swatchClicked.data('attr-hover');\n }\n\n setSelectedValue($swatchClicked, selectedValue, attributeLabelValue);\n });\n\n // Size/Dimension Attribute Select event to get the new attribute selected/selectable status\n $(document).on('attribute:select', '.js-product-content .js-size-swatch, .js-product-content .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 } else {\n attributeLabelValue.removeClass('text-danger').text($attrValue.data('attr-hover'));\n }\n });\n};\n\n/**\n * updates QuickViewView Details url if Variation atttibute selected is Out of Stock\n * @param {Object} response - response data object from ajax\n */\nconst updateViewDetailsURL = (response) => {\n if (response && response.data) {\n const responseDataProduct = response.data.product;\n const selectedProductUrl = responseDataProduct && responseDataProduct.selectedProductUrl ? responseDataProduct.selectedProductUrl : '';\n const masterId = responseDataProduct && responseDataProduct.masterId ? responseDataProduct.masterId : '';\n let OOSSelectedProductUrl;\n const $pdpLinks = $('.product-quickview .js-qv-pdp-url');\n\n // if the selected variation attribute is Out of Stock, remove the size parameter from the url\n if (responseDataProduct.OOSSelectedAttributes) {\n const OOSSelectedAttributeSize = responseDataProduct.OOSSelectedAttributes && responseDataProduct.OOSSelectedAttributes.size ? responseDataProduct.OOSSelectedAttributes.size : '';\n const urlSizeParameter = '&dwvar_' + masterId + '_size=' + OOSSelectedAttributeSize;\n if (selectedProductUrl.indexOf(urlSizeParameter)) {\n OOSSelectedProductUrl = selectedProductUrl.replace(urlSizeParameter, '');\n }\n $pdpLinks.attr('href', OOSSelectedProductUrl);\n } else {\n $pdpLinks.attr('href', responseDataProduct.selectedProductUrl);\n }\n }\n};\n\nmodule.exports = {\n initQuickview: () => {\n $('body')\n .off('.qv', '.js-quickview')\n .on('click.qv', '.js-quickview', (e) => {\n // Don't initiate qv when product tile image is clicked in desktop breakpoint\n let $this = $(e.currentTarget);\n let link = $this.data('link') || $this.attr('href');\n let qs = utils.queryStringToObject(link);\n if (!qs.pid) {\n return;\n }\n e.preventDefault();\n\n let $modal = createQVModal();\n\n launchQuickview(link, $modal);\n });\n\n // quickview won't load without a delay\n setTimeout(function () {\n const qvPid = sessionStorage.getItem('quickview');\n const $productTile = $('.product[data-pid=' + qvPid + ']');\n\n if (qvPid && $productTile.length) {\n const qvLink = $productTile.find('.js-quickview').data('link');\n const $modal = createQVModal();\n launchQuickview(qvLink, $modal);\n sessionStorage.removeItem('quickview');\n }\n }, 500);\n\n base.initExclusiveEvents();\n },\n launchEditProduct: (editProductUrl) => {\n if (editProductUrl) {\n let $modal = createQVModal();\n launchQuickview(editProductUrl, $modal);\n }\n },\n hideQuickview: hideQuickview,\n startSpinner: startSpinner,\n beforeAddToCart: () => {\n $('body').on('product:beforeAddToCart', function (data) {\n $(data).closest('.modal-body').spinner().start();\n });\n },\n afterAddToCart: () => {\n $('body').on('product:afterAddToCart', () => {\n if ($('.cart-container').length) {\n // we're on the cart page.\n $.spinner().start();\n location.reload();\n } else if ($('.quickview-modal .product-set').length) {\n $.spinner().stop();\n } else {\n hideQuickview();\n }\n });\n },\n updateAttribute: () => {\n $('body').on('product:afterAttributeSelect', (e, response) => {\n if ($('.modal.show .product-quickview>.bundle-items').length) {\n $('.modal.show').find(response.container).data('pid', response.data.product.id);\n $('.modal.show').find(response.container)\n .find('.product-id')\n .data('pid', response.data.product.id)\n .text(response.data.product.materialStyleNumber);\n } else if ($('.set-items').length) {\n $(response.container)\n .find('.product-id')\n .data('pid', response.data.product.id)\n .text(response.data.product.materialStyleNumber);\n } else {\n $('.modal.show .product-quickview').data('pid', response.data.product.id);\n updateViewDetailsURL(response);\n }\n });\n },\n updateAddToCart: () => {\n $('body').on('product:updateAddToCart', (e, response) => {\n // update global add to cart (single products, bundles)\n var $dialog = $(response.$productContainer)\n .closest('.quickview-modal');\n\n // update local add to cart (for sets)\n if (response.product.readyToOrder && !response.product.available) {\n $('.js-product__message--partners', $dialog).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', $dialog).toArray().every(function (item) {\n return $(item).data('available') && $(item).data('ready-to-order');\n });\n\n if (enable) {\n $('.js-product__message--partners', $dialog).hide();\n }\n });\n },\n updateAvailability: () => {\n $('body').on('product:updateAvailability', (e, response) => {\n var $dialog = $(response.$productContainer)\n .closest('.quickview-modal');\n\n if ($dialog.length) {\n $('div.availability', $dialog)\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', $dialog).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', $dialog)\n .empty()\n .html(response.velocityMessage);\n\n var variationAttr = response.$productContainer.prevObject.closest('.js-attribute').data('attr').toLowerCase();\n $('.selectswatch-' + variationAttr + '-msg', response.$productContainer).removeClass('d-inline').addClass('d-none');\n\n $('.outofstock-combination-msg', $dialog);\n\n if (response.product.notifyme && !response.product.isMaster) {\n $('.product__add-to-cart', $dialog).hide();\n $('.product__notify-me', $dialog).show();\n $('.product__message--velocity', $dialog).addClass('product__message--velocity--notifyme').show();\n $('input[name=variantPID]', $dialog).val(response.product.id);\n } else {\n $('.product__add-to-cart', $dialog).show();\n $('.product__notify-me', $dialog).hide();\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', $dialog).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', $dialog).toArray()\n .every(function (item) { return $(item).data('available'); });\n\n var allReady = $('.product-availability', $dialog).toArray()\n .every(function (item) { return $(item).data('ready-to-order'); });\n\n $('.global-availability', $dialog)\n .data('ready-to-order', allReady)\n .data('available', allAvailable);\n\n $('.global-availability .availability-msg', $dialog).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\n $('body').trigger('product:checkOutOfStock', response);\n }\n });\n },\n closeQuickview: () => {\n $('.quickview-modal').on('click', (e) => {\n if (e.target !== e.currentTarget) {\n return;\n }\n hideQuickview();\n });\n },\n closeQuickviewButton: () => {\n $('.js-close-quickView').on('click', () => {\n hideQuickview();\n });\n },\n onSelectAttribute: onSelectAttribute,\n updateViewDetailsURL: updateViewDetailsURL\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\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';\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","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","'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\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","var debounce = require('./debounce'),\n isObject = require('./isObject');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` 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 throttled 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 `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\nmodule.exports = throttle;\n"],"sourceRoot":""}