{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./storefront-reference-architecture-master/cartridges/app_storefront_base/cartridge/client/default/js/product/detail.js","webpack:///./plugin_wishlists-master/cartridges/plugin_wishlists/cartridge/client/default/js/product/wishlist.js","webpack:///./plugin_commercepayments/cartridges/plugin_commercepayments/cartridge/client/default/js/product/payments.js","webpack:///./storefront-reference-architecture-master/cartridges/app_storefront_base/cartridge/client/default/js/util.js","webpack:///./storefront-reference-architecture-master/cartridges/app_storefront_base/cartridge/client/default/js/product/base.js","webpack:///./app_silver_sfra/cartridges/app_silver_sfra/cartridge/client/default/js/sizeChart.js","webpack:///./storefront-reference-architecture-master/cartridges/app_storefront_base/cartridge/client/default/js/components/focus.js","webpack:///./app_silver_sfra/node_modules/@splidejs/splide/dist/js/splide.cjs.js","webpack:///./storefront-reference-architecture-master/cartridges/app_storefront_base/cartridge/client/default/js/components/formValidation.js","webpack:///./app_silver_sfra/node_modules/photoswipe/dist/photoswipe-ui-default.js","webpack:///./app_silver_sfra/node_modules/photoswipe/dist/photoswipe.js","webpack:///./app_silver_sfra/cartridges/app_silver_sfra/cartridge/client/default/js/product/details.js","webpack:///./app_silver_sfra/cartridges/app_silver_sfra/cartridge/client/default/js/productDetail.js","webpack:///./plugin-applepay/cartridges/plugin_applepay/cartridge/client/default/js/product/detail.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","base","methods","updateAddToCartEnableDisableOtherElements","enableOrDisable","$","attr","availability","addToCart","updateAttributesAndDetails","on","e","data","$productContainer","id","find","empty","html","attributesHtml","shortDescription","removeClass","addClass","longDescription","showSpinner","spinner","start","updateAttribute","response","length","eq","container","product","text","updateAddToCart","readyToOrder","available","enable","toArray","every","item","updateAvailability","message","allAvailable","allReady","resources","info_selectforstock","sizeChart","preventDefault","url","this","$prodSizeChart","closest","is","ajax","type","dataType","success","append","content","toggleClass","$sizeChart","has","target","copyProductLink","event","$temp","val","select","document","execCommand","remove","setTimeout","focusChooseBonusProductModal","displayMessage","button","status","stop","msg","removeAttr","addToWishlist","pid","optionId","optionVal","error","err","updateBuyNowRequest","window","sfpp","ready","errorElement","querySelector","buynow","getCartUrl","placeOrderUrl","paypalApproveUrl","paypalMessage","updateBasketData","basketData","updatePaymentRequest","options","paypalAmount","getRenderedTypes","indexOf","getCartQuantity","delay","Promise","resolve","reject","timeoutMillis","contentType","quantityTotal","then","trigger","method","errorMessage","redirect","appendTo","body","action","continueUrl","orderID","orderToken","submit","location","href","redirectUrl","responseJSON","include","keys","forEach","focusHelper","getPidValue","$el","hasClass","getQuantitySelector","quantitySelected","quantitySelectedModal","quantitySelectedPDP","undefined","getQuantitySelected","handleVariantResponse","isVaraint","isChoiceOfBonusProducts","parents","variationAttributes","attrs","msgs","attrsWithSwatches","values","attrValue","$attrValue","$swatchButton","parent","selected","siblings","assistiveSelectedText","selectable","processSwatchValues","$attr","resetUrl","processNonSwatchValues","updateAttrs","productType","imgs","carousel","carouselId","alt","parseInt","index","title","first","detach","createCarousel","images","large","replaceWith","price","promotionsHtml","availabilityValue","availabilityMessages","messages","attributes","attributeGroup","ID","attribute","label","getAttributesHtml","attributeSelect","selectedValueUrl","optionsHtml","updateOptions","quantities","map","quantity","join","updateQuantities","parseHtml","$html","parseHTML","footer","children","chooseBonusProducts","bonusUrl","bonusChoiceRuleBased","showProductsUrlRuleBased","showProductsUrlListBased","htmlString","maxBonusItems","uuid","pliUUID","addToCartUrl","pageSize","labels","selectprods","parsedHtml","renderedTemplate","enterDialogMessage","closeButtonText","modal","getOptions","$elOption","urlValue","selectedValueId","JSON","stringify","miniCartReportingUrl","editBonusProducts","focus","onClosingChooseBonusProductModal","trapChooseBonusProductModalFocus","focusParams","containerSelector","firstElementSelector","lastElementSelector","setTabNextFocus","colorAttribute","selectAttribute","currentTarget","pidsObj","setPids","each","push","qty","childProducts","form","messageType","newBonusDiscountLineItem","handlePostCartAdd","reportingURL","selectBonusProduct","$choiceOfBonusProduct","maxPids","submittedQty","totalQty","optionID","valueId","selectedBonusProductHtml","removeBonusProduct","$selected","count","enableBonusProductSelection","showMoreBonusProducts","addBonusProductsToCart","$readyToOrderBonusProducts","queryString","pidsObject","bonusProducts","qtyOption","option","productId","msgSuccess","reload","formValidation","appendSelectOptions","prop","add","Option","watchSelectChange","categorySelect","getElementById","addEventListener","subCategorySelect","removeSelectOptions","SIZE_CHART_OPTIONS","getSizeChart","serialize","newHeading","createElement","classList","createTextNode","appendChild","category","categoryValue","subCategory","getCurrentSelection","keyCode","firstFocusableEl","lastFocusableEl","nextToLastElementSelector","linkElements","shiftKey","_defineProperties","props","descriptor","configurable","writable","STATES","CREATED","MOUNTED","IDLE","MOVING","SCROLLING","DRAGGING","DESTROYED","array","slice","arrayLike","end","Array","apply","func","concat","arguments","nextTick","noop","raf","requestAnimationFrame","typeOf","subject","isObject","isNull","isArray","isFunction","isString","isUndefined","isHTMLElement","ownerDocument","defaultView","HTMLElement","iteratee","includes","items","elm","classes","split","before","nodes","ref","node","parentNode","insertBefore","matches","selector","children2","filter","child","firstElementChild","ownKeys","forOwn","right","reverse","assign","source","merge","omit","removeAttribute","elms","setAttribute","value2","String","tag","style","getComputedStyle","display","display2","preventScroll","getAttribute","className","contains","rect","getBoundingClientRect","removeChild","DOMParser","parseFromString","prevent","stopPropagation","stopImmediatePropagation","query","queryAll","querySelectorAll","timeOf","timeStamp","unit","assert","condition","Error","min","Math","max","floor","ceil","abs","approximatelyEqual","x","y","epsilon","between","number","exclusive","minimum","maximum","clamp","sign","camelToKebab","string","replace","toLowerCase","format","replacements","replacement","pad","ids","uniqueId","prefix","EventBinder","listeners","forEachEvent","targets","events","events2","eventNS","fragment","callback","namespace","isEventTarget","remover","removeEventListener","unbind","listener","dispatch","detail","CustomEvent","bubbles","createEvent","initCustomEvent","dispatchEvent","destroy","EventInterface","Splide2","bus","createDocumentFragment","binder","off","emit","RequestInterval","interval","onInterval","onUpdate","limit","startTime","now","Date","rate","paused","update","pause","cancel","cancelAnimationFrame","resume","rewind","set","time","isPaused","State","initialState","state","states","Throttle","duration","TTB","ORIENTATION_MAP","width","left","X","Y","ArrowLeft","ARROW","ArrowRight","Direction","Components2","axisOnly","direction","match","offset","charAt","toUpperCase","orient","ROLE","ALL_ATTRIBUTES","ARIA_PREFIX","CLASS_ROOT","CLASS_CLONE","CLASS_SLIDE","CLASS_ACTIVE","STATUS_CLASS_PREFIX","STATUS_CLASSES","CLASSES","slide","CLASS_PREFIX","clone","arrows","arrow","prev","CLASS_ARROW","next","pagination","page","CLASS_PAGINATION","POINTER_UP_EVENTS","SLIDE","LOOP","Slide$1","slideIndex","destroyed","Components","root","isNavigation","updateOnMove","i18n","slideFocus","styles","isClone","initNavigation","controls","splides","Slide2","splide","Slides","getAt","slideX","onMove","curr","active","isActive","self","visible","trackRect","Elements","track","slideRect","isVisible","hidden","focusableNodes","activeElement","updateVisibility","cloneStatus","mount","slideLabel","useContainer","isWithin","from","distance","diff","PATH","SCROLL_LISTENER_OPTIONS","passive","capture","NORMALIZATION_MAP","Spacebar","Right","Left","Up","Down","normalizeKey","TRIGGER_KEYS","ComponentConstructors","freeze","__proto__","Media","breakpoints","reducedMotion","queries","completely","register","options2","queryList","matchMedia","merged","reduce","merged2","entry","refresh","opts","notify","getPrototypeOf","setup","isMin","mediaQuery","sort","list","isUsingKey","_EventInterface","elements","slides","rootClasses","trackClasses","bar","CLASS_PROGRESS","toggle","role","tagName","init","getClasses","labelledby","nodeType","parentElement","drag","POINTER_DOWN_EVENTS","_EventInterface2","_Components2$Elements","Slides2","forEach$1","Slide1","excludeClones","matcher","getIn","Controller","toIndex","hasFocus","perPage","img","getLength","isEnough","Layout","vertical","rootRect","overflow","_EventInterface3","_Components2$Elements2","styleSlides","cssPadding","resize","force","newRect","height","cssHeight","cssTrackHeight","gap","autoWidth","fixedWidth","cssSlideSize","fixedHeight","autoHeight","isOverflow","padding","heightRatio","listSize","slideSize","withoutGap","Slide","getGap","totalSize","sliderSize","parseFloat","getPadding","Clones","cloneCount","clones","remount","observe","computeCloneCount","isHead","cloneNode","cloneDeep","generate","clones2","fixedSize","Move","Transition","_EventInterface4","_Components2$Layout","_Components2$Directio","_Components2$Elements3","reposition","isBusy","Scroll","jump","translate","toPosition","position","preventLoop","destination","exceededMax","getEnd","shift","loop","backwards","excess","getLimit","size","getPosition","minDistance","Infinity","trimming","trimSpace","trim","move","dest","shifted","exceededLimit","exceededMin","endIndex","slideCount","perMove","_EventInterface5","_Components2$Slides","omitEnd","isLoop","isSlide","getNext","getAdjacent","getPrev","currIndex","prevIndex","onResized","computeDestIndex","snapPage","computeMovableDestIndex","toPage","setIndex","waitForTransition","go","control","allowSameIndex","_ref","indicator","parse","scroll","snap","getIndex","toDest","Arrows","created","wrapperClasses","placeholder","wrapper","enabled","createArrow","CLASS_ARROWS","prev2","arrowPath","nextIndex","prevLabel","last","nextLabel","disabled","Autoplay","hovered","focused","_EventInterface6","_Components2$Elements4","autoplay","stopped","play","resetProgress","autoToggle","DATA_ATTRIBUTE","pauseOnHover","pauseOnFocus","listen","Cover","cover","cover2","src","_EventInterface8","friction","onScrolled","noConstrain","clear","noDistance","onEnd","to","easingFunc","pow","Drag","basePosition","baseEvent","prevBaseEvent","isFree","dragging","clickPrevented","_EventInterface9","_Components2$Directio2","exceeded","disable","onPointerDown","isTouch","isTouchEvent","target2","noDrag","onPointerMove","onPointerUp","save","cancelable","diffCoord","expired","diffTime","hasExceeded","isSliderDirection","thresholds","dragMinThreshold","isObj","mouse","touch","shouldStart","velocity","computeVelocity","flickPower","flickMaxPages","computeDestination","rewindByDrag","onClick","orthogonal","coordOf","getBaseEvent","changedTouches","TouchEvent","isDragging","Keyboard","_EventInterface10","keyboard","onKeydown","_disabled","LazyLoad","_EventInterface11","isSequential","lazyLoad","entries","srcset","SRC_DATA_ATTRIBUTE","loadNext","check","preloadPages","load","onLoad","Pagination","paginationClasses","dir","getDirection","nextPage","paginationDirection","_button","li","class","pageX","paginationKeyboard","createPagination","Sync","isParent","sync","navigate","Wheel","lastTime","onWheel","deltaY","_min","wheelMinThreshold","sleep","wheelSleep","releaseWheel","shouldPrevent","wheel","Live","live","sr","textContent","DEFAULTS","speed","easing","rewindSpeed","Fade","done","endCallback","transition","getSpeed","useScroll","Splide","_Splide","_o","_E","defaults","Constructor","protoProps","staticProps","_proto","Extensions","_this","_C","_T","Component","component","_this$event","RENDERER_DEFAULT_CONFIG","listTag","slideTag","Style","_proto2","rule","breakpoint","selectors","build","_this2","css","default","buildSelectors","_this3","SplideRenderer","contents","config","clean","_proto3","parseBreakpoints","initSlides","registerRootStyles","registerTrackStyles","registerSlideStyles","registerListStyles","_this4","buildStyles","generateClones","_this5","_ref2","_this6","Style2","_ref3","_this7","_ref4","buildTranslate","cssSlideHeight","cssAspectRatio","_this8","_ref5","cssSlideWidth","_this$Direction","cssOffsetClones","cssOffsetGaps","isCenter","buildCssValue","cssOffsetCenter","Boolean","_this$Direction2","getCloneCount","isFixedWidth","_this$parseCssValue","parseCssValue","unit2","_this$Direction3","_this$parseCssValue2","_this$parseCssValue3","_value","_unit","gapOffset","_this$parseCssValue4","gaps","isVertical","_this9","buildClasses","buildAttrs","renderSlides","_this10","_content$html","background","unshift","_ref6","renderArrows","renderArrow","_this$options","ariaLabel","_this$config","rootClass","beforeTrack","afterTrack","slider","beforeSlider","afterSlider","CLASS_ARROW_NEXT","CLASS_ARROW_PREV","CLASS_CONTAINER","CLASS_FOCUS_IN","CLASS_INITIALIZED","CLASS_LIST","CLASS_LOADING","CLASS_NEXT","CLASS_OVERFLOW","CLASS_PAGINATION_PAGE","CLASS_PREV","CLASS_PROGRESS_BAR","CLASS_SPINNER","CLASS_SR","CLASS_TOGGLE","CLASS_TOGGLE_PAUSE","CLASS_TOGGLE_PLAY","CLASS_TRACK","CLASS_VISIBLE","EVENT_ACTIVE","EVENT_ARROWS_MOUNTED","EVENT_ARROWS_UPDATED","EVENT_AUTOPLAY_PAUSE","EVENT_AUTOPLAY_PLAY","EVENT_AUTOPLAY_PLAYING","EVENT_CLICK","EVENT_DESTROY","EVENT_DRAG","EVENT_DRAGGED","EVENT_DRAGGING","EVENT_END_INDEX_CHANGED","EVENT_HIDDEN","EVENT_INACTIVE","EVENT_LAZYLOAD_LOADED","EVENT_MOUNTED","EVENT_MOVE","EVENT_MOVED","EVENT_NAVIGATION_MOUNTED","EVENT_OVERFLOW","EVENT_PAGINATION_MOUNTED","EVENT_PAGINATION_UPDATED","EVENT_READY","EVENT_REFRESH","EVENT_RESIZE","EVENT_RESIZED","EVENT_SCROLL","EVENT_SCROLLED","EVENT_SHIFTED","EVENT_SLIDE_KEYDOWN","EVENT_UPDATED","EVENT_VISIBLE","FADE","LTR","RTL","formElement","payload","clearFormErrors","fields","feedbackElement","prepend","pswp","framework","_fullscrenAPI","_controls","_captionContainer","_fakeCaptionContainer","_indexIndicator","_shareButton","_shareModal","_initalCloseOnScrollValue","_isIdle","_listen","_loadingIndicator","_loadingIndicatorHidden","_loadingIndicatorTimeout","_galleryHasOneSlide","_options","_blockControlsTap","_idleInterval","_idleTimer","ui","_overlayUIUpdated","_controlsVisible","_shareModalHidden","_defaultUIOptions","barsSize","top","bottom","closeElClasses","timeToIdle","timeToIdleOutside","loadingIndicatorDelay","addCaptionHTMLFn","captionEl","innerHTML","closeEl","fullscreenEl","zoomEl","shareEl","counterEl","arrowEl","preloaderEl","tapToClose","tapToToggleControls","clickToCloseNonZoomable","shareButtons","download","getImageURLForShare","currItem","getPageURLForShare","getTextForShare","indexIndicatorSep","fitControlsWidth","_onControlsTap","mouseUsed","_onIdleMouseMove","uiElement","found","clickedClass","srcElement","_uiElements","onTap","tapDelay","features","isOldAndroid","_togglePswpClass","el","cName","_countNumItems","hasOneSlide","getNumItemsFn","_toggleShareModalClass","_toggleShareModal","_updateShareURLs","_openWindowPopup","shout","hasAttribute","open","screen","round","shareButtonData","image_url","page_url","share_text","shareButtonOut","encodeURIComponent","parseShareButtonOut","onclick","_hasCloseClass","_idleIncrement","clearTimeout","setIdle","_onMouseLeaveWindow","relatedTarget","toElement","nodeName","_toggleLoadingIndicator","hide","_applyNavBarGaps","vGap","likelyTouchDevice","bars","createEl","captionSize","clientHeight","onInit","toggleDesktopZoom","close","isFullscreen","exit","enter","pinchControlsHidden","extend","getChildByClass","scrollWrap","hideControls","showControls","point","initialZoomLevel","getZoomLevel","zoomTo","getDoubleTapZoom","isDown","preventObj","test","onGlobalTap","onMouseOver","clearInterval","eventK","updateFullscreen","hideAnimationDuration","showAnimationDuration","classAttr","loopThroughChildElements","sChildren","a","topBar","_setupUIElements","setInterval","getFullscreenAPI","template","loading","allowProgressiveImg","naturalWidth","isIdle","updateIndexIndicator","setScrollOffset","getScrollY","getCurrentIndex","pointerType","fitRatio","releasePoint","supportsFullscreen","exitFullscreen","mozCancelFullScreen","webkitExitFullscreen","msExitFullscreen","api","dE","documentElement","tF","requestFullscreen","enterK","exitK","elementK","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","closeOnScroll","Element","ALLOW_KEYBOARD_INPUT","UiClass","methodName","obj","yOffset","pageYOffset","scrollTop","reg","RegExp","parentEl","childClassName","firstChild","nextSibling","arraySearch","o1","o2","preventOverwrite","sine","out","k","sin","PI","inOut","cos","cubic","detectFeatures","helperStyle","vendor","oldIE","all","caf","pointerEvent","navigator","msPointerEnabled","ua","userAgent","platform","v","isOldIOSPhone","androidversion","androidVersion","isMobileOpera","styleCheckItem","styleName","styleChecks","vendors","fn","currTime","getTime","timeToCall","svg","createElementNS","createSVGRect","evName","_handleEv","handleEvent","allowPanToNext","spacing","bgOpacity","pinchToClose","closeOnVerticalDrag","verticalDragRange","showHideOpacity","escKey","arrowKeys","mainScrollEndFriction","panEndFriction","isClickableElement","isMouseClick","maxSpreadZoom","scaleMode","_isOpen","_isDestroying","_closedByScroll","_currentItemIndex","_containerStyle","_containerShiftIndex","_upMoveEvents","_downEvents","_globalEventHandlers","_currZoomLevel","_startZoomLevel","_translatePrefix","_translateSufix","_updateSizeInterval","_itemsNeedUpdate","_itemHolders","_prevItemIndex","_dragStartEvent","_dragMoveEvent","_dragEndEvent","_dragCancelEvent","_transformKey","_pointerEventEnabled","_likelyTouchDevice","_requestAF","_cancelAF","_initalClassName","_initalWindowScrollY","_oldIE","_currentWindowScrollY","_features","_orientationChangeTimeout","_gestureStartTime","_gestureCheckSpeedTime","_releaseAnimData","_isZoomingIn","_verticalDragInitiated","_oldAndroidTouchEndTimeout","_isDragging","_isMultitouch","_zoomStarted","_moved","_dragAnimFrame","_mainScrollShifted","_currentPoints","_isZooming","_startPointsDistance","_currPanBounds","_currZoomElementStyle","_mainScrollAnimating","_direction","_isFirstMove","_opacityChanged","_bgOpacity","_wasOverInitialZoom","_tempCounter","_currPanDist","_startPanOffset","_panOffset","_viewportSize","_currPositionIndex","_offset","_slideSize","_indexDiff","_isFixedPosition","_modules","_windowVisibleSize","_renderMaxResolution","_registerModule","publicMethods","_getLoopedId","numSlides","_getNumItems","_listeners","_shout","args","_getCurrentTime","_applyBgOpacity","opacity","bg","_applyZoomTransform","styleObj","zoom","_applyCurrentZoomPan","allowRenderResolution","_setImageSize","_applyZoomPanToItem","initialPosition","_setTranslateX","elStyle","_moveMainScroll","newSlideIndexOffset","delta","_mainScrollPos","_calculatePanOffset","axis","zoomLevel","_midZoomPoint","_equalizePoints","p1","p2","_roundPoint","_mouseMoveTimeout","_onFirstMouseMove","_calculatePanBounds","bounds","_calculateItemSize","_getMinZoomLevel","_getMaxZoomLevel","w","_modifyDestPanOffset","destPanBounds","destPanOffset","destZoomLevel","_onKeyDown","keydownAction","ctrlKey","altKey","metaKey","returnValue","_onGlobalClick","_updatePageScrollOffset","_animations","_numAnimations","_stopAnimation","_registerStartAnimation","_stopAllAnimations","_animateProp","b","endProp","easingFn","onComplete","startAnimTime","animloop","viewportSize","isMainScrollAnimating","isZooming","applyZoomPan","panX","panY","transform","itemHolders","wrap","allow3dTransform","perspective","zoomRatio","h","_setupTransforms","updateSize","orientationchange","clientWidth","keydown","click","oldPhone","animationName","isNaN","_getItemAt","mainClass","setContent","updateCurrItem","_showOrHide","_showOrHideTimeout","_stopDragUpdateLoop","panTo","goTo","updateCurrZoomItem","emulateSetContent","zoomElement","center","invalidateCurrItems","needsUpdate","beforeAnimation","tempHolder","diffAbs","NUM_HOLDERS","pop","prevItem","windowScrollY","innerWidth","innerHeight","holder","hIndex","cleanSlide","centerPoint","updateFn","initialPanOffset","_currPoint","_startPoint","_currPointers","_startMainScrollPos","_posPoints","_tempPoint","_currZoomedItemIndex","_centerPoint","_lastReleaseTime","_currCenterPoint","_calculatePointsDistance","sqrt","_dragUpdateLoop","_renderMovement","_closestElement","_preventObj","_preventDefaultEventBehaviour","_convertTouchToPoint","pageY","identifier","_findCenterOfPoints","pCenter","_calculateVerticalDragOpacityRatio","_ePoint1","_ePoint2","_tempPointsArr","_getTouchPoints","touches","_panOrMoveMainScroll","panFriction","startOverDiff","newPanPos","newMainScrollPos","newOffset","newMainScrollPosition","mainScrollDiff","_onDragStart","_initialZoomRunning","pointerIndex","pointerId","startPointsList","numPoints","_onDragMove","touchesList","_isEqualPoints","pointsDistance","_calculateZoomLevel","zoomFriction","minZoomLevel","maxZoomLevel","percent","opacityRatio","_pushPosPoint","_onDragRelease","splice","4","2","3","gestureType","touchList","releaseTimeDiff","_initDragReleaseAnimationData","calculateSwipeSpeed","initalPanY","initialBgOpacity","_finishSwipeMainScrollGesture","_completePanGesture","_completeZoomGesture","lastFlickDuration","tempReleasePos","lastFlickOffset","lastFlickDist","lastFlickSpeed","slowDownRatio","slowDownRatioReverse","speedDecelerationRatio","speedDecelerationRatioAbs","distanceOffset","backAnimDestination","backAnimStarted","calculateOverBoundsAnimOffset","pos","calculateAnimOffset","timeDiff","panAnimLoop","zoomPan","lastNow","animData","itemChanged","itemsDiff","nextCircle","totalShiftDist","isFastLastFlick","finishAnimDuration","animateToX","animateToDist","touchesDistance","initialOpacity","initGestures","addEventNames","pref","down","up","maxTouchPoints","msMaxTouchPoints","mousedown","mousemove","mouseup","_items","_initialContentSet","completeFn","thumbBounds","initialLayout","getThumbBoundsFn","closeWithRaf","fadeEverything","loadError","miniImg","webkitBackfaceVisibility","initalBgOpacity","_tempPanAreaSize","_imagesToAppendPool","_controllerDefaultOptions","errorMsg","forceProgressiveLoading","preload","isInitial","hRatio","vRatio","realPanElementW","realPanElementH","_calculateSingleItemPanBounds","_appendImage","baseDiv","preventAnimation","keepPlaceholder","imageAppended","loaded","_preloadImage","loadComplete","onload","onerror","_checkForError","cleanUp","maxRes","lastChild","_appendImagesPool","poolItem","clearPlaceholder","lazyLoadItem","initController","getItemAt","isNext","preloadBefore","preloadAfter","preloader","placeholderClassName","msrc","tapTimer","_wheelDelta","tapReleasePoint","_dispatchTapEvent","origEvent","eDetail","initTap","onTapStart","onTapRelease","touch0","touch1","p0","initDesktopZoom","setupDesktopZoom","handleMouseWheel","mouseZoomedIn","hasDraggingClass","updateZoomable","removeDraggingClass","deltaMode","deltaX","wheelDeltaX","wheelDeltaY","wheelDelta","newPanX","newPanY","doubleTapZoomLevel","zoomOut","_historyUpdateTimeout","_hashChangeTimeout","_hashAnimCheckTimeout","_hashChangedByScript","_hashChangedByHistory","_hashReseted","_initialHash","_historyChanged","_closedFromURL","_urlChangedOnce","_windowLoc","_supportsPushState","_historyDefaultOptions","history","galleryUID","_getHash","hash","substring","_cleanHistoryTimeouts","_parseItemIndexFromURL","params","vars","pair","galleryPIDs","searchfor","_updateHash","newHash","newURL","initHistory","updateURL","onHashChange","returnToOriginal","back","pushState","pathname","search","detailUpdateAddToCartEnableDisableOtherElements","PhotoSwipeDefault","PhotoSwipe","mainGallery","initGallery","thumbs","initPhotoSwipeFromDOM","gallerySelector","onThumbnailsClick","eTarget","clickedListItem","clickedGallery","childNodes","numChildNodes","nodeIndex","openPhotoSwipe","galleryElement","disableAnimation","fromURL","gallery","pswpElement","figureEl","linkEl","thumbElements","numNodes","parseThumbnailElements","thumbnail","getElementsByTagName","pageYScroll","j","galleryElements","hashData","gid","photoswipeParseHash","isDesktop","getModalHtmlElement","modalId","addToCartBtn","addToBagUrl","addToBag","mediaContainer","carouselThumbnail","isQuickView","mobile","selectedQty","updateQuantity","trueFitButton","color","swatchable","updateTrueFit","localStorage","setItem","dataLayer","exportDetails","searchPID","selectVariantAttribute","sizeChartTemplate","modalTitle","headingDescription","description","modalDescription","inseamGuideTemplate","processInclude","ex","applePayButton","showApplePay","applePayButtonIsmlString"],"mappings":"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","file":"default/js/productDetail.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 = 98);\n","'use strict';\nvar base = require('./base');\n\n/**\n * Enable/disable UI elements\n * @param {boolean} enableOrDisable - true or false\n */\nfunction updateAddToCartEnableDisableOtherElements(enableOrDisable) {\n $('button.add-to-cart-global').attr('disabled', enableOrDisable);\n}\n\nmodule.exports = {\n methods: {\n updateAddToCartEnableDisableOtherElements: updateAddToCartEnableDisableOtherElements\n },\n\n availability: base.availability,\n\n addToCart: base.addToCart,\n\n updateAttributesAndDetails: function () {\n $('body').on('product:statusUpdate', function (e, data) {\n var $productContainer = $('.product-detail[data-pid=\"' + data.id + '\"]');\n\n $productContainer.find('.description-and-detail .product-attributes')\n .empty()\n .html(data.attributesHtml);\n\n if (data.shortDescription) {\n $productContainer.find('.description-and-detail .description')\n .removeClass('hidden-xl-down');\n $productContainer.find('.description-and-detail .description .content')\n .empty()\n .html(data.shortDescription);\n } else {\n $productContainer.find('.description-and-detail .description')\n .addClass('hidden-xl-down');\n }\n\n if (data.longDescription) {\n $productContainer.find('.description-and-detail .details')\n .removeClass('hidden-xl-down');\n $productContainer.find('.description-and-detail .details .content')\n .empty()\n .html(data.longDescription);\n } else {\n $productContainer.find('.description-and-detail .details')\n .addClass('hidden-xl-down');\n }\n });\n },\n\n showSpinner: function () {\n $('body').on('product:beforeAddToCart product:beforeAttributeSelect', function () {\n $.spinner().start();\n });\n },\n updateAttribute: function () {\n $('body').on('product:afterAttributeSelect', function (e, response) {\n if ($('.product-detail>.bundle-items').length) {\n response.container.data('pid', response.data.product.id);\n response.container.find('.product-id').text(response.data.product.id);\n } else if ($('.product-set-detail').eq(0)) {\n response.container.data('pid', response.data.product.id);\n response.container.find('.product-id').text(response.data.product.id);\n } else {\n $('.product-id').text(response.data.product.id);\n $('.product-detail:not(\".bundle-item\")').data('pid', response.data.product.id);\n }\n });\n },\n updateAddToCart: function () {\n $('body').on('product:updateAddToCart', function (e, response) {\n // update local add to cart (for sets)\n $('button.add-to-cart', response.$productContainer).attr('disabled',\n (!response.product.readyToOrder || !response.product.available));\n\n var enable = $('.product-availability').toArray().every(function (item) {\n return $(item).data('available') && $(item).data('ready-to-order');\n });\n module.exports.methods.updateAddToCartEnableDisableOtherElements(!enable);\n });\n },\n updateAvailability: function () {\n $('body').on('product:updateAvailability', function (e, response) {\n $('div.availability', response.$productContainer)\n .data('ready-to-order', response.product.readyToOrder)\n .data('available', response.product.available);\n\n $('.availability-msg', response.$productContainer)\n .empty().html(response.message);\n\n if ($('.global-availability').length) {\n var allAvailable = $('.product-availability').toArray()\n .every(function (item) { return $(item).data('available'); });\n\n var allReady = $('.product-availability').toArray()\n .every(function (item) { return $(item).data('ready-to-order'); });\n\n $('.global-availability')\n .data('ready-to-order', allReady)\n .data('available', allAvailable);\n\n $('.global-availability .availability-msg').empty()\n .html(allReady ? response.message : response.resources.info_selectforstock);\n }\n });\n },\n sizeChart: function () {\n $('.size-chart a').on('click', function (e) {\n e.preventDefault();\n var url = $(this).attr('href');\n var $prodSizeChart = $(this).closest('.size-chart').find('.size-chart-collapsible');\n if ($prodSizeChart.is(':empty')) {\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n $prodSizeChart.append(data.content);\n }\n });\n }\n $prodSizeChart.toggleClass('active');\n });\n\n var $sizeChart = $('.size-chart-collapsible');\n $('body').on('click touchstart', function (e) {\n if ($('.size-chart').has(e.target).length <= 0) {\n $sizeChart.removeClass('active');\n }\n });\n },\n copyProductLink: function () {\n $('body').on('click', '#fa-link', function () {\n event.preventDefault();\n var $temp = $('');\n $('body').append($temp);\n $temp.val($('#shareUrl').val()).select();\n document.execCommand('copy');\n $temp.remove();\n $('.copy-link-message').attr('role', 'alert');\n $('.copy-link-message').removeClass('d-none');\n setTimeout(function () {\n $('.copy-link-message').addClass('d-none');\n }, 3000);\n });\n },\n\n focusChooseBonusProductModal: base.focusChooseBonusProductModal()\n};\n","'use strict';\n\n\n/**\n * appends params to a url\n * @param {string} data - data returned from the server's ajax call\n * @param {Object} button - button that was clicked to add a product to the wishlist\n */\nfunction displayMessage(data, button) {\n $.spinner().stop();\n var status;\n if (data.success) {\n status = 'alert-success';\n } else {\n status = 'alert-danger';\n }\n\n if ($('.add-to-wishlist-messages').length === 0) {\n $('body').append(\n '
'\n );\n }\n $('.add-to-wishlist-messages')\n .append('
' + data.msg + '
');\n\n setTimeout(function () {\n $('.add-to-wishlist-messages').remove();\n button.removeAttr('disabled');\n }, 5000);\n}\n\nmodule.exports = {\n addToWishlist: function () {\n $('.add-to-wish-list').on('click', function (e) {\n e.preventDefault();\n var url = $(this).data('href');\n var button = $(this);\n var pid = $(this).closest('.product-detail').find('.product-id').html();\n var optionId = $(this).closest('.product-detail').find('.product-option').attr('data-option-id');\n var optionVal = $(this).closest('.product-detail').find('.options-select option:selected').attr('data-value-id');\n optionId = optionId || null;\n optionVal = optionVal || null;\n if (!url || !pid) {\n return;\n }\n\n $.spinner().start();\n $(this).attr('disabled', true);\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: {\n pid: pid,\n optionId: optionId,\n optionVal: optionVal\n },\n success: function (data) {\n displayMessage(data, button);\n },\n error: function (err) {\n displayMessage(err, button);\n }\n });\n });\n }\n};\n","/* global Promise */\n'use strict';\n\n/**\n * Get the cart quantity.\n * @param {string} url - URL of the controller to get the cart model\n * @param {number=} delay - milliseconds to wait before getting the cart (default is 1000)\n * @returns {Promise} - promise to resolve the cart model and its quantity\n */\nfunction getCartQuantity(url, delay) {\n return new Promise(function (resolve, reject) {\n // Default delay to 1 second\n var timeoutMillis = delay || 1000;\n\n setTimeout(function () {\n $.ajax({\n url: url,\n contentType: 'application/json; charset=UTF-8',\n success: function (response) {\n if (response.quantityTotal) {\n // Resolve response for mini cart update\n resolve(response);\n } else {\n // Get the cart again after a longer delay\n getCartQuantity(url, timeoutMillis * 2).then(resolve, reject);\n }\n },\n error: reject\n });\n }, timeoutMillis);\n });\n}\n\nmodule.exports = {\n updateBuyNowRequest: function () {\n if (window.sfpp) {\n sfpp.ready(function () { // eslint-disable-line\n var errorElement = $(document.querySelector('.salesforce-buynow-element-errors'));\n var buynow = sfpp.get('buynow'); // eslint-disable-line\n\n var getCartUrl = $('.salesforce-buynow-element').data('getcart');\n var placeOrderUrl = $('.salesforce-buynow-element').data('placeorder');\n var paypalApproveUrl = $('.salesforce-buynow-element').data('paypalapprove');\n\n var paypalMessage = $('.prices-add-to-cart-actions .salesforce-paypal-messaging');\n\n $('body').on('product:updateAddToCart', function (e, response) {\n // Update payment request data and options\n buynow.updateBasketData(response.product.buynow.basketData);\n buynow.updatePaymentRequest(response.product.buynow.options);\n\n // Update amount in PayPal messages component\n paypalMessage.find('div[data-pp-message]').attr('data-pp-amount', response.product.buynow.paypalAmount);\n });\n\n // Show PayPal messages component if PayPal button rendered\n buynow.on('render', function () {\n if (buynow.getRenderedTypes().indexOf('paypalexpress') !== -1) {\n paypalMessage.removeClass('salesforce-paypal-messaging-hidden');\n }\n });\n\n // Update mini cart count once basket is prepared\n buynow.on('click', function () {\n getCartQuantity(getCartUrl).then(function (response) {\n $('.minicart').trigger('count:update', response);\n $('body').trigger('product:afterAddToCart', response);\n });\n });\n\n // Update error message on change\n buynow.on('change', function (event) {\n if (event.error) {\n // Inform the customer that there is an error.\n errorElement.empty().text(event.error.message);\n } else {\n // Clear out error message\n errorElement.empty();\n }\n });\n\n buynow.on('payment', function () {\n $.ajax({\n url: placeOrderUrl,\n method: 'POST',\n contentType: 'application/json; charset=UTF-8',\n success: function (data) {\n if (data.error) {\n // Inform the customer that there is an error.\n errorElement.empty().text(data.errorMessage);\n } else {\n // Show the order confirmation page\n var redirect = $('
')\n .appendTo(document.body)\n .attr({\n method: 'POST',\n action: data.continueUrl\n });\n\n $('')\n .appendTo(redirect)\n .attr({\n name: 'orderID',\n value: data.orderID\n });\n\n $('')\n .appendTo(redirect)\n .attr({\n name: 'orderToken',\n value: data.orderToken\n });\n\n redirect.submit();\n }\n },\n error: function (err) {\n if (err.message) {\n // Inform the customer that there is an error.\n errorElement.empty().text(err.message);\n }\n }\n });\n });\n\n buynow.on('paypal.approve', function () {\n $.ajax({\n url: paypalApproveUrl,\n type: 'post',\n data: '',\n success: function (data) {\n window.location.href = data.redirectUrl;\n },\n error: function (err) {\n if (err.responseJSON && err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else if (err.message) {\n // Inform the customer that there is an error.\n errorElement.empty().text(err.message);\n }\n }\n });\n });\n });\n }\n }\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';\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\n/**\n * Script depends on sizeChartOptions custom preference being set properly as\n * it will pull the sub category options from the global SIZE_CHART_OPTIONS\n * variable that is created on the template.\n*/\n\nvar formValidation = require('base/components/formValidation');\n\n/**\n *\n * @param {element} select - a select element from DOM\n * @param {Object} options - an object containing key value pairs for select option\n */\nfunction appendSelectOptions(select, options) {\n /* eslint-disable guard-for-in, no-restricted-syntax */\n for (var prop in options) {\n select.add(new Option(options[prop], prop));\n }\n}\n\n/**\n *\n * @param {element} select - a select element from DOM\n */\nfunction removeSelectOptions(select) {\n for (let option in select.options) {\n select.remove(option);\n }\n\n select.add(new Option('Select a sub-category', '', true, true));\n}\n\n/**\n *\n */\nfunction watchSelectChange() {\n var categorySelect = document.getElementById('categorySelect');\n if (categorySelect) {\n categorySelect.addEventListener('change', function () {\n let subCategorySelect = document.getElementById('subCategorySelect');\n removeSelectOptions(subCategorySelect);\n /* eslint-disable no-undef */\n appendSelectOptions(subCategorySelect, SIZE_CHART_OPTIONS[this.value]);\n });\n }\n}\n\n/**\n * getSizeChart - Get size chart using Product-SizeChart controller. Content ID is formed from select options concatenated.\n */\nfunction getSizeChart() {\n $('#sizeChartSelector').on('submit', function (e) {\n e.preventDefault();\n let form = $(this);\n\n // var url = `${form.action}size-chart-${formData.categorySelect.value}-${formData.subCategorySelect.value}`;\n var $prodSizeChart = $('.size-chart-container');\n $.ajax({\n url: form.attr('action'),\n type: 'get',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n if (!data.success) {\n form.spinner().stop();\n formValidation(form, data);\n $prodSizeChart.empty();\n let newHeading = document.createElement('h3');\n newHeading.classList.add('h5');\n let errorMessage = document.createTextNode('Sorry, we couldn\\'t find that size chart.');\n newHeading.appendChild(errorMessage);\n $prodSizeChart.append(newHeading);\n } else {\n $prodSizeChart.empty();\n $prodSizeChart.append(data.content);\n form.spinner().stop();\n }\n },\n error: function () {\n form.spinner().stop();\n }\n });\n });\n}\n\n/**\n *\n */\nfunction getCurrentSelection() {\n let category = document.getElementById('categorySelect');\n if (category) {\n let categoryValue = category.value;\n let subCategory = document.getElementById('subCategorySelect');\n let subCategoryValue = subCategory.value;\n if (subCategoryValue) {\n getSizeChart();\n } else if (categoryValue) {\n /* eslint-disable no-undef */\n appendSelectOptions(subCategory, SIZE_CHART_OPTIONS[categoryValue]);\n }\n }\n}\n\n$(document).ready(function () {\n getCurrentSelection();\n watchSelectChange();\n getSizeChart();\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 * Splide.js\n * Version : 4.1.4\n * License : MIT\n * Copyright: 2022 Naotoshi Fujita\n */\n'use strict';\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nvar MEDIA_PREFERS_REDUCED_MOTION = \"(prefers-reduced-motion: reduce)\";\nvar CREATED = 1;\nvar MOUNTED = 2;\nvar IDLE = 3;\nvar MOVING = 4;\nvar SCROLLING = 5;\nvar DRAGGING = 6;\nvar DESTROYED = 7;\nvar STATES = {\n CREATED: CREATED,\n MOUNTED: MOUNTED,\n IDLE: IDLE,\n MOVING: MOVING,\n SCROLLING: SCROLLING,\n DRAGGING: DRAGGING,\n DESTROYED: DESTROYED\n};\n\nfunction empty(array) {\n array.length = 0;\n}\n\nfunction slice(arrayLike, start, end) {\n return Array.prototype.slice.call(arrayLike, start, end);\n}\n\nfunction apply(func) {\n return func.bind.apply(func, [null].concat(slice(arguments, 1)));\n}\n\nvar nextTick = setTimeout;\n\nvar noop = function noop() {};\n\nfunction raf(func) {\n return requestAnimationFrame(func);\n}\n\nfunction typeOf(type, subject) {\n return typeof subject === type;\n}\n\nfunction isObject(subject) {\n return !isNull(subject) && typeOf(\"object\", subject);\n}\n\nvar isArray = Array.isArray;\nvar isFunction = apply(typeOf, \"function\");\nvar isString = apply(typeOf, \"string\");\nvar isUndefined = apply(typeOf, \"undefined\");\n\nfunction isNull(subject) {\n return subject === null;\n}\n\nfunction isHTMLElement(subject) {\n try {\n return subject instanceof (subject.ownerDocument.defaultView || window).HTMLElement;\n } catch (e) {\n return false;\n }\n}\n\nfunction toArray(value) {\n return isArray(value) ? value : [value];\n}\n\nfunction forEach(values, iteratee) {\n toArray(values).forEach(iteratee);\n}\n\nfunction includes(array, value) {\n return array.indexOf(value) > -1;\n}\n\nfunction push(array, items) {\n array.push.apply(array, toArray(items));\n return array;\n}\n\nfunction toggleClass(elm, classes, add) {\n if (elm) {\n forEach(classes, function (name) {\n if (name) {\n elm.classList[add ? \"add\" : \"remove\"](name);\n }\n });\n }\n}\n\nfunction addClass(elm, classes) {\n toggleClass(elm, isString(classes) ? classes.split(\" \") : classes, true);\n}\n\nfunction append(parent, children) {\n forEach(children, parent.appendChild.bind(parent));\n}\n\nfunction before(nodes, ref) {\n forEach(nodes, function (node) {\n var parent = (ref || node).parentNode;\n\n if (parent) {\n parent.insertBefore(node, ref);\n }\n });\n}\n\nfunction matches(elm, selector) {\n return isHTMLElement(elm) && (elm[\"msMatchesSelector\"] || elm.matches).call(elm, selector);\n}\n\nfunction children(parent, selector) {\n var children2 = parent ? slice(parent.children) : [];\n return selector ? children2.filter(function (child) {\n return matches(child, selector);\n }) : children2;\n}\n\nfunction child(parent, selector) {\n return selector ? children(parent, selector)[0] : parent.firstElementChild;\n}\n\nvar ownKeys = Object.keys;\n\nfunction forOwn(object, iteratee, right) {\n if (object) {\n (right ? ownKeys(object).reverse() : ownKeys(object)).forEach(function (key) {\n key !== \"__proto__\" && iteratee(object[key], key);\n });\n }\n\n return object;\n}\n\nfunction assign(object) {\n slice(arguments, 1).forEach(function (source) {\n forOwn(source, function (value, key) {\n object[key] = source[key];\n });\n });\n return object;\n}\n\nfunction merge(object) {\n slice(arguments, 1).forEach(function (source) {\n forOwn(source, function (value, key) {\n if (isArray(value)) {\n object[key] = value.slice();\n } else if (isObject(value)) {\n object[key] = merge({}, isObject(object[key]) ? object[key] : {}, value);\n } else {\n object[key] = value;\n }\n });\n });\n return object;\n}\n\nfunction omit(object, keys) {\n forEach(keys || ownKeys(object), function (key) {\n delete object[key];\n });\n}\n\nfunction removeAttribute(elms, attrs) {\n forEach(elms, function (elm) {\n forEach(attrs, function (attr) {\n elm && elm.removeAttribute(attr);\n });\n });\n}\n\nfunction setAttribute(elms, attrs, value) {\n if (isObject(attrs)) {\n forOwn(attrs, function (value2, name) {\n setAttribute(elms, name, value2);\n });\n } else {\n forEach(elms, function (elm) {\n isNull(value) || value === \"\" ? removeAttribute(elm, attrs) : elm.setAttribute(attrs, String(value));\n });\n }\n}\n\nfunction create(tag, attrs, parent) {\n var elm = document.createElement(tag);\n\n if (attrs) {\n isString(attrs) ? addClass(elm, attrs) : setAttribute(elm, attrs);\n }\n\n parent && append(parent, elm);\n return elm;\n}\n\nfunction style(elm, prop, value) {\n if (isUndefined(value)) {\n return getComputedStyle(elm)[prop];\n }\n\n if (!isNull(value)) {\n elm.style[prop] = \"\" + value;\n }\n}\n\nfunction display(elm, display2) {\n style(elm, \"display\", display2);\n}\n\nfunction focus(elm) {\n elm[\"setActive\"] && elm[\"setActive\"]() || elm.focus({\n preventScroll: true\n });\n}\n\nfunction getAttribute(elm, attr) {\n return elm.getAttribute(attr);\n}\n\nfunction hasClass(elm, className) {\n return elm && elm.classList.contains(className);\n}\n\nfunction rect(target) {\n return target.getBoundingClientRect();\n}\n\nfunction remove(nodes) {\n forEach(nodes, function (node) {\n if (node && node.parentNode) {\n node.parentNode.removeChild(node);\n }\n });\n}\n\nfunction parseHtml(html) {\n return child(new DOMParser().parseFromString(html, \"text/html\").body);\n}\n\nfunction prevent(e, stopPropagation) {\n e.preventDefault();\n\n if (stopPropagation) {\n e.stopPropagation();\n e.stopImmediatePropagation();\n }\n}\n\nfunction query(parent, selector) {\n return parent && parent.querySelector(selector);\n}\n\nfunction queryAll(parent, selector) {\n return selector ? slice(parent.querySelectorAll(selector)) : [];\n}\n\nfunction removeClass(elm, classes) {\n toggleClass(elm, classes, false);\n}\n\nfunction timeOf(e) {\n return e.timeStamp;\n}\n\nfunction unit(value) {\n return isString(value) ? value : value ? value + \"px\" : \"\";\n}\n\nvar PROJECT_CODE = \"splide\";\nvar DATA_ATTRIBUTE = \"data-\" + PROJECT_CODE;\n\nfunction assert(condition, message) {\n if (!condition) {\n throw new Error(\"[\" + PROJECT_CODE + \"] \" + (message || \"\"));\n }\n}\n\nvar min = Math.min,\n max = Math.max,\n floor = Math.floor,\n ceil = Math.ceil,\n abs = Math.abs;\n\nfunction approximatelyEqual(x, y, epsilon) {\n return abs(x - y) < epsilon;\n}\n\nfunction between(number, x, y, exclusive) {\n var minimum = min(x, y);\n var maximum = max(x, y);\n return exclusive ? minimum < number && number < maximum : minimum <= number && number <= maximum;\n}\n\nfunction clamp(number, x, y) {\n var minimum = min(x, y);\n var maximum = max(x, y);\n return min(max(minimum, number), maximum);\n}\n\nfunction sign(x) {\n return +(x > 0) - +(x < 0);\n}\n\nfunction camelToKebab(string) {\n return string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n\nfunction format(string, replacements) {\n forEach(replacements, function (replacement) {\n string = string.replace(\"%s\", \"\" + replacement);\n });\n return string;\n}\n\nfunction pad(number) {\n return number < 10 ? \"0\" + number : \"\" + number;\n}\n\nvar ids = {};\n\nfunction uniqueId(prefix) {\n return \"\" + prefix + pad(ids[prefix] = (ids[prefix] || 0) + 1);\n}\n\nfunction EventBinder() {\n var listeners = [];\n\n function bind(targets, events, callback, options) {\n forEachEvent(targets, events, function (target, event, namespace) {\n var isEventTarget = (\"addEventListener\" in target);\n var remover = isEventTarget ? target.removeEventListener.bind(target, event, callback, options) : target[\"removeListener\"].bind(target, callback);\n isEventTarget ? target.addEventListener(event, callback, options) : target[\"addListener\"](callback);\n listeners.push([target, event, namespace, callback, remover]);\n });\n }\n\n function unbind(targets, events, callback) {\n forEachEvent(targets, events, function (target, event, namespace) {\n listeners = listeners.filter(function (listener) {\n if (listener[0] === target && listener[1] === event && listener[2] === namespace && (!callback || listener[3] === callback)) {\n listener[4]();\n return false;\n }\n\n return true;\n });\n });\n }\n\n function dispatch(target, type, detail) {\n var e;\n var bubbles = true;\n\n if (typeof CustomEvent === \"function\") {\n e = new CustomEvent(type, {\n bubbles: bubbles,\n detail: detail\n });\n } else {\n e = document.createEvent(\"CustomEvent\");\n e.initCustomEvent(type, bubbles, false, detail);\n }\n\n target.dispatchEvent(e);\n return e;\n }\n\n function forEachEvent(targets, events, iteratee) {\n forEach(targets, function (target) {\n target && forEach(events, function (events2) {\n events2.split(\" \").forEach(function (eventNS) {\n var fragment = eventNS.split(\".\");\n iteratee(target, fragment[0], fragment[1]);\n });\n });\n });\n }\n\n function destroy() {\n listeners.forEach(function (data) {\n data[4]();\n });\n empty(listeners);\n }\n\n return {\n bind: bind,\n unbind: unbind,\n dispatch: dispatch,\n destroy: destroy\n };\n}\n\nvar EVENT_MOUNTED = \"mounted\";\nvar EVENT_READY = \"ready\";\nvar EVENT_MOVE = \"move\";\nvar EVENT_MOVED = \"moved\";\nvar EVENT_CLICK = \"click\";\nvar EVENT_ACTIVE = \"active\";\nvar EVENT_INACTIVE = \"inactive\";\nvar EVENT_VISIBLE = \"visible\";\nvar EVENT_HIDDEN = \"hidden\";\nvar EVENT_REFRESH = \"refresh\";\nvar EVENT_UPDATED = \"updated\";\nvar EVENT_RESIZE = \"resize\";\nvar EVENT_RESIZED = \"resized\";\nvar EVENT_DRAG = \"drag\";\nvar EVENT_DRAGGING = \"dragging\";\nvar EVENT_DRAGGED = \"dragged\";\nvar EVENT_SCROLL = \"scroll\";\nvar EVENT_SCROLLED = \"scrolled\";\nvar EVENT_OVERFLOW = \"overflow\";\nvar EVENT_DESTROY = \"destroy\";\nvar EVENT_ARROWS_MOUNTED = \"arrows:mounted\";\nvar EVENT_ARROWS_UPDATED = \"arrows:updated\";\nvar EVENT_PAGINATION_MOUNTED = \"pagination:mounted\";\nvar EVENT_PAGINATION_UPDATED = \"pagination:updated\";\nvar EVENT_NAVIGATION_MOUNTED = \"navigation:mounted\";\nvar EVENT_AUTOPLAY_PLAY = \"autoplay:play\";\nvar EVENT_AUTOPLAY_PLAYING = \"autoplay:playing\";\nvar EVENT_AUTOPLAY_PAUSE = \"autoplay:pause\";\nvar EVENT_LAZYLOAD_LOADED = \"lazyload:loaded\";\nvar EVENT_SLIDE_KEYDOWN = \"sk\";\nvar EVENT_SHIFTED = \"sh\";\nvar EVENT_END_INDEX_CHANGED = \"ei\";\n\nfunction EventInterface(Splide2) {\n var bus = Splide2 ? Splide2.event.bus : document.createDocumentFragment();\n var binder = EventBinder();\n\n function on(events, callback) {\n binder.bind(bus, toArray(events).join(\" \"), function (e) {\n callback.apply(callback, isArray(e.detail) ? e.detail : []);\n });\n }\n\n function emit(event) {\n binder.dispatch(bus, event, slice(arguments, 1));\n }\n\n if (Splide2) {\n Splide2.event.on(EVENT_DESTROY, binder.destroy);\n }\n\n return assign(binder, {\n bus: bus,\n on: on,\n off: apply(binder.unbind, bus),\n emit: emit\n });\n}\n\nfunction RequestInterval(interval, onInterval, onUpdate, limit) {\n var now = Date.now;\n var startTime;\n var rate = 0;\n var id;\n var paused = true;\n var count = 0;\n\n function update() {\n if (!paused) {\n rate = interval ? min((now() - startTime) / interval, 1) : 1;\n onUpdate && onUpdate(rate);\n\n if (rate >= 1) {\n onInterval();\n startTime = now();\n\n if (limit && ++count >= limit) {\n return pause();\n }\n }\n\n id = raf(update);\n }\n }\n\n function start(resume) {\n resume || cancel();\n startTime = now() - (resume ? rate * interval : 0);\n paused = false;\n id = raf(update);\n }\n\n function pause() {\n paused = true;\n }\n\n function rewind() {\n startTime = now();\n rate = 0;\n\n if (onUpdate) {\n onUpdate(rate);\n }\n }\n\n function cancel() {\n id && cancelAnimationFrame(id);\n rate = 0;\n id = 0;\n paused = true;\n }\n\n function set(time) {\n interval = time;\n }\n\n function isPaused() {\n return paused;\n }\n\n return {\n start: start,\n rewind: rewind,\n pause: pause,\n cancel: cancel,\n set: set,\n isPaused: isPaused\n };\n}\n\nfunction State(initialState) {\n var state = initialState;\n\n function set(value) {\n state = value;\n }\n\n function is(states) {\n return includes(toArray(states), state);\n }\n\n return {\n set: set,\n is: is\n };\n}\n\nfunction Throttle(func, duration) {\n var interval = RequestInterval(duration || 0, func, null, 1);\n return function () {\n interval.isPaused() && interval.start();\n };\n}\n\nfunction Media(Splide2, Components2, options) {\n var state = Splide2.state;\n var breakpoints = options.breakpoints || {};\n var reducedMotion = options.reducedMotion || {};\n var binder = EventBinder();\n var queries = [];\n\n function setup() {\n var isMin = options.mediaQuery === \"min\";\n ownKeys(breakpoints).sort(function (n, m) {\n return isMin ? +n - +m : +m - +n;\n }).forEach(function (key) {\n register(breakpoints[key], \"(\" + (isMin ? \"min\" : \"max\") + \"-width:\" + key + \"px)\");\n });\n register(reducedMotion, MEDIA_PREFERS_REDUCED_MOTION);\n update();\n }\n\n function destroy(completely) {\n if (completely) {\n binder.destroy();\n }\n }\n\n function register(options2, query) {\n var queryList = matchMedia(query);\n binder.bind(queryList, \"change\", update);\n queries.push([options2, queryList]);\n }\n\n function update() {\n var destroyed = state.is(DESTROYED);\n var direction = options.direction;\n var merged = queries.reduce(function (merged2, entry) {\n return merge(merged2, entry[1].matches ? entry[0] : {});\n }, {});\n omit(options);\n set(merged);\n\n if (options.destroy) {\n Splide2.destroy(options.destroy === \"completely\");\n } else if (destroyed) {\n destroy(true);\n Splide2.mount();\n } else {\n direction !== options.direction && Splide2.refresh();\n }\n }\n\n function reduce(enable) {\n if (matchMedia(MEDIA_PREFERS_REDUCED_MOTION).matches) {\n enable ? merge(options, reducedMotion) : omit(options, ownKeys(reducedMotion));\n }\n }\n\n function set(opts, base, notify) {\n merge(options, opts);\n base && merge(Object.getPrototypeOf(options), opts);\n\n if (notify || !state.is(CREATED)) {\n Splide2.emit(EVENT_UPDATED, options);\n }\n }\n\n return {\n setup: setup,\n destroy: destroy,\n reduce: reduce,\n set: set\n };\n}\n\nvar ARROW = \"Arrow\";\nvar ARROW_LEFT = ARROW + \"Left\";\nvar ARROW_RIGHT = ARROW + \"Right\";\nvar ARROW_UP = ARROW + \"Up\";\nvar ARROW_DOWN = ARROW + \"Down\";\nvar LTR = \"ltr\";\nvar RTL = \"rtl\";\nvar TTB = \"ttb\";\nvar ORIENTATION_MAP = {\n width: [\"height\"],\n left: [\"top\", \"right\"],\n right: [\"bottom\", \"left\"],\n x: [\"y\"],\n X: [\"Y\"],\n Y: [\"X\"],\n ArrowLeft: [ARROW_UP, ARROW_RIGHT],\n ArrowRight: [ARROW_DOWN, ARROW_LEFT]\n};\n\nfunction Direction(Splide2, Components2, options) {\n function resolve(prop, axisOnly, direction) {\n direction = direction || options.direction;\n var index = direction === RTL && !axisOnly ? 1 : direction === TTB ? 0 : -1;\n return ORIENTATION_MAP[prop] && ORIENTATION_MAP[prop][index] || prop.replace(/width|left|right/i, function (match, offset) {\n var replacement = ORIENTATION_MAP[match.toLowerCase()][index] || match;\n return offset > 0 ? replacement.charAt(0).toUpperCase() + replacement.slice(1) : replacement;\n });\n }\n\n function orient(value) {\n return value * (options.direction === RTL ? 1 : -1);\n }\n\n return {\n resolve: resolve,\n orient: orient\n };\n}\n\nvar ROLE = \"role\";\nvar TAB_INDEX = \"tabindex\";\nvar DISABLED = \"disabled\";\nvar ARIA_PREFIX = \"aria-\";\nvar ARIA_CONTROLS = ARIA_PREFIX + \"controls\";\nvar ARIA_CURRENT = ARIA_PREFIX + \"current\";\nvar ARIA_SELECTED = ARIA_PREFIX + \"selected\";\nvar ARIA_LABEL = ARIA_PREFIX + \"label\";\nvar ARIA_LABELLEDBY = ARIA_PREFIX + \"labelledby\";\nvar ARIA_HIDDEN = ARIA_PREFIX + \"hidden\";\nvar ARIA_ORIENTATION = ARIA_PREFIX + \"orientation\";\nvar ARIA_ROLEDESCRIPTION = ARIA_PREFIX + \"roledescription\";\nvar ARIA_LIVE = ARIA_PREFIX + \"live\";\nvar ARIA_BUSY = ARIA_PREFIX + \"busy\";\nvar ARIA_ATOMIC = ARIA_PREFIX + \"atomic\";\nvar ALL_ATTRIBUTES = [ROLE, TAB_INDEX, DISABLED, ARIA_CONTROLS, ARIA_CURRENT, ARIA_LABEL, ARIA_LABELLEDBY, ARIA_HIDDEN, ARIA_ORIENTATION, ARIA_ROLEDESCRIPTION];\nvar CLASS_PREFIX = PROJECT_CODE + \"__\";\nvar STATUS_CLASS_PREFIX = \"is-\";\nvar CLASS_ROOT = PROJECT_CODE;\nvar CLASS_TRACK = CLASS_PREFIX + \"track\";\nvar CLASS_LIST = CLASS_PREFIX + \"list\";\nvar CLASS_SLIDE = CLASS_PREFIX + \"slide\";\nvar CLASS_CLONE = CLASS_SLIDE + \"--clone\";\nvar CLASS_CONTAINER = CLASS_SLIDE + \"__container\";\nvar CLASS_ARROWS = CLASS_PREFIX + \"arrows\";\nvar CLASS_ARROW = CLASS_PREFIX + \"arrow\";\nvar CLASS_ARROW_PREV = CLASS_ARROW + \"--prev\";\nvar CLASS_ARROW_NEXT = CLASS_ARROW + \"--next\";\nvar CLASS_PAGINATION = CLASS_PREFIX + \"pagination\";\nvar CLASS_PAGINATION_PAGE = CLASS_PAGINATION + \"__page\";\nvar CLASS_PROGRESS = CLASS_PREFIX + \"progress\";\nvar CLASS_PROGRESS_BAR = CLASS_PROGRESS + \"__bar\";\nvar CLASS_TOGGLE = CLASS_PREFIX + \"toggle\";\nvar CLASS_TOGGLE_PLAY = CLASS_TOGGLE + \"__play\";\nvar CLASS_TOGGLE_PAUSE = CLASS_TOGGLE + \"__pause\";\nvar CLASS_SPINNER = CLASS_PREFIX + \"spinner\";\nvar CLASS_SR = CLASS_PREFIX + \"sr\";\nvar CLASS_INITIALIZED = STATUS_CLASS_PREFIX + \"initialized\";\nvar CLASS_ACTIVE = STATUS_CLASS_PREFIX + \"active\";\nvar CLASS_PREV = STATUS_CLASS_PREFIX + \"prev\";\nvar CLASS_NEXT = STATUS_CLASS_PREFIX + \"next\";\nvar CLASS_VISIBLE = STATUS_CLASS_PREFIX + \"visible\";\nvar CLASS_LOADING = STATUS_CLASS_PREFIX + \"loading\";\nvar CLASS_FOCUS_IN = STATUS_CLASS_PREFIX + \"focus-in\";\nvar CLASS_OVERFLOW = STATUS_CLASS_PREFIX + \"overflow\";\nvar STATUS_CLASSES = [CLASS_ACTIVE, CLASS_VISIBLE, CLASS_PREV, CLASS_NEXT, CLASS_LOADING, CLASS_FOCUS_IN, CLASS_OVERFLOW];\nvar CLASSES = {\n slide: CLASS_SLIDE,\n clone: CLASS_CLONE,\n arrows: CLASS_ARROWS,\n arrow: CLASS_ARROW,\n prev: CLASS_ARROW_PREV,\n next: CLASS_ARROW_NEXT,\n pagination: CLASS_PAGINATION,\n page: CLASS_PAGINATION_PAGE,\n spinner: CLASS_SPINNER\n};\n\nfunction closest(from, selector) {\n if (isFunction(from.closest)) {\n return from.closest(selector);\n }\n\n var elm = from;\n\n while (elm && elm.nodeType === 1) {\n if (matches(elm, selector)) {\n break;\n }\n\n elm = elm.parentElement;\n }\n\n return elm;\n}\n\nvar FRICTION = 5;\nvar LOG_INTERVAL = 200;\nvar POINTER_DOWN_EVENTS = \"touchstart mousedown\";\nvar POINTER_MOVE_EVENTS = \"touchmove mousemove\";\nvar POINTER_UP_EVENTS = \"touchend touchcancel mouseup click\";\n\nfunction Elements(Splide2, Components2, options) {\n var _EventInterface = EventInterface(Splide2),\n on = _EventInterface.on,\n bind = _EventInterface.bind;\n\n var root = Splide2.root;\n var i18n = options.i18n;\n var elements = {};\n var slides = [];\n var rootClasses = [];\n var trackClasses = [];\n var track;\n var list;\n var isUsingKey;\n\n function setup() {\n collect();\n init();\n update();\n }\n\n function mount() {\n on(EVENT_REFRESH, destroy);\n on(EVENT_REFRESH, setup);\n on(EVENT_UPDATED, update);\n bind(document, POINTER_DOWN_EVENTS + \" keydown\", function (e) {\n isUsingKey = e.type === \"keydown\";\n }, {\n capture: true\n });\n bind(root, \"focusin\", function () {\n toggleClass(root, CLASS_FOCUS_IN, !!isUsingKey);\n });\n }\n\n function destroy(completely) {\n var attrs = ALL_ATTRIBUTES.concat(\"style\");\n empty(slides);\n removeClass(root, rootClasses);\n removeClass(track, trackClasses);\n removeAttribute([track, list], attrs);\n removeAttribute(root, completely ? attrs : [\"style\", ARIA_ROLEDESCRIPTION]);\n }\n\n function update() {\n removeClass(root, rootClasses);\n removeClass(track, trackClasses);\n rootClasses = getClasses(CLASS_ROOT);\n trackClasses = getClasses(CLASS_TRACK);\n addClass(root, rootClasses);\n addClass(track, trackClasses);\n setAttribute(root, ARIA_LABEL, options.label);\n setAttribute(root, ARIA_LABELLEDBY, options.labelledby);\n }\n\n function collect() {\n track = find(\".\" + CLASS_TRACK);\n list = child(track, \".\" + CLASS_LIST);\n assert(track && list, \"A track/list element is missing.\");\n push(slides, children(list, \".\" + CLASS_SLIDE + \":not(.\" + CLASS_CLONE + \")\"));\n forOwn({\n arrows: CLASS_ARROWS,\n pagination: CLASS_PAGINATION,\n prev: CLASS_ARROW_PREV,\n next: CLASS_ARROW_NEXT,\n bar: CLASS_PROGRESS_BAR,\n toggle: CLASS_TOGGLE\n }, function (className, key) {\n elements[key] = find(\".\" + className);\n });\n assign(elements, {\n root: root,\n track: track,\n list: list,\n slides: slides\n });\n }\n\n function init() {\n var id = root.id || uniqueId(PROJECT_CODE);\n var role = options.role;\n root.id = id;\n track.id = track.id || id + \"-track\";\n list.id = list.id || id + \"-list\";\n\n if (!getAttribute(root, ROLE) && root.tagName !== \"SECTION\" && role) {\n setAttribute(root, ROLE, role);\n }\n\n setAttribute(root, ARIA_ROLEDESCRIPTION, i18n.carousel);\n setAttribute(list, ROLE, \"presentation\");\n }\n\n function find(selector) {\n var elm = query(root, selector);\n return elm && closest(elm, \".\" + CLASS_ROOT) === root ? elm : void 0;\n }\n\n function getClasses(base) {\n return [base + \"--\" + options.type, base + \"--\" + options.direction, options.drag && base + \"--draggable\", options.isNavigation && base + \"--nav\", base === CLASS_ROOT && CLASS_ACTIVE];\n }\n\n return assign(elements, {\n setup: setup,\n mount: mount,\n destroy: destroy\n });\n}\n\nvar SLIDE = \"slide\";\nvar LOOP = \"loop\";\nvar FADE = \"fade\";\n\nfunction Slide$1(Splide2, index, slideIndex, slide) {\n var event = EventInterface(Splide2);\n var on = event.on,\n emit = event.emit,\n bind = event.bind;\n var Components = Splide2.Components,\n root = Splide2.root,\n options = Splide2.options;\n var isNavigation = options.isNavigation,\n updateOnMove = options.updateOnMove,\n i18n = options.i18n,\n pagination = options.pagination,\n slideFocus = options.slideFocus;\n var resolve = Components.Direction.resolve;\n var styles = getAttribute(slide, \"style\");\n var label = getAttribute(slide, ARIA_LABEL);\n var isClone = slideIndex > -1;\n var container = child(slide, \".\" + CLASS_CONTAINER);\n var destroyed;\n\n function mount() {\n if (!isClone) {\n slide.id = root.id + \"-slide\" + pad(index + 1);\n setAttribute(slide, ROLE, pagination ? \"tabpanel\" : \"group\");\n setAttribute(slide, ARIA_ROLEDESCRIPTION, i18n.slide);\n setAttribute(slide, ARIA_LABEL, label || format(i18n.slideLabel, [index + 1, Splide2.length]));\n }\n\n listen();\n }\n\n function listen() {\n bind(slide, \"click\", apply(emit, EVENT_CLICK, self));\n bind(slide, \"keydown\", apply(emit, EVENT_SLIDE_KEYDOWN, self));\n on([EVENT_MOVED, EVENT_SHIFTED, EVENT_SCROLLED], update);\n on(EVENT_NAVIGATION_MOUNTED, initNavigation);\n\n if (updateOnMove) {\n on(EVENT_MOVE, onMove);\n }\n }\n\n function destroy() {\n destroyed = true;\n event.destroy();\n removeClass(slide, STATUS_CLASSES);\n removeAttribute(slide, ALL_ATTRIBUTES);\n setAttribute(slide, \"style\", styles);\n setAttribute(slide, ARIA_LABEL, label || \"\");\n }\n\n function initNavigation() {\n var controls = Splide2.splides.map(function (target) {\n var Slide2 = target.splide.Components.Slides.getAt(index);\n return Slide2 ? Slide2.slide.id : \"\";\n }).join(\" \");\n setAttribute(slide, ARIA_LABEL, format(i18n.slideX, (isClone ? slideIndex : index) + 1));\n setAttribute(slide, ARIA_CONTROLS, controls);\n setAttribute(slide, ROLE, slideFocus ? \"button\" : \"\");\n slideFocus && removeAttribute(slide, ARIA_ROLEDESCRIPTION);\n }\n\n function onMove() {\n if (!destroyed) {\n update();\n }\n }\n\n function update() {\n if (!destroyed) {\n var curr = Splide2.index;\n updateActivity();\n updateVisibility();\n toggleClass(slide, CLASS_PREV, index === curr - 1);\n toggleClass(slide, CLASS_NEXT, index === curr + 1);\n }\n }\n\n function updateActivity() {\n var active = isActive();\n\n if (active !== hasClass(slide, CLASS_ACTIVE)) {\n toggleClass(slide, CLASS_ACTIVE, active);\n setAttribute(slide, ARIA_CURRENT, isNavigation && active || \"\");\n emit(active ? EVENT_ACTIVE : EVENT_INACTIVE, self);\n }\n }\n\n function updateVisibility() {\n var visible = isVisible();\n var hidden = !visible && (!isActive() || isClone);\n\n if (!Splide2.state.is([MOVING, SCROLLING])) {\n setAttribute(slide, ARIA_HIDDEN, hidden || \"\");\n }\n\n setAttribute(queryAll(slide, options.focusableNodes || \"\"), TAB_INDEX, hidden ? -1 : \"\");\n\n if (slideFocus) {\n setAttribute(slide, TAB_INDEX, hidden ? -1 : 0);\n }\n\n if (visible !== hasClass(slide, CLASS_VISIBLE)) {\n toggleClass(slide, CLASS_VISIBLE, visible);\n emit(visible ? EVENT_VISIBLE : EVENT_HIDDEN, self);\n }\n\n if (!visible && document.activeElement === slide) {\n var Slide2 = Components.Slides.getAt(Splide2.index);\n Slide2 && focus(Slide2.slide);\n }\n }\n\n function style$1(prop, value, useContainer) {\n style(useContainer && container || slide, prop, value);\n }\n\n function isActive() {\n var curr = Splide2.index;\n return curr === index || options.cloneStatus && curr === slideIndex;\n }\n\n function isVisible() {\n if (Splide2.is(FADE)) {\n return isActive();\n }\n\n var trackRect = rect(Components.Elements.track);\n var slideRect = rect(slide);\n var left = resolve(\"left\", true);\n var right = resolve(\"right\", true);\n return floor(trackRect[left]) <= ceil(slideRect[left]) && floor(slideRect[right]) <= ceil(trackRect[right]);\n }\n\n function isWithin(from, distance) {\n var diff = abs(from - index);\n\n if (!isClone && (options.rewind || Splide2.is(LOOP))) {\n diff = min(diff, Splide2.length - diff);\n }\n\n return diff <= distance;\n }\n\n var self = {\n index: index,\n slideIndex: slideIndex,\n slide: slide,\n container: container,\n isClone: isClone,\n mount: mount,\n destroy: destroy,\n update: update,\n style: style$1,\n isWithin: isWithin\n };\n return self;\n}\n\nfunction Slides(Splide2, Components2, options) {\n var _EventInterface2 = EventInterface(Splide2),\n on = _EventInterface2.on,\n emit = _EventInterface2.emit,\n bind = _EventInterface2.bind;\n\n var _Components2$Elements = Components2.Elements,\n slides = _Components2$Elements.slides,\n list = _Components2$Elements.list;\n var Slides2 = [];\n\n function mount() {\n init();\n on(EVENT_REFRESH, destroy);\n on(EVENT_REFRESH, init);\n }\n\n function init() {\n slides.forEach(function (slide, index) {\n register(slide, index, -1);\n });\n }\n\n function destroy() {\n forEach$1(function (Slide2) {\n Slide2.destroy();\n });\n empty(Slides2);\n }\n\n function update() {\n forEach$1(function (Slide2) {\n Slide2.update();\n });\n }\n\n function register(slide, index, slideIndex) {\n var object = Slide$1(Splide2, index, slideIndex, slide);\n object.mount();\n Slides2.push(object);\n Slides2.sort(function (Slide1, Slide2) {\n return Slide1.index - Slide2.index;\n });\n }\n\n function get(excludeClones) {\n return excludeClones ? filter(function (Slide2) {\n return !Slide2.isClone;\n }) : Slides2;\n }\n\n function getIn(page) {\n var Controller = Components2.Controller;\n var index = Controller.toIndex(page);\n var max = Controller.hasFocus() ? 1 : options.perPage;\n return filter(function (Slide2) {\n return between(Slide2.index, index, index + max - 1);\n });\n }\n\n function getAt(index) {\n return filter(index)[0];\n }\n\n function add(items, index) {\n forEach(items, function (slide) {\n if (isString(slide)) {\n slide = parseHtml(slide);\n }\n\n if (isHTMLElement(slide)) {\n var ref = slides[index];\n ref ? before(slide, ref) : append(list, slide);\n addClass(slide, options.classes.slide);\n observeImages(slide, apply(emit, EVENT_RESIZE));\n }\n });\n emit(EVENT_REFRESH);\n }\n\n function remove$1(matcher) {\n remove(filter(matcher).map(function (Slide2) {\n return Slide2.slide;\n }));\n emit(EVENT_REFRESH);\n }\n\n function forEach$1(iteratee, excludeClones) {\n get(excludeClones).forEach(iteratee);\n }\n\n function filter(matcher) {\n return Slides2.filter(isFunction(matcher) ? matcher : function (Slide2) {\n return isString(matcher) ? matches(Slide2.slide, matcher) : includes(toArray(matcher), Slide2.index);\n });\n }\n\n function style(prop, value, useContainer) {\n forEach$1(function (Slide2) {\n Slide2.style(prop, value, useContainer);\n });\n }\n\n function observeImages(elm, callback) {\n var images = queryAll(elm, \"img\");\n var length = images.length;\n\n if (length) {\n images.forEach(function (img) {\n bind(img, \"load error\", function () {\n if (! --length) {\n callback();\n }\n });\n });\n } else {\n callback();\n }\n }\n\n function getLength(excludeClones) {\n return excludeClones ? slides.length : Slides2.length;\n }\n\n function isEnough() {\n return Slides2.length > options.perPage;\n }\n\n return {\n mount: mount,\n destroy: destroy,\n update: update,\n register: register,\n get: get,\n getIn: getIn,\n getAt: getAt,\n add: add,\n remove: remove$1,\n forEach: forEach$1,\n filter: filter,\n style: style,\n getLength: getLength,\n isEnough: isEnough\n };\n}\n\nfunction Layout(Splide2, Components2, options) {\n var _EventInterface3 = EventInterface(Splide2),\n on = _EventInterface3.on,\n bind = _EventInterface3.bind,\n emit = _EventInterface3.emit;\n\n var Slides = Components2.Slides;\n var resolve = Components2.Direction.resolve;\n var _Components2$Elements2 = Components2.Elements,\n root = _Components2$Elements2.root,\n track = _Components2$Elements2.track,\n list = _Components2$Elements2.list;\n var getAt = Slides.getAt,\n styleSlides = Slides.style;\n var vertical;\n var rootRect;\n var overflow;\n\n function mount() {\n init();\n bind(window, \"resize load\", Throttle(apply(emit, EVENT_RESIZE)));\n on([EVENT_UPDATED, EVENT_REFRESH], init);\n on(EVENT_RESIZE, resize);\n }\n\n function init() {\n vertical = options.direction === TTB;\n style(root, \"maxWidth\", unit(options.width));\n style(track, resolve(\"paddingLeft\"), cssPadding(false));\n style(track, resolve(\"paddingRight\"), cssPadding(true));\n resize(true);\n }\n\n function resize(force) {\n var newRect = rect(root);\n\n if (force || rootRect.width !== newRect.width || rootRect.height !== newRect.height) {\n style(track, \"height\", cssTrackHeight());\n styleSlides(resolve(\"marginRight\"), unit(options.gap));\n styleSlides(\"width\", cssSlideWidth());\n styleSlides(\"height\", cssSlideHeight(), true);\n rootRect = newRect;\n emit(EVENT_RESIZED);\n\n if (overflow !== (overflow = isOverflow())) {\n toggleClass(root, CLASS_OVERFLOW, overflow);\n emit(EVENT_OVERFLOW, overflow);\n }\n }\n }\n\n function cssPadding(right) {\n var padding = options.padding;\n var prop = resolve(right ? \"right\" : \"left\");\n return padding && unit(padding[prop] || (isObject(padding) ? 0 : padding)) || \"0px\";\n }\n\n function cssTrackHeight() {\n var height = \"\";\n\n if (vertical) {\n height = cssHeight();\n assert(height, \"height or heightRatio is missing.\");\n height = \"calc(\" + height + \" - \" + cssPadding(false) + \" - \" + cssPadding(true) + \")\";\n }\n\n return height;\n }\n\n function cssHeight() {\n return unit(options.height || rect(list).width * options.heightRatio);\n }\n\n function cssSlideWidth() {\n return options.autoWidth ? null : unit(options.fixedWidth) || (vertical ? \"\" : cssSlideSize());\n }\n\n function cssSlideHeight() {\n return unit(options.fixedHeight) || (vertical ? options.autoHeight ? null : cssSlideSize() : cssHeight());\n }\n\n function cssSlideSize() {\n var gap = unit(options.gap);\n return \"calc((100%\" + (gap && \" + \" + gap) + \")/\" + (options.perPage || 1) + (gap && \" - \" + gap) + \")\";\n }\n\n function listSize() {\n return rect(list)[resolve(\"width\")];\n }\n\n function slideSize(index, withoutGap) {\n var Slide = getAt(index || 0);\n return Slide ? rect(Slide.slide)[resolve(\"width\")] + (withoutGap ? 0 : getGap()) : 0;\n }\n\n function totalSize(index, withoutGap) {\n var Slide = getAt(index);\n\n if (Slide) {\n var right = rect(Slide.slide)[resolve(\"right\")];\n var left = rect(list)[resolve(\"left\")];\n return abs(right - left) + (withoutGap ? 0 : getGap());\n }\n\n return 0;\n }\n\n function sliderSize(withoutGap) {\n return totalSize(Splide2.length - 1) - totalSize(0) + slideSize(0, withoutGap);\n }\n\n function getGap() {\n var Slide = getAt(0);\n return Slide && parseFloat(style(Slide.slide, resolve(\"marginRight\"))) || 0;\n }\n\n function getPadding(right) {\n return parseFloat(style(track, resolve(\"padding\" + (right ? \"Right\" : \"Left\")))) || 0;\n }\n\n function isOverflow() {\n return Splide2.is(FADE) || sliderSize(true) > listSize();\n }\n\n return {\n mount: mount,\n resize: resize,\n listSize: listSize,\n slideSize: slideSize,\n sliderSize: sliderSize,\n totalSize: totalSize,\n getPadding: getPadding,\n isOverflow: isOverflow\n };\n}\n\nvar MULTIPLIER = 2;\n\nfunction Clones(Splide2, Components2, options) {\n var event = EventInterface(Splide2);\n var on = event.on;\n var Elements = Components2.Elements,\n Slides = Components2.Slides;\n var resolve = Components2.Direction.resolve;\n var clones = [];\n var cloneCount;\n\n function mount() {\n on(EVENT_REFRESH, remount);\n on([EVENT_UPDATED, EVENT_RESIZE], observe);\n\n if (cloneCount = computeCloneCount()) {\n generate(cloneCount);\n Components2.Layout.resize(true);\n }\n }\n\n function remount() {\n destroy();\n mount();\n }\n\n function destroy() {\n remove(clones);\n empty(clones);\n event.destroy();\n }\n\n function observe() {\n var count = computeCloneCount();\n\n if (cloneCount !== count) {\n if (cloneCount < count || !count) {\n event.emit(EVENT_REFRESH);\n }\n }\n }\n\n function generate(count) {\n var slides = Slides.get().slice();\n var length = slides.length;\n\n if (length) {\n while (slides.length < count) {\n push(slides, slides);\n }\n\n push(slides.slice(-count), slides.slice(0, count)).forEach(function (Slide, index) {\n var isHead = index < count;\n var clone = cloneDeep(Slide.slide, index);\n isHead ? before(clone, slides[0].slide) : append(Elements.list, clone);\n push(clones, clone);\n Slides.register(clone, index - count + (isHead ? 0 : length), Slide.index);\n });\n }\n }\n\n function cloneDeep(elm, index) {\n var clone = elm.cloneNode(true);\n addClass(clone, options.classes.clone);\n clone.id = Splide2.root.id + \"-clone\" + pad(index + 1);\n return clone;\n }\n\n function computeCloneCount() {\n var clones2 = options.clones;\n\n if (!Splide2.is(LOOP)) {\n clones2 = 0;\n } else if (isUndefined(clones2)) {\n var fixedSize = options[resolve(\"fixedWidth\")] && Components2.Layout.slideSize(0);\n var fixedCount = fixedSize && ceil(rect(Elements.track)[resolve(\"width\")] / fixedSize);\n clones2 = fixedCount || options[resolve(\"autoWidth\")] && Splide2.length || options.perPage * MULTIPLIER;\n }\n\n return clones2;\n }\n\n return {\n mount: mount,\n destroy: destroy\n };\n}\n\nfunction Move(Splide2, Components2, options) {\n var _EventInterface4 = EventInterface(Splide2),\n on = _EventInterface4.on,\n emit = _EventInterface4.emit;\n\n var set = Splide2.state.set;\n var _Components2$Layout = Components2.Layout,\n slideSize = _Components2$Layout.slideSize,\n getPadding = _Components2$Layout.getPadding,\n totalSize = _Components2$Layout.totalSize,\n listSize = _Components2$Layout.listSize,\n sliderSize = _Components2$Layout.sliderSize;\n var _Components2$Directio = Components2.Direction,\n resolve = _Components2$Directio.resolve,\n orient = _Components2$Directio.orient;\n var _Components2$Elements3 = Components2.Elements,\n list = _Components2$Elements3.list,\n track = _Components2$Elements3.track;\n var Transition;\n\n function mount() {\n Transition = Components2.Transition;\n on([EVENT_MOUNTED, EVENT_RESIZED, EVENT_UPDATED, EVENT_REFRESH], reposition);\n }\n\n function reposition() {\n if (!Components2.Controller.isBusy()) {\n Components2.Scroll.cancel();\n jump(Splide2.index);\n Components2.Slides.update();\n }\n }\n\n function move(dest, index, prev, callback) {\n if (dest !== index && canShift(dest > prev)) {\n cancel();\n translate(shift(getPosition(), dest > prev), true);\n }\n\n set(MOVING);\n emit(EVENT_MOVE, index, prev, dest);\n Transition.start(index, function () {\n set(IDLE);\n emit(EVENT_MOVED, index, prev, dest);\n callback && callback();\n });\n }\n\n function jump(index) {\n translate(toPosition(index, true));\n }\n\n function translate(position, preventLoop) {\n if (!Splide2.is(FADE)) {\n var destination = preventLoop ? position : loop(position);\n style(list, \"transform\", \"translate\" + resolve(\"X\") + \"(\" + destination + \"px)\");\n position !== destination && emit(EVENT_SHIFTED);\n }\n }\n\n function loop(position) {\n if (Splide2.is(LOOP)) {\n var index = toIndex(position);\n var exceededMax = index > Components2.Controller.getEnd();\n var exceededMin = index < 0;\n\n if (exceededMin || exceededMax) {\n position = shift(position, exceededMax);\n }\n }\n\n return position;\n }\n\n function shift(position, backwards) {\n var excess = position - getLimit(backwards);\n var size = sliderSize();\n position -= orient(size * (ceil(abs(excess) / size) || 1)) * (backwards ? 1 : -1);\n return position;\n }\n\n function cancel() {\n translate(getPosition(), true);\n Transition.cancel();\n }\n\n function toIndex(position) {\n var Slides = Components2.Slides.get();\n var index = 0;\n var minDistance = Infinity;\n\n for (var i = 0; i < Slides.length; i++) {\n var slideIndex = Slides[i].index;\n var distance = abs(toPosition(slideIndex, true) - position);\n\n if (distance <= minDistance) {\n minDistance = distance;\n index = slideIndex;\n } else {\n break;\n }\n }\n\n return index;\n }\n\n function toPosition(index, trimming) {\n var position = orient(totalSize(index - 1) - offset(index));\n return trimming ? trim(position) : position;\n }\n\n function getPosition() {\n var left = resolve(\"left\");\n return rect(list)[left] - rect(track)[left] + orient(getPadding(false));\n }\n\n function trim(position) {\n if (options.trimSpace && Splide2.is(SLIDE)) {\n position = clamp(position, 0, orient(sliderSize(true) - listSize()));\n }\n\n return position;\n }\n\n function offset(index) {\n var focus = options.focus;\n return focus === \"center\" ? (listSize() - slideSize(index, true)) / 2 : +focus * slideSize(index) || 0;\n }\n\n function getLimit(max) {\n return toPosition(max ? Components2.Controller.getEnd() : 0, !!options.trimSpace);\n }\n\n function canShift(backwards) {\n var shifted = orient(shift(getPosition(), backwards));\n return backwards ? shifted >= 0 : shifted <= list[resolve(\"scrollWidth\")] - rect(track)[resolve(\"width\")];\n }\n\n function exceededLimit(max, position) {\n position = isUndefined(position) ? getPosition() : position;\n var exceededMin = max !== true && orient(position) < orient(getLimit(false));\n var exceededMax = max !== false && orient(position) > orient(getLimit(true));\n return exceededMin || exceededMax;\n }\n\n return {\n mount: mount,\n move: move,\n jump: jump,\n translate: translate,\n shift: shift,\n cancel: cancel,\n toIndex: toIndex,\n toPosition: toPosition,\n getPosition: getPosition,\n getLimit: getLimit,\n exceededLimit: exceededLimit,\n reposition: reposition\n };\n}\n\nfunction Controller(Splide2, Components2, options) {\n var _EventInterface5 = EventInterface(Splide2),\n on = _EventInterface5.on,\n emit = _EventInterface5.emit;\n\n var Move = Components2.Move;\n var getPosition = Move.getPosition,\n getLimit = Move.getLimit,\n toPosition = Move.toPosition;\n var _Components2$Slides = Components2.Slides,\n isEnough = _Components2$Slides.isEnough,\n getLength = _Components2$Slides.getLength;\n var omitEnd = options.omitEnd;\n var isLoop = Splide2.is(LOOP);\n var isSlide = Splide2.is(SLIDE);\n var getNext = apply(getAdjacent, false);\n var getPrev = apply(getAdjacent, true);\n var currIndex = options.start || 0;\n var endIndex;\n var prevIndex = currIndex;\n var slideCount;\n var perMove;\n var perPage;\n\n function mount() {\n init();\n on([EVENT_UPDATED, EVENT_REFRESH, EVENT_END_INDEX_CHANGED], init);\n on(EVENT_RESIZED, onResized);\n }\n\n function init() {\n slideCount = getLength(true);\n perMove = options.perMove;\n perPage = options.perPage;\n endIndex = getEnd();\n var index = clamp(currIndex, 0, omitEnd ? endIndex : slideCount - 1);\n\n if (index !== currIndex) {\n currIndex = index;\n Move.reposition();\n }\n }\n\n function onResized() {\n if (endIndex !== getEnd()) {\n emit(EVENT_END_INDEX_CHANGED);\n }\n }\n\n function go(control, allowSameIndex, callback) {\n if (!isBusy()) {\n var dest = parse(control);\n var index = loop(dest);\n\n if (index > -1 && (allowSameIndex || index !== currIndex)) {\n setIndex(index);\n Move.move(dest, index, prevIndex, callback);\n }\n }\n }\n\n function scroll(destination, duration, snap, callback) {\n Components2.Scroll.scroll(destination, duration, snap, function () {\n var index = loop(Move.toIndex(getPosition()));\n setIndex(omitEnd ? min(index, endIndex) : index);\n callback && callback();\n });\n }\n\n function parse(control) {\n var index = currIndex;\n\n if (isString(control)) {\n var _ref = control.match(/([+\\-<>])(\\d+)?/) || [],\n indicator = _ref[1],\n number = _ref[2];\n\n if (indicator === \"+\" || indicator === \"-\") {\n index = computeDestIndex(currIndex + +(\"\" + indicator + (+number || 1)), currIndex);\n } else if (indicator === \">\") {\n index = number ? toIndex(+number) : getNext(true);\n } else if (indicator === \"<\") {\n index = getPrev(true);\n }\n } else {\n index = isLoop ? control : clamp(control, 0, endIndex);\n }\n\n return index;\n }\n\n function getAdjacent(prev, destination) {\n var number = perMove || (hasFocus() ? 1 : perPage);\n var dest = computeDestIndex(currIndex + number * (prev ? -1 : 1), currIndex, !(perMove || hasFocus()));\n\n if (dest === -1 && isSlide) {\n if (!approximatelyEqual(getPosition(), getLimit(!prev), 1)) {\n return prev ? 0 : endIndex;\n }\n }\n\n return destination ? dest : loop(dest);\n }\n\n function computeDestIndex(dest, from, snapPage) {\n if (isEnough() || hasFocus()) {\n var index = computeMovableDestIndex(dest);\n\n if (index !== dest) {\n from = dest;\n dest = index;\n snapPage = false;\n }\n\n if (dest < 0 || dest > endIndex) {\n if (!perMove && (between(0, dest, from, true) || between(endIndex, from, dest, true))) {\n dest = toIndex(toPage(dest));\n } else {\n if (isLoop) {\n dest = snapPage ? dest < 0 ? -(slideCount % perPage || perPage) : slideCount : dest;\n } else if (options.rewind) {\n dest = dest < 0 ? endIndex : 0;\n } else {\n dest = -1;\n }\n }\n } else {\n if (snapPage && dest !== from) {\n dest = toIndex(toPage(from) + (dest < from ? -1 : 1));\n }\n }\n } else {\n dest = -1;\n }\n\n return dest;\n }\n\n function computeMovableDestIndex(dest) {\n if (isSlide && options.trimSpace === \"move\" && dest !== currIndex) {\n var position = getPosition();\n\n while (position === toPosition(dest, true) && between(dest, 0, Splide2.length - 1, !options.rewind)) {\n dest < currIndex ? --dest : ++dest;\n }\n }\n\n return dest;\n }\n\n function loop(index) {\n return isLoop ? (index + slideCount) % slideCount || 0 : index;\n }\n\n function getEnd() {\n var end = slideCount - (hasFocus() || isLoop && perMove ? 1 : perPage);\n\n while (omitEnd && end-- > 0) {\n if (toPosition(slideCount - 1, true) !== toPosition(end, true)) {\n end++;\n break;\n }\n }\n\n return clamp(end, 0, slideCount - 1);\n }\n\n function toIndex(page) {\n return clamp(hasFocus() ? page : perPage * page, 0, endIndex);\n }\n\n function toPage(index) {\n return hasFocus() ? min(index, endIndex) : floor((index >= endIndex ? slideCount - 1 : index) / perPage);\n }\n\n function toDest(destination) {\n var closest = Move.toIndex(destination);\n return isSlide ? clamp(closest, 0, endIndex) : closest;\n }\n\n function setIndex(index) {\n if (index !== currIndex) {\n prevIndex = currIndex;\n currIndex = index;\n }\n }\n\n function getIndex(prev) {\n return prev ? prevIndex : currIndex;\n }\n\n function hasFocus() {\n return !isUndefined(options.focus) || options.isNavigation;\n }\n\n function isBusy() {\n return Splide2.state.is([MOVING, SCROLLING]) && !!options.waitForTransition;\n }\n\n return {\n mount: mount,\n go: go,\n scroll: scroll,\n getNext: getNext,\n getPrev: getPrev,\n getAdjacent: getAdjacent,\n getEnd: getEnd,\n setIndex: setIndex,\n getIndex: getIndex,\n toIndex: toIndex,\n toPage: toPage,\n toDest: toDest,\n hasFocus: hasFocus,\n isBusy: isBusy\n };\n}\n\nvar XML_NAME_SPACE = \"http://www.w3.org/2000/svg\";\nvar PATH = \"m15.5 0.932-4.3 4.38 14.5 14.6-14.5 14.5 4.3 4.4 14.6-14.6 4.4-4.3-4.4-4.4-14.6-14.6z\";\nvar SIZE = 40;\n\nfunction Arrows(Splide2, Components2, options) {\n var event = EventInterface(Splide2);\n var on = event.on,\n bind = event.bind,\n emit = event.emit;\n var classes = options.classes,\n i18n = options.i18n;\n var Elements = Components2.Elements,\n Controller = Components2.Controller;\n var placeholder = Elements.arrows,\n track = Elements.track;\n var wrapper = placeholder;\n var prev = Elements.prev;\n var next = Elements.next;\n var created;\n var wrapperClasses;\n var arrows = {};\n\n function mount() {\n init();\n on(EVENT_UPDATED, remount);\n }\n\n function remount() {\n destroy();\n mount();\n }\n\n function init() {\n var enabled = options.arrows;\n\n if (enabled && !(prev && next)) {\n createArrows();\n }\n\n if (prev && next) {\n assign(arrows, {\n prev: prev,\n next: next\n });\n display(wrapper, enabled ? \"\" : \"none\");\n addClass(wrapper, wrapperClasses = CLASS_ARROWS + \"--\" + options.direction);\n\n if (enabled) {\n listen();\n update();\n setAttribute([prev, next], ARIA_CONTROLS, track.id);\n emit(EVENT_ARROWS_MOUNTED, prev, next);\n }\n }\n }\n\n function destroy() {\n event.destroy();\n removeClass(wrapper, wrapperClasses);\n\n if (created) {\n remove(placeholder ? [prev, next] : wrapper);\n prev = next = null;\n } else {\n removeAttribute([prev, next], ALL_ATTRIBUTES);\n }\n }\n\n function listen() {\n on([EVENT_MOUNTED, EVENT_MOVED, EVENT_REFRESH, EVENT_SCROLLED, EVENT_END_INDEX_CHANGED], update);\n bind(next, \"click\", apply(go, \">\"));\n bind(prev, \"click\", apply(go, \"<\"));\n }\n\n function go(control) {\n Controller.go(control, true);\n }\n\n function createArrows() {\n wrapper = placeholder || create(\"div\", classes.arrows);\n prev = createArrow(true);\n next = createArrow(false);\n created = true;\n append(wrapper, [prev, next]);\n !placeholder && before(wrapper, track);\n }\n\n function createArrow(prev2) {\n var arrow = \"\";\n };\n\n _proto3.html = function html() {\n var _this$config = this.config,\n rootClass = _this$config.rootClass,\n listTag = _this$config.listTag,\n arrows = _this$config.arrows,\n beforeTrack = _this$config.beforeTrack,\n afterTrack = _this$config.afterTrack,\n slider = _this$config.slider,\n beforeSlider = _this$config.beforeSlider,\n afterSlider = _this$config.afterSlider;\n var html = \"\";\n html += \"
      \";\n html += \"\";\n\n if (slider) {\n html += beforeSlider || \"\";\n html += \"
      \";\n }\n\n html += beforeTrack || \"\";\n\n if (arrows) {\n html += this.renderArrows();\n }\n\n html += \"
      \";\n html += \"<\" + listTag + \" class=\\\"splide__list\\\">\";\n html += this.renderSlides();\n html += \"\";\n html += \"
      \";\n html += afterTrack || \"\";\n\n if (slider) {\n html += \"
      \";\n html += afterSlider || \"\";\n }\n\n html += \"
      \";\n return html;\n };\n\n return SplideRenderer;\n}();\n\nexports.CLASSES = CLASSES;\nexports.CLASS_ACTIVE = CLASS_ACTIVE;\nexports.CLASS_ARROW = CLASS_ARROW;\nexports.CLASS_ARROWS = CLASS_ARROWS;\nexports.CLASS_ARROW_NEXT = CLASS_ARROW_NEXT;\nexports.CLASS_ARROW_PREV = CLASS_ARROW_PREV;\nexports.CLASS_CLONE = CLASS_CLONE;\nexports.CLASS_CONTAINER = CLASS_CONTAINER;\nexports.CLASS_FOCUS_IN = CLASS_FOCUS_IN;\nexports.CLASS_INITIALIZED = CLASS_INITIALIZED;\nexports.CLASS_LIST = CLASS_LIST;\nexports.CLASS_LOADING = CLASS_LOADING;\nexports.CLASS_NEXT = CLASS_NEXT;\nexports.CLASS_OVERFLOW = CLASS_OVERFLOW;\nexports.CLASS_PAGINATION = CLASS_PAGINATION;\nexports.CLASS_PAGINATION_PAGE = CLASS_PAGINATION_PAGE;\nexports.CLASS_PREV = CLASS_PREV;\nexports.CLASS_PROGRESS = CLASS_PROGRESS;\nexports.CLASS_PROGRESS_BAR = CLASS_PROGRESS_BAR;\nexports.CLASS_ROOT = CLASS_ROOT;\nexports.CLASS_SLIDE = CLASS_SLIDE;\nexports.CLASS_SPINNER = CLASS_SPINNER;\nexports.CLASS_SR = CLASS_SR;\nexports.CLASS_TOGGLE = CLASS_TOGGLE;\nexports.CLASS_TOGGLE_PAUSE = CLASS_TOGGLE_PAUSE;\nexports.CLASS_TOGGLE_PLAY = CLASS_TOGGLE_PLAY;\nexports.CLASS_TRACK = CLASS_TRACK;\nexports.CLASS_VISIBLE = CLASS_VISIBLE;\nexports.DEFAULTS = DEFAULTS;\nexports.EVENT_ACTIVE = EVENT_ACTIVE;\nexports.EVENT_ARROWS_MOUNTED = EVENT_ARROWS_MOUNTED;\nexports.EVENT_ARROWS_UPDATED = EVENT_ARROWS_UPDATED;\nexports.EVENT_AUTOPLAY_PAUSE = EVENT_AUTOPLAY_PAUSE;\nexports.EVENT_AUTOPLAY_PLAY = EVENT_AUTOPLAY_PLAY;\nexports.EVENT_AUTOPLAY_PLAYING = EVENT_AUTOPLAY_PLAYING;\nexports.EVENT_CLICK = EVENT_CLICK;\nexports.EVENT_DESTROY = EVENT_DESTROY;\nexports.EVENT_DRAG = EVENT_DRAG;\nexports.EVENT_DRAGGED = EVENT_DRAGGED;\nexports.EVENT_DRAGGING = EVENT_DRAGGING;\nexports.EVENT_END_INDEX_CHANGED = EVENT_END_INDEX_CHANGED;\nexports.EVENT_HIDDEN = EVENT_HIDDEN;\nexports.EVENT_INACTIVE = EVENT_INACTIVE;\nexports.EVENT_LAZYLOAD_LOADED = EVENT_LAZYLOAD_LOADED;\nexports.EVENT_MOUNTED = EVENT_MOUNTED;\nexports.EVENT_MOVE = EVENT_MOVE;\nexports.EVENT_MOVED = EVENT_MOVED;\nexports.EVENT_NAVIGATION_MOUNTED = EVENT_NAVIGATION_MOUNTED;\nexports.EVENT_OVERFLOW = EVENT_OVERFLOW;\nexports.EVENT_PAGINATION_MOUNTED = EVENT_PAGINATION_MOUNTED;\nexports.EVENT_PAGINATION_UPDATED = EVENT_PAGINATION_UPDATED;\nexports.EVENT_READY = EVENT_READY;\nexports.EVENT_REFRESH = EVENT_REFRESH;\nexports.EVENT_RESIZE = EVENT_RESIZE;\nexports.EVENT_RESIZED = EVENT_RESIZED;\nexports.EVENT_SCROLL = EVENT_SCROLL;\nexports.EVENT_SCROLLED = EVENT_SCROLLED;\nexports.EVENT_SHIFTED = EVENT_SHIFTED;\nexports.EVENT_SLIDE_KEYDOWN = EVENT_SLIDE_KEYDOWN;\nexports.EVENT_UPDATED = EVENT_UPDATED;\nexports.EVENT_VISIBLE = EVENT_VISIBLE;\nexports.EventBinder = EventBinder;\nexports.EventInterface = EventInterface;\nexports.FADE = FADE;\nexports.LOOP = LOOP;\nexports.LTR = LTR;\nexports.RTL = RTL;\nexports.RequestInterval = RequestInterval;\nexports.SLIDE = SLIDE;\nexports.STATUS_CLASSES = STATUS_CLASSES;\nexports.Splide = Splide;\nexports.SplideRenderer = SplideRenderer;\nexports.State = State;\nexports.TTB = TTB;\nexports.Throttle = Throttle;\nexports[\"default\"] = Splide;\n","'use strict';\n\n/**\n * Remove all validation. Should be called every time before revalidating form\n * @param {element} form - Form to be cleared\n * @returns {void}\n */\nfunction clearFormErrors(form) {\n $(form).find('.form-control.is-invalid').removeClass('is-invalid');\n}\n\nmodule.exports = function (formElement, payload) {\n // clear form validation first\n clearFormErrors(formElement);\n $('.alert', formElement).remove();\n\n if (typeof payload === 'object' && payload.fields) {\n Object.keys(payload.fields).forEach(function (key) {\n if (payload.fields[key]) {\n var feedbackElement = $(formElement).find('[name=\"' + key + '\"]')\n .parent()\n .children('.invalid-feedback');\n\n if (feedbackElement.length > 0) {\n if (Array.isArray(payload[key])) {\n feedbackElement.html(payload.fields[key].join('
      '));\n } else {\n feedbackElement.html(payload.fields[key]);\n }\n feedbackElement.siblings('.form-control').addClass('is-invalid');\n }\n }\n });\n }\n if (payload && payload.error) {\n var form = $(formElement).prop('tagName') === 'FORM'\n ? $(formElement)\n : $(formElement).parents('form');\n\n form.prepend('
      '\n + payload.error.join('
      ') + '
      ');\n }\n};\n","/*! PhotoSwipe Default UI - 4.1.3 - 2019-01-08\n* http://photoswipe.com\n* Copyright (c) 2019 Dmitry Semenov; */\n/**\n*\n* UI on top of main sliding area (caption, arrows, close button, etc.).\n* Built just using public methods/properties of PhotoSwipe.\n* \n*/\n(function (root, factory) { \n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(factory);\n\t} else if (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t} else {\n\t\troot.PhotoSwipeUI_Default = factory();\n\t}\n})(this, function () {\n\n\t'use strict';\n\n\n\nvar PhotoSwipeUI_Default =\n function(pswp, framework) {\n\n\tvar ui = this;\n\tvar _overlayUIUpdated = false,\n\t\t_controlsVisible = true,\n\t\t_fullscrenAPI,\n\t\t_controls,\n\t\t_captionContainer,\n\t\t_fakeCaptionContainer,\n\t\t_indexIndicator,\n\t\t_shareButton,\n\t\t_shareModal,\n\t\t_shareModalHidden = true,\n\t\t_initalCloseOnScrollValue,\n\t\t_isIdle,\n\t\t_listen,\n\n\t\t_loadingIndicator,\n\t\t_loadingIndicatorHidden,\n\t\t_loadingIndicatorTimeout,\n\n\t\t_galleryHasOneSlide,\n\n\t\t_options,\n\t\t_defaultUIOptions = {\n\t\t\tbarsSize: {top:44, bottom:'auto'},\n\t\t\tcloseElClasses: ['item', 'caption', 'zoom-wrap', 'ui', 'top-bar'], \n\t\t\ttimeToIdle: 4000, \n\t\t\ttimeToIdleOutside: 1000,\n\t\t\tloadingIndicatorDelay: 1000, // 2s\n\t\t\t\n\t\t\taddCaptionHTMLFn: function(item, captionEl /*, isFake */) {\n\t\t\t\tif(!item.title) {\n\t\t\t\t\tcaptionEl.children[0].innerHTML = '';\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tcaptionEl.children[0].innerHTML = item.title;\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\tcloseEl:true,\n\t\t\tcaptionEl: true,\n\t\t\tfullscreenEl: true,\n\t\t\tzoomEl: true,\n\t\t\tshareEl: true,\n\t\t\tcounterEl: true,\n\t\t\tarrowEl: true,\n\t\t\tpreloaderEl: true,\n\n\t\t\ttapToClose: false,\n\t\t\ttapToToggleControls: true,\n\n\t\t\tclickToCloseNonZoomable: true,\n\n\t\t\tshareButtons: [\n\t\t\t\t{id:'facebook', label:'Share on Facebook', url:'https://www.facebook.com/sharer/sharer.php?u={{url}}'},\n\t\t\t\t{id:'twitter', label:'Tweet', url:'https://twitter.com/intent/tweet?text={{text}}&url={{url}}'},\n\t\t\t\t{id:'pinterest', label:'Pin it', url:'http://www.pinterest.com/pin/create/button/'+\n\t\t\t\t\t\t\t\t\t\t\t\t\t'?url={{url}}&media={{image_url}}&description={{text}}'},\n\t\t\t\t{id:'download', label:'Download image', url:'{{raw_image_url}}', download:true}\n\t\t\t],\n\t\t\tgetImageURLForShare: function( /* shareButtonData */ ) {\n\t\t\t\treturn pswp.currItem.src || '';\n\t\t\t},\n\t\t\tgetPageURLForShare: function( /* shareButtonData */ ) {\n\t\t\t\treturn window.location.href;\n\t\t\t},\n\t\t\tgetTextForShare: function( /* shareButtonData */ ) {\n\t\t\t\treturn pswp.currItem.title || '';\n\t\t\t},\n\t\t\t\t\n\t\t\tindexIndicatorSep: ' / ',\n\t\t\tfitControlsWidth: 1200\n\n\t\t},\n\t\t_blockControlsTap,\n\t\t_blockControlsTapTimeout;\n\n\n\n\tvar _onControlsTap = function(e) {\n\t\t\tif(_blockControlsTap) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\n\t\t\te = e || window.event;\n\n\t\t\tif(_options.timeToIdle && _options.mouseUsed && !_isIdle) {\n\t\t\t\t// reset idle timer\n\t\t\t\t_onIdleMouseMove();\n\t\t\t}\n\n\n\t\t\tvar target = e.target || e.srcElement,\n\t\t\t\tuiElement,\n\t\t\t\tclickedClass = target.getAttribute('class') || '',\n\t\t\t\tfound;\n\n\t\t\tfor(var i = 0; i < _uiElements.length; i++) {\n\t\t\t\tuiElement = _uiElements[i];\n\t\t\t\tif(uiElement.onTap && clickedClass.indexOf('pswp__' + uiElement.name ) > -1 ) {\n\t\t\t\t\tuiElement.onTap();\n\t\t\t\t\tfound = true;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(found) {\n\t\t\t\tif(e.stopPropagation) {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t}\n\t\t\t\t_blockControlsTap = true;\n\n\t\t\t\t// Some versions of Android don't prevent ghost click event \n\t\t\t\t// when preventDefault() was called on touchstart and/or touchend.\n\t\t\t\t// \n\t\t\t\t// This happens on v4.3, 4.2, 4.1, \n\t\t\t\t// older versions strangely work correctly, \n\t\t\t\t// but just in case we add delay on all of them)\t\n\t\t\t\tvar tapDelay = framework.features.isOldAndroid ? 600 : 30;\n\t\t\t\t_blockControlsTapTimeout = setTimeout(function() {\n\t\t\t\t\t_blockControlsTap = false;\n\t\t\t\t}, tapDelay);\n\t\t\t}\n\n\t\t},\n\t\t_fitControlsInViewport = function() {\n\t\t\treturn !pswp.likelyTouchDevice || _options.mouseUsed || screen.width > _options.fitControlsWidth;\n\t\t},\n\t\t_togglePswpClass = function(el, cName, add) {\n\t\t\tframework[ (add ? 'add' : 'remove') + 'Class' ](el, 'pswp__' + cName);\n\t\t},\n\n\t\t// add class when there is just one item in the gallery\n\t\t// (by default it hides left/right arrows and 1ofX counter)\n\t\t_countNumItems = function() {\n\t\t\tvar hasOneSlide = (_options.getNumItemsFn() === 1);\n\n\t\t\tif(hasOneSlide !== _galleryHasOneSlide) {\n\t\t\t\t_togglePswpClass(_controls, 'ui--one-slide', hasOneSlide);\n\t\t\t\t_galleryHasOneSlide = hasOneSlide;\n\t\t\t}\n\t\t},\n\t\t_toggleShareModalClass = function() {\n\t\t\t_togglePswpClass(_shareModal, 'share-modal--hidden', _shareModalHidden);\n\t\t},\n\t\t_toggleShareModal = function() {\n\n\t\t\t_shareModalHidden = !_shareModalHidden;\n\t\t\t\n\t\t\t\n\t\t\tif(!_shareModalHidden) {\n\t\t\t\t_toggleShareModalClass();\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tif(!_shareModalHidden) {\n\t\t\t\t\t\tframework.addClass(_shareModal, 'pswp__share-modal--fade-in');\n\t\t\t\t\t}\n\t\t\t\t}, 30);\n\t\t\t} else {\n\t\t\t\tframework.removeClass(_shareModal, 'pswp__share-modal--fade-in');\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tif(_shareModalHidden) {\n\t\t\t\t\t\t_toggleShareModalClass();\n\t\t\t\t\t}\n\t\t\t\t}, 300);\n\t\t\t}\n\t\t\t\n\t\t\tif(!_shareModalHidden) {\n\t\t\t\t_updateShareURLs();\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\t_openWindowPopup = function(e) {\n\t\t\te = e || window.event;\n\t\t\tvar target = e.target || e.srcElement;\n\n\t\t\tpswp.shout('shareLinkClick', e, target);\n\n\t\t\tif(!target.href) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif( target.hasAttribute('download') ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\twindow.open(target.href, 'pswp_share', 'scrollbars=yes,resizable=yes,toolbar=no,'+\n\t\t\t\t\t\t\t\t\t\t'location=yes,width=550,height=420,top=100,left=' + \n\t\t\t\t\t\t\t\t\t\t(window.screen ? Math.round(screen.width / 2 - 275) : 100) );\n\n\t\t\tif(!_shareModalHidden) {\n\t\t\t\t_toggleShareModal();\n\t\t\t}\n\t\t\t\n\t\t\treturn false;\n\t\t},\n\t\t_updateShareURLs = function() {\n\t\t\tvar shareButtonOut = '',\n\t\t\t\tshareButtonData,\n\t\t\t\tshareURL,\n\t\t\t\timage_url,\n\t\t\t\tpage_url,\n\t\t\t\tshare_text;\n\n\t\t\tfor(var i = 0; i < _options.shareButtons.length; i++) {\n\t\t\t\tshareButtonData = _options.shareButtons[i];\n\n\t\t\t\timage_url = _options.getImageURLForShare(shareButtonData);\n\t\t\t\tpage_url = _options.getPageURLForShare(shareButtonData);\n\t\t\t\tshare_text = _options.getTextForShare(shareButtonData);\n\n\t\t\t\tshareURL = shareButtonData.url.replace('{{url}}', encodeURIComponent(page_url) )\n\t\t\t\t\t\t\t\t\t.replace('{{image_url}}', encodeURIComponent(image_url) )\n\t\t\t\t\t\t\t\t\t.replace('{{raw_image_url}}', image_url )\n\t\t\t\t\t\t\t\t\t.replace('{{text}}', encodeURIComponent(share_text) );\n\n\t\t\t\tshareButtonOut += '' + \n\t\t\t\t\t\t\t\t\tshareButtonData.label + '';\n\n\t\t\t\tif(_options.parseShareButtonOut) {\n\t\t\t\t\tshareButtonOut = _options.parseShareButtonOut(shareButtonData, shareButtonOut);\n\t\t\t\t}\n\t\t\t}\n\t\t\t_shareModal.children[0].innerHTML = shareButtonOut;\n\t\t\t_shareModal.children[0].onclick = _openWindowPopup;\n\n\t\t},\n\t\t_hasCloseClass = function(target) {\n\t\t\tfor(var i = 0; i < _options.closeElClasses.length; i++) {\n\t\t\t\tif( framework.hasClass(target, 'pswp__' + _options.closeElClasses[i]) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t_idleInterval,\n\t\t_idleTimer,\n\t\t_idleIncrement = 0,\n\t\t_onIdleMouseMove = function() {\n\t\t\tclearTimeout(_idleTimer);\n\t\t\t_idleIncrement = 0;\n\t\t\tif(_isIdle) {\n\t\t\t\tui.setIdle(false);\n\t\t\t}\n\t\t},\n\t\t_onMouseLeaveWindow = function(e) {\n\t\t\te = e ? e : window.event;\n\t\t\tvar from = e.relatedTarget || e.toElement;\n\t\t\tif (!from || from.nodeName === 'HTML') {\n\t\t\t\tclearTimeout(_idleTimer);\n\t\t\t\t_idleTimer = setTimeout(function() {\n\t\t\t\t\tui.setIdle(true);\n\t\t\t\t}, _options.timeToIdleOutside);\n\t\t\t}\n\t\t},\n\t\t_setupFullscreenAPI = function() {\n\t\t\tif(_options.fullscreenEl && !framework.features.isOldAndroid) {\n\t\t\t\tif(!_fullscrenAPI) {\n\t\t\t\t\t_fullscrenAPI = ui.getFullscreenAPI();\n\t\t\t\t}\n\t\t\t\tif(_fullscrenAPI) {\n\t\t\t\t\tframework.bind(document, _fullscrenAPI.eventK, ui.updateFullscreen);\n\t\t\t\t\tui.updateFullscreen();\n\t\t\t\t\tframework.addClass(pswp.template, 'pswp--supports-fs');\n\t\t\t\t} else {\n\t\t\t\t\tframework.removeClass(pswp.template, 'pswp--supports-fs');\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t_setupLoadingIndicator = function() {\n\t\t\t// Setup loading indicator\n\t\t\tif(_options.preloaderEl) {\n\t\t\t\n\t\t\t\t_toggleLoadingIndicator(true);\n\n\t\t\t\t_listen('beforeChange', function() {\n\n\t\t\t\t\tclearTimeout(_loadingIndicatorTimeout);\n\n\t\t\t\t\t// display loading indicator with delay\n\t\t\t\t\t_loadingIndicatorTimeout = setTimeout(function() {\n\n\t\t\t\t\t\tif(pswp.currItem && pswp.currItem.loading) {\n\n\t\t\t\t\t\t\tif( !pswp.allowProgressiveImg() || (pswp.currItem.img && !pswp.currItem.img.naturalWidth) ) {\n\t\t\t\t\t\t\t\t// show preloader if progressive loading is not enabled, \n\t\t\t\t\t\t\t\t// or image width is not defined yet (because of slow connection)\n\t\t\t\t\t\t\t\t_toggleLoadingIndicator(false); \n\t\t\t\t\t\t\t\t// items-controller.js function allowProgressiveImg\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t_toggleLoadingIndicator(true); // hide preloader\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}, _options.loadingIndicatorDelay);\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t\t_listen('imageLoadComplete', function(index, item) {\n\t\t\t\t\tif(pswp.currItem === item) {\n\t\t\t\t\t\t_toggleLoadingIndicator(true);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t}\n\t\t},\n\t\t_toggleLoadingIndicator = function(hide) {\n\t\t\tif( _loadingIndicatorHidden !== hide ) {\n\t\t\t\t_togglePswpClass(_loadingIndicator, 'preloader--active', !hide);\n\t\t\t\t_loadingIndicatorHidden = hide;\n\t\t\t}\n\t\t},\n\t\t_applyNavBarGaps = function(item) {\n\t\t\tvar gap = item.vGap;\n\n\t\t\tif( _fitControlsInViewport() ) {\n\t\t\t\t\n\t\t\t\tvar bars = _options.barsSize; \n\t\t\t\tif(_options.captionEl && bars.bottom === 'auto') {\n\t\t\t\t\tif(!_fakeCaptionContainer) {\n\t\t\t\t\t\t_fakeCaptionContainer = framework.createEl('pswp__caption pswp__caption--fake');\n\t\t\t\t\t\t_fakeCaptionContainer.appendChild( framework.createEl('pswp__caption__center') );\n\t\t\t\t\t\t_controls.insertBefore(_fakeCaptionContainer, _captionContainer);\n\t\t\t\t\t\tframework.addClass(_controls, 'pswp__ui--fit');\n\t\t\t\t\t}\n\t\t\t\t\tif( _options.addCaptionHTMLFn(item, _fakeCaptionContainer, true) ) {\n\n\t\t\t\t\t\tvar captionSize = _fakeCaptionContainer.clientHeight;\n\t\t\t\t\t\tgap.bottom = parseInt(captionSize,10) || 44;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgap.bottom = bars.top; // if no caption, set size of bottom gap to size of top\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tgap.bottom = bars.bottom === 'auto' ? 0 : bars.bottom;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// height of top bar is static, no need to calculate it\n\t\t\t\tgap.top = bars.top;\n\t\t\t} else {\n\t\t\t\tgap.top = gap.bottom = 0;\n\t\t\t}\n\t\t},\n\t\t_setupIdle = function() {\n\t\t\t// Hide controls when mouse is used\n\t\t\tif(_options.timeToIdle) {\n\t\t\t\t_listen('mouseUsed', function() {\n\t\t\t\t\t\n\t\t\t\t\tframework.bind(document, 'mousemove', _onIdleMouseMove);\n\t\t\t\t\tframework.bind(document, 'mouseout', _onMouseLeaveWindow);\n\n\t\t\t\t\t_idleInterval = setInterval(function() {\n\t\t\t\t\t\t_idleIncrement++;\n\t\t\t\t\t\tif(_idleIncrement === 2) {\n\t\t\t\t\t\t\tui.setIdle(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, _options.timeToIdle / 2);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t_setupHidingControlsDuringGestures = function() {\n\n\t\t\t// Hide controls on vertical drag\n\t\t\t_listen('onVerticalDrag', function(now) {\n\t\t\t\tif(_controlsVisible && now < 0.95) {\n\t\t\t\t\tui.hideControls();\n\t\t\t\t} else if(!_controlsVisible && now >= 0.95) {\n\t\t\t\t\tui.showControls();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Hide controls when pinching to close\n\t\t\tvar pinchControlsHidden;\n\t\t\t_listen('onPinchClose' , function(now) {\n\t\t\t\tif(_controlsVisible && now < 0.9) {\n\t\t\t\t\tui.hideControls();\n\t\t\t\t\tpinchControlsHidden = true;\n\t\t\t\t} else if(pinchControlsHidden && !_controlsVisible && now > 0.9) {\n\t\t\t\t\tui.showControls();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_listen('zoomGestureEnded', function() {\n\t\t\t\tpinchControlsHidden = false;\n\t\t\t\tif(pinchControlsHidden && !_controlsVisible) {\n\t\t\t\t\tui.showControls();\n\t\t\t\t}\n\t\t\t});\n\n\t\t};\n\n\n\n\tvar _uiElements = [\n\t\t{ \n\t\t\tname: 'caption', \n\t\t\toption: 'captionEl',\n\t\t\tonInit: function(el) { \n\t\t\t\t_captionContainer = el; \n\t\t\t} \n\t\t},\n\t\t{ \n\t\t\tname: 'share-modal', \n\t\t\toption: 'shareEl',\n\t\t\tonInit: function(el) { \n\t\t\t\t_shareModal = el;\n\t\t\t},\n\t\t\tonTap: function() {\n\t\t\t\t_toggleShareModal();\n\t\t\t} \n\t\t},\n\t\t{ \n\t\t\tname: 'button--share', \n\t\t\toption: 'shareEl',\n\t\t\tonInit: function(el) { \n\t\t\t\t_shareButton = el;\n\t\t\t},\n\t\t\tonTap: function() {\n\t\t\t\t_toggleShareModal();\n\t\t\t} \n\t\t},\n\t\t{ \n\t\t\tname: 'button--zoom', \n\t\t\toption: 'zoomEl',\n\t\t\tonTap: pswp.toggleDesktopZoom\n\t\t},\n\t\t{ \n\t\t\tname: 'counter', \n\t\t\toption: 'counterEl',\n\t\t\tonInit: function(el) { \n\t\t\t\t_indexIndicator = el;\n\t\t\t} \n\t\t},\n\t\t{ \n\t\t\tname: 'button--close', \n\t\t\toption: 'closeEl',\n\t\t\tonTap: pswp.close\n\t\t},\n\t\t{ \n\t\t\tname: 'button--arrow--left', \n\t\t\toption: 'arrowEl',\n\t\t\tonTap: pswp.prev\n\t\t},\n\t\t{ \n\t\t\tname: 'button--arrow--right', \n\t\t\toption: 'arrowEl',\n\t\t\tonTap: pswp.next\n\t\t},\n\t\t{ \n\t\t\tname: 'button--fs', \n\t\t\toption: 'fullscreenEl',\n\t\t\tonTap: function() { \n\t\t\t\tif(_fullscrenAPI.isFullscreen()) {\n\t\t\t\t\t_fullscrenAPI.exit();\n\t\t\t\t} else {\n\t\t\t\t\t_fullscrenAPI.enter();\n\t\t\t\t}\n\t\t\t} \n\t\t},\n\t\t{ \n\t\t\tname: 'preloader', \n\t\t\toption: 'preloaderEl',\n\t\t\tonInit: function(el) { \n\t\t\t\t_loadingIndicator = el;\n\t\t\t} \n\t\t}\n\n\t];\n\n\tvar _setupUIElements = function() {\n\t\tvar item,\n\t\t\tclassAttr,\n\t\t\tuiElement;\n\n\t\tvar loopThroughChildElements = function(sChildren) {\n\t\t\tif(!sChildren) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar l = sChildren.length;\n\t\t\tfor(var i = 0; i < l; i++) {\n\t\t\t\titem = sChildren[i];\n\t\t\t\tclassAttr = item.className;\n\n\t\t\t\tfor(var a = 0; a < _uiElements.length; a++) {\n\t\t\t\t\tuiElement = _uiElements[a];\n\n\t\t\t\t\tif(classAttr.indexOf('pswp__' + uiElement.name) > -1 ) {\n\n\t\t\t\t\t\tif( _options[uiElement.option] ) { // if element is not disabled from options\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tframework.removeClass(item, 'pswp__element--disabled');\n\t\t\t\t\t\t\tif(uiElement.onInit) {\n\t\t\t\t\t\t\t\tuiElement.onInit(item);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t//item.style.display = 'block';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tframework.addClass(item, 'pswp__element--disabled');\n\t\t\t\t\t\t\t//item.style.display = 'none';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tloopThroughChildElements(_controls.children);\n\n\t\tvar topBar = framework.getChildByClass(_controls, 'pswp__top-bar');\n\t\tif(topBar) {\n\t\t\tloopThroughChildElements( topBar.children );\n\t\t}\n\t};\n\n\n\t\n\n\tui.init = function() {\n\n\t\t// extend options\n\t\tframework.extend(pswp.options, _defaultUIOptions, true);\n\n\t\t// create local link for fast access\n\t\t_options = pswp.options;\n\n\t\t// find pswp__ui element\n\t\t_controls = framework.getChildByClass(pswp.scrollWrap, 'pswp__ui');\n\n\t\t// create local link\n\t\t_listen = pswp.listen;\n\n\n\t\t_setupHidingControlsDuringGestures();\n\n\t\t// update controls when slides change\n\t\t_listen('beforeChange', ui.update);\n\n\t\t// toggle zoom on double-tap\n\t\t_listen('doubleTap', function(point) {\n\t\t\tvar initialZoomLevel = pswp.currItem.initialZoomLevel;\n\t\t\tif(pswp.getZoomLevel() !== initialZoomLevel) {\n\t\t\t\tpswp.zoomTo(initialZoomLevel, point, 333);\n\t\t\t} else {\n\t\t\t\tpswp.zoomTo(_options.getDoubleTapZoom(false, pswp.currItem), point, 333);\n\t\t\t}\n\t\t});\n\n\t\t// Allow text selection in caption\n\t\t_listen('preventDragEvent', function(e, isDown, preventObj) {\n\t\t\tvar t = e.target || e.srcElement;\n\t\t\tif(\n\t\t\t\tt && \n\t\t\t\tt.getAttribute('class') && e.type.indexOf('mouse') > -1 && \n\t\t\t\t( t.getAttribute('class').indexOf('__caption') > 0 || (/(SMALL|STRONG|EM)/i).test(t.tagName) ) \n\t\t\t) {\n\t\t\t\tpreventObj.prevent = false;\n\t\t\t}\n\t\t});\n\n\t\t// bind events for UI\n\t\t_listen('bindEvents', function() {\n\t\t\tframework.bind(_controls, 'pswpTap click', _onControlsTap);\n\t\t\tframework.bind(pswp.scrollWrap, 'pswpTap', ui.onGlobalTap);\n\n\t\t\tif(!pswp.likelyTouchDevice) {\n\t\t\t\tframework.bind(pswp.scrollWrap, 'mouseover', ui.onMouseOver);\n\t\t\t}\n\t\t});\n\n\t\t// unbind events for UI\n\t\t_listen('unbindEvents', function() {\n\t\t\tif(!_shareModalHidden) {\n\t\t\t\t_toggleShareModal();\n\t\t\t}\n\n\t\t\tif(_idleInterval) {\n\t\t\t\tclearInterval(_idleInterval);\n\t\t\t}\n\t\t\tframework.unbind(document, 'mouseout', _onMouseLeaveWindow);\n\t\t\tframework.unbind(document, 'mousemove', _onIdleMouseMove);\n\t\t\tframework.unbind(_controls, 'pswpTap click', _onControlsTap);\n\t\t\tframework.unbind(pswp.scrollWrap, 'pswpTap', ui.onGlobalTap);\n\t\t\tframework.unbind(pswp.scrollWrap, 'mouseover', ui.onMouseOver);\n\n\t\t\tif(_fullscrenAPI) {\n\t\t\t\tframework.unbind(document, _fullscrenAPI.eventK, ui.updateFullscreen);\n\t\t\t\tif(_fullscrenAPI.isFullscreen()) {\n\t\t\t\t\t_options.hideAnimationDuration = 0;\n\t\t\t\t\t_fullscrenAPI.exit();\n\t\t\t\t}\n\t\t\t\t_fullscrenAPI = null;\n\t\t\t}\n\t\t});\n\n\n\t\t// clean up things when gallery is destroyed\n\t\t_listen('destroy', function() {\n\t\t\tif(_options.captionEl) {\n\t\t\t\tif(_fakeCaptionContainer) {\n\t\t\t\t\t_controls.removeChild(_fakeCaptionContainer);\n\t\t\t\t}\n\t\t\t\tframework.removeClass(_captionContainer, 'pswp__caption--empty');\n\t\t\t}\n\n\t\t\tif(_shareModal) {\n\t\t\t\t_shareModal.children[0].onclick = null;\n\t\t\t}\n\t\t\tframework.removeClass(_controls, 'pswp__ui--over-close');\n\t\t\tframework.addClass( _controls, 'pswp__ui--hidden');\n\t\t\tui.setIdle(false);\n\t\t});\n\t\t\n\n\t\tif(!_options.showAnimationDuration) {\n\t\t\tframework.removeClass( _controls, 'pswp__ui--hidden');\n\t\t}\n\t\t_listen('initialZoomIn', function() {\n\t\t\tif(_options.showAnimationDuration) {\n\t\t\t\tframework.removeClass( _controls, 'pswp__ui--hidden');\n\t\t\t}\n\t\t});\n\t\t_listen('initialZoomOut', function() {\n\t\t\tframework.addClass( _controls, 'pswp__ui--hidden');\n\t\t});\n\n\t\t_listen('parseVerticalMargin', _applyNavBarGaps);\n\t\t\n\t\t_setupUIElements();\n\n\t\tif(_options.shareEl && _shareButton && _shareModal) {\n\t\t\t_shareModalHidden = true;\n\t\t}\n\n\t\t_countNumItems();\n\n\t\t_setupIdle();\n\n\t\t_setupFullscreenAPI();\n\n\t\t_setupLoadingIndicator();\n\t};\n\n\tui.setIdle = function(isIdle) {\n\t\t_isIdle = isIdle;\n\t\t_togglePswpClass(_controls, 'ui--idle', isIdle);\n\t};\n\n\tui.update = function() {\n\t\t// Don't update UI if it's hidden\n\t\tif(_controlsVisible && pswp.currItem) {\n\t\t\t\n\t\t\tui.updateIndexIndicator();\n\n\t\t\tif(_options.captionEl) {\n\t\t\t\t_options.addCaptionHTMLFn(pswp.currItem, _captionContainer);\n\n\t\t\t\t_togglePswpClass(_captionContainer, 'caption--empty', !pswp.currItem.title);\n\t\t\t}\n\n\t\t\t_overlayUIUpdated = true;\n\n\t\t} else {\n\t\t\t_overlayUIUpdated = false;\n\t\t}\n\n\t\tif(!_shareModalHidden) {\n\t\t\t_toggleShareModal();\n\t\t}\n\n\t\t_countNumItems();\n\t};\n\n\tui.updateFullscreen = function(e) {\n\n\t\tif(e) {\n\t\t\t// some browsers change window scroll position during the fullscreen\n\t\t\t// so PhotoSwipe updates it just in case\n\t\t\tsetTimeout(function() {\n\t\t\t\tpswp.setScrollOffset( 0, framework.getScrollY() );\n\t\t\t}, 50);\n\t\t}\n\t\t\n\t\t// toogle pswp--fs class on root element\n\t\tframework[ (_fullscrenAPI.isFullscreen() ? 'add' : 'remove') + 'Class' ](pswp.template, 'pswp--fs');\n\t};\n\n\tui.updateIndexIndicator = function() {\n\t\tif(_options.counterEl) {\n\t\t\t_indexIndicator.innerHTML = (pswp.getCurrentIndex()+1) + \n\t\t\t\t\t\t\t\t\t\t_options.indexIndicatorSep + \n\t\t\t\t\t\t\t\t\t\t_options.getNumItemsFn();\n\t\t}\n\t};\n\t\n\tui.onGlobalTap = function(e) {\n\t\te = e || window.event;\n\t\tvar target = e.target || e.srcElement;\n\n\t\tif(_blockControlsTap) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(e.detail && e.detail.pointerType === 'mouse') {\n\n\t\t\t// close gallery if clicked outside of the image\n\t\t\tif(_hasCloseClass(target)) {\n\t\t\t\tpswp.close();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(framework.hasClass(target, 'pswp__img')) {\n\t\t\t\tif(pswp.getZoomLevel() === 1 && pswp.getZoomLevel() <= pswp.currItem.fitRatio) {\n\t\t\t\t\tif(_options.clickToCloseNonZoomable) {\n\t\t\t\t\t\tpswp.close();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tpswp.toggleDesktopZoom(e.detail.releasePoint);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t} else {\n\n\t\t\t// tap anywhere (except buttons) to toggle visibility of controls\n\t\t\tif(_options.tapToToggleControls) {\n\t\t\t\tif(_controlsVisible) {\n\t\t\t\t\tui.hideControls();\n\t\t\t\t} else {\n\t\t\t\t\tui.showControls();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// tap to close gallery\n\t\t\tif(_options.tapToClose && (framework.hasClass(target, 'pswp__img') || _hasCloseClass(target)) ) {\n\t\t\t\tpswp.close();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t}\n\t};\n\tui.onMouseOver = function(e) {\n\t\te = e || window.event;\n\t\tvar target = e.target || e.srcElement;\n\n\t\t// add class when mouse is over an element that should close the gallery\n\t\t_togglePswpClass(_controls, 'ui--over-close', _hasCloseClass(target));\n\t};\n\n\tui.hideControls = function() {\n\t\tframework.addClass(_controls,'pswp__ui--hidden');\n\t\t_controlsVisible = false;\n\t};\n\n\tui.showControls = function() {\n\t\t_controlsVisible = true;\n\t\tif(!_overlayUIUpdated) {\n\t\t\tui.update();\n\t\t}\n\t\tframework.removeClass(_controls,'pswp__ui--hidden');\n\t};\n\n\tui.supportsFullscreen = function() {\n\t\tvar d = document;\n\t\treturn !!(d.exitFullscreen || d.mozCancelFullScreen || d.webkitExitFullscreen || d.msExitFullscreen);\n\t};\n\n\tui.getFullscreenAPI = function() {\n\t\tvar dE = document.documentElement,\n\t\t\tapi,\n\t\t\ttF = 'fullscreenchange';\n\n\t\tif (dE.requestFullscreen) {\n\t\t\tapi = {\n\t\t\t\tenterK: 'requestFullscreen',\n\t\t\t\texitK: 'exitFullscreen',\n\t\t\t\telementK: 'fullscreenElement',\n\t\t\t\teventK: tF\n\t\t\t};\n\n\t\t} else if(dE.mozRequestFullScreen ) {\n\t\t\tapi = {\n\t\t\t\tenterK: 'mozRequestFullScreen',\n\t\t\t\texitK: 'mozCancelFullScreen',\n\t\t\t\telementK: 'mozFullScreenElement',\n\t\t\t\teventK: 'moz' + tF\n\t\t\t};\n\n\t\t\t\n\n\t\t} else if(dE.webkitRequestFullscreen) {\n\t\t\tapi = {\n\t\t\t\tenterK: 'webkitRequestFullscreen',\n\t\t\t\texitK: 'webkitExitFullscreen',\n\t\t\t\telementK: 'webkitFullscreenElement',\n\t\t\t\teventK: 'webkit' + tF\n\t\t\t};\n\n\t\t} else if(dE.msRequestFullscreen) {\n\t\t\tapi = {\n\t\t\t\tenterK: 'msRequestFullscreen',\n\t\t\t\texitK: 'msExitFullscreen',\n\t\t\t\telementK: 'msFullscreenElement',\n\t\t\t\teventK: 'MSFullscreenChange'\n\t\t\t};\n\t\t}\n\n\t\tif(api) {\n\t\t\tapi.enter = function() { \n\t\t\t\t// disable close-on-scroll in fullscreen\n\t\t\t\t_initalCloseOnScrollValue = _options.closeOnScroll; \n\t\t\t\t_options.closeOnScroll = false; \n\n\t\t\t\tif(this.enterK === 'webkitRequestFullscreen') {\n\t\t\t\t\tpswp.template[this.enterK]( Element.ALLOW_KEYBOARD_INPUT );\n\t\t\t\t} else {\n\t\t\t\t\treturn pswp.template[this.enterK](); \n\t\t\t\t}\n\t\t\t};\n\t\t\tapi.exit = function() { \n\t\t\t\t_options.closeOnScroll = _initalCloseOnScrollValue;\n\n\t\t\t\treturn document[this.exitK](); \n\n\t\t\t};\n\t\t\tapi.isFullscreen = function() { return document[this.elementK]; };\n\t\t}\n\n\t\treturn api;\n\t};\n\n\n\n};\nreturn PhotoSwipeUI_Default;\n\n\n});\n","/*! PhotoSwipe - v4.1.3 - 2019-01-08\n* http://photoswipe.com\n* Copyright (c) 2019 Dmitry Semenov; */\n(function (root, factory) { \n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(factory);\n\t} else if (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t} else {\n\t\troot.PhotoSwipe = factory();\n\t}\n})(this, function () {\n\n\t'use strict';\n\tvar PhotoSwipe = function(template, UiClass, items, options){\n\n/*>>framework-bridge*/\n/**\n *\n * Set of generic functions used by gallery.\n * \n * You're free to modify anything here as long as functionality is kept.\n * \n */\nvar framework = {\n\tfeatures: null,\n\tbind: function(target, type, listener, unbind) {\n\t\tvar methodName = (unbind ? 'remove' : 'add') + 'EventListener';\n\t\ttype = type.split(' ');\n\t\tfor(var i = 0; i < type.length; i++) {\n\t\t\tif(type[i]) {\n\t\t\t\ttarget[methodName]( type[i], listener, false);\n\t\t\t}\n\t\t}\n\t},\n\tisArray: function(obj) {\n\t\treturn (obj instanceof Array);\n\t},\n\tcreateEl: function(classes, tag) {\n\t\tvar el = document.createElement(tag || 'div');\n\t\tif(classes) {\n\t\t\tel.className = classes;\n\t\t}\n\t\treturn el;\n\t},\n\tgetScrollY: function() {\n\t\tvar yOffset = window.pageYOffset;\n\t\treturn yOffset !== undefined ? yOffset : document.documentElement.scrollTop;\n\t},\n\tunbind: function(target, type, listener) {\n\t\tframework.bind(target,type,listener,true);\n\t},\n\tremoveClass: function(el, className) {\n\t\tvar reg = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)');\n\t\tel.className = el.className.replace(reg, ' ').replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, ''); \n\t},\n\taddClass: function(el, className) {\n\t\tif( !framework.hasClass(el,className) ) {\n\t\t\tel.className += (el.className ? ' ' : '') + className;\n\t\t}\n\t},\n\thasClass: function(el, className) {\n\t\treturn el.className && new RegExp('(^|\\\\s)' + className + '(\\\\s|$)').test(el.className);\n\t},\n\tgetChildByClass: function(parentEl, childClassName) {\n\t\tvar node = parentEl.firstChild;\n\t\twhile(node) {\n\t\t\tif( framework.hasClass(node, childClassName) ) {\n\t\t\t\treturn node;\n\t\t\t}\n\t\t\tnode = node.nextSibling;\n\t\t}\n\t},\n\tarraySearch: function(array, value, key) {\n\t\tvar i = array.length;\n\t\twhile(i--) {\n\t\t\tif(array[i][key] === value) {\n\t\t\t\treturn i;\n\t\t\t} \n\t\t}\n\t\treturn -1;\n\t},\n\textend: function(o1, o2, preventOverwrite) {\n\t\tfor (var prop in o2) {\n\t\t\tif (o2.hasOwnProperty(prop)) {\n\t\t\t\tif(preventOverwrite && o1.hasOwnProperty(prop)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\to1[prop] = o2[prop];\n\t\t\t}\n\t\t}\n\t},\n\teasing: {\n\t\tsine: {\n\t\t\tout: function(k) {\n\t\t\t\treturn Math.sin(k * (Math.PI / 2));\n\t\t\t},\n\t\t\tinOut: function(k) {\n\t\t\t\treturn - (Math.cos(Math.PI * k) - 1) / 2;\n\t\t\t}\n\t\t},\n\t\tcubic: {\n\t\t\tout: function(k) {\n\t\t\t\treturn --k * k * k + 1;\n\t\t\t}\n\t\t}\n\t\t/*\n\t\t\telastic: {\n\t\t\t\tout: function ( k ) {\n\n\t\t\t\t\tvar s, a = 0.1, p = 0.4;\n\t\t\t\t\tif ( k === 0 ) return 0;\n\t\t\t\t\tif ( k === 1 ) return 1;\n\t\t\t\t\tif ( !a || a < 1 ) { a = 1; s = p / 4; }\n\t\t\t\t\telse s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n\t\t\t\t\treturn ( a * Math.pow( 2, - 10 * k) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) + 1 );\n\n\t\t\t\t},\n\t\t\t},\n\t\t\tback: {\n\t\t\t\tout: function ( k ) {\n\t\t\t\t\tvar s = 1.70158;\n\t\t\t\t\treturn --k * k * ( ( s + 1 ) * k + s ) + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t*/\n\t},\n\n\t/**\n\t * \n\t * @return {object}\n\t * \n\t * {\n\t * raf : request animation frame function\n\t * caf : cancel animation frame function\n\t * transfrom : transform property key (with vendor), or null if not supported\n\t * oldIE : IE8 or below\n\t * }\n\t * \n\t */\n\tdetectFeatures: function() {\n\t\tif(framework.features) {\n\t\t\treturn framework.features;\n\t\t}\n\t\tvar helperEl = framework.createEl(),\n\t\t\thelperStyle = helperEl.style,\n\t\t\tvendor = '',\n\t\t\tfeatures = {};\n\n\t\t// IE8 and below\n\t\tfeatures.oldIE = document.all && !document.addEventListener;\n\n\t\tfeatures.touch = 'ontouchstart' in window;\n\n\t\tif(window.requestAnimationFrame) {\n\t\t\tfeatures.raf = window.requestAnimationFrame;\n\t\t\tfeatures.caf = window.cancelAnimationFrame;\n\t\t}\n\n\t\tfeatures.pointerEvent = !!(window.PointerEvent) || navigator.msPointerEnabled;\n\n\t\t// fix false-positive detection of old Android in new IE\n\t\t// (IE11 ua string contains \"Android 4.0\")\n\t\t\n\t\tif(!features.pointerEvent) { \n\n\t\t\tvar ua = navigator.userAgent;\n\n\t\t\t// Detect if device is iPhone or iPod and if it's older than iOS 8\n\t\t\t// http://stackoverflow.com/a/14223920\n\t\t\t// \n\t\t\t// This detection is made because of buggy top/bottom toolbars\n\t\t\t// that don't trigger window.resize event.\n\t\t\t// For more info refer to _isFixedPosition variable in core.js\n\n\t\t\tif (/iP(hone|od)/.test(navigator.platform)) {\n\t\t\t\tvar v = (navigator.appVersion).match(/OS (\\d+)_(\\d+)_?(\\d+)?/);\n\t\t\t\tif(v && v.length > 0) {\n\t\t\t\t\tv = parseInt(v[1], 10);\n\t\t\t\t\tif(v >= 1 && v < 8 ) {\n\t\t\t\t\t\tfeatures.isOldIOSPhone = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Detect old Android (before KitKat)\n\t\t\t// due to bugs related to position:fixed\n\t\t\t// http://stackoverflow.com/questions/7184573/pick-up-the-android-version-in-the-browser-by-javascript\n\t\t\t\n\t\t\tvar match = ua.match(/Android\\s([0-9\\.]*)/);\n\t\t\tvar androidversion = match ? match[1] : 0;\n\t\t\tandroidversion = parseFloat(androidversion);\n\t\t\tif(androidversion >= 1 ) {\n\t\t\t\tif(androidversion < 4.4) {\n\t\t\t\t\tfeatures.isOldAndroid = true; // for fixed position bug & performance\n\t\t\t\t}\n\t\t\t\tfeatures.androidVersion = androidversion; // for touchend bug\n\t\t\t}\t\n\t\t\tfeatures.isMobileOpera = /opera mini|opera mobi/i.test(ua);\n\n\t\t\t// p.s. yes, yes, UA sniffing is bad, propose your solution for above bugs.\n\t\t}\n\t\t\n\t\tvar styleChecks = ['transform', 'perspective', 'animationName'],\n\t\t\tvendors = ['', 'webkit','Moz','ms','O'],\n\t\t\tstyleCheckItem,\n\t\t\tstyleName;\n\n\t\tfor(var i = 0; i < 4; i++) {\n\t\t\tvendor = vendors[i];\n\n\t\t\tfor(var a = 0; a < 3; a++) {\n\t\t\t\tstyleCheckItem = styleChecks[a];\n\n\t\t\t\t// uppercase first letter of property name, if vendor is present\n\t\t\t\tstyleName = vendor + (vendor ? \n\t\t\t\t\t\t\t\t\t\tstyleCheckItem.charAt(0).toUpperCase() + styleCheckItem.slice(1) : \n\t\t\t\t\t\t\t\t\t\tstyleCheckItem);\n\t\t\t\n\t\t\t\tif(!features[styleCheckItem] && styleName in helperStyle ) {\n\t\t\t\t\tfeatures[styleCheckItem] = styleName;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(vendor && !features.raf) {\n\t\t\t\tvendor = vendor.toLowerCase();\n\t\t\t\tfeatures.raf = window[vendor+'RequestAnimationFrame'];\n\t\t\t\tif(features.raf) {\n\t\t\t\t\tfeatures.caf = window[vendor+'CancelAnimationFrame'] || \n\t\t\t\t\t\t\t\t\twindow[vendor+'CancelRequestAnimationFrame'];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\t\n\t\tif(!features.raf) {\n\t\t\tvar lastTime = 0;\n\t\t\tfeatures.raf = function(fn) {\n\t\t\t\tvar currTime = new Date().getTime();\n\t\t\t\tvar timeToCall = Math.max(0, 16 - (currTime - lastTime));\n\t\t\t\tvar id = window.setTimeout(function() { fn(currTime + timeToCall); }, timeToCall);\n\t\t\t\tlastTime = currTime + timeToCall;\n\t\t\t\treturn id;\n\t\t\t};\n\t\t\tfeatures.caf = function(id) { clearTimeout(id); };\n\t\t}\n\n\t\t// Detect SVG support\n\t\tfeatures.svg = !!document.createElementNS && \n\t\t\t\t\t\t!!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect;\n\n\t\tframework.features = features;\n\n\t\treturn features;\n\t}\n};\n\nframework.detectFeatures();\n\n// Override addEventListener for old versions of IE\nif(framework.features.oldIE) {\n\n\tframework.bind = function(target, type, listener, unbind) {\n\t\t\n\t\ttype = type.split(' ');\n\n\t\tvar methodName = (unbind ? 'detach' : 'attach') + 'Event',\n\t\t\tevName,\n\t\t\t_handleEv = function() {\n\t\t\t\tlistener.handleEvent.call(listener);\n\t\t\t};\n\n\t\tfor(var i = 0; i < type.length; i++) {\n\t\t\tevName = type[i];\n\t\t\tif(evName) {\n\n\t\t\t\tif(typeof listener === 'object' && listener.handleEvent) {\n\t\t\t\t\tif(!unbind) {\n\t\t\t\t\t\tlistener['oldIE' + evName] = _handleEv;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(!listener['oldIE' + evName]) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\ttarget[methodName]( 'on' + evName, listener['oldIE' + evName]);\n\t\t\t\t} else {\n\t\t\t\t\ttarget[methodName]( 'on' + evName, listener);\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t};\n\t\n}\n\n/*>>framework-bridge*/\n\n/*>>core*/\n//function(template, UiClass, items, options)\n\nvar self = this;\n\n/**\n * Static vars, don't change unless you know what you're doing.\n */\nvar DOUBLE_TAP_RADIUS = 25, \n\tNUM_HOLDERS = 3;\n\n/**\n * Options\n */\nvar _options = {\n\tallowPanToNext:true,\n\tspacing: 0.12,\n\tbgOpacity: 1,\n\tmouseUsed: false,\n\tloop: true,\n\tpinchToClose: true,\n\tcloseOnScroll: true,\n\tcloseOnVerticalDrag: true,\n\tverticalDragRange: 0.75,\n\thideAnimationDuration: 333,\n\tshowAnimationDuration: 333,\n\tshowHideOpacity: false,\n\tfocus: true,\n\tescKey: true,\n\tarrowKeys: true,\n\tmainScrollEndFriction: 0.35,\n\tpanEndFriction: 0.35,\n\tisClickableElement: function(el) {\n return el.tagName === 'A';\n },\n getDoubleTapZoom: function(isMouseClick, item) {\n \tif(isMouseClick) {\n \t\treturn 1;\n \t} else {\n \t\treturn item.initialZoomLevel < 0.7 ? 1 : 1.33;\n \t}\n },\n maxSpreadZoom: 1.33,\n\tmodal: true,\n\n\t// not fully implemented yet\n\tscaleMode: 'fit' // TODO\n};\nframework.extend(_options, options);\n\n\n/**\n * Private helper variables & functions\n */\n\nvar _getEmptyPoint = function() { \n\t\treturn {x:0,y:0}; \n\t};\n\nvar _isOpen,\n\t_isDestroying,\n\t_closedByScroll,\n\t_currentItemIndex,\n\t_containerStyle,\n\t_containerShiftIndex,\n\t_currPanDist = _getEmptyPoint(),\n\t_startPanOffset = _getEmptyPoint(),\n\t_panOffset = _getEmptyPoint(),\n\t_upMoveEvents, // drag move, drag end & drag cancel events array\n\t_downEvents, // drag start events array\n\t_globalEventHandlers,\n\t_viewportSize = {},\n\t_currZoomLevel,\n\t_startZoomLevel,\n\t_translatePrefix,\n\t_translateSufix,\n\t_updateSizeInterval,\n\t_itemsNeedUpdate,\n\t_currPositionIndex = 0,\n\t_offset = {},\n\t_slideSize = _getEmptyPoint(), // size of slide area, including spacing\n\t_itemHolders,\n\t_prevItemIndex,\n\t_indexDiff = 0, // difference of indexes since last content update\n\t_dragStartEvent,\n\t_dragMoveEvent,\n\t_dragEndEvent,\n\t_dragCancelEvent,\n\t_transformKey,\n\t_pointerEventEnabled,\n\t_isFixedPosition = true,\n\t_likelyTouchDevice,\n\t_modules = [],\n\t_requestAF,\n\t_cancelAF,\n\t_initalClassName,\n\t_initalWindowScrollY,\n\t_oldIE,\n\t_currentWindowScrollY,\n\t_features,\n\t_windowVisibleSize = {},\n\t_renderMaxResolution = false,\n\t_orientationChangeTimeout,\n\n\n\t// Registers PhotoSWipe module (History, Controller ...)\n\t_registerModule = function(name, module) {\n\t\tframework.extend(self, module.publicMethods);\n\t\t_modules.push(name);\n\t},\n\n\t_getLoopedId = function(index) {\n\t\tvar numSlides = _getNumItems();\n\t\tif(index > numSlides - 1) {\n\t\t\treturn index - numSlides;\n\t\t} else if(index < 0) {\n\t\t\treturn numSlides + index;\n\t\t}\n\t\treturn index;\n\t},\n\t\n\t// Micro bind/trigger\n\t_listeners = {},\n\t_listen = function(name, fn) {\n\t\tif(!_listeners[name]) {\n\t\t\t_listeners[name] = [];\n\t\t}\n\t\treturn _listeners[name].push(fn);\n\t},\n\t_shout = function(name) {\n\t\tvar listeners = _listeners[name];\n\n\t\tif(listeners) {\n\t\t\tvar args = Array.prototype.slice.call(arguments);\n\t\t\targs.shift();\n\n\t\t\tfor(var i = 0; i < listeners.length; i++) {\n\t\t\t\tlisteners[i].apply(self, args);\n\t\t\t}\n\t\t}\n\t},\n\n\t_getCurrentTime = function() {\n\t\treturn new Date().getTime();\n\t},\n\t_applyBgOpacity = function(opacity) {\n\t\t_bgOpacity = opacity;\n\t\tself.bg.style.opacity = opacity * _options.bgOpacity;\n\t},\n\n\t_applyZoomTransform = function(styleObj,x,y,zoom,item) {\n\t\tif(!_renderMaxResolution || (item && item !== self.currItem) ) {\n\t\t\tzoom = zoom / (item ? item.fitRatio : self.currItem.fitRatio);\t\n\t\t}\n\t\t\t\n\t\tstyleObj[_transformKey] = _translatePrefix + x + 'px, ' + y + 'px' + _translateSufix + ' scale(' + zoom + ')';\n\t},\n\t_applyCurrentZoomPan = function( allowRenderResolution ) {\n\t\tif(_currZoomElementStyle) {\n\n\t\t\tif(allowRenderResolution) {\n\t\t\t\tif(_currZoomLevel > self.currItem.fitRatio) {\n\t\t\t\t\tif(!_renderMaxResolution) {\n\t\t\t\t\t\t_setImageSize(self.currItem, false, true);\n\t\t\t\t\t\t_renderMaxResolution = true;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif(_renderMaxResolution) {\n\t\t\t\t\t\t_setImageSize(self.currItem);\n\t\t\t\t\t\t_renderMaxResolution = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\n\t\t\t_applyZoomTransform(_currZoomElementStyle, _panOffset.x, _panOffset.y, _currZoomLevel);\n\t\t}\n\t},\n\t_applyZoomPanToItem = function(item) {\n\t\tif(item.container) {\n\n\t\t\t_applyZoomTransform(item.container.style, \n\t\t\t\t\t\t\t\titem.initialPosition.x, \n\t\t\t\t\t\t\t\titem.initialPosition.y, \n\t\t\t\t\t\t\t\titem.initialZoomLevel,\n\t\t\t\t\t\t\t\titem);\n\t\t}\n\t},\n\t_setTranslateX = function(x, elStyle) {\n\t\telStyle[_transformKey] = _translatePrefix + x + 'px, 0px' + _translateSufix;\n\t},\n\t_moveMainScroll = function(x, dragging) {\n\n\t\tif(!_options.loop && dragging) {\n\t\t\tvar newSlideIndexOffset = _currentItemIndex + (_slideSize.x * _currPositionIndex - x) / _slideSize.x,\n\t\t\t\tdelta = Math.round(x - _mainScrollPos.x);\n\n\t\t\tif( (newSlideIndexOffset < 0 && delta > 0) || \n\t\t\t\t(newSlideIndexOffset >= _getNumItems() - 1 && delta < 0) ) {\n\t\t\t\tx = _mainScrollPos.x + delta * _options.mainScrollEndFriction;\n\t\t\t} \n\t\t}\n\t\t\n\t\t_mainScrollPos.x = x;\n\t\t_setTranslateX(x, _containerStyle);\n\t},\n\t_calculatePanOffset = function(axis, zoomLevel) {\n\t\tvar m = _midZoomPoint[axis] - _offset[axis];\n\t\treturn _startPanOffset[axis] + _currPanDist[axis] + m - m * ( zoomLevel / _startZoomLevel );\n\t},\n\t\n\t_equalizePoints = function(p1, p2) {\n\t\tp1.x = p2.x;\n\t\tp1.y = p2.y;\n\t\tif(p2.id) {\n\t\t\tp1.id = p2.id;\n\t\t}\n\t},\n\t_roundPoint = function(p) {\n\t\tp.x = Math.round(p.x);\n\t\tp.y = Math.round(p.y);\n\t},\n\n\t_mouseMoveTimeout = null,\n\t_onFirstMouseMove = function() {\n\t\t// Wait until mouse move event is fired at least twice during 100ms\n\t\t// We do this, because some mobile browsers trigger it on touchstart\n\t\tif(_mouseMoveTimeout ) { \n\t\t\tframework.unbind(document, 'mousemove', _onFirstMouseMove);\n\t\t\tframework.addClass(template, 'pswp--has_mouse');\n\t\t\t_options.mouseUsed = true;\n\t\t\t_shout('mouseUsed');\n\t\t}\n\t\t_mouseMoveTimeout = setTimeout(function() {\n\t\t\t_mouseMoveTimeout = null;\n\t\t}, 100);\n\t},\n\n\t_bindEvents = function() {\n\t\tframework.bind(document, 'keydown', self);\n\n\t\tif(_features.transform) {\n\t\t\t// don't bind click event in browsers that don't support transform (mostly IE8)\n\t\t\tframework.bind(self.scrollWrap, 'click', self);\n\t\t}\n\t\t\n\n\t\tif(!_options.mouseUsed) {\n\t\t\tframework.bind(document, 'mousemove', _onFirstMouseMove);\n\t\t}\n\n\t\tframework.bind(window, 'resize scroll orientationchange', self);\n\n\t\t_shout('bindEvents');\n\t},\n\n\t_unbindEvents = function() {\n\t\tframework.unbind(window, 'resize scroll orientationchange', self);\n\t\tframework.unbind(window, 'scroll', _globalEventHandlers.scroll);\n\t\tframework.unbind(document, 'keydown', self);\n\t\tframework.unbind(document, 'mousemove', _onFirstMouseMove);\n\n\t\tif(_features.transform) {\n\t\t\tframework.unbind(self.scrollWrap, 'click', self);\n\t\t}\n\n\t\tif(_isDragging) {\n\t\t\tframework.unbind(window, _upMoveEvents, self);\n\t\t}\n\n\t\tclearTimeout(_orientationChangeTimeout);\n\n\t\t_shout('unbindEvents');\n\t},\n\t\n\t_calculatePanBounds = function(zoomLevel, update) {\n\t\tvar bounds = _calculateItemSize( self.currItem, _viewportSize, zoomLevel );\n\t\tif(update) {\n\t\t\t_currPanBounds = bounds;\n\t\t}\n\t\treturn bounds;\n\t},\n\t\n\t_getMinZoomLevel = function(item) {\n\t\tif(!item) {\n\t\t\titem = self.currItem;\n\t\t}\n\t\treturn item.initialZoomLevel;\n\t},\n\t_getMaxZoomLevel = function(item) {\n\t\tif(!item) {\n\t\t\titem = self.currItem;\n\t\t}\n\t\treturn item.w > 0 ? _options.maxSpreadZoom : 1;\n\t},\n\n\t// Return true if offset is out of the bounds\n\t_modifyDestPanOffset = function(axis, destPanBounds, destPanOffset, destZoomLevel) {\n\t\tif(destZoomLevel === self.currItem.initialZoomLevel) {\n\t\t\tdestPanOffset[axis] = self.currItem.initialPosition[axis];\n\t\t\treturn true;\n\t\t} else {\n\t\t\tdestPanOffset[axis] = _calculatePanOffset(axis, destZoomLevel); \n\n\t\t\tif(destPanOffset[axis] > destPanBounds.min[axis]) {\n\t\t\t\tdestPanOffset[axis] = destPanBounds.min[axis];\n\t\t\t\treturn true;\n\t\t\t} else if(destPanOffset[axis] < destPanBounds.max[axis] ) {\n\t\t\t\tdestPanOffset[axis] = destPanBounds.max[axis];\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\t_setupTransforms = function() {\n\n\t\tif(_transformKey) {\n\t\t\t// setup 3d transforms\n\t\t\tvar allow3dTransform = _features.perspective && !_likelyTouchDevice;\n\t\t\t_translatePrefix = 'translate' + (allow3dTransform ? '3d(' : '(');\n\t\t\t_translateSufix = _features.perspective ? ', 0px)' : ')';\t\n\t\t\treturn;\n\t\t}\n\n\t\t// Override zoom/pan/move functions in case old browser is used (most likely IE)\n\t\t// (so they use left/top/width/height, instead of CSS transform)\n\t\n\t\t_transformKey = 'left';\n\t\tframework.addClass(template, 'pswp--ie');\n\n\t\t_setTranslateX = function(x, elStyle) {\n\t\t\telStyle.left = x + 'px';\n\t\t};\n\t\t_applyZoomPanToItem = function(item) {\n\n\t\t\tvar zoomRatio = item.fitRatio > 1 ? 1 : item.fitRatio,\n\t\t\t\ts = item.container.style,\n\t\t\t\tw = zoomRatio * item.w,\n\t\t\t\th = zoomRatio * item.h;\n\n\t\t\ts.width = w + 'px';\n\t\t\ts.height = h + 'px';\n\t\t\ts.left = item.initialPosition.x + 'px';\n\t\t\ts.top = item.initialPosition.y + 'px';\n\n\t\t};\n\t\t_applyCurrentZoomPan = function() {\n\t\t\tif(_currZoomElementStyle) {\n\n\t\t\t\tvar s = _currZoomElementStyle,\n\t\t\t\t\titem = self.currItem,\n\t\t\t\t\tzoomRatio = item.fitRatio > 1 ? 1 : item.fitRatio,\n\t\t\t\t\tw = zoomRatio * item.w,\n\t\t\t\t\th = zoomRatio * item.h;\n\n\t\t\t\ts.width = w + 'px';\n\t\t\t\ts.height = h + 'px';\n\n\n\t\t\t\ts.left = _panOffset.x + 'px';\n\t\t\t\ts.top = _panOffset.y + 'px';\n\t\t\t}\n\t\t\t\n\t\t};\n\t},\n\n\t_onKeyDown = function(e) {\n\t\tvar keydownAction = '';\n\t\tif(_options.escKey && e.keyCode === 27) { \n\t\t\tkeydownAction = 'close';\n\t\t} else if(_options.arrowKeys) {\n\t\t\tif(e.keyCode === 37) {\n\t\t\t\tkeydownAction = 'prev';\n\t\t\t} else if(e.keyCode === 39) { \n\t\t\t\tkeydownAction = 'next';\n\t\t\t}\n\t\t}\n\n\t\tif(keydownAction) {\n\t\t\t// don't do anything if special key pressed to prevent from overriding default browser actions\n\t\t\t// e.g. in Chrome on Mac cmd+arrow-left returns to previous page\n\t\t\tif( !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey ) {\n\t\t\t\tif(e.preventDefault) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t} else {\n\t\t\t\t\te.returnValue = false;\n\t\t\t\t} \n\t\t\t\tself[keydownAction]();\n\t\t\t}\n\t\t}\n\t},\n\n\t_onGlobalClick = function(e) {\n\t\tif(!e) {\n\t\t\treturn;\n\t\t}\n\n\t\t// don't allow click event to pass through when triggering after drag or some other gesture\n\t\tif(_moved || _zoomStarted || _mainScrollAnimating || _verticalDragInitiated) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\n\t_updatePageScrollOffset = function() {\n\t\tself.setScrollOffset(0, framework.getScrollY());\t\t\n\t};\n\t\n\n\n\t\n\n\n\n// Micro animation engine\nvar _animations = {},\n\t_numAnimations = 0,\n\t_stopAnimation = function(name) {\n\t\tif(_animations[name]) {\n\t\t\tif(_animations[name].raf) {\n\t\t\t\t_cancelAF( _animations[name].raf );\n\t\t\t}\n\t\t\t_numAnimations--;\n\t\t\tdelete _animations[name];\n\t\t}\n\t},\n\t_registerStartAnimation = function(name) {\n\t\tif(_animations[name]) {\n\t\t\t_stopAnimation(name);\n\t\t}\n\t\tif(!_animations[name]) {\n\t\t\t_numAnimations++;\n\t\t\t_animations[name] = {};\n\t\t}\n\t},\n\t_stopAllAnimations = function() {\n\t\tfor (var prop in _animations) {\n\n\t\t\tif( _animations.hasOwnProperty( prop ) ) {\n\t\t\t\t_stopAnimation(prop);\n\t\t\t} \n\t\t\t\n\t\t}\n\t},\n\t_animateProp = function(name, b, endProp, d, easingFn, onUpdate, onComplete) {\n\t\tvar startAnimTime = _getCurrentTime(), t;\n\t\t_registerStartAnimation(name);\n\n\t\tvar animloop = function(){\n\t\t\tif ( _animations[name] ) {\n\t\t\t\t\n\t\t\t\tt = _getCurrentTime() - startAnimTime; // time diff\n\t\t\t\t//b - beginning (start prop)\n\t\t\t\t//d - anim duration\n\n\t\t\t\tif ( t >= d ) {\n\t\t\t\t\t_stopAnimation(name);\n\t\t\t\t\tonUpdate(endProp);\n\t\t\t\t\tif(onComplete) {\n\t\t\t\t\t\tonComplete();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonUpdate( (endProp - b) * easingFn(t/d) + b );\n\n\t\t\t\t_animations[name].raf = _requestAF(animloop);\n\t\t\t}\n\t\t};\n\t\tanimloop();\n\t};\n\t\n\n\nvar publicMethods = {\n\n\t// make a few local variables and functions public\n\tshout: _shout,\n\tlisten: _listen,\n\tviewportSize: _viewportSize,\n\toptions: _options,\n\n\tisMainScrollAnimating: function() {\n\t\treturn _mainScrollAnimating;\n\t},\n\tgetZoomLevel: function() {\n\t\treturn _currZoomLevel;\n\t},\n\tgetCurrentIndex: function() {\n\t\treturn _currentItemIndex;\n\t},\n\tisDragging: function() {\n\t\treturn _isDragging;\n\t},\t\n\tisZooming: function() {\n\t\treturn _isZooming;\n\t},\n\tsetScrollOffset: function(x,y) {\n\t\t_offset.x = x;\n\t\t_currentWindowScrollY = _offset.y = y;\n\t\t_shout('updateScrollOffset', _offset);\n\t},\n\tapplyZoomPan: function(zoomLevel,panX,panY,allowRenderResolution) {\n\t\t_panOffset.x = panX;\n\t\t_panOffset.y = panY;\n\t\t_currZoomLevel = zoomLevel;\n\t\t_applyCurrentZoomPan( allowRenderResolution );\n\t},\n\n\tinit: function() {\n\n\t\tif(_isOpen || _isDestroying) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar i;\n\n\t\tself.framework = framework; // basic functionality\n\t\tself.template = template; // root DOM element of PhotoSwipe\n\t\tself.bg = framework.getChildByClass(template, 'pswp__bg');\n\n\t\t_initalClassName = template.className;\n\t\t_isOpen = true;\n\t\t\t\t\n\t\t_features = framework.detectFeatures();\n\t\t_requestAF = _features.raf;\n\t\t_cancelAF = _features.caf;\n\t\t_transformKey = _features.transform;\n\t\t_oldIE = _features.oldIE;\n\t\t\n\t\tself.scrollWrap = framework.getChildByClass(template, 'pswp__scroll-wrap');\n\t\tself.container = framework.getChildByClass(self.scrollWrap, 'pswp__container');\n\n\t\t_containerStyle = self.container.style; // for fast access\n\n\t\t// Objects that hold slides (there are only 3 in DOM)\n\t\tself.itemHolders = _itemHolders = [\n\t\t\t{el:self.container.children[0] , wrap:0, index: -1},\n\t\t\t{el:self.container.children[1] , wrap:0, index: -1},\n\t\t\t{el:self.container.children[2] , wrap:0, index: -1}\n\t\t];\n\n\t\t// hide nearby item holders until initial zoom animation finishes (to avoid extra Paints)\n\t\t_itemHolders[0].el.style.display = _itemHolders[2].el.style.display = 'none';\n\n\t\t_setupTransforms();\n\n\t\t// Setup global events\n\t\t_globalEventHandlers = {\n\t\t\tresize: self.updateSize,\n\n\t\t\t// Fixes: iOS 10.3 resize event\n\t\t\t// does not update scrollWrap.clientWidth instantly after resize\n\t\t\t// https://github.com/dimsemenov/PhotoSwipe/issues/1315\n\t\t\torientationchange: function() {\n\t\t\t\tclearTimeout(_orientationChangeTimeout);\n\t\t\t\t_orientationChangeTimeout = setTimeout(function() {\n\t\t\t\t\tif(_viewportSize.x !== self.scrollWrap.clientWidth) {\n\t\t\t\t\t\tself.updateSize();\n\t\t\t\t\t}\n\t\t\t\t}, 500);\n\t\t\t},\n\t\t\tscroll: _updatePageScrollOffset,\n\t\t\tkeydown: _onKeyDown,\n\t\t\tclick: _onGlobalClick\n\t\t};\n\n\t\t// disable show/hide effects on old browsers that don't support CSS animations or transforms, \n\t\t// old IOS, Android and Opera mobile. Blackberry seems to work fine, even older models.\n\t\tvar oldPhone = _features.isOldIOSPhone || _features.isOldAndroid || _features.isMobileOpera;\n\t\tif(!_features.animationName || !_features.transform || oldPhone) {\n\t\t\t_options.showAnimationDuration = _options.hideAnimationDuration = 0;\n\t\t}\n\n\t\t// init modules\n\t\tfor(i = 0; i < _modules.length; i++) {\n\t\t\tself['init' + _modules[i]]();\n\t\t}\n\t\t\n\t\t// init\n\t\tif(UiClass) {\n\t\t\tvar ui = self.ui = new UiClass(self, framework);\n\t\t\tui.init();\n\t\t}\n\n\t\t_shout('firstUpdate');\n\t\t_currentItemIndex = _currentItemIndex || _options.index || 0;\n\t\t// validate index\n\t\tif( isNaN(_currentItemIndex) || _currentItemIndex < 0 || _currentItemIndex >= _getNumItems() ) {\n\t\t\t_currentItemIndex = 0;\n\t\t}\n\t\tself.currItem = _getItemAt( _currentItemIndex );\n\n\t\t\n\t\tif(_features.isOldIOSPhone || _features.isOldAndroid) {\n\t\t\t_isFixedPosition = false;\n\t\t}\n\t\t\n\t\ttemplate.setAttribute('aria-hidden', 'false');\n\t\tif(_options.modal) {\n\t\t\tif(!_isFixedPosition) {\n\t\t\t\ttemplate.style.position = 'absolute';\n\t\t\t\ttemplate.style.top = framework.getScrollY() + 'px';\n\t\t\t} else {\n\t\t\t\ttemplate.style.position = 'fixed';\n\t\t\t}\n\t\t}\n\n\t\tif(_currentWindowScrollY === undefined) {\n\t\t\t_shout('initialLayout');\n\t\t\t_currentWindowScrollY = _initalWindowScrollY = framework.getScrollY();\n\t\t}\n\t\t\n\t\t// add classes to root element of PhotoSwipe\n\t\tvar rootClasses = 'pswp--open ';\n\t\tif(_options.mainClass) {\n\t\t\trootClasses += _options.mainClass + ' ';\n\t\t}\n\t\tif(_options.showHideOpacity) {\n\t\t\trootClasses += 'pswp--animate_opacity ';\n\t\t}\n\t\trootClasses += _likelyTouchDevice ? 'pswp--touch' : 'pswp--notouch';\n\t\trootClasses += _features.animationName ? ' pswp--css_animation' : '';\n\t\trootClasses += _features.svg ? ' pswp--svg' : '';\n\t\tframework.addClass(template, rootClasses);\n\n\t\tself.updateSize();\n\n\t\t// initial update\n\t\t_containerShiftIndex = -1;\n\t\t_indexDiff = null;\n\t\tfor(i = 0; i < NUM_HOLDERS; i++) {\n\t\t\t_setTranslateX( (i+_containerShiftIndex) * _slideSize.x, _itemHolders[i].el.style);\n\t\t}\n\n\t\tif(!_oldIE) {\n\t\t\tframework.bind(self.scrollWrap, _downEvents, self); // no dragging for old IE\n\t\t}\t\n\n\t\t_listen('initialZoomInEnd', function() {\n\t\t\tself.setContent(_itemHolders[0], _currentItemIndex-1);\n\t\t\tself.setContent(_itemHolders[2], _currentItemIndex+1);\n\n\t\t\t_itemHolders[0].el.style.display = _itemHolders[2].el.style.display = 'block';\n\n\t\t\tif(_options.focus) {\n\t\t\t\t// focus causes layout, \n\t\t\t\t// which causes lag during the animation, \n\t\t\t\t// that's why we delay it untill the initial zoom transition ends\n\t\t\t\ttemplate.focus();\n\t\t\t}\n\t\t\t \n\n\t\t\t_bindEvents();\n\t\t});\n\n\t\t// set content for center slide (first time)\n\t\tself.setContent(_itemHolders[1], _currentItemIndex);\n\t\t\n\t\tself.updateCurrItem();\n\n\t\t_shout('afterInit');\n\n\t\tif(!_isFixedPosition) {\n\n\t\t\t// On all versions of iOS lower than 8.0, we check size of viewport every second.\n\t\t\t// \n\t\t\t// This is done to detect when Safari top & bottom bars appear, \n\t\t\t// as this action doesn't trigger any events (like resize). \n\t\t\t// \n\t\t\t// On iOS8 they fixed this.\n\t\t\t// \n\t\t\t// 10 Nov 2014: iOS 7 usage ~40%. iOS 8 usage 56%.\n\t\t\t\n\t\t\t_updateSizeInterval = setInterval(function() {\n\t\t\t\tif(!_numAnimations && !_isDragging && !_isZooming && (_currZoomLevel === self.currItem.initialZoomLevel) ) {\n\t\t\t\t\tself.updateSize();\n\t\t\t\t}\n\t\t\t}, 1000);\n\t\t}\n\n\t\tframework.addClass(template, 'pswp--visible');\n\t},\n\n\t// Close the gallery, then destroy it\n\tclose: function() {\n\t\tif(!_isOpen) {\n\t\t\treturn;\n\t\t}\n\n\t\t_isOpen = false;\n\t\t_isDestroying = true;\n\t\t_shout('close');\n\t\t_unbindEvents();\n\n\t\t_showOrHide(self.currItem, null, true, self.destroy);\n\t},\n\n\t// destroys the gallery (unbinds events, cleans up intervals and timeouts to avoid memory leaks)\n\tdestroy: function() {\n\t\t_shout('destroy');\n\n\t\tif(_showOrHideTimeout) {\n\t\t\tclearTimeout(_showOrHideTimeout);\n\t\t}\n\t\t\n\t\ttemplate.setAttribute('aria-hidden', 'true');\n\t\ttemplate.className = _initalClassName;\n\n\t\tif(_updateSizeInterval) {\n\t\t\tclearInterval(_updateSizeInterval);\n\t\t}\n\n\t\tframework.unbind(self.scrollWrap, _downEvents, self);\n\n\t\t// we unbind scroll event at the end, as closing animation may depend on it\n\t\tframework.unbind(window, 'scroll', self);\n\n\t\t_stopDragUpdateLoop();\n\n\t\t_stopAllAnimations();\n\n\t\t_listeners = null;\n\t},\n\n\t/**\n\t * Pan image to position\n\t * @param {Number} x \n\t * @param {Number} y \n\t * @param {Boolean} force Will ignore bounds if set to true.\n\t */\n\tpanTo: function(x,y,force) {\n\t\tif(!force) {\n\t\t\tif(x > _currPanBounds.min.x) {\n\t\t\t\tx = _currPanBounds.min.x;\n\t\t\t} else if(x < _currPanBounds.max.x) {\n\t\t\t\tx = _currPanBounds.max.x;\n\t\t\t}\n\n\t\t\tif(y > _currPanBounds.min.y) {\n\t\t\t\ty = _currPanBounds.min.y;\n\t\t\t} else if(y < _currPanBounds.max.y) {\n\t\t\t\ty = _currPanBounds.max.y;\n\t\t\t}\n\t\t}\n\t\t\n\t\t_panOffset.x = x;\n\t\t_panOffset.y = y;\n\t\t_applyCurrentZoomPan();\n\t},\n\t\n\thandleEvent: function (e) {\n\t\te = e || window.event;\n\t\tif(_globalEventHandlers[e.type]) {\n\t\t\t_globalEventHandlers[e.type](e);\n\t\t}\n\t},\n\n\n\tgoTo: function(index) {\n\n\t\tindex = _getLoopedId(index);\n\n\t\tvar diff = index - _currentItemIndex;\n\t\t_indexDiff = diff;\n\n\t\t_currentItemIndex = index;\n\t\tself.currItem = _getItemAt( _currentItemIndex );\n\t\t_currPositionIndex -= diff;\n\t\t\n\t\t_moveMainScroll(_slideSize.x * _currPositionIndex);\n\t\t\n\n\t\t_stopAllAnimations();\n\t\t_mainScrollAnimating = false;\n\n\t\tself.updateCurrItem();\n\t},\n\tnext: function() {\n\t\tself.goTo( _currentItemIndex + 1);\n\t},\n\tprev: function() {\n\t\tself.goTo( _currentItemIndex - 1);\n\t},\n\n\t// update current zoom/pan objects\n\tupdateCurrZoomItem: function(emulateSetContent) {\n\t\tif(emulateSetContent) {\n\t\t\t_shout('beforeChange', 0);\n\t\t}\n\n\t\t// itemHolder[1] is middle (current) item\n\t\tif(_itemHolders[1].el.children.length) {\n\t\t\tvar zoomElement = _itemHolders[1].el.children[0];\n\t\t\tif( framework.hasClass(zoomElement, 'pswp__zoom-wrap') ) {\n\t\t\t\t_currZoomElementStyle = zoomElement.style;\n\t\t\t} else {\n\t\t\t\t_currZoomElementStyle = null;\n\t\t\t}\n\t\t} else {\n\t\t\t_currZoomElementStyle = null;\n\t\t}\n\t\t\n\t\t_currPanBounds = self.currItem.bounds;\t\n\t\t_startZoomLevel = _currZoomLevel = self.currItem.initialZoomLevel;\n\n\t\t_panOffset.x = _currPanBounds.center.x;\n\t\t_panOffset.y = _currPanBounds.center.y;\n\n\t\tif(emulateSetContent) {\n\t\t\t_shout('afterChange');\n\t\t}\n\t},\n\n\n\tinvalidateCurrItems: function() {\n\t\t_itemsNeedUpdate = true;\n\t\tfor(var i = 0; i < NUM_HOLDERS; i++) {\n\t\t\tif( _itemHolders[i].item ) {\n\t\t\t\t_itemHolders[i].item.needsUpdate = true;\n\t\t\t}\n\t\t}\n\t},\n\n\tupdateCurrItem: function(beforeAnimation) {\n\n\t\tif(_indexDiff === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar diffAbs = Math.abs(_indexDiff),\n\t\t\ttempHolder;\n\n\t\tif(beforeAnimation && diffAbs < 2) {\n\t\t\treturn;\n\t\t}\n\n\n\t\tself.currItem = _getItemAt( _currentItemIndex );\n\t\t_renderMaxResolution = false;\n\t\t\n\t\t_shout('beforeChange', _indexDiff);\n\n\t\tif(diffAbs >= NUM_HOLDERS) {\n\t\t\t_containerShiftIndex += _indexDiff + (_indexDiff > 0 ? -NUM_HOLDERS : NUM_HOLDERS);\n\t\t\tdiffAbs = NUM_HOLDERS;\n\t\t}\n\t\tfor(var i = 0; i < diffAbs; i++) {\n\t\t\tif(_indexDiff > 0) {\n\t\t\t\ttempHolder = _itemHolders.shift();\n\t\t\t\t_itemHolders[NUM_HOLDERS-1] = tempHolder; // move first to last\n\n\t\t\t\t_containerShiftIndex++;\n\t\t\t\t_setTranslateX( (_containerShiftIndex+2) * _slideSize.x, tempHolder.el.style);\n\t\t\t\tself.setContent(tempHolder, _currentItemIndex - diffAbs + i + 1 + 1);\n\t\t\t} else {\n\t\t\t\ttempHolder = _itemHolders.pop();\n\t\t\t\t_itemHolders.unshift( tempHolder ); // move last to first\n\n\t\t\t\t_containerShiftIndex--;\n\t\t\t\t_setTranslateX( _containerShiftIndex * _slideSize.x, tempHolder.el.style);\n\t\t\t\tself.setContent(tempHolder, _currentItemIndex + diffAbs - i - 1 - 1);\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t\t// reset zoom/pan on previous item\n\t\tif(_currZoomElementStyle && Math.abs(_indexDiff) === 1) {\n\n\t\t\tvar prevItem = _getItemAt(_prevItemIndex);\n\t\t\tif(prevItem.initialZoomLevel !== _currZoomLevel) {\n\t\t\t\t_calculateItemSize(prevItem , _viewportSize );\n\t\t\t\t_setImageSize(prevItem);\n\t\t\t\t_applyZoomPanToItem( prevItem ); \t\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\t// reset diff after update\n\t\t_indexDiff = 0;\n\n\t\tself.updateCurrZoomItem();\n\n\t\t_prevItemIndex = _currentItemIndex;\n\n\t\t_shout('afterChange');\n\t\t\n\t},\n\n\n\n\tupdateSize: function(force) {\n\t\t\n\t\tif(!_isFixedPosition && _options.modal) {\n\t\t\tvar windowScrollY = framework.getScrollY();\n\t\t\tif(_currentWindowScrollY !== windowScrollY) {\n\t\t\t\ttemplate.style.top = windowScrollY + 'px';\n\t\t\t\t_currentWindowScrollY = windowScrollY;\n\t\t\t}\n\t\t\tif(!force && _windowVisibleSize.x === window.innerWidth && _windowVisibleSize.y === window.innerHeight) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t_windowVisibleSize.x = window.innerWidth;\n\t\t\t_windowVisibleSize.y = window.innerHeight;\n\n\t\t\t//template.style.width = _windowVisibleSize.x + 'px';\n\t\t\ttemplate.style.height = _windowVisibleSize.y + 'px';\n\t\t}\n\n\n\n\t\t_viewportSize.x = self.scrollWrap.clientWidth;\n\t\t_viewportSize.y = self.scrollWrap.clientHeight;\n\n\t\t_updatePageScrollOffset();\n\n\t\t_slideSize.x = _viewportSize.x + Math.round(_viewportSize.x * _options.spacing);\n\t\t_slideSize.y = _viewportSize.y;\n\n\t\t_moveMainScroll(_slideSize.x * _currPositionIndex);\n\n\t\t_shout('beforeResize'); // even may be used for example to switch image sources\n\n\n\t\t// don't re-calculate size on inital size update\n\t\tif(_containerShiftIndex !== undefined) {\n\n\t\t\tvar holder,\n\t\t\t\titem,\n\t\t\t\thIndex;\n\n\t\t\tfor(var i = 0; i < NUM_HOLDERS; i++) {\n\t\t\t\tholder = _itemHolders[i];\n\t\t\t\t_setTranslateX( (i+_containerShiftIndex) * _slideSize.x, holder.el.style);\n\n\t\t\t\thIndex = _currentItemIndex+i-1;\n\n\t\t\t\tif(_options.loop && _getNumItems() > 2) {\n\t\t\t\t\thIndex = _getLoopedId(hIndex);\n\t\t\t\t}\n\n\t\t\t\t// update zoom level on items and refresh source (if needsUpdate)\n\t\t\t\titem = _getItemAt( hIndex );\n\n\t\t\t\t// re-render gallery item if `needsUpdate`,\n\t\t\t\t// or doesn't have `bounds` (entirely new slide object)\n\t\t\t\tif( item && (_itemsNeedUpdate || item.needsUpdate || !item.bounds) ) {\n\n\t\t\t\t\tself.cleanSlide( item );\n\t\t\t\t\t\n\t\t\t\t\tself.setContent( holder, hIndex );\n\n\t\t\t\t\t// if \"center\" slide\n\t\t\t\t\tif(i === 1) {\n\t\t\t\t\t\tself.currItem = item;\n\t\t\t\t\t\tself.updateCurrZoomItem(true);\n\t\t\t\t\t}\n\n\t\t\t\t\titem.needsUpdate = false;\n\n\t\t\t\t} else if(holder.index === -1 && hIndex >= 0) {\n\t\t\t\t\t// add content first time\n\t\t\t\t\tself.setContent( holder, hIndex );\n\t\t\t\t}\n\t\t\t\tif(item && item.container) {\n\t\t\t\t\t_calculateItemSize(item, _viewportSize);\n\t\t\t\t\t_setImageSize(item);\n\t\t\t\t\t_applyZoomPanToItem( item );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t_itemsNeedUpdate = false;\n\t\t}\t\n\n\t\t_startZoomLevel = _currZoomLevel = self.currItem.initialZoomLevel;\n\t\t_currPanBounds = self.currItem.bounds;\n\n\t\tif(_currPanBounds) {\n\t\t\t_panOffset.x = _currPanBounds.center.x;\n\t\t\t_panOffset.y = _currPanBounds.center.y;\n\t\t\t_applyCurrentZoomPan( true );\n\t\t}\n\t\t\n\t\t_shout('resize');\n\t},\n\t\n\t// Zoom current item to\n\tzoomTo: function(destZoomLevel, centerPoint, speed, easingFn, updateFn) {\n\t\t/*\n\t\t\tif(destZoomLevel === 'fit') {\n\t\t\t\tdestZoomLevel = self.currItem.fitRatio;\n\t\t\t} else if(destZoomLevel === 'fill') {\n\t\t\t\tdestZoomLevel = self.currItem.fillRatio;\n\t\t\t}\n\t\t*/\n\n\t\tif(centerPoint) {\n\t\t\t_startZoomLevel = _currZoomLevel;\n\t\t\t_midZoomPoint.x = Math.abs(centerPoint.x) - _panOffset.x ;\n\t\t\t_midZoomPoint.y = Math.abs(centerPoint.y) - _panOffset.y ;\n\t\t\t_equalizePoints(_startPanOffset, _panOffset);\n\t\t}\n\n\t\tvar destPanBounds = _calculatePanBounds(destZoomLevel, false),\n\t\t\tdestPanOffset = {};\n\n\t\t_modifyDestPanOffset('x', destPanBounds, destPanOffset, destZoomLevel);\n\t\t_modifyDestPanOffset('y', destPanBounds, destPanOffset, destZoomLevel);\n\n\t\tvar initialZoomLevel = _currZoomLevel;\n\t\tvar initialPanOffset = {\n\t\t\tx: _panOffset.x,\n\t\t\ty: _panOffset.y\n\t\t};\n\n\t\t_roundPoint(destPanOffset);\n\n\t\tvar onUpdate = function(now) {\n\t\t\tif(now === 1) {\n\t\t\t\t_currZoomLevel = destZoomLevel;\n\t\t\t\t_panOffset.x = destPanOffset.x;\n\t\t\t\t_panOffset.y = destPanOffset.y;\n\t\t\t} else {\n\t\t\t\t_currZoomLevel = (destZoomLevel - initialZoomLevel) * now + initialZoomLevel;\n\t\t\t\t_panOffset.x = (destPanOffset.x - initialPanOffset.x) * now + initialPanOffset.x;\n\t\t\t\t_panOffset.y = (destPanOffset.y - initialPanOffset.y) * now + initialPanOffset.y;\n\t\t\t}\n\n\t\t\tif(updateFn) {\n\t\t\t\tupdateFn(now);\n\t\t\t}\n\n\t\t\t_applyCurrentZoomPan( now === 1 );\n\t\t};\n\n\t\tif(speed) {\n\t\t\t_animateProp('customZoomTo', 0, 1, speed, easingFn || framework.easing.sine.inOut, onUpdate);\n\t\t} else {\n\t\t\tonUpdate(1);\n\t\t}\n\t}\n\n\n};\n\n\n/*>>core*/\n\n/*>>gestures*/\n/**\n * Mouse/touch/pointer event handlers.\n * \n * separated from @core.js for readability\n */\n\nvar MIN_SWIPE_DISTANCE = 30,\n\tDIRECTION_CHECK_OFFSET = 10; // amount of pixels to drag to determine direction of swipe\n\nvar _gestureStartTime,\n\t_gestureCheckSpeedTime,\n\n\t// pool of objects that are used during dragging of zooming\n\tp = {}, // first point\n\tp2 = {}, // second point (for zoom gesture)\n\tdelta = {},\n\t_currPoint = {},\n\t_startPoint = {},\n\t_currPointers = [],\n\t_startMainScrollPos = {},\n\t_releaseAnimData,\n\t_posPoints = [], // array of points during dragging, used to determine type of gesture\n\t_tempPoint = {},\n\n\t_isZoomingIn,\n\t_verticalDragInitiated,\n\t_oldAndroidTouchEndTimeout,\n\t_currZoomedItemIndex = 0,\n\t_centerPoint = _getEmptyPoint(),\n\t_lastReleaseTime = 0,\n\t_isDragging, // at least one pointer is down\n\t_isMultitouch, // at least two _pointers are down\n\t_zoomStarted, // zoom level changed during zoom gesture\n\t_moved,\n\t_dragAnimFrame,\n\t_mainScrollShifted,\n\t_currentPoints, // array of current touch points\n\t_isZooming,\n\t_currPointsDistance,\n\t_startPointsDistance,\n\t_currPanBounds,\n\t_mainScrollPos = _getEmptyPoint(),\n\t_currZoomElementStyle,\n\t_mainScrollAnimating, // true, if animation after swipe gesture is running\n\t_midZoomPoint = _getEmptyPoint(),\n\t_currCenterPoint = _getEmptyPoint(),\n\t_direction,\n\t_isFirstMove,\n\t_opacityChanged,\n\t_bgOpacity,\n\t_wasOverInitialZoom,\n\n\t_isEqualPoints = function(p1, p2) {\n\t\treturn p1.x === p2.x && p1.y === p2.y;\n\t},\n\t_isNearbyPoints = function(touch0, touch1) {\n\t\treturn Math.abs(touch0.x - touch1.x) < DOUBLE_TAP_RADIUS && Math.abs(touch0.y - touch1.y) < DOUBLE_TAP_RADIUS;\n\t},\n\t_calculatePointsDistance = function(p1, p2) {\n\t\t_tempPoint.x = Math.abs( p1.x - p2.x );\n\t\t_tempPoint.y = Math.abs( p1.y - p2.y );\n\t\treturn Math.sqrt(_tempPoint.x * _tempPoint.x + _tempPoint.y * _tempPoint.y);\n\t},\n\t_stopDragUpdateLoop = function() {\n\t\tif(_dragAnimFrame) {\n\t\t\t_cancelAF(_dragAnimFrame);\n\t\t\t_dragAnimFrame = null;\n\t\t}\n\t},\n\t_dragUpdateLoop = function() {\n\t\tif(_isDragging) {\n\t\t\t_dragAnimFrame = _requestAF(_dragUpdateLoop);\n\t\t\t_renderMovement();\n\t\t}\n\t},\n\t_canPan = function() {\n\t\treturn !(_options.scaleMode === 'fit' && _currZoomLevel === self.currItem.initialZoomLevel);\n\t},\n\t\n\t// find the closest parent DOM element\n\t_closestElement = function(el, fn) {\n\t \tif(!el || el === document) {\n\t \t\treturn false;\n\t \t}\n\n\t \t// don't search elements above pswp__scroll-wrap\n\t \tif(el.getAttribute('class') && el.getAttribute('class').indexOf('pswp__scroll-wrap') > -1 ) {\n\t \t\treturn false;\n\t \t}\n\n\t \tif( fn(el) ) {\n\t \t\treturn el;\n\t \t}\n\n\t \treturn _closestElement(el.parentNode, fn);\n\t},\n\n\t_preventObj = {},\n\t_preventDefaultEventBehaviour = function(e, isDown) {\n\t _preventObj.prevent = !_closestElement(e.target, _options.isClickableElement);\n\n\t\t_shout('preventDragEvent', e, isDown, _preventObj);\n\t\treturn _preventObj.prevent;\n\n\t},\n\t_convertTouchToPoint = function(touch, p) {\n\t\tp.x = touch.pageX;\n\t\tp.y = touch.pageY;\n\t\tp.id = touch.identifier;\n\t\treturn p;\n\t},\n\t_findCenterOfPoints = function(p1, p2, pCenter) {\n\t\tpCenter.x = (p1.x + p2.x) * 0.5;\n\t\tpCenter.y = (p1.y + p2.y) * 0.5;\n\t},\n\t_pushPosPoint = function(time, x, y) {\n\t\tif(time - _gestureCheckSpeedTime > 50) {\n\t\t\tvar o = _posPoints.length > 2 ? _posPoints.shift() : {};\n\t\t\to.x = x;\n\t\t\to.y = y; \n\t\t\t_posPoints.push(o);\n\t\t\t_gestureCheckSpeedTime = time;\n\t\t}\n\t},\n\n\t_calculateVerticalDragOpacityRatio = function() {\n\t\tvar yOffset = _panOffset.y - self.currItem.initialPosition.y; // difference between initial and current position\n\t\treturn 1 - Math.abs( yOffset / (_viewportSize.y / 2) );\n\t},\n\n\t\n\t// points pool, reused during touch events\n\t_ePoint1 = {},\n\t_ePoint2 = {},\n\t_tempPointsArr = [],\n\t_tempCounter,\n\t_getTouchPoints = function(e) {\n\t\t// clean up previous points, without recreating array\n\t\twhile(_tempPointsArr.length > 0) {\n\t\t\t_tempPointsArr.pop();\n\t\t}\n\n\t\tif(!_pointerEventEnabled) {\n\t\t\tif(e.type.indexOf('touch') > -1) {\n\n\t\t\t\tif(e.touches && e.touches.length > 0) {\n\t\t\t\t\t_tempPointsArr[0] = _convertTouchToPoint(e.touches[0], _ePoint1);\n\t\t\t\t\tif(e.touches.length > 1) {\n\t\t\t\t\t\t_tempPointsArr[1] = _convertTouchToPoint(e.touches[1], _ePoint2);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\t_ePoint1.x = e.pageX;\n\t\t\t\t_ePoint1.y = e.pageY;\n\t\t\t\t_ePoint1.id = '';\n\t\t\t\t_tempPointsArr[0] = _ePoint1;//_ePoint1;\n\t\t\t}\n\t\t} else {\n\t\t\t_tempCounter = 0;\n\t\t\t// we can use forEach, as pointer events are supported only in modern browsers\n\t\t\t_currPointers.forEach(function(p) {\n\t\t\t\tif(_tempCounter === 0) {\n\t\t\t\t\t_tempPointsArr[0] = p;\n\t\t\t\t} else if(_tempCounter === 1) {\n\t\t\t\t\t_tempPointsArr[1] = p;\n\t\t\t\t}\n\t\t\t\t_tempCounter++;\n\n\t\t\t});\n\t\t}\n\t\treturn _tempPointsArr;\n\t},\n\n\t_panOrMoveMainScroll = function(axis, delta) {\n\n\t\tvar panFriction,\n\t\t\toverDiff = 0,\n\t\t\tnewOffset = _panOffset[axis] + delta[axis],\n\t\t\tstartOverDiff,\n\t\t\tdir = delta[axis] > 0,\n\t\t\tnewMainScrollPosition = _mainScrollPos.x + delta.x,\n\t\t\tmainScrollDiff = _mainScrollPos.x - _startMainScrollPos.x,\n\t\t\tnewPanPos,\n\t\t\tnewMainScrollPos;\n\n\t\t// calculate fdistance over the bounds and friction\n\t\tif(newOffset > _currPanBounds.min[axis] || newOffset < _currPanBounds.max[axis]) {\n\t\t\tpanFriction = _options.panEndFriction;\n\t\t\t// Linear increasing of friction, so at 1/4 of viewport it's at max value. \n\t\t\t// Looks not as nice as was expected. Left for history.\n\t\t\t// panFriction = (1 - (_panOffset[axis] + delta[axis] + panBounds.min[axis]) / (_viewportSize[axis] / 4) );\n\t\t} else {\n\t\t\tpanFriction = 1;\n\t\t}\n\t\t\n\t\tnewOffset = _panOffset[axis] + delta[axis] * panFriction;\n\n\t\t// move main scroll or start panning\n\t\tif(_options.allowPanToNext || _currZoomLevel === self.currItem.initialZoomLevel) {\n\n\n\t\t\tif(!_currZoomElementStyle) {\n\t\t\t\t\n\t\t\t\tnewMainScrollPos = newMainScrollPosition;\n\n\t\t\t} else if(_direction === 'h' && axis === 'x' && !_zoomStarted ) {\n\t\t\t\t\n\t\t\t\tif(dir) {\n\t\t\t\t\tif(newOffset > _currPanBounds.min[axis]) {\n\t\t\t\t\t\tpanFriction = _options.panEndFriction;\n\t\t\t\t\t\toverDiff = _currPanBounds.min[axis] - newOffset;\n\t\t\t\t\t\tstartOverDiff = _currPanBounds.min[axis] - _startPanOffset[axis];\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// drag right\n\t\t\t\t\tif( (startOverDiff <= 0 || mainScrollDiff < 0) && _getNumItems() > 1 ) {\n\t\t\t\t\t\tnewMainScrollPos = newMainScrollPosition;\n\t\t\t\t\t\tif(mainScrollDiff < 0 && newMainScrollPosition > _startMainScrollPos.x) {\n\t\t\t\t\t\t\tnewMainScrollPos = _startMainScrollPos.x;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(_currPanBounds.min.x !== _currPanBounds.max.x) {\n\t\t\t\t\t\t\tnewPanPos = newOffset;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif(newOffset < _currPanBounds.max[axis] ) {\n\t\t\t\t\t\tpanFriction =_options.panEndFriction;\n\t\t\t\t\t\toverDiff = newOffset - _currPanBounds.max[axis];\n\t\t\t\t\t\tstartOverDiff = _startPanOffset[axis] - _currPanBounds.max[axis];\n\t\t\t\t\t}\n\n\t\t\t\t\tif( (startOverDiff <= 0 || mainScrollDiff > 0) && _getNumItems() > 1 ) {\n\t\t\t\t\t\tnewMainScrollPos = newMainScrollPosition;\n\n\t\t\t\t\t\tif(mainScrollDiff > 0 && newMainScrollPosition < _startMainScrollPos.x) {\n\t\t\t\t\t\t\tnewMainScrollPos = _startMainScrollPos.x;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(_currPanBounds.min.x !== _currPanBounds.max.x) {\n\t\t\t\t\t\t\tnewPanPos = newOffset;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t\t//\n\t\t\t}\n\n\t\t\tif(axis === 'x') {\n\n\t\t\t\tif(newMainScrollPos !== undefined) {\n\t\t\t\t\t_moveMainScroll(newMainScrollPos, true);\n\t\t\t\t\tif(newMainScrollPos === _startMainScrollPos.x) {\n\t\t\t\t\t\t_mainScrollShifted = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_mainScrollShifted = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(_currPanBounds.min.x !== _currPanBounds.max.x) {\n\t\t\t\t\tif(newPanPos !== undefined) {\n\t\t\t\t\t\t_panOffset.x = newPanPos;\n\t\t\t\t\t} else if(!_mainScrollShifted) {\n\t\t\t\t\t\t_panOffset.x += delta.x * panFriction;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn newMainScrollPos !== undefined;\n\t\t\t}\n\n\t\t}\n\n\t\tif(!_mainScrollAnimating) {\n\t\t\t\n\t\t\tif(!_mainScrollShifted) {\n\t\t\t\tif(_currZoomLevel > self.currItem.fitRatio) {\n\t\t\t\t\t_panOffset[axis] += delta[axis] * panFriction;\n\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t\n\t\t}\n\t\t\n\t},\n\n\t// Pointerdown/touchstart/mousedown handler\n\t_onDragStart = function(e) {\n\n\t\t// Allow dragging only via left mouse button.\n\t\t// As this handler is not added in IE8 - we ignore e.which\n\t\t// \n\t\t// http://www.quirksmode.org/js/events_properties.html\n\t\t// https://developer.mozilla.org/en-US/docs/Web/API/event.button\n\t\tif(e.type === 'mousedown' && e.button > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(_initialZoomRunning) {\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tif(_oldAndroidTouchEndTimeout && e.type === 'mousedown') {\n\t\t\treturn;\n\t\t}\n\n\t\tif(_preventDefaultEventBehaviour(e, true)) {\n\t\t\te.preventDefault();\n\t\t}\n\n\n\n\t\t_shout('pointerDown');\n\n\t\tif(_pointerEventEnabled) {\n\t\t\tvar pointerIndex = framework.arraySearch(_currPointers, e.pointerId, 'id');\n\t\t\tif(pointerIndex < 0) {\n\t\t\t\tpointerIndex = _currPointers.length;\n\t\t\t}\n\t\t\t_currPointers[pointerIndex] = {x:e.pageX, y:e.pageY, id: e.pointerId};\n\t\t}\n\t\t\n\n\n\t\tvar startPointsList = _getTouchPoints(e),\n\t\t\tnumPoints = startPointsList.length;\n\n\t\t_currentPoints = null;\n\n\t\t_stopAllAnimations();\n\n\t\t// init drag\n\t\tif(!_isDragging || numPoints === 1) {\n\n\t\t\t\n\n\t\t\t_isDragging = _isFirstMove = true;\n\t\t\tframework.bind(window, _upMoveEvents, self);\n\n\t\t\t_isZoomingIn = \n\t\t\t\t_wasOverInitialZoom = \n\t\t\t\t_opacityChanged = \n\t\t\t\t_verticalDragInitiated = \n\t\t\t\t_mainScrollShifted = \n\t\t\t\t_moved = \n\t\t\t\t_isMultitouch = \n\t\t\t\t_zoomStarted = false;\n\n\t\t\t_direction = null;\n\n\t\t\t_shout('firstTouchStart', startPointsList);\n\n\t\t\t_equalizePoints(_startPanOffset, _panOffset);\n\n\t\t\t_currPanDist.x = _currPanDist.y = 0;\n\t\t\t_equalizePoints(_currPoint, startPointsList[0]);\n\t\t\t_equalizePoints(_startPoint, _currPoint);\n\n\t\t\t//_equalizePoints(_startMainScrollPos, _mainScrollPos);\n\t\t\t_startMainScrollPos.x = _slideSize.x * _currPositionIndex;\n\n\t\t\t_posPoints = [{\n\t\t\t\tx: _currPoint.x,\n\t\t\t\ty: _currPoint.y\n\t\t\t}];\n\n\t\t\t_gestureCheckSpeedTime = _gestureStartTime = _getCurrentTime();\n\n\t\t\t//_mainScrollAnimationEnd(true);\n\t\t\t_calculatePanBounds( _currZoomLevel, true );\n\t\t\t\n\t\t\t// Start rendering\n\t\t\t_stopDragUpdateLoop();\n\t\t\t_dragUpdateLoop();\n\t\t\t\n\t\t}\n\n\t\t// init zoom\n\t\tif(!_isZooming && numPoints > 1 && !_mainScrollAnimating && !_mainScrollShifted) {\n\t\t\t_startZoomLevel = _currZoomLevel;\n\t\t\t_zoomStarted = false; // true if zoom changed at least once\n\n\t\t\t_isZooming = _isMultitouch = true;\n\t\t\t_currPanDist.y = _currPanDist.x = 0;\n\n\t\t\t_equalizePoints(_startPanOffset, _panOffset);\n\n\t\t\t_equalizePoints(p, startPointsList[0]);\n\t\t\t_equalizePoints(p2, startPointsList[1]);\n\n\t\t\t_findCenterOfPoints(p, p2, _currCenterPoint);\n\n\t\t\t_midZoomPoint.x = Math.abs(_currCenterPoint.x) - _panOffset.x;\n\t\t\t_midZoomPoint.y = Math.abs(_currCenterPoint.y) - _panOffset.y;\n\t\t\t_currPointsDistance = _startPointsDistance = _calculatePointsDistance(p, p2);\n\t\t}\n\n\n\t},\n\n\t// Pointermove/touchmove/mousemove handler\n\t_onDragMove = function(e) {\n\n\t\te.preventDefault();\n\n\t\tif(_pointerEventEnabled) {\n\t\t\tvar pointerIndex = framework.arraySearch(_currPointers, e.pointerId, 'id');\n\t\t\tif(pointerIndex > -1) {\n\t\t\t\tvar p = _currPointers[pointerIndex];\n\t\t\t\tp.x = e.pageX;\n\t\t\t\tp.y = e.pageY; \n\t\t\t}\n\t\t}\n\n\t\tif(_isDragging) {\n\t\t\tvar touchesList = _getTouchPoints(e);\n\t\t\tif(!_direction && !_moved && !_isZooming) {\n\n\t\t\t\tif(_mainScrollPos.x !== _slideSize.x * _currPositionIndex) {\n\t\t\t\t\t// if main scroll position is shifted – direction is always horizontal\n\t\t\t\t\t_direction = 'h';\n\t\t\t\t} else {\n\t\t\t\t\tvar diff = Math.abs(touchesList[0].x - _currPoint.x) - Math.abs(touchesList[0].y - _currPoint.y);\n\t\t\t\t\t// check the direction of movement\n\t\t\t\t\tif(Math.abs(diff) >= DIRECTION_CHECK_OFFSET) {\n\t\t\t\t\t\t_direction = diff > 0 ? 'h' : 'v';\n\t\t\t\t\t\t_currentPoints = touchesList;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\t_currentPoints = touchesList;\n\t\t\t}\n\t\t}\t\n\t},\n\t// \n\t_renderMovement = function() {\n\n\t\tif(!_currentPoints) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar numPoints = _currentPoints.length;\n\n\t\tif(numPoints === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t_equalizePoints(p, _currentPoints[0]);\n\n\t\tdelta.x = p.x - _currPoint.x;\n\t\tdelta.y = p.y - _currPoint.y;\n\n\t\tif(_isZooming && numPoints > 1) {\n\t\t\t// Handle behaviour for more than 1 point\n\n\t\t\t_currPoint.x = p.x;\n\t\t\t_currPoint.y = p.y;\n\t\t\n\t\t\t// check if one of two points changed\n\t\t\tif( !delta.x && !delta.y && _isEqualPoints(_currentPoints[1], p2) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_equalizePoints(p2, _currentPoints[1]);\n\n\n\t\t\tif(!_zoomStarted) {\n\t\t\t\t_zoomStarted = true;\n\t\t\t\t_shout('zoomGestureStarted');\n\t\t\t}\n\t\t\t\n\t\t\t// Distance between two points\n\t\t\tvar pointsDistance = _calculatePointsDistance(p,p2);\n\n\t\t\tvar zoomLevel = _calculateZoomLevel(pointsDistance);\n\n\t\t\t// slightly over the of initial zoom level\n\t\t\tif(zoomLevel > self.currItem.initialZoomLevel + self.currItem.initialZoomLevel / 15) {\n\t\t\t\t_wasOverInitialZoom = true;\n\t\t\t}\n\n\t\t\t// Apply the friction if zoom level is out of the bounds\n\t\t\tvar zoomFriction = 1,\n\t\t\t\tminZoomLevel = _getMinZoomLevel(),\n\t\t\t\tmaxZoomLevel = _getMaxZoomLevel();\n\n\t\t\tif ( zoomLevel < minZoomLevel ) {\n\t\t\t\t\n\t\t\t\tif(_options.pinchToClose && !_wasOverInitialZoom && _startZoomLevel <= self.currItem.initialZoomLevel) {\n\t\t\t\t\t// fade out background if zooming out\n\t\t\t\t\tvar minusDiff = minZoomLevel - zoomLevel;\n\t\t\t\t\tvar percent = 1 - minusDiff / (minZoomLevel / 1.2);\n\n\t\t\t\t\t_applyBgOpacity(percent);\n\t\t\t\t\t_shout('onPinchClose', percent);\n\t\t\t\t\t_opacityChanged = true;\n\t\t\t\t} else {\n\t\t\t\t\tzoomFriction = (minZoomLevel - zoomLevel) / minZoomLevel;\n\t\t\t\t\tif(zoomFriction > 1) {\n\t\t\t\t\t\tzoomFriction = 1;\n\t\t\t\t\t}\n\t\t\t\t\tzoomLevel = minZoomLevel - zoomFriction * (minZoomLevel / 3);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else if ( zoomLevel > maxZoomLevel ) {\n\t\t\t\t// 1.5 - extra zoom level above the max. E.g. if max is x6, real max 6 + 1.5 = 7.5\n\t\t\t\tzoomFriction = (zoomLevel - maxZoomLevel) / ( minZoomLevel * 6 );\n\t\t\t\tif(zoomFriction > 1) {\n\t\t\t\t\tzoomFriction = 1;\n\t\t\t\t}\n\t\t\t\tzoomLevel = maxZoomLevel + zoomFriction * minZoomLevel;\n\t\t\t}\n\n\t\t\tif(zoomFriction < 0) {\n\t\t\t\tzoomFriction = 0;\n\t\t\t}\n\n\t\t\t// distance between touch points after friction is applied\n\t\t\t_currPointsDistance = pointsDistance;\n\n\t\t\t// _centerPoint - The point in the middle of two pointers\n\t\t\t_findCenterOfPoints(p, p2, _centerPoint);\n\t\t\n\t\t\t// paning with two pointers pressed\n\t\t\t_currPanDist.x += _centerPoint.x - _currCenterPoint.x;\n\t\t\t_currPanDist.y += _centerPoint.y - _currCenterPoint.y;\n\t\t\t_equalizePoints(_currCenterPoint, _centerPoint);\n\n\t\t\t_panOffset.x = _calculatePanOffset('x', zoomLevel);\n\t\t\t_panOffset.y = _calculatePanOffset('y', zoomLevel);\n\n\t\t\t_isZoomingIn = zoomLevel > _currZoomLevel;\n\t\t\t_currZoomLevel = zoomLevel;\n\t\t\t_applyCurrentZoomPan();\n\n\t\t} else {\n\n\t\t\t// handle behaviour for one point (dragging or panning)\n\n\t\t\tif(!_direction) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(_isFirstMove) {\n\t\t\t\t_isFirstMove = false;\n\n\t\t\t\t// subtract drag distance that was used during the detection direction \n\n\t\t\t\tif( Math.abs(delta.x) >= DIRECTION_CHECK_OFFSET) {\n\t\t\t\t\tdelta.x -= _currentPoints[0].x - _startPoint.x;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif( Math.abs(delta.y) >= DIRECTION_CHECK_OFFSET) {\n\t\t\t\t\tdelta.y -= _currentPoints[0].y - _startPoint.y;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_currPoint.x = p.x;\n\t\t\t_currPoint.y = p.y;\n\n\t\t\t// do nothing if pointers position hasn't changed\n\t\t\tif(delta.x === 0 && delta.y === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(_direction === 'v' && _options.closeOnVerticalDrag) {\n\t\t\t\tif(!_canPan()) {\n\t\t\t\t\t_currPanDist.y += delta.y;\n\t\t\t\t\t_panOffset.y += delta.y;\n\n\t\t\t\t\tvar opacityRatio = _calculateVerticalDragOpacityRatio();\n\n\t\t\t\t\t_verticalDragInitiated = true;\n\t\t\t\t\t_shout('onVerticalDrag', opacityRatio);\n\n\t\t\t\t\t_applyBgOpacity(opacityRatio);\n\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\treturn ;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_pushPosPoint(_getCurrentTime(), p.x, p.y);\n\n\t\t\t_moved = true;\n\t\t\t_currPanBounds = self.currItem.bounds;\n\t\t\t\n\t\t\tvar mainScrollChanged = _panOrMoveMainScroll('x', delta);\n\t\t\tif(!mainScrollChanged) {\n\t\t\t\t_panOrMoveMainScroll('y', delta);\n\n\t\t\t\t_roundPoint(_panOffset);\n\t\t\t\t_applyCurrentZoomPan();\n\t\t\t}\n\n\t\t}\n\n\t},\n\t\n\t// Pointerup/pointercancel/touchend/touchcancel/mouseup event handler\n\t_onDragRelease = function(e) {\n\n\t\tif(_features.isOldAndroid ) {\n\n\t\t\tif(_oldAndroidTouchEndTimeout && e.type === 'mouseup') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// on Android (v4.1, 4.2, 4.3 & possibly older) \n\t\t\t// ghost mousedown/up event isn't preventable via e.preventDefault,\n\t\t\t// which causes fake mousedown event\n\t\t\t// so we block mousedown/up for 600ms\n\t\t\tif( e.type.indexOf('touch') > -1 ) {\n\t\t\t\tclearTimeout(_oldAndroidTouchEndTimeout);\n\t\t\t\t_oldAndroidTouchEndTimeout = setTimeout(function() {\n\t\t\t\t\t_oldAndroidTouchEndTimeout = 0;\n\t\t\t\t}, 600);\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t\t_shout('pointerUp');\n\n\t\tif(_preventDefaultEventBehaviour(e, false)) {\n\t\t\te.preventDefault();\n\t\t}\n\n\t\tvar releasePoint;\n\n\t\tif(_pointerEventEnabled) {\n\t\t\tvar pointerIndex = framework.arraySearch(_currPointers, e.pointerId, 'id');\n\t\t\t\n\t\t\tif(pointerIndex > -1) {\n\t\t\t\treleasePoint = _currPointers.splice(pointerIndex, 1)[0];\n\n\t\t\t\tif(navigator.msPointerEnabled) {\n\t\t\t\t\tvar MSPOINTER_TYPES = {\n\t\t\t\t\t\t4: 'mouse', // event.MSPOINTER_TYPE_MOUSE\n\t\t\t\t\t\t2: 'touch', // event.MSPOINTER_TYPE_TOUCH \n\t\t\t\t\t\t3: 'pen' // event.MSPOINTER_TYPE_PEN\n\t\t\t\t\t};\n\t\t\t\t\treleasePoint.type = MSPOINTER_TYPES[e.pointerType];\n\n\t\t\t\t\tif(!releasePoint.type) {\n\t\t\t\t\t\treleasePoint.type = e.pointerType || 'mouse';\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treleasePoint.type = e.pointerType || 'mouse';\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t\tvar touchList = _getTouchPoints(e),\n\t\t\tgestureType,\n\t\t\tnumPoints = touchList.length;\n\n\t\tif(e.type === 'mouseup') {\n\t\t\tnumPoints = 0;\n\t\t}\n\n\t\t// Do nothing if there were 3 touch points or more\n\t\tif(numPoints === 2) {\n\t\t\t_currentPoints = null;\n\t\t\treturn true;\n\t\t}\n\n\t\t// if second pointer released\n\t\tif(numPoints === 1) {\n\t\t\t_equalizePoints(_startPoint, touchList[0]);\n\t\t}\t\t\t\t\n\n\n\t\t// pointer hasn't moved, send \"tap release\" point\n\t\tif(numPoints === 0 && !_direction && !_mainScrollAnimating) {\n\t\t\tif(!releasePoint) {\n\t\t\t\tif(e.type === 'mouseup') {\n\t\t\t\t\treleasePoint = {x: e.pageX, y: e.pageY, type:'mouse'};\n\t\t\t\t} else if(e.changedTouches && e.changedTouches[0]) {\n\t\t\t\t\treleasePoint = {x: e.changedTouches[0].pageX, y: e.changedTouches[0].pageY, type:'touch'};\n\t\t\t\t}\t\t\n\t\t\t}\n\n\t\t\t_shout('touchRelease', e, releasePoint);\n\t\t}\n\n\t\t// Difference in time between releasing of two last touch points (zoom gesture)\n\t\tvar releaseTimeDiff = -1;\n\n\t\t// Gesture completed, no pointers left\n\t\tif(numPoints === 0) {\n\t\t\t_isDragging = false;\n\t\t\tframework.unbind(window, _upMoveEvents, self);\n\n\t\t\t_stopDragUpdateLoop();\n\n\t\t\tif(_isZooming) {\n\t\t\t\t// Two points released at the same time\n\t\t\t\treleaseTimeDiff = 0;\n\t\t\t} else if(_lastReleaseTime !== -1) {\n\t\t\t\treleaseTimeDiff = _getCurrentTime() - _lastReleaseTime;\n\t\t\t}\n\t\t}\n\t\t_lastReleaseTime = numPoints === 1 ? _getCurrentTime() : -1;\n\t\t\n\t\tif(releaseTimeDiff !== -1 && releaseTimeDiff < 150) {\n\t\t\tgestureType = 'zoom';\n\t\t} else {\n\t\t\tgestureType = 'swipe';\n\t\t}\n\n\t\tif(_isZooming && numPoints < 2) {\n\t\t\t_isZooming = false;\n\n\t\t\t// Only second point released\n\t\t\tif(numPoints === 1) {\n\t\t\t\tgestureType = 'zoomPointerUp';\n\t\t\t}\n\t\t\t_shout('zoomGestureEnded');\n\t\t}\n\n\t\t_currentPoints = null;\n\t\tif(!_moved && !_zoomStarted && !_mainScrollAnimating && !_verticalDragInitiated) {\n\t\t\t// nothing to animate\n\t\t\treturn;\n\t\t}\n\t\n\t\t_stopAllAnimations();\n\n\t\t\n\t\tif(!_releaseAnimData) {\n\t\t\t_releaseAnimData = _initDragReleaseAnimationData();\n\t\t}\n\t\t\n\t\t_releaseAnimData.calculateSwipeSpeed('x');\n\n\n\t\tif(_verticalDragInitiated) {\n\n\t\t\tvar opacityRatio = _calculateVerticalDragOpacityRatio();\n\n\t\t\tif(opacityRatio < _options.verticalDragRange) {\n\t\t\t\tself.close();\n\t\t\t} else {\n\t\t\t\tvar initalPanY = _panOffset.y,\n\t\t\t\t\tinitialBgOpacity = _bgOpacity;\n\n\t\t\t\t_animateProp('verticalDrag', 0, 1, 300, framework.easing.cubic.out, function(now) {\n\t\t\t\t\t\n\t\t\t\t\t_panOffset.y = (self.currItem.initialPosition.y - initalPanY) * now + initalPanY;\n\n\t\t\t\t\t_applyBgOpacity( (1 - initialBgOpacity) * now + initialBgOpacity );\n\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t});\n\n\t\t\t\t_shout('onVerticalDrag', 1);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\n\t\t// main scroll \n\t\tif( (_mainScrollShifted || _mainScrollAnimating) && numPoints === 0) {\n\t\t\tvar itemChanged = _finishSwipeMainScrollGesture(gestureType, _releaseAnimData);\n\t\t\tif(itemChanged) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgestureType = 'zoomPointerUp';\n\t\t}\n\n\t\t// prevent zoom/pan animation when main scroll animation runs\n\t\tif(_mainScrollAnimating) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// Complete simple zoom gesture (reset zoom level if it's out of the bounds) \n\t\tif(gestureType !== 'swipe') {\n\t\t\t_completeZoomGesture();\n\t\t\treturn;\n\t\t}\n\t\n\t\t// Complete pan gesture if main scroll is not shifted, and it's possible to pan current image\n\t\tif(!_mainScrollShifted && _currZoomLevel > self.currItem.fitRatio) {\n\t\t\t_completePanGesture(_releaseAnimData);\n\t\t}\n\t},\n\n\n\t// Returns object with data about gesture\n\t// It's created only once and then reused\n\t_initDragReleaseAnimationData = function() {\n\t\t// temp local vars\n\t\tvar lastFlickDuration,\n\t\t\ttempReleasePos;\n\n\t\t// s = this\n\t\tvar s = {\n\t\t\tlastFlickOffset: {},\n\t\t\tlastFlickDist: {},\n\t\t\tlastFlickSpeed: {},\n\t\t\tslowDownRatio: {},\n\t\t\tslowDownRatioReverse: {},\n\t\t\tspeedDecelerationRatio: {},\n\t\t\tspeedDecelerationRatioAbs: {},\n\t\t\tdistanceOffset: {},\n\t\t\tbackAnimDestination: {},\n\t\t\tbackAnimStarted: {},\n\t\t\tcalculateSwipeSpeed: function(axis) {\n\t\t\t\t\n\n\t\t\t\tif( _posPoints.length > 1) {\n\t\t\t\t\tlastFlickDuration = _getCurrentTime() - _gestureCheckSpeedTime + 50;\n\t\t\t\t\ttempReleasePos = _posPoints[_posPoints.length-2][axis];\n\t\t\t\t} else {\n\t\t\t\t\tlastFlickDuration = _getCurrentTime() - _gestureStartTime; // total gesture duration\n\t\t\t\t\ttempReleasePos = _startPoint[axis];\n\t\t\t\t}\n\t\t\t\ts.lastFlickOffset[axis] = _currPoint[axis] - tempReleasePos;\n\t\t\t\ts.lastFlickDist[axis] = Math.abs(s.lastFlickOffset[axis]);\n\t\t\t\tif(s.lastFlickDist[axis] > 20) {\n\t\t\t\t\ts.lastFlickSpeed[axis] = s.lastFlickOffset[axis] / lastFlickDuration;\n\t\t\t\t} else {\n\t\t\t\t\ts.lastFlickSpeed[axis] = 0;\n\t\t\t\t}\n\t\t\t\tif( Math.abs(s.lastFlickSpeed[axis]) < 0.1 ) {\n\t\t\t\t\ts.lastFlickSpeed[axis] = 0;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\ts.slowDownRatio[axis] = 0.95;\n\t\t\t\ts.slowDownRatioReverse[axis] = 1 - s.slowDownRatio[axis];\n\t\t\t\ts.speedDecelerationRatio[axis] = 1;\n\t\t\t},\n\n\t\t\tcalculateOverBoundsAnimOffset: function(axis, speed) {\n\t\t\t\tif(!s.backAnimStarted[axis]) {\n\n\t\t\t\t\tif(_panOffset[axis] > _currPanBounds.min[axis]) {\n\t\t\t\t\t\ts.backAnimDestination[axis] = _currPanBounds.min[axis];\n\t\t\t\t\t\t\n\t\t\t\t\t} else if(_panOffset[axis] < _currPanBounds.max[axis]) {\n\t\t\t\t\t\ts.backAnimDestination[axis] = _currPanBounds.max[axis];\n\t\t\t\t\t}\n\n\t\t\t\t\tif(s.backAnimDestination[axis] !== undefined) {\n\t\t\t\t\t\ts.slowDownRatio[axis] = 0.7;\n\t\t\t\t\t\ts.slowDownRatioReverse[axis] = 1 - s.slowDownRatio[axis];\n\t\t\t\t\t\tif(s.speedDecelerationRatioAbs[axis] < 0.05) {\n\n\t\t\t\t\t\t\ts.lastFlickSpeed[axis] = 0;\n\t\t\t\t\t\t\ts.backAnimStarted[axis] = true;\n\n\t\t\t\t\t\t\t_animateProp('bounceZoomPan'+axis,_panOffset[axis], \n\t\t\t\t\t\t\t\ts.backAnimDestination[axis], \n\t\t\t\t\t\t\t\tspeed || 300, \n\t\t\t\t\t\t\t\tframework.easing.sine.out, \n\t\t\t\t\t\t\t\tfunction(pos) {\n\t\t\t\t\t\t\t\t\t_panOffset[axis] = pos;\n\t\t\t\t\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Reduces the speed by slowDownRatio (per 10ms)\n\t\t\tcalculateAnimOffset: function(axis) {\n\t\t\t\tif(!s.backAnimStarted[axis]) {\n\t\t\t\t\ts.speedDecelerationRatio[axis] = s.speedDecelerationRatio[axis] * (s.slowDownRatio[axis] + \n\t\t\t\t\t\t\t\t\t\t\t\ts.slowDownRatioReverse[axis] - \n\t\t\t\t\t\t\t\t\t\t\t\ts.slowDownRatioReverse[axis] * s.timeDiff / 10);\n\n\t\t\t\t\ts.speedDecelerationRatioAbs[axis] = Math.abs(s.lastFlickSpeed[axis] * s.speedDecelerationRatio[axis]);\n\t\t\t\t\ts.distanceOffset[axis] = s.lastFlickSpeed[axis] * s.speedDecelerationRatio[axis] * s.timeDiff;\n\t\t\t\t\t_panOffset[axis] += s.distanceOffset[axis];\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tpanAnimLoop: function() {\n\t\t\t\tif ( _animations.zoomPan ) {\n\t\t\t\t\t_animations.zoomPan.raf = _requestAF(s.panAnimLoop);\n\n\t\t\t\t\ts.now = _getCurrentTime();\n\t\t\t\t\ts.timeDiff = s.now - s.lastNow;\n\t\t\t\t\ts.lastNow = s.now;\n\t\t\t\t\t\n\t\t\t\t\ts.calculateAnimOffset('x');\n\t\t\t\t\ts.calculateAnimOffset('y');\n\n\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\t\n\t\t\t\t\ts.calculateOverBoundsAnimOffset('x');\n\t\t\t\t\ts.calculateOverBoundsAnimOffset('y');\n\n\n\t\t\t\t\tif (s.speedDecelerationRatioAbs.x < 0.05 && s.speedDecelerationRatioAbs.y < 0.05) {\n\n\t\t\t\t\t\t// round pan position\n\t\t\t\t\t\t_panOffset.x = Math.round(_panOffset.x);\n\t\t\t\t\t\t_panOffset.y = Math.round(_panOffset.y);\n\t\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\t\t\n\t\t\t\t\t\t_stopAnimation('zoomPan');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t};\n\t\treturn s;\n\t},\n\n\t_completePanGesture = function(animData) {\n\t\t// calculate swipe speed for Y axis (paanning)\n\t\tanimData.calculateSwipeSpeed('y');\n\n\t\t_currPanBounds = self.currItem.bounds;\n\t\t\n\t\tanimData.backAnimDestination = {};\n\t\tanimData.backAnimStarted = {};\n\n\t\t// Avoid acceleration animation if speed is too low\n\t\tif(Math.abs(animData.lastFlickSpeed.x) <= 0.05 && Math.abs(animData.lastFlickSpeed.y) <= 0.05 ) {\n\t\t\tanimData.speedDecelerationRatioAbs.x = animData.speedDecelerationRatioAbs.y = 0;\n\n\t\t\t// Run pan drag release animation. E.g. if you drag image and release finger without momentum.\n\t\t\tanimData.calculateOverBoundsAnimOffset('x');\n\t\t\tanimData.calculateOverBoundsAnimOffset('y');\n\t\t\treturn true;\n\t\t}\n\n\t\t// Animation loop that controls the acceleration after pan gesture ends\n\t\t_registerStartAnimation('zoomPan');\n\t\tanimData.lastNow = _getCurrentTime();\n\t\tanimData.panAnimLoop();\n\t},\n\n\n\t_finishSwipeMainScrollGesture = function(gestureType, _releaseAnimData) {\n\t\tvar itemChanged;\n\t\tif(!_mainScrollAnimating) {\n\t\t\t_currZoomedItemIndex = _currentItemIndex;\n\t\t}\n\n\n\t\t\n\t\tvar itemsDiff;\n\n\t\tif(gestureType === 'swipe') {\n\t\t\tvar totalShiftDist = _currPoint.x - _startPoint.x,\n\t\t\t\tisFastLastFlick = _releaseAnimData.lastFlickDist.x < 10;\n\n\t\t\t// if container is shifted for more than MIN_SWIPE_DISTANCE, \n\t\t\t// and last flick gesture was in right direction\n\t\t\tif(totalShiftDist > MIN_SWIPE_DISTANCE && \n\t\t\t\t(isFastLastFlick || _releaseAnimData.lastFlickOffset.x > 20) ) {\n\t\t\t\t// go to prev item\n\t\t\t\titemsDiff = -1;\n\t\t\t} else if(totalShiftDist < -MIN_SWIPE_DISTANCE && \n\t\t\t\t(isFastLastFlick || _releaseAnimData.lastFlickOffset.x < -20) ) {\n\t\t\t\t// go to next item\n\t\t\t\titemsDiff = 1;\n\t\t\t}\n\t\t}\n\n\t\tvar nextCircle;\n\n\t\tif(itemsDiff) {\n\t\t\t\n\t\t\t_currentItemIndex += itemsDiff;\n\n\t\t\tif(_currentItemIndex < 0) {\n\t\t\t\t_currentItemIndex = _options.loop ? _getNumItems()-1 : 0;\n\t\t\t\tnextCircle = true;\n\t\t\t} else if(_currentItemIndex >= _getNumItems()) {\n\t\t\t\t_currentItemIndex = _options.loop ? 0 : _getNumItems()-1;\n\t\t\t\tnextCircle = true;\n\t\t\t}\n\n\t\t\tif(!nextCircle || _options.loop) {\n\t\t\t\t_indexDiff += itemsDiff;\n\t\t\t\t_currPositionIndex -= itemsDiff;\n\t\t\t\titemChanged = true;\n\t\t\t}\n\t\t\t\n\n\t\t\t\n\t\t}\n\n\t\tvar animateToX = _slideSize.x * _currPositionIndex;\n\t\tvar animateToDist = Math.abs( animateToX - _mainScrollPos.x );\n\t\tvar finishAnimDuration;\n\n\n\t\tif(!itemChanged && animateToX > _mainScrollPos.x !== _releaseAnimData.lastFlickSpeed.x > 0) {\n\t\t\t// \"return to current\" duration, e.g. when dragging from slide 0 to -1\n\t\t\tfinishAnimDuration = 333; \n\t\t} else {\n\t\t\tfinishAnimDuration = Math.abs(_releaseAnimData.lastFlickSpeed.x) > 0 ? \n\t\t\t\t\t\t\t\t\tanimateToDist / Math.abs(_releaseAnimData.lastFlickSpeed.x) : \n\t\t\t\t\t\t\t\t\t333;\n\n\t\t\tfinishAnimDuration = Math.min(finishAnimDuration, 400);\n\t\t\tfinishAnimDuration = Math.max(finishAnimDuration, 250);\n\t\t}\n\n\t\tif(_currZoomedItemIndex === _currentItemIndex) {\n\t\t\titemChanged = false;\n\t\t}\n\t\t\n\t\t_mainScrollAnimating = true;\n\t\t\n\t\t_shout('mainScrollAnimStart');\n\n\t\t_animateProp('mainScroll', _mainScrollPos.x, animateToX, finishAnimDuration, framework.easing.cubic.out, \n\t\t\t_moveMainScroll,\n\t\t\tfunction() {\n\t\t\t\t_stopAllAnimations();\n\t\t\t\t_mainScrollAnimating = false;\n\t\t\t\t_currZoomedItemIndex = -1;\n\t\t\t\t\n\t\t\t\tif(itemChanged || _currZoomedItemIndex !== _currentItemIndex) {\n\t\t\t\t\tself.updateCurrItem();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t_shout('mainScrollAnimComplete');\n\t\t\t}\n\t\t);\n\n\t\tif(itemChanged) {\n\t\t\tself.updateCurrItem(true);\n\t\t}\n\n\t\treturn itemChanged;\n\t},\n\n\t_calculateZoomLevel = function(touchesDistance) {\n\t\treturn 1 / _startPointsDistance * touchesDistance * _startZoomLevel;\n\t},\n\n\t// Resets zoom if it's out of bounds\n\t_completeZoomGesture = function() {\n\t\tvar destZoomLevel = _currZoomLevel,\n\t\t\tminZoomLevel = _getMinZoomLevel(),\n\t\t\tmaxZoomLevel = _getMaxZoomLevel();\n\n\t\tif ( _currZoomLevel < minZoomLevel ) {\n\t\t\tdestZoomLevel = minZoomLevel;\n\t\t} else if ( _currZoomLevel > maxZoomLevel ) {\n\t\t\tdestZoomLevel = maxZoomLevel;\n\t\t}\n\n\t\tvar destOpacity = 1,\n\t\t\tonUpdate,\n\t\t\tinitialOpacity = _bgOpacity;\n\n\t\tif(_opacityChanged && !_isZoomingIn && !_wasOverInitialZoom && _currZoomLevel < minZoomLevel) {\n\t\t\t//_closedByScroll = true;\n\t\t\tself.close();\n\t\t\treturn true;\n\t\t}\n\n\t\tif(_opacityChanged) {\n\t\t\tonUpdate = function(now) {\n\t\t\t\t_applyBgOpacity( (destOpacity - initialOpacity) * now + initialOpacity );\n\t\t\t};\n\t\t}\n\n\t\tself.zoomTo(destZoomLevel, 0, 200, framework.easing.cubic.out, onUpdate);\n\t\treturn true;\n\t};\n\n\n_registerModule('Gestures', {\n\tpublicMethods: {\n\n\t\tinitGestures: function() {\n\n\t\t\t// helper function that builds touch/pointer/mouse events\n\t\t\tvar addEventNames = function(pref, down, move, up, cancel) {\n\t\t\t\t_dragStartEvent = pref + down;\n\t\t\t\t_dragMoveEvent = pref + move;\n\t\t\t\t_dragEndEvent = pref + up;\n\t\t\t\tif(cancel) {\n\t\t\t\t\t_dragCancelEvent = pref + cancel;\n\t\t\t\t} else {\n\t\t\t\t\t_dragCancelEvent = '';\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t_pointerEventEnabled = _features.pointerEvent;\n\t\t\tif(_pointerEventEnabled && _features.touch) {\n\t\t\t\t// we don't need touch events, if browser supports pointer events\n\t\t\t\t_features.touch = false;\n\t\t\t}\n\n\t\t\tif(_pointerEventEnabled) {\n\t\t\t\tif(navigator.msPointerEnabled) {\n\t\t\t\t\t// IE10 pointer events are case-sensitive\n\t\t\t\t\taddEventNames('MSPointer', 'Down', 'Move', 'Up', 'Cancel');\n\t\t\t\t} else {\n\t\t\t\t\taddEventNames('pointer', 'down', 'move', 'up', 'cancel');\n\t\t\t\t}\n\t\t\t} else if(_features.touch) {\n\t\t\t\taddEventNames('touch', 'start', 'move', 'end', 'cancel');\n\t\t\t\t_likelyTouchDevice = true;\n\t\t\t} else {\n\t\t\t\taddEventNames('mouse', 'down', 'move', 'up');\t\n\t\t\t}\n\n\t\t\t_upMoveEvents = _dragMoveEvent + ' ' + _dragEndEvent + ' ' + _dragCancelEvent;\n\t\t\t_downEvents = _dragStartEvent;\n\n\t\t\tif(_pointerEventEnabled && !_likelyTouchDevice) {\n\t\t\t\t_likelyTouchDevice = (navigator.maxTouchPoints > 1) || (navigator.msMaxTouchPoints > 1);\n\t\t\t}\n\t\t\t// make variable public\n\t\t\tself.likelyTouchDevice = _likelyTouchDevice; \n\t\t\t\n\t\t\t_globalEventHandlers[_dragStartEvent] = _onDragStart;\n\t\t\t_globalEventHandlers[_dragMoveEvent] = _onDragMove;\n\t\t\t_globalEventHandlers[_dragEndEvent] = _onDragRelease; // the Kraken\n\n\t\t\tif(_dragCancelEvent) {\n\t\t\t\t_globalEventHandlers[_dragCancelEvent] = _globalEventHandlers[_dragEndEvent];\n\t\t\t}\n\n\t\t\t// Bind mouse events on device with detected hardware touch support, in case it supports multiple types of input.\n\t\t\tif(_features.touch) {\n\t\t\t\t_downEvents += ' mousedown';\n\t\t\t\t_upMoveEvents += ' mousemove mouseup';\n\t\t\t\t_globalEventHandlers.mousedown = _globalEventHandlers[_dragStartEvent];\n\t\t\t\t_globalEventHandlers.mousemove = _globalEventHandlers[_dragMoveEvent];\n\t\t\t\t_globalEventHandlers.mouseup = _globalEventHandlers[_dragEndEvent];\n\t\t\t}\n\n\t\t\tif(!_likelyTouchDevice) {\n\t\t\t\t// don't allow pan to next slide from zoomed state on Desktop\n\t\t\t\t_options.allowPanToNext = false;\n\t\t\t}\n\t\t}\n\n\t}\n});\n\n\n/*>>gestures*/\n\n/*>>show-hide-transition*/\n/**\n * show-hide-transition.js:\n *\n * Manages initial opening or closing transition.\n *\n * If you're not planning to use transition for gallery at all,\n * you may set options hideAnimationDuration and showAnimationDuration to 0,\n * and just delete startAnimation function.\n * \n */\n\n\nvar _showOrHideTimeout,\n\t_showOrHide = function(item, img, out, completeFn) {\n\n\t\tif(_showOrHideTimeout) {\n\t\t\tclearTimeout(_showOrHideTimeout);\n\t\t}\n\n\t\t_initialZoomRunning = true;\n\t\t_initialContentSet = true;\n\t\t\n\t\t// dimensions of small thumbnail {x:,y:,w:}.\n\t\t// Height is optional, as calculated based on large image.\n\t\tvar thumbBounds; \n\t\tif(item.initialLayout) {\n\t\t\tthumbBounds = item.initialLayout;\n\t\t\titem.initialLayout = null;\n\t\t} else {\n\t\t\tthumbBounds = _options.getThumbBoundsFn && _options.getThumbBoundsFn(_currentItemIndex);\n\t\t}\n\n\t\tvar duration = out ? _options.hideAnimationDuration : _options.showAnimationDuration;\n\n\t\tvar onComplete = function() {\n\t\t\t_stopAnimation('initialZoom');\n\t\t\tif(!out) {\n\t\t\t\t_applyBgOpacity(1);\n\t\t\t\tif(img) {\n\t\t\t\t\timg.style.display = 'block';\n\t\t\t\t}\n\t\t\t\tframework.addClass(template, 'pswp--animated-in');\n\t\t\t\t_shout('initialZoom' + (out ? 'OutEnd' : 'InEnd'));\n\t\t\t} else {\n\t\t\t\tself.template.removeAttribute('style');\n\t\t\t\tself.bg.removeAttribute('style');\n\t\t\t}\n\n\t\t\tif(completeFn) {\n\t\t\t\tcompleteFn();\n\t\t\t}\n\t\t\t_initialZoomRunning = false;\n\t\t};\n\n\t\t// if bounds aren't provided, just open gallery without animation\n\t\tif(!duration || !thumbBounds || thumbBounds.x === undefined) {\n\n\t\t\t_shout('initialZoom' + (out ? 'Out' : 'In') );\n\n\t\t\t_currZoomLevel = item.initialZoomLevel;\n\t\t\t_equalizePoints(_panOffset, item.initialPosition );\n\t\t\t_applyCurrentZoomPan();\n\n\t\t\ttemplate.style.opacity = out ? 0 : 1;\n\t\t\t_applyBgOpacity(1);\n\n\t\t\tif(duration) {\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tonComplete();\n\t\t\t\t}, duration);\n\t\t\t} else {\n\t\t\t\tonComplete();\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvar startAnimation = function() {\n\t\t\tvar closeWithRaf = _closedByScroll,\n\t\t\t\tfadeEverything = !self.currItem.src || self.currItem.loadError || _options.showHideOpacity;\n\t\t\t\n\t\t\t// apply hw-acceleration to image\n\t\t\tif(item.miniImg) {\n\t\t\t\titem.miniImg.style.webkitBackfaceVisibility = 'hidden';\n\t\t\t}\n\n\t\t\tif(!out) {\n\t\t\t\t_currZoomLevel = thumbBounds.w / item.w;\n\t\t\t\t_panOffset.x = thumbBounds.x;\n\t\t\t\t_panOffset.y = thumbBounds.y - _initalWindowScrollY;\n\n\t\t\t\tself[fadeEverything ? 'template' : 'bg'].style.opacity = 0.001;\n\t\t\t\t_applyCurrentZoomPan();\n\t\t\t}\n\n\t\t\t_registerStartAnimation('initialZoom');\n\t\t\t\n\t\t\tif(out && !closeWithRaf) {\n\t\t\t\tframework.removeClass(template, 'pswp--animated-in');\n\t\t\t}\n\n\t\t\tif(fadeEverything) {\n\t\t\t\tif(out) {\n\t\t\t\t\tframework[ (closeWithRaf ? 'remove' : 'add') + 'Class' ](template, 'pswp--animate_opacity');\n\t\t\t\t} else {\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tframework.addClass(template, 'pswp--animate_opacity');\n\t\t\t\t\t}, 30);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_showOrHideTimeout = setTimeout(function() {\n\n\t\t\t\t_shout('initialZoom' + (out ? 'Out' : 'In') );\n\t\t\t\t\n\n\t\t\t\tif(!out) {\n\n\t\t\t\t\t// \"in\" animation always uses CSS transitions (instead of rAF).\n\t\t\t\t\t// CSS transition work faster here, \n\t\t\t\t\t// as developer may also want to animate other things, \n\t\t\t\t\t// like ui on top of sliding area, which can be animated just via CSS\n\t\t\t\t\t\n\t\t\t\t\t_currZoomLevel = item.initialZoomLevel;\n\t\t\t\t\t_equalizePoints(_panOffset, item.initialPosition );\n\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\t_applyBgOpacity(1);\n\n\t\t\t\t\tif(fadeEverything) {\n\t\t\t\t\t\ttemplate.style.opacity = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_applyBgOpacity(1);\n\t\t\t\t\t}\n\n\t\t\t\t\t_showOrHideTimeout = setTimeout(onComplete, duration + 20);\n\t\t\t\t} else {\n\n\t\t\t\t\t// \"out\" animation uses rAF only when PhotoSwipe is closed by browser scroll, to recalculate position\n\t\t\t\t\tvar destZoomLevel = thumbBounds.w / item.w,\n\t\t\t\t\t\tinitialPanOffset = {\n\t\t\t\t\t\t\tx: _panOffset.x,\n\t\t\t\t\t\t\ty: _panOffset.y\n\t\t\t\t\t\t},\n\t\t\t\t\t\tinitialZoomLevel = _currZoomLevel,\n\t\t\t\t\t\tinitalBgOpacity = _bgOpacity,\n\t\t\t\t\t\tonUpdate = function(now) {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(now === 1) {\n\t\t\t\t\t\t\t\t_currZoomLevel = destZoomLevel;\n\t\t\t\t\t\t\t\t_panOffset.x = thumbBounds.x;\n\t\t\t\t\t\t\t\t_panOffset.y = thumbBounds.y - _currentWindowScrollY;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_currZoomLevel = (destZoomLevel - initialZoomLevel) * now + initialZoomLevel;\n\t\t\t\t\t\t\t\t_panOffset.x = (thumbBounds.x - initialPanOffset.x) * now + initialPanOffset.x;\n\t\t\t\t\t\t\t\t_panOffset.y = (thumbBounds.y - _currentWindowScrollY - initialPanOffset.y) * now + initialPanOffset.y;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\t\t\tif(fadeEverything) {\n\t\t\t\t\t\t\t\ttemplate.style.opacity = 1 - now;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_applyBgOpacity( initalBgOpacity - now * initalBgOpacity );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\tif(closeWithRaf) {\n\t\t\t\t\t\t_animateProp('initialZoom', 0, 1, duration, framework.easing.cubic.out, onUpdate, onComplete);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tonUpdate(1);\n\t\t\t\t\t\t_showOrHideTimeout = setTimeout(onComplete, duration + 20);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t}, out ? 25 : 90); // Main purpose of this delay is to give browser time to paint and\n\t\t\t\t\t// create composite layers of PhotoSwipe UI parts (background, controls, caption, arrows).\n\t\t\t\t\t// Which avoids lag at the beginning of scale transition.\n\t\t};\n\t\tstartAnimation();\n\n\t\t\n\t};\n\n/*>>show-hide-transition*/\n\n/*>>items-controller*/\n/**\n*\n* Controller manages gallery items, their dimensions, and their content.\n* \n*/\n\nvar _items,\n\t_tempPanAreaSize = {},\n\t_imagesToAppendPool = [],\n\t_initialContentSet,\n\t_initialZoomRunning,\n\t_controllerDefaultOptions = {\n\t\tindex: 0,\n\t\terrorMsg: '
      The image could not be loaded.
      ',\n\t\tforceProgressiveLoading: false, // TODO\n\t\tpreload: [1,1],\n\t\tgetNumItemsFn: function() {\n\t\t\treturn _items.length;\n\t\t}\n\t};\n\n\nvar _getItemAt,\n\t_getNumItems,\n\t_initialIsLoop,\n\t_getZeroBounds = function() {\n\t\treturn {\n\t\t\tcenter:{x:0,y:0}, \n\t\t\tmax:{x:0,y:0}, \n\t\t\tmin:{x:0,y:0}\n\t\t};\n\t},\n\t_calculateSingleItemPanBounds = function(item, realPanElementW, realPanElementH ) {\n\t\tvar bounds = item.bounds;\n\n\t\t// position of element when it's centered\n\t\tbounds.center.x = Math.round((_tempPanAreaSize.x - realPanElementW) / 2);\n\t\tbounds.center.y = Math.round((_tempPanAreaSize.y - realPanElementH) / 2) + item.vGap.top;\n\n\t\t// maximum pan position\n\t\tbounds.max.x = (realPanElementW > _tempPanAreaSize.x) ? \n\t\t\t\t\t\t\tMath.round(_tempPanAreaSize.x - realPanElementW) : \n\t\t\t\t\t\t\tbounds.center.x;\n\t\t\n\t\tbounds.max.y = (realPanElementH > _tempPanAreaSize.y) ? \n\t\t\t\t\t\t\tMath.round(_tempPanAreaSize.y - realPanElementH) + item.vGap.top : \n\t\t\t\t\t\t\tbounds.center.y;\n\t\t\n\t\t// minimum pan position\n\t\tbounds.min.x = (realPanElementW > _tempPanAreaSize.x) ? 0 : bounds.center.x;\n\t\tbounds.min.y = (realPanElementH > _tempPanAreaSize.y) ? item.vGap.top : bounds.center.y;\n\t},\n\t_calculateItemSize = function(item, viewportSize, zoomLevel) {\n\n\t\tif (item.src && !item.loadError) {\n\t\t\tvar isInitial = !zoomLevel;\n\t\t\t\n\t\t\tif(isInitial) {\n\t\t\t\tif(!item.vGap) {\n\t\t\t\t\titem.vGap = {top:0,bottom:0};\n\t\t\t\t}\n\t\t\t\t// allows overriding vertical margin for individual items\n\t\t\t\t_shout('parseVerticalMargin', item);\n\t\t\t}\n\n\n\t\t\t_tempPanAreaSize.x = viewportSize.x;\n\t\t\t_tempPanAreaSize.y = viewportSize.y - item.vGap.top - item.vGap.bottom;\n\n\t\t\tif (isInitial) {\n\t\t\t\tvar hRatio = _tempPanAreaSize.x / item.w;\n\t\t\t\tvar vRatio = _tempPanAreaSize.y / item.h;\n\n\t\t\t\titem.fitRatio = hRatio < vRatio ? hRatio : vRatio;\n\t\t\t\t//item.fillRatio = hRatio > vRatio ? hRatio : vRatio;\n\n\t\t\t\tvar scaleMode = _options.scaleMode;\n\n\t\t\t\tif (scaleMode === 'orig') {\n\t\t\t\t\tzoomLevel = 1;\n\t\t\t\t} else if (scaleMode === 'fit') {\n\t\t\t\t\tzoomLevel = item.fitRatio;\n\t\t\t\t}\n\n\t\t\t\tif (zoomLevel > 1) {\n\t\t\t\t\tzoomLevel = 1;\n\t\t\t\t}\n\n\t\t\t\titem.initialZoomLevel = zoomLevel;\n\t\t\t\t\n\t\t\t\tif(!item.bounds) {\n\t\t\t\t\t// reuse bounds object\n\t\t\t\t\titem.bounds = _getZeroBounds(); \n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!zoomLevel) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_calculateSingleItemPanBounds(item, item.w * zoomLevel, item.h * zoomLevel);\n\n\t\t\tif (isInitial && zoomLevel === item.initialZoomLevel) {\n\t\t\t\titem.initialPosition = item.bounds.center;\n\t\t\t}\n\n\t\t\treturn item.bounds;\n\t\t} else {\n\t\t\titem.w = item.h = 0;\n\t\t\titem.initialZoomLevel = item.fitRatio = 1;\n\t\t\titem.bounds = _getZeroBounds();\n\t\t\titem.initialPosition = item.bounds.center;\n\n\t\t\t// if it's not image, we return zero bounds (content is not zoomable)\n\t\t\treturn item.bounds;\n\t\t}\n\t\t\n\t},\n\n\t\n\n\n\t_appendImage = function(index, item, baseDiv, img, preventAnimation, keepPlaceholder) {\n\t\t\n\n\t\tif(item.loadError) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(img) {\n\n\t\t\titem.imageAppended = true;\n\t\t\t_setImageSize(item, img, (item === self.currItem && _renderMaxResolution) );\n\t\t\t\n\t\t\tbaseDiv.appendChild(img);\n\n\t\t\tif(keepPlaceholder) {\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tif(item && item.loaded && item.placeholder) {\n\t\t\t\t\t\titem.placeholder.style.display = 'none';\n\t\t\t\t\t\titem.placeholder = null;\n\t\t\t\t\t}\n\t\t\t\t}, 500);\n\t\t\t}\n\t\t}\n\t},\n\t\n\n\n\t_preloadImage = function(item) {\n\t\titem.loading = true;\n\t\titem.loaded = false;\n\t\tvar img = item.img = framework.createEl('pswp__img', 'img');\n\t\tvar onComplete = function() {\n\t\t\titem.loading = false;\n\t\t\titem.loaded = true;\n\n\t\t\tif(item.loadComplete) {\n\t\t\t\titem.loadComplete(item);\n\t\t\t} else {\n\t\t\t\titem.img = null; // no need to store image object\n\t\t\t}\n\t\t\timg.onload = img.onerror = null;\n\t\t\timg = null;\n\t\t};\n\t\timg.onload = onComplete;\n\t\timg.onerror = function() {\n\t\t\titem.loadError = true;\n\t\t\tonComplete();\n\t\t};\t\t\n\n\t\timg.src = item.src;// + '?a=' + Math.random();\n\n\t\treturn img;\n\t},\n\t_checkForError = function(item, cleanUp) {\n\t\tif(item.src && item.loadError && item.container) {\n\n\t\t\tif(cleanUp) {\n\t\t\t\titem.container.innerHTML = '';\n\t\t\t}\n\n\t\t\titem.container.innerHTML = _options.errorMsg.replace('%url%', item.src );\n\t\t\treturn true;\n\t\t\t\n\t\t}\n\t},\n\t_setImageSize = function(item, img, maxRes) {\n\t\tif(!item.src) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(!img) {\n\t\t\timg = item.container.lastChild;\n\t\t}\n\n\t\tvar w = maxRes ? item.w : Math.round(item.w * item.fitRatio),\n\t\t\th = maxRes ? item.h : Math.round(item.h * item.fitRatio);\n\t\t\n\t\tif(item.placeholder && !item.loaded) {\n\t\t\titem.placeholder.style.width = w + 'px';\n\t\t\titem.placeholder.style.height = h + 'px';\n\t\t}\n\n\t\timg.style.width = w + 'px';\n\t\timg.style.height = h + 'px';\n\t},\n\t_appendImagesPool = function() {\n\n\t\tif(_imagesToAppendPool.length) {\n\t\t\tvar poolItem;\n\n\t\t\tfor(var i = 0; i < _imagesToAppendPool.length; i++) {\n\t\t\t\tpoolItem = _imagesToAppendPool[i];\n\t\t\t\tif( poolItem.holder.index === poolItem.index ) {\n\t\t\t\t\t_appendImage(poolItem.index, poolItem.item, poolItem.baseDiv, poolItem.img, false, poolItem.clearPlaceholder);\n\t\t\t\t}\n\t\t\t}\n\t\t\t_imagesToAppendPool = [];\n\t\t}\n\t};\n\t\n\n\n_registerModule('Controller', {\n\n\tpublicMethods: {\n\n\t\tlazyLoadItem: function(index) {\n\t\t\tindex = _getLoopedId(index);\n\t\t\tvar item = _getItemAt(index);\n\n\t\t\tif(!item || ((item.loaded || item.loading) && !_itemsNeedUpdate)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_shout('gettingData', index, item);\n\n\t\t\tif (!item.src) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_preloadImage(item);\n\t\t},\n\t\tinitController: function() {\n\t\t\tframework.extend(_options, _controllerDefaultOptions, true);\n\t\t\tself.items = _items = items;\n\t\t\t_getItemAt = self.getItemAt;\n\t\t\t_getNumItems = _options.getNumItemsFn; //self.getNumItems;\n\n\n\n\t\t\t_initialIsLoop = _options.loop;\n\t\t\tif(_getNumItems() < 3) {\n\t\t\t\t_options.loop = false; // disable loop if less then 3 items\n\t\t\t}\n\n\t\t\t_listen('beforeChange', function(diff) {\n\n\t\t\t\tvar p = _options.preload,\n\t\t\t\t\tisNext = diff === null ? true : (diff >= 0),\n\t\t\t\t\tpreloadBefore = Math.min(p[0], _getNumItems() ),\n\t\t\t\t\tpreloadAfter = Math.min(p[1], _getNumItems() ),\n\t\t\t\t\ti;\n\n\n\t\t\t\tfor(i = 1; i <= (isNext ? preloadAfter : preloadBefore); i++) {\n\t\t\t\t\tself.lazyLoadItem(_currentItemIndex+i);\n\t\t\t\t}\n\t\t\t\tfor(i = 1; i <= (isNext ? preloadBefore : preloadAfter); i++) {\n\t\t\t\t\tself.lazyLoadItem(_currentItemIndex-i);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_listen('initialLayout', function() {\n\t\t\t\tself.currItem.initialLayout = _options.getThumbBoundsFn && _options.getThumbBoundsFn(_currentItemIndex);\n\t\t\t});\n\n\t\t\t_listen('mainScrollAnimComplete', _appendImagesPool);\n\t\t\t_listen('initialZoomInEnd', _appendImagesPool);\n\n\n\n\t\t\t_listen('destroy', function() {\n\t\t\t\tvar item;\n\t\t\t\tfor(var i = 0; i < _items.length; i++) {\n\t\t\t\t\titem = _items[i];\n\t\t\t\t\t// remove reference to DOM elements, for GC\n\t\t\t\t\tif(item.container) {\n\t\t\t\t\t\titem.container = null; \n\t\t\t\t\t}\n\t\t\t\t\tif(item.placeholder) {\n\t\t\t\t\t\titem.placeholder = null;\n\t\t\t\t\t}\n\t\t\t\t\tif(item.img) {\n\t\t\t\t\t\titem.img = null;\n\t\t\t\t\t}\n\t\t\t\t\tif(item.preloader) {\n\t\t\t\t\t\titem.preloader = null;\n\t\t\t\t\t}\n\t\t\t\t\tif(item.loadError) {\n\t\t\t\t\t\titem.loaded = item.loadError = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t_imagesToAppendPool = null;\n\t\t\t});\n\t\t},\n\n\n\t\tgetItemAt: function(index) {\n\t\t\tif (index >= 0) {\n\t\t\t\treturn _items[index] !== undefined ? _items[index] : false;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\tallowProgressiveImg: function() {\n\t\t\t// 1. Progressive image loading isn't working on webkit/blink \n\t\t\t// when hw-acceleration (e.g. translateZ) is applied to IMG element.\n\t\t\t// That's why in PhotoSwipe parent element gets zoom transform, not image itself.\n\t\t\t// \n\t\t\t// 2. Progressive image loading sometimes blinks in webkit/blink when applying animation to parent element.\n\t\t\t// That's why it's disabled on touch devices (mainly because of swipe transition)\n\t\t\t// \n\t\t\t// 3. Progressive image loading sometimes doesn't work in IE (up to 11).\n\n\t\t\t// Don't allow progressive loading on non-large touch devices\n\t\t\treturn _options.forceProgressiveLoading || !_likelyTouchDevice || _options.mouseUsed || screen.width > 1200; \n\t\t\t// 1200 - to eliminate touch devices with large screen (like Chromebook Pixel)\n\t\t},\n\n\t\tsetContent: function(holder, index) {\n\n\t\t\tif(_options.loop) {\n\t\t\t\tindex = _getLoopedId(index);\n\t\t\t}\n\n\t\t\tvar prevItem = self.getItemAt(holder.index);\n\t\t\tif(prevItem) {\n\t\t\t\tprevItem.container = null;\n\t\t\t}\n\t\n\t\t\tvar item = self.getItemAt(index),\n\t\t\t\timg;\n\t\t\t\n\t\t\tif(!item) {\n\t\t\t\tholder.el.innerHTML = '';\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// allow to override data\n\t\t\t_shout('gettingData', index, item);\n\n\t\t\tholder.index = index;\n\t\t\tholder.item = item;\n\n\t\t\t// base container DIV is created only once for each of 3 holders\n\t\t\tvar baseDiv = item.container = framework.createEl('pswp__zoom-wrap'); \n\n\t\t\t\n\n\t\t\tif(!item.src && item.html) {\n\t\t\t\tif(item.html.tagName) {\n\t\t\t\t\tbaseDiv.appendChild(item.html);\n\t\t\t\t} else {\n\t\t\t\t\tbaseDiv.innerHTML = item.html;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_checkForError(item);\n\n\t\t\t_calculateItemSize(item, _viewportSize);\n\t\t\t\n\t\t\tif(item.src && !item.loadError && !item.loaded) {\n\n\t\t\t\titem.loadComplete = function(item) {\n\n\t\t\t\t\t// gallery closed before image finished loading\n\t\t\t\t\tif(!_isOpen) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// check if holder hasn't changed while image was loading\n\t\t\t\t\tif(holder && holder.index === index ) {\n\t\t\t\t\t\tif( _checkForError(item, true) ) {\n\t\t\t\t\t\t\titem.loadComplete = item.img = null;\n\t\t\t\t\t\t\t_calculateItemSize(item, _viewportSize);\n\t\t\t\t\t\t\t_applyZoomPanToItem(item);\n\n\t\t\t\t\t\t\tif(holder.index === _currentItemIndex) {\n\t\t\t\t\t\t\t\t// recalculate dimensions\n\t\t\t\t\t\t\t\tself.updateCurrZoomItem();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif( !item.imageAppended ) {\n\t\t\t\t\t\t\tif(_features.transform && (_mainScrollAnimating || _initialZoomRunning) ) {\n\t\t\t\t\t\t\t\t_imagesToAppendPool.push({\n\t\t\t\t\t\t\t\t\titem:item,\n\t\t\t\t\t\t\t\t\tbaseDiv:baseDiv,\n\t\t\t\t\t\t\t\t\timg:item.img,\n\t\t\t\t\t\t\t\t\tindex:index,\n\t\t\t\t\t\t\t\t\tholder:holder,\n\t\t\t\t\t\t\t\t\tclearPlaceholder:true\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_appendImage(index, item, baseDiv, item.img, _mainScrollAnimating || _initialZoomRunning, true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// remove preloader & mini-img\n\t\t\t\t\t\t\tif(!_initialZoomRunning && item.placeholder) {\n\t\t\t\t\t\t\t\titem.placeholder.style.display = 'none';\n\t\t\t\t\t\t\t\titem.placeholder = null;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\titem.loadComplete = null;\n\t\t\t\t\titem.img = null; // no need to store image element after it's added\n\n\t\t\t\t\t_shout('imageLoadComplete', index, item);\n\t\t\t\t};\n\n\t\t\t\tif(framework.features.transform) {\n\t\t\t\t\t\n\t\t\t\t\tvar placeholderClassName = 'pswp__img pswp__img--placeholder'; \n\t\t\t\t\tplaceholderClassName += (item.msrc ? '' : ' pswp__img--placeholder--blank');\n\n\t\t\t\t\tvar placeholder = framework.createEl(placeholderClassName, item.msrc ? 'img' : '');\n\t\t\t\t\tif(item.msrc) {\n\t\t\t\t\t\tplaceholder.src = item.msrc;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t_setImageSize(item, placeholder);\n\n\t\t\t\t\tbaseDiv.appendChild(placeholder);\n\t\t\t\t\titem.placeholder = placeholder;\n\n\t\t\t\t}\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\tif(!item.loading) {\n\t\t\t\t\t_preloadImage(item);\n\t\t\t\t}\n\n\n\t\t\t\tif( self.allowProgressiveImg() ) {\n\t\t\t\t\t// just append image\n\t\t\t\t\tif(!_initialContentSet && _features.transform) {\n\t\t\t\t\t\t_imagesToAppendPool.push({\n\t\t\t\t\t\t\titem:item, \n\t\t\t\t\t\t\tbaseDiv:baseDiv, \n\t\t\t\t\t\t\timg:item.img, \n\t\t\t\t\t\t\tindex:index, \n\t\t\t\t\t\t\tholder:holder\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_appendImage(index, item, baseDiv, item.img, true, true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else if(item.src && !item.loadError) {\n\t\t\t\t// image object is created every time, due to bugs of image loading & delay when switching images\n\t\t\t\timg = framework.createEl('pswp__img', 'img');\n\t\t\t\timg.style.opacity = 1;\n\t\t\t\timg.src = item.src;\n\t\t\t\t_setImageSize(item, img);\n\t\t\t\t_appendImage(index, item, baseDiv, img, true);\n\t\t\t}\n\t\t\t\n\n\t\t\tif(!_initialContentSet && index === _currentItemIndex) {\n\t\t\t\t_currZoomElementStyle = baseDiv.style;\n\t\t\t\t_showOrHide(item, (img ||item.img) );\n\t\t\t} else {\n\t\t\t\t_applyZoomPanToItem(item);\n\t\t\t}\n\n\t\t\tholder.el.innerHTML = '';\n\t\t\tholder.el.appendChild(baseDiv);\n\t\t},\n\n\t\tcleanSlide: function( item ) {\n\t\t\tif(item.img ) {\n\t\t\t\titem.img.onload = item.img.onerror = null;\n\t\t\t}\n\t\t\titem.loaded = item.loading = item.img = item.imageAppended = false;\n\t\t}\n\n\t}\n});\n\n/*>>items-controller*/\n\n/*>>tap*/\n/**\n * tap.js:\n *\n * Displatches tap and double-tap events.\n * \n */\n\nvar tapTimer,\n\ttapReleasePoint = {},\n\t_dispatchTapEvent = function(origEvent, releasePoint, pointerType) {\t\t\n\t\tvar e = document.createEvent( 'CustomEvent' ),\n\t\t\teDetail = {\n\t\t\t\torigEvent:origEvent, \n\t\t\t\ttarget:origEvent.target, \n\t\t\t\treleasePoint: releasePoint, \n\t\t\t\tpointerType:pointerType || 'touch'\n\t\t\t};\n\n\t\te.initCustomEvent( 'pswpTap', true, true, eDetail );\n\t\torigEvent.target.dispatchEvent(e);\n\t};\n\n_registerModule('Tap', {\n\tpublicMethods: {\n\t\tinitTap: function() {\n\t\t\t_listen('firstTouchStart', self.onTapStart);\n\t\t\t_listen('touchRelease', self.onTapRelease);\n\t\t\t_listen('destroy', function() {\n\t\t\t\ttapReleasePoint = {};\n\t\t\t\ttapTimer = null;\n\t\t\t});\n\t\t},\n\t\tonTapStart: function(touchList) {\n\t\t\tif(touchList.length > 1) {\n\t\t\t\tclearTimeout(tapTimer);\n\t\t\t\ttapTimer = null;\n\t\t\t}\n\t\t},\n\t\tonTapRelease: function(e, releasePoint) {\n\t\t\tif(!releasePoint) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(!_moved && !_isMultitouch && !_numAnimations) {\n\t\t\t\tvar p0 = releasePoint;\n\t\t\t\tif(tapTimer) {\n\t\t\t\t\tclearTimeout(tapTimer);\n\t\t\t\t\ttapTimer = null;\n\n\t\t\t\t\t// Check if taped on the same place\n\t\t\t\t\tif ( _isNearbyPoints(p0, tapReleasePoint) ) {\n\t\t\t\t\t\t_shout('doubleTap', p0);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(releasePoint.type === 'mouse') {\n\t\t\t\t\t_dispatchTapEvent(e, releasePoint, 'mouse');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar clickedTagName = e.target.tagName.toUpperCase();\n\t\t\t\t// avoid double tap delay on buttons and elements that have class pswp__single-tap\n\t\t\t\tif(clickedTagName === 'BUTTON' || framework.hasClass(e.target, 'pswp__single-tap') ) {\n\t\t\t\t\t_dispatchTapEvent(e, releasePoint);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t_equalizePoints(tapReleasePoint, p0);\n\n\t\t\t\ttapTimer = setTimeout(function() {\n\t\t\t\t\t_dispatchTapEvent(e, releasePoint);\n\t\t\t\t\ttapTimer = null;\n\t\t\t\t}, 300);\n\t\t\t}\n\t\t}\n\t}\n});\n\n/*>>tap*/\n\n/*>>desktop-zoom*/\n/**\n *\n * desktop-zoom.js:\n *\n * - Binds mousewheel event for paning zoomed image.\n * - Manages \"dragging\", \"zoomed-in\", \"zoom-out\" classes.\n * (which are used for cursors and zoom icon)\n * - Adds toggleDesktopZoom function.\n * \n */\n\nvar _wheelDelta;\n\t\n_registerModule('DesktopZoom', {\n\n\tpublicMethods: {\n\n\t\tinitDesktopZoom: function() {\n\n\t\t\tif(_oldIE) {\n\t\t\t\t// no zoom for old IE (<=8)\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(_likelyTouchDevice) {\n\t\t\t\t// if detected hardware touch support, we wait until mouse is used,\n\t\t\t\t// and only then apply desktop-zoom features\n\t\t\t\t_listen('mouseUsed', function() {\n\t\t\t\t\tself.setupDesktopZoom();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tself.setupDesktopZoom(true);\n\t\t\t}\n\n\t\t},\n\n\t\tsetupDesktopZoom: function(onInit) {\n\n\t\t\t_wheelDelta = {};\n\n\t\t\tvar events = 'wheel mousewheel DOMMouseScroll';\n\t\t\t\n\t\t\t_listen('bindEvents', function() {\n\t\t\t\tframework.bind(template, events, self.handleMouseWheel);\n\t\t\t});\n\n\t\t\t_listen('unbindEvents', function() {\n\t\t\t\tif(_wheelDelta) {\n\t\t\t\t\tframework.unbind(template, events, self.handleMouseWheel);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tself.mouseZoomedIn = false;\n\n\t\t\tvar hasDraggingClass,\n\t\t\t\tupdateZoomable = function() {\n\t\t\t\t\tif(self.mouseZoomedIn) {\n\t\t\t\t\t\tframework.removeClass(template, 'pswp--zoomed-in');\n\t\t\t\t\t\tself.mouseZoomedIn = false;\n\t\t\t\t\t}\n\t\t\t\t\tif(_currZoomLevel < 1) {\n\t\t\t\t\t\tframework.addClass(template, 'pswp--zoom-allowed');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tframework.removeClass(template, 'pswp--zoom-allowed');\n\t\t\t\t\t}\n\t\t\t\t\tremoveDraggingClass();\n\t\t\t\t},\n\t\t\t\tremoveDraggingClass = function() {\n\t\t\t\t\tif(hasDraggingClass) {\n\t\t\t\t\t\tframework.removeClass(template, 'pswp--dragging');\n\t\t\t\t\t\thasDraggingClass = false;\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t_listen('resize' , updateZoomable);\n\t\t\t_listen('afterChange' , updateZoomable);\n\t\t\t_listen('pointerDown', function() {\n\t\t\t\tif(self.mouseZoomedIn) {\n\t\t\t\t\thasDraggingClass = true;\n\t\t\t\t\tframework.addClass(template, 'pswp--dragging');\n\t\t\t\t}\n\t\t\t});\n\t\t\t_listen('pointerUp', removeDraggingClass);\n\n\t\t\tif(!onInit) {\n\t\t\t\tupdateZoomable();\n\t\t\t}\n\t\t\t\n\t\t},\n\n\t\thandleMouseWheel: function(e) {\n\n\t\t\tif(_currZoomLevel <= self.currItem.fitRatio) {\n\t\t\t\tif( _options.modal ) {\n\n\t\t\t\t\tif (!_options.closeOnScroll || _numAnimations || _isDragging) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t} else if(_transformKey && Math.abs(e.deltaY) > 2) {\n\t\t\t\t\t\t// close PhotoSwipe\n\t\t\t\t\t\t// if browser supports transforms & scroll changed enough\n\t\t\t\t\t\t_closedByScroll = true;\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// allow just one event to fire\n\t\t\te.stopPropagation();\n\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/Events/wheel\n\t\t\t_wheelDelta.x = 0;\n\n\t\t\tif('deltaX' in e) {\n\t\t\t\tif(e.deltaMode === 1 /* DOM_DELTA_LINE */) {\n\t\t\t\t\t// 18 - average line height\n\t\t\t\t\t_wheelDelta.x = e.deltaX * 18;\n\t\t\t\t\t_wheelDelta.y = e.deltaY * 18;\n\t\t\t\t} else {\n\t\t\t\t\t_wheelDelta.x = e.deltaX;\n\t\t\t\t\t_wheelDelta.y = e.deltaY;\n\t\t\t\t}\n\t\t\t} else if('wheelDelta' in e) {\n\t\t\t\tif(e.wheelDeltaX) {\n\t\t\t\t\t_wheelDelta.x = -0.16 * e.wheelDeltaX;\n\t\t\t\t}\n\t\t\t\tif(e.wheelDeltaY) {\n\t\t\t\t\t_wheelDelta.y = -0.16 * e.wheelDeltaY;\n\t\t\t\t} else {\n\t\t\t\t\t_wheelDelta.y = -0.16 * e.wheelDelta;\n\t\t\t\t}\n\t\t\t} else if('detail' in e) {\n\t\t\t\t_wheelDelta.y = e.detail;\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_calculatePanBounds(_currZoomLevel, true);\n\n\t\t\tvar newPanX = _panOffset.x - _wheelDelta.x,\n\t\t\t\tnewPanY = _panOffset.y - _wheelDelta.y;\n\n\t\t\t// only prevent scrolling in nonmodal mode when not at edges\n\t\t\tif (_options.modal ||\n\t\t\t\t(\n\t\t\t\tnewPanX <= _currPanBounds.min.x && newPanX >= _currPanBounds.max.x &&\n\t\t\t\tnewPanY <= _currPanBounds.min.y && newPanY >= _currPanBounds.max.y\n\t\t\t\t) ) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\n\t\t\t// TODO: use rAF instead of mousewheel?\n\t\t\tself.panTo(newPanX, newPanY);\n\t\t},\n\n\t\ttoggleDesktopZoom: function(centerPoint) {\n\t\t\tcenterPoint = centerPoint || {x:_viewportSize.x/2 + _offset.x, y:_viewportSize.y/2 + _offset.y };\n\n\t\t\tvar doubleTapZoomLevel = _options.getDoubleTapZoom(true, self.currItem);\n\t\t\tvar zoomOut = _currZoomLevel === doubleTapZoomLevel;\n\t\t\t\n\t\t\tself.mouseZoomedIn = !zoomOut;\n\n\t\t\tself.zoomTo(zoomOut ? self.currItem.initialZoomLevel : doubleTapZoomLevel, centerPoint, 333);\n\t\t\tframework[ (!zoomOut ? 'add' : 'remove') + 'Class'](template, 'pswp--zoomed-in');\n\t\t}\n\n\t}\n});\n\n\n/*>>desktop-zoom*/\n\n/*>>history*/\n/**\n *\n * history.js:\n *\n * - Back button to close gallery.\n * \n * - Unique URL for each slide: example.com/&pid=1&gid=3\n * (where PID is picture index, and GID and gallery index)\n * \n * - Switch URL when slides change.\n * \n */\n\n\nvar _historyDefaultOptions = {\n\thistory: true,\n\tgalleryUID: 1\n};\n\nvar _historyUpdateTimeout,\n\t_hashChangeTimeout,\n\t_hashAnimCheckTimeout,\n\t_hashChangedByScript,\n\t_hashChangedByHistory,\n\t_hashReseted,\n\t_initialHash,\n\t_historyChanged,\n\t_closedFromURL,\n\t_urlChangedOnce,\n\t_windowLoc,\n\n\t_supportsPushState,\n\n\t_getHash = function() {\n\t\treturn _windowLoc.hash.substring(1);\n\t},\n\t_cleanHistoryTimeouts = function() {\n\n\t\tif(_historyUpdateTimeout) {\n\t\t\tclearTimeout(_historyUpdateTimeout);\n\t\t}\n\n\t\tif(_hashAnimCheckTimeout) {\n\t\t\tclearTimeout(_hashAnimCheckTimeout);\n\t\t}\n\t},\n\n\t// pid - Picture index\n\t// gid - Gallery index\n\t_parseItemIndexFromURL = function() {\n\t\tvar hash = _getHash(),\n\t\t\tparams = {};\n\n\t\tif(hash.length < 5) { // pid=1\n\t\t\treturn params;\n\t\t}\n\n\t\tvar i, vars = hash.split('&');\n\t\tfor (i = 0; i < vars.length; i++) {\n\t\t\tif(!vars[i]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar pair = vars[i].split('=');\t\n\t\t\tif(pair.length < 2) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tparams[pair[0]] = pair[1];\n\t\t}\n\t\tif(_options.galleryPIDs) {\n\t\t\t// detect custom pid in hash and search for it among the items collection\n\t\t\tvar searchfor = params.pid;\n\t\t\tparams.pid = 0; // if custom pid cannot be found, fallback to the first item\n\t\t\tfor(i = 0; i < _items.length; i++) {\n\t\t\t\tif(_items[i].pid === searchfor) {\n\t\t\t\t\tparams.pid = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tparams.pid = parseInt(params.pid,10)-1;\n\t\t}\n\t\tif( params.pid < 0 ) {\n\t\t\tparams.pid = 0;\n\t\t}\n\t\treturn params;\n\t},\n\t_updateHash = function() {\n\n\t\tif(_hashAnimCheckTimeout) {\n\t\t\tclearTimeout(_hashAnimCheckTimeout);\n\t\t}\n\n\n\t\tif(_numAnimations || _isDragging) {\n\t\t\t// changing browser URL forces layout/paint in some browsers, which causes noticable lag during animation\n\t\t\t// that's why we update hash only when no animations running\n\t\t\t_hashAnimCheckTimeout = setTimeout(_updateHash, 500);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif(_hashChangedByScript) {\n\t\t\tclearTimeout(_hashChangeTimeout);\n\t\t} else {\n\t\t\t_hashChangedByScript = true;\n\t\t}\n\n\n\t\tvar pid = (_currentItemIndex + 1);\n\t\tvar item = _getItemAt( _currentItemIndex );\n\t\tif(item.hasOwnProperty('pid')) {\n\t\t\t// carry forward any custom pid assigned to the item\n\t\t\tpid = item.pid;\n\t\t}\n\t\tvar newHash = _initialHash + '&' + 'gid=' + _options.galleryUID + '&' + 'pid=' + pid;\n\n\t\tif(!_historyChanged) {\n\t\t\tif(_windowLoc.hash.indexOf(newHash) === -1) {\n\t\t\t\t_urlChangedOnce = true;\n\t\t\t}\n\t\t\t// first time - add new hisory record, then just replace\n\t\t}\n\n\t\tvar newURL = _windowLoc.href.split('#')[0] + '#' + newHash;\n\n\t\tif( _supportsPushState ) {\n\n\t\t\tif('#' + newHash !== window.location.hash) {\n\t\t\t\thistory[_historyChanged ? 'replaceState' : 'pushState']('', document.title, newURL);\n\t\t\t}\n\n\t\t} else {\n\t\t\tif(_historyChanged) {\n\t\t\t\t_windowLoc.replace( newURL );\n\t\t\t} else {\n\t\t\t\t_windowLoc.hash = newHash;\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\n\t\t_historyChanged = true;\n\t\t_hashChangeTimeout = setTimeout(function() {\n\t\t\t_hashChangedByScript = false;\n\t\t}, 60);\n\t};\n\n\n\n\t\n\n_registerModule('History', {\n\n\t\n\n\tpublicMethods: {\n\t\tinitHistory: function() {\n\n\t\t\tframework.extend(_options, _historyDefaultOptions, true);\n\n\t\t\tif( !_options.history ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\n\t\t\t_windowLoc = window.location;\n\t\t\t_urlChangedOnce = false;\n\t\t\t_closedFromURL = false;\n\t\t\t_historyChanged = false;\n\t\t\t_initialHash = _getHash();\n\t\t\t_supportsPushState = ('pushState' in history);\n\n\n\t\t\tif(_initialHash.indexOf('gid=') > -1) {\n\t\t\t\t_initialHash = _initialHash.split('&gid=')[0];\n\t\t\t\t_initialHash = _initialHash.split('?gid=')[0];\n\t\t\t}\n\t\t\t\n\n\t\t\t_listen('afterChange', self.updateURL);\n\t\t\t_listen('unbindEvents', function() {\n\t\t\t\tframework.unbind(window, 'hashchange', self.onHashChange);\n\t\t\t});\n\n\n\t\t\tvar returnToOriginal = function() {\n\t\t\t\t_hashReseted = true;\n\t\t\t\tif(!_closedFromURL) {\n\n\t\t\t\t\tif(_urlChangedOnce) {\n\t\t\t\t\t\thistory.back();\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif(_initialHash) {\n\t\t\t\t\t\t\t_windowLoc.hash = _initialHash;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (_supportsPushState) {\n\n\t\t\t\t\t\t\t\t// remove hash from url without refreshing it or scrolling to top\n\t\t\t\t\t\t\t\thistory.pushState('', document.title, _windowLoc.pathname + _windowLoc.search );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_windowLoc.hash = '';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\t_cleanHistoryTimeouts();\n\t\t\t};\n\n\n\t\t\t_listen('unbindEvents', function() {\n\t\t\t\tif(_closedByScroll) {\n\t\t\t\t\t// if PhotoSwipe is closed by scroll, we go \"back\" before the closing animation starts\n\t\t\t\t\t// this is done to keep the scroll position\n\t\t\t\t\treturnToOriginal();\n\t\t\t\t}\n\t\t\t});\n\t\t\t_listen('destroy', function() {\n\t\t\t\tif(!_hashReseted) {\n\t\t\t\t\treturnToOriginal();\n\t\t\t\t}\n\t\t\t});\n\t\t\t_listen('firstUpdate', function() {\n\t\t\t\t_currentItemIndex = _parseItemIndexFromURL().pid;\n\t\t\t});\n\n\t\t\t\n\n\t\t\t\n\t\t\tvar index = _initialHash.indexOf('pid=');\n\t\t\tif(index > -1) {\n\t\t\t\t_initialHash = _initialHash.substring(0, index);\n\t\t\t\tif(_initialHash.slice(-1) === '&') {\n\t\t\t\t\t_initialHash = _initialHash.slice(0, -1);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\n\t\t\tsetTimeout(function() {\n\t\t\t\tif(_isOpen) { // hasn't destroyed yet\n\t\t\t\t\tframework.bind(window, 'hashchange', self.onHashChange);\n\t\t\t\t}\n\t\t\t}, 40);\n\t\t\t\n\t\t},\n\t\tonHashChange: function() {\n\n\t\t\tif(_getHash() === _initialHash) {\n\n\t\t\t\t_closedFromURL = true;\n\t\t\t\tself.close();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(!_hashChangedByScript) {\n\n\t\t\t\t_hashChangedByHistory = true;\n\t\t\t\tself.goTo( _parseItemIndexFromURL().pid );\n\t\t\t\t_hashChangedByHistory = false;\n\t\t\t}\n\t\t\t\n\t\t},\n\t\tupdateURL: function() {\n\n\t\t\t// Delay the update of URL, to avoid lag during transition, \n\t\t\t// and to not to trigger actions like \"refresh page sound\" or \"blinking favicon\" to often\n\t\t\t\n\t\t\t_cleanHistoryTimeouts();\n\t\t\t\n\n\t\t\tif(_hashChangedByHistory) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(!_historyChanged) {\n\t\t\t\t_updateHash(); // first time\n\t\t\t} else {\n\t\t\t\t_historyUpdateTimeout = setTimeout(_updateHash, 800);\n\t\t\t}\n\t\t}\n\t\n\t}\n});\n\n\n/*>>history*/\n\tframework.extend(self, publicMethods); };\n\treturn PhotoSwipe;\n});","'use strict';\n\nvar base = require('base/product/base');\nvar detail = require('base/product/detail');\nvar detailUpdateAddToCartEnableDisableOtherElements = detail.methods.updateAddToCartEnableDisableOtherElements;\n\nvar PhotoSwipeDefault = require('photoswipe/dist/photoswipe-ui-default.js');\nvar PhotoSwipe = require('photoswipe/dist/photoswipe.js');\nconst { Splide } = require('@splidejs/splide/dist/js/splide.cjs.js');\n\nlocalStorage.setItem('productIdViewed', '.product[data-pid=\"' + $('.product-id').first().text() + '\"]');\n\nif (window.dataLayer) {\n $('body').trigger('gtm:pdp:view', {\n productId: $('.product-id').first().text()\n });\n}\n\nlet mainGallery;\n\nfunction initGallery() {\n let gallery = document.querySelector('.pdp-media__gallery');\n if (gallery) {\n mainGallery = new Splide('.pdp-media__gallery', {\n type: 'loop',\n pagination: false,\n lazyLoad: 'nearby'\n });\n\n let thumbs = new Splide('.pdp-media__thumbs', {\n isNavigation: true,\n pagination: false,\n arrows: false,\n fixedWidth: 100,\n gap: 16\n });\n\n thumbs.mount();\n mainGallery.sync(thumbs);\n mainGallery.mount();\n }\n}\n\n$(document).ready(function () {\n $('body').trigger('collect:pdp:view', {\n productId: $('.product-id').first().text()\n });\n});\n\nfunction initPhotoSwipeFromDOM(gallerySelector) {\n // parse slide data (url, title, size ...) from DOM elements\n // (children of gallerySelector)\n var parseThumbnailElements = function parseThumbnailElements(el) {\n var thumbElements = el.querySelectorAll('.splide__slide:not(.splide__slide--clone)'),\n numNodes = thumbElements.length,\n items = [],\n figureEl,\n linkEl,\n size,\n item;\n\n for (var i = 0; i < numNodes; i++) {\n figureEl = thumbElements[i]; //
      element\n // include only element nodes\n\n if (figureEl.nodeType !== 1) {\n continue;\n }\n\n linkEl = figureEl.children[0]; // element\n\n if (linkEl.tagName && linkEl.tagName !== 'A') {\n continue;\n } else {\n size = linkEl.getAttribute('data-size').split('x'); // create slide object\n\n item = {\n src: linkEl.getAttribute('href'),\n w: parseInt(size[0], 10),\n h: parseInt(size[1], 10)\n };\n \n if (figureEl.children.length > 1) {\n //
      content\n item.title = figureEl.children[1].innerHTML;\n }\n \n if (linkEl.children.length > 0) {\n // thumbnail element, retrieving thumbnail url\n item.msrc = linkEl.children[0].getAttribute('src');\n }\n }\n\n item.el = figureEl; // save link to element for getThumbBoundsFn\n\n items.push(item);\n }\n\n return items;\n }; // find nearest parent element\n\n\n var closest = function closest(el, fn) {\n return el && (fn(el) ? el : closest(el.parentNode, fn));\n }; // triggers when user clicks on thumbnail\n\n\n var onThumbnailsClick = function onThumbnailsClick(e) {\n e = e || window.event;\n e.preventDefault ? e.preventDefault() : e.returnValue = false;\n var eTarget = e.target || e.srcElement; // find root element of slide\n\n var clickedListItem = closest(eTarget, function (el) {\n return el.tagName && el.tagName.toUpperCase() === 'LI';\n });\n\n if (eTarget.tagName === 'VIDEO') {\n return;\n }\n\n if (!clickedListItem) {\n return;\n } // find index of clicked item by looping through all child nodes\n // alternatively, you may define index via data- attribute\n\n\n var clickedGallery = clickedListItem.parentNode,\n childNodes = clickedListItem.parentNode.querySelectorAll('.splide__slide:not(.splide__slide--clone)'),\n numChildNodes = childNodes.length,\n nodeIndex = 0,\n index;\n\n for (var i = 0; i < numChildNodes; i++) {\n if (childNodes[i].nodeType !== 1) {\n continue;\n }\n\n if (childNodes[i] === clickedListItem) {\n index = nodeIndex;\n break;\n }\n\n nodeIndex++;\n }\n\n if (index >= 0) {\n // open PhotoSwipe if valid index found\n openPhotoSwipe(index, clickedGallery);\n }\n\n return false;\n }; // parse picture index and gallery index from URL (#&pid=1&gid=2)\n\n\n var photoswipeParseHash = function photoswipeParseHash() {\n var hash = window.location.hash.substring(1),\n params = {};\n\n if (hash.length < 5) {\n return params;\n }\n\n var vars = hash.split('&');\n\n for (var i = 0; i < vars.length; i++) {\n if (!vars[i]) {\n continue;\n }\n\n var pair = vars[i].split('=');\n\n if (pair.length < 2) {\n continue;\n }\n\n params[pair[0]] = pair[1];\n }\n\n if (params.gid) {\n params.gid = parseInt(params.gid, 10);\n }\n\n return params;\n };\n\n var openPhotoSwipe = function openPhotoSwipe(index, galleryElement, disableAnimation, fromURL) {\n var pswpElement = document.querySelectorAll('.pswp')[0],\n gallery,\n options,\n items;\n items = parseThumbnailElements(galleryElement); // #################### 3/4 define photoswipe options (if needed) #################### \n // https://photoswipe.com/documentation/options.html //\n\n options = {\n history: false,\n bgOpacity: 0.9,\n\n /* 'showHideOpacity' uncomment this If dimensions of your small thumbnail don't match dimensions of large image */\n showHideOpacity: true,\n // Buttons/elements\n closeEl: true,\n captionEl: true,\n fullscreenEl: true,\n zoomEl: true,\n shareEl: false,\n counterEl: false,\n arrowEl: true,\n preloaderEl: true,\n // define gallery index (for URL)\n galleryUID: galleryElement.getAttribute('data-pswp-uid'),\n // getDoubleTapZoom: function(isMouseClick, item) {\n // \treturn 4;\n // },\n getThumbBoundsFn: function getThumbBoundsFn(index) {\n // See Options -> getThumbBoundsFn section of documentation for more info\n var thumbnail = items[index].el.getElementsByTagName('img')[0],\n // find thumbnail\n pageYScroll = window.pageYOffset || document.documentElement.scrollTop,\n rect = thumbnail.getBoundingClientRect();\n return {\n x: rect.left,\n y: rect.top + pageYScroll,\n w: rect.width\n };\n }\n }; // PhotoSwipe opened from URL\n\n if (fromURL) {\n if (options.galleryPIDs) {\n // parse real index when custom PIDs are used\n // http://photoswipe.com/documentation/faq.html#custom-pid-in-url\n for (var j = 0; j < items.length; j++) {\n if (items[j].pid == index) {\n options.index = j;\n break;\n }\n }\n } else {\n // in URL indexes start from 1\n options.index = parseInt(index, 10) - 1;\n }\n } else {\n options.index = parseInt(index, 10);\n } // exit if index not found\n\n\n if (isNaN(options.index)) {\n return;\n }\n\n if (disableAnimation) {\n options.showAnimationDuration = 0;\n } // Pass data to PhotoSwipe and initialize it\n\n gallery = new PhotoSwipe(pswpElement, PhotoSwipeDefault, items, options);\n gallery.init();\n /* ########### PART 4 - EXTRA CODE ########### */\n\n /* EXTRA CODE (NOT FROM photoswipe CORE) - \n 1/2. UPDATE GALLERY POSITION TO THE 'CURRENT' ZOOM_IN IMAGE (BETTER UI) */\n // photoswipe event: Gallery unbinds events\n // (triggers before closing animation)\n\n gallery.listen('unbindEvents', function () {\n // The index of the current photoswipe slide\n var getCurrentIndex = gallery.getCurrentIndex(); // Update position of the slider\n\n mainGallery.go(getCurrentIndex);\n });\n }; // loop through all gallery elements and bind events\n\n\n var galleryElements = document.querySelectorAll(gallerySelector);\n\n for (var i = 0, l = galleryElements.length; i < l; i++) {\n galleryElements[i].setAttribute('data-pswp-uid', i + 1);\n galleryElements[i].onclick = onThumbnailsClick;\n } // Parse URL and open gallery if it contains #&pid=3&gid=1\n\n\n var hashData = photoswipeParseHash();\n\n if (hashData.pid && hashData.gid) {\n openPhotoSwipe(hashData.pid, galleryElements[hashData.gid - 1], true, true);\n }\n}; // execute above function\n\n\n$(document).ready(function () {\n if (typeof PhotoSwipe !== 'undefined') {\n initPhotoSwipeFromDOM('.gallery');\n }\n});\n\nfunction isDesktop() {\n return $(window).width() >= 1220;\n}\n\n/**\n * Generates the modal window on the first call.\n *\n */\nfunction getModalHtmlElement(modalId) {\n if ($('.' + modalId).length !== 0) {\n $('.' + modalId).remove();\n }\n var htmlString = '' +\n '
      ' +\n '
      ' +\n '' +\n '
      ' +\n '
      ' +\n ' ' +\n '
      ' +\n '
      ' +\n '
      ' +\n '
      ' +\n '
      ';\n $('body').append(htmlString);\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 * 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 * 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 * 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 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 || $($el).closest('.product-detail').find('.quantity-select').length > 0)) {\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 * 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 {\n body: body,\n footer: footer\n };\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 * Call Cart-AddCartBag that will show the current basket with the lasted added product\n * @param {element} addToCartBtn - Element that triggered the add to cart click event\n */\nfunction addToBag(addToCartBtn) {\n var addToBagUrl = $(addToCartBtn).data('addtobag');\n var pid = $('.product-detail').data('pid');\n if (addToBagUrl) {\n $.ajax({\n url: addToBagUrl + '?pid=' + pid,\n method: 'GET',\n success: function (data) {\n $('#addToBagModal').find('.add-to-bag').empty().append(data);\n $('#addToBagModal').addClass('p-0');\n $('#addToBagModal').modal('show');\n },\n error: function () {\n // no reporting urls hit on the server\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 * @param {element} addToCartBtn - Element that triggered the add to cart click event\n */\nfunction handlePostCartAdd(response, addToCartBtn) {\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 if (!response.error && !isDesktop()) {\n addToBag(addToCartBtn);\n } else if (isDesktop()) {\n $('.minicart').trigger('minicart:show');\n $('.minicart .popover').addClass('minicart__custom-popover');\n }\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\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.parent().addClass('selected');\n $attrValue.addClass('selected');\n $attrValue.siblings('.selected-assistive-text').text(msgs.assistiveSelectedText);\n } else {\n $attrValue.parent().removeClass('selected');\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 if (!attrValue.selectable) {\n $attrValue.parent().attr('disabled', true);\n } else {\n $attrValue.parent().removeAttr('disabled');\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 */\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* Process TrueFit button with updated product id and color swatches\n*\n* @param {Object} response - Response from Ajax call\n*/\nfunction updateTrueFit(response) {\n const trueFitButton = document.querySelector('.tfc-fitrec-product');\n\n let color;\n response.product.variationAttributes.forEach((attribute) => {\n if (attribute.swatchable) {\n attribute.values.forEach((option) => {\n if (option.selected) {\n color = option.value;\n }\n });\n }\n });\n\n if (trueFitButton) {\n trueFitButton.setAttribute('data-styleid', response.product.id);\n if (color) {\n trueFitButton.setAttribute('data-colorid', color);\n }\n }\n}\n\n/**\n * Dynamically creates swipper 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 /* Main media container */\n var mediaContainer = $productContainer.find('.pdp-media');\n /* Main carousel */\n var carousel = $productContainer.find('.pdp-media__gallery');\n /* Thumbnail carousel */\n var carouselThumbnail = $productContainer.find('.pdp-media__thumbs');\n\n if (imgs.length > 1 && imgs[0] && imgs[0].url) {\n /* Create main content: next, prev, ul, ol */\n $(carousel).empty().append('
        ');\n $(carouselThumbnail).empty().append('
          ');\n\n var isQuickView = $(carousel).closest('.product-quickview');\n /* Create images */\n for (var i = 0; i < imgs.length; i++) {\n if (isQuickView.length > 0) {\n $('
        • \"'
        • ').appendTo($(carousel).find('.splide__list'));\n } else if (i === 0) {\n $(`
        • \n \n \"${imgs[i].alt}\n \n
        • `).appendTo($(carousel).find('.splide__list'));\n } else {\n $(`
        • \n \n \"${imgs[i].alt}\n \n
        • `).appendTo($(carousel).find('.splide__list'));\n }\n\n $(`
        • \"${imgs[i].alt}
        • `).appendTo($(carouselThumbnail).find('.splide__list'));\n }\n\n initGallery();\n\n if (typeof PhotoSwipe !== 'undefined') {\n initPhotoSwipeFromDOM('.gallery');\n }\n } else if (imgs[0] && imgs[0].url) {\n $(mediaContainer).empty();\n $(`\"${imgs[0].alt}\"`).appendTo($(mediaContainer));\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\n if (response.product.readyToOrder) {\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 * 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['hi-res'];\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,\n $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,\n $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 * 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 // Update options\n $productContainer.find('.product-options').empty().html(optionsHtml);\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\nfunction updateQuantity(selectedQty, $productContainer) {\n if ($productContainer.parent('.bonus-product-item').length <= 0) {\n $productContainer.find('quantity-js').attr('data-url', selectedQty.url);\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,\n container: $productContainer\n });\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 updateQuantity(data.product.selectedQty, $productContainer);\n updateTrueFit(data);\n $('body').trigger('product:afterAttributeSelect', {\n data: data,\n container: $productContainer\n });\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n}\n\n/**\n * Add to cart on click event. This can only be triggered if the product has stock.\n */\nfunction addToCart() {\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 var addToCartBtn = $(this);\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 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, addToCartBtn);\n $('body').trigger('product:afterAddToCart', data);\n if (window.dataLayer) {\n $('body').trigger('gtm:pdp:add', {\n data: data,\n form: form\n });\n }\n $('body').trigger('collect:cart:addToCart', data);\n $.spinner().stop();\n miniCartReportingUrl(data.reportingURL);\n },\n error: function (error) {\n $.spinner().stop();\n }\n });\n }\n });\n}\n\n/**\n * Registering on change event on quantity selector. If store has been selected, exist function,\n * otherwise proceed to update attributes.\n */\nfunction availability() {\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 attributeSelect($(e.currentTarget).find('option:selected').data('url'),\n $productContainer);\n }\n });\n}\n\nfunction colorAttribute() {\n $(document).on('click', '[data-attr=\"color\"] button', function (e) {\n e.preventDefault();\n $.spinner().start();\n\n if ($(this).attr('disabled') || $(this).hasClass('selected')) {\n $.spinner().stop();\n return;\n }\n $('.color .color-val').text($(this).data('label'));\n $('.size-chart__wrapper .true-fit__button').attr('data-colorid', $(this).data('attr-value'));\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\nfunction selectAttribute() {\n $(document).on('change', 'select[class*=\"select-\"], .options-select', function (e) {\n e.preventDefault();\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\nfunction selectVariantAttribute() {\n $(document).on('click', '.product-attr-js', function (e) {\n e.preventDefault();\n $.spinner().start();\n\n if ($(this).hasClass('selected')) {\n $.spinner().stop();\n return;\n }\n\n $(this).parent().parent().find('.product-attr-js')\n .removeClass('selected');\n\n $(this).addClass('selected');\n var $productContainer = $(this).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n attributeSelect($(this).attr('value'), $productContainer);\n });\n}\n\n\nfunction sizeChartTemplate() {\n $(document).on('click', '.size-chart__js', function (e) {\n e.preventDefault();\n $.spinner().start();\n $.get($(this).attr('href'), function (data) {\n getModalHtmlElement('sizeChartModal');\n let newHeading = document.createElement('h2');\n newHeading.classList.add('h5', 'font-weight-bold');\n newHeading.setAttribute('id', 'modalTitle');\n let title = document.createTextNode(data.modalTitle);\n newHeading.appendChild(title);\n let headingDescription = document.createElement('p');\n let description = document.createTextNode(data.modalDescription);\n headingDescription.classList.add('size-chart__header-description');\n headingDescription.appendChild(description);\n\n let container = document.createElement('div');\n container.classList.add('size-chart__header-container');\n container.appendChild(newHeading);\n container.appendChild(headingDescription);\n $('#sizeChartModal').find('.modal-body').empty().append(data.content);\n $('#sizeChartModal').find('.modal-header').prepend(container);\n $('#sizeChartModal').modal('show');\n $.spinner().stop();\n });\n });\n}\n\nfunction inseamGuideTemplate() {\n $(document).on('click', '.inseam-guide__js', function (e) {\n e.preventDefault();\n $.spinner().start();\n $.get($(this).attr('href'), function (data) {\n getModalHtmlElement('inseamGuideModal');\n $('#inseamGuideModal').find('.modal-body').empty().append(data.content);\n $('#inseamGuideModal').modal('show');\n $.spinner().stop();\n });\n });\n}\n\n/**\n * Enable/disable Buy Now buttons based on product availability\n * @param {boolean} enableOrDisable - true or false\n */\nfunction updateAddToCartEnableDisableOtherElements(enableOrDisable) {\n detailUpdateAddToCartEnableDisableOtherElements.call(this, enableOrDisable);\n $('.salesforce-buynow-element').attr('disabled', enableOrDisable);\n}\n\nfunction updateAttributesAndDetails() {\n $('body').on('product:statusUpdate', function (e, data) {\n var $productContainer = $('.product-detail[data-pid=\"' + data.id + '\"]');\n\n if (data.longDescription) {\n $productContainer.find('.description-and-detail #productLongDescription .card-body')\n .empty()\n .html(data.longDescription);\n }\n });\n}\n\nvar exportDetails = $.extend({}, base, detail, {\n updateAttributesAndDetails: updateAttributesAndDetails,\n availability: availability,\n selectAttribute: selectAttribute,\n addToCart: addToCart,\n selectVariantAttribute: selectVariantAttribute,\n colorAttribute: colorAttribute,\n sizeChartTemplate: sizeChartTemplate,\n inseamGuideTemplate: inseamGuideTemplate\n});\n\nexportDetails.methods.updateAddToCartEnableDisableOtherElements = updateAddToCartEnableDisableOtherElements;\n\nexportDetails.initPhotoSwipeFromDOM = initPhotoSwipeFromDOM;\nexportDetails.initGallery = initGallery;\nmodule.exports = exportDetails;\n","'use strict';\n\nvar processInclude = require('base/util');\n\n$(document).ready(function () {\n // Include base details\n processInclude(require('./sizeChart'));\n processInclude(require('./product/details'));\n\n // Gift Registry\n // try {\n // processInclude(require('giftregistry/product/giftRegistry'));\n // } catch (ex) {\n // // plugin not in use\n // }\n\n // Apple pay\n try {\n processInclude(require('applepay/product/detail'));\n } catch (ex) {\n // plugin not in use\n }\n\n // Instore pickup\n // try {\n // processInclude(require('instorepickup/product/pdpInstoreInventory'));\n // } catch (ex) {\n // // plugin not in use\n // }\n\n // Wishlists\n try {\n processInclude(require('wishlist/product/wishlist'));\n } catch (ex) {\n // plugin not in use\n }\n\n // Commerce payments\n try {\n processInclude(require('commercepayments/product/payments'));\n } catch (ex) {\n // plugin not in use\n }\n});\n","'use strict';\n\nmodule.exports = function () {\n $('body').on('product:updateAddToCart', function (e, response) {\n if (response.product.readyToOrder) {\n var applePayButton = $('.apple-pay-pdp', response.$productContainer);\n if (applePayButton.length !== 0) {\n applePayButton.attr('sku', response.product.id);\n } else {\n var showApplePay = true;\n if (typeof $('.cart-and-ipay').data('ipay-enabled') !== 'undefined') {\n showApplePay = $('.cart-and-ipay').data('ipay-enabled');\n }\n if ($('.apple-pay-pdp').length === 0 && showApplePay) { // eslint-disable-line no-lonely-if\n var applePayButtonIsmlString = '
          ' +\n '' +\n '
          ';\n $('.cart-and-ipay .row').append(applePayButtonIsmlString);\n\n if ($('.cart-and-ipay').data('is-apple-session') === true) {\n $('.pdp-checkout-button').removeClass('col-12');\n $('.pdp-checkout-button').addClass('col col-sm-5');\n }\n }\n }\n } else {\n $('.pdp-apple-pay-button').remove();\n $('.pdp-checkout-button').removeClass('col col-sm-5');\n $('.pdp-checkout-button').addClass('col-12');\n }\n });\n};\n"],"sourceRoot":""}