{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/photoswipe/dist/photoswipe.js","webpack:///./node_modules/photoswipe/dist/photoswipe-ui-default.js","webpack:///./app/javascript/packs/frontPictures.ts"],"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","_typeof","iterator","obj","constructor","PhotoSwipe","template","UiClass","items","options","framework","features","target","type","listener","unbind","methodName","split","length","isArray","Array","createEl","classes","tag","el","document","createElement","className","getScrollY","yOffset","window","pageYOffset","undefined","documentElement","scrollTop","removeClass","reg","RegExp","replace","addClass","hasClass","test","getChildByClass","parentEl","childClassName","node","firstChild","nextSibling","arraySearch","array","extend","o1","o2","preventOverwrite","prop","easing","sine","out","k","Math","sin","PI","inOut","cos","cubic","detectFeatures","helperStyle","style","vendor","oldIE","all","addEventListener","touch","requestAnimationFrame","raf","caf","cancelAnimationFrame","pointerEvent","PointerEvent","navigator","msPointerEnabled","ua","userAgent","platform","v","appVersion","match","parseInt","isOldIOSPhone","androidversion","parseFloat","isOldAndroid","androidVersion","isMobileOpera","styleCheckItem","styleName","styleChecks","vendors","a","charAt","toUpperCase","slice","toLowerCase","lastTime","fn","currTime","Date","getTime","timeToCall","max","id","setTimeout","clearTimeout","svg","createElementNS","createSVGRect","evName","_handleEv","handleEvent","self","this","DOUBLE_TAP_RADIUS","NUM_HOLDERS","_options","allowPanToNext","spacing","bgOpacity","mouseUsed","loop","pinchToClose","closeOnScroll","closeOnVerticalDrag","verticalDragRange","hideAnimationDuration","showAnimationDuration","showHideOpacity","focus","escKey","arrowKeys","mainScrollEndFriction","panEndFriction","isClickableElement","tagName","getDoubleTapZoom","isMouseClick","item","initialZoomLevel","maxSpreadZoom","modal","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","_getEmptyPoint","x","y","_currPanDist","_startPanOffset","_panOffset","_viewportSize","_currPositionIndex","_offset","_slideSize","_indexDiff","_isFixedPosition","_modules","_windowVisibleSize","_renderMaxResolution","_registerModule","publicMethods","push","_getLoopedId","index","numSlides","_getNumItems","_listeners","_listen","_shout","listeners","args","arguments","shift","apply","_getCurrentTime","_applyBgOpacity","opacity","bg","_applyZoomTransform","styleObj","zoom","currItem","fitRatio","_applyCurrentZoomPan","allowRenderResolution","_setImageSize","_applyZoomPanToItem","container","initialPosition","_setTranslateX","elStyle","_moveMainScroll","dragging","newSlideIndexOffset","delta","round","_mainScrollPos","_calculatePanOffset","axis","zoomLevel","_midZoomPoint","_equalizePoints","p1","p2","_roundPoint","_mouseMoveTimeout","_onFirstMouseMove","_bindEvents","transform","scrollWrap","_unbindEvents","scroll","_calculatePanBounds","update","bounds","_calculateItemSize","_getMinZoomLevel","_getMaxZoomLevel","w","_modifyDestPanOffset","destPanBounds","destPanOffset","destZoomLevel","min","_setupTransforms","allow3dTransform","perspective","left","zoomRatio","h","width","height","top","_onKeyDown","e","keydownAction","keyCode","ctrlKey","altKey","shiftKey","metaKey","preventDefault","returnValue","_onGlobalClick","stopPropagation","_updatePageScrollOffset","setScrollOffset","_animations","_numAnimations","_stopAnimation","_registerStartAnimation","_stopAllAnimations","_animateProp","b","endProp","easingFn","onUpdate","onComplete","startAnimTime","animloop","shout","listen","viewportSize","isMainScrollAnimating","getZoomLevel","getCurrentIndex","isDragging","isZooming","applyZoomPan","panX","panY","init","itemHolders","children","wrap","display","resize","updateSize","orientationchange","clientWidth","keydown","click","oldPhone","animationName","ui","isNaN","_getItemAt","setAttribute","position","rootClasses","mainClass","setContent","updateCurrItem","setInterval","close","_showOrHide","destroy","_showOrHideTimeout","clearInterval","_stopDragUpdateLoop","panTo","force","event","goTo","diff","next","prev","updateCurrZoomItem","emulateSetContent","zoomElement","center","invalidateCurrItems","needsUpdate","beforeAnimation","tempHolder","diffAbs","abs","pop","unshift","prevItem","windowScrollY","innerWidth","innerHeight","clientHeight","holder","hIndex","cleanSlide","zoomTo","centerPoint","speed","updateFn","initialPanOffset","now","MIN_SWIPE_DISTANCE","DIRECTION_CHECK_OFFSET","_currPoint","_startPoint","_currPointers","_startMainScrollPos","_posPoints","_tempPoint","_currZoomedItemIndex","_centerPoint","_lastReleaseTime","_currCenterPoint","_isEqualPoints","_isNearbyPoints","touch0","touch1","_calculatePointsDistance","sqrt","_dragUpdateLoop","_renderMovement","_canPan","_closestElement","getAttribute","indexOf","parentNode","_preventObj","_preventDefaultEventBehaviour","isDown","prevent","_convertTouchToPoint","pageX","pageY","identifier","_findCenterOfPoints","pCenter","_pushPosPoint","time","_calculateVerticalDragOpacityRatio","_ePoint1","_ePoint2","_tempPointsArr","_getTouchPoints","forEach","touches","_panOrMoveMainScroll","panFriction","startOverDiff","newPanPos","newMainScrollPos","newOffset","dir","newMainScrollPosition","mainScrollDiff","_onDragStart","button","_initialZoomRunning","pointerIndex","pointerId","startPointsList","numPoints","_onDragMove","touchesList","pointsDistance","_calculateZoomLevel","zoomFriction","minZoomLevel","maxZoomLevel","percent","opacityRatio","_onDragRelease","releasePoint","splice","MSPOINTER_TYPES","pointerType","gestureType","touchList","changedTouches","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","destOpacity","initialOpacity","initGestures","addEventNames","pref","down","move","up","cancel","maxTouchPoints","msMaxTouchPoints","likelyTouchDevice","mousedown","mousemove","mouseup","_items","_initialContentSet","img","completeFn","thumbBounds","initialLayout","getThumbBoundsFn","closeWithRaf","fadeEverything","duration","removeAttribute","src","loadError","miniImg","webkitBackfaceVisibility","initalBgOpacity","_tempPanAreaSize","_imagesToAppendPool","_controllerDefaultOptions","errorMsg","forceProgressiveLoading","preload","getNumItemsFn","_getZeroBounds","_calculateSingleItemPanBounds","realPanElementW","realPanElementH","vGap","isInitial","bottom","hRatio","vRatio","_appendImage","baseDiv","preventAnimation","keepPlaceholder","imageAppended","appendChild","loaded","placeholder","_preloadImage","loading","loadComplete","onload","onerror","_checkForError","cleanUp","innerHTML","maxRes","lastChild","_appendImagesPool","poolItem","clearPlaceholder","lazyLoadItem","initController","getItemAt","isNext","preloadBefore","preloadAfter","preloader","allowProgressiveImg","screen","html","placeholderClassName","msrc","tapTimer","_wheelDelta","tapReleasePoint","_dispatchTapEvent","origEvent","createEvent","eDetail","initCustomEvent","dispatchEvent","initTap","onTapStart","onTapRelease","p0","initDesktopZoom","setupDesktopZoom","onInit","events","handleMouseWheel","mouseZoomedIn","hasDraggingClass","updateZoomable","removeDraggingClass","deltaY","deltaMode","deltaX","wheelDeltaX","wheelDeltaY","wheelDelta","detail","newPanX","newPanY","toggleDesktopZoom","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","pid","_updateHash","newHash","newURL","href","location","title","initHistory","updateURL","onHashChange","returnToOriginal","back","pushState","pathname","search","pswp","_fullscrenAPI","_controls","_captionContainer","_fakeCaptionContainer","_indexIndicator","_shareButton","_shareModal","_initalCloseOnScrollValue","_isIdle","_loadingIndicator","_loadingIndicatorHidden","_loadingIndicatorTimeout","_galleryHasOneSlide","_blockControlsTap","_idleInterval","_idleTimer","_overlayUIUpdated","_controlsVisible","_shareModalHidden","_defaultUIOptions","barsSize","closeElClasses","timeToIdle","timeToIdleOutside","loadingIndicatorDelay","addCaptionHTMLFn","captionEl","closeEl","fullscreenEl","zoomEl","shareEl","counterEl","arrowEl","preloaderEl","tapToClose","tapToToggleControls","clickToCloseNonZoomable","shareButtons","label","url","download","getImageURLForShare","getPageURLForShare","getTextForShare","indexIndicatorSep","fitControlsWidth","_onControlsTap","_onIdleMouseMove","uiElement","found","clickedClass","srcElement","_uiElements","onTap","tapDelay","_fitControlsInViewport","_togglePswpClass","cName","add","_countNumItems","hasOneSlide","_toggleShareModalClass","_toggleShareModal","_updateShareURLs","_openWindowPopup","hasAttribute","open","shareButtonData","image_url","page_url","share_text","shareButtonOut","encodeURIComponent","parseShareButtonOut","onclick","_hasCloseClass","_idleIncrement","setIdle","_onMouseLeaveWindow","from","relatedTarget","toElement","nodeName","_setupFullscreenAPI","getFullscreenAPI","eventK","updateFullscreen","_setupLoadingIndicator","_toggleLoadingIndicator","naturalWidth","hide","_applyNavBarGaps","gap","bars","insertBefore","captionSize","_setupIdle","_setupHidingControlsDuringGestures","pinchControlsHidden","hideControls","showControls","option","isFullscreen","exit","enter","_setupUIElements","classAttr","loopThroughChildElements","sChildren","topBar","point","preventObj","onGlobalTap","onMouseOver","removeChild","isIdle","updateIndexIndicator","supportsFullscreen","exitFullscreen","mozCancelFullScreen","webkitExitFullscreen","msExitFullscreen","api","dE","tF","requestFullscreen","enterK","exitK","elementK","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","Element","ALLOW_KEYBOARD_INPUT","querySelector","pswpLink","querySelectorAll","map","link","PhotoSwipeUIDefault"],"mappings":"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","file":"js/frontPictures-7c6c0db6b19ba5082811.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 = \"/packs/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 91);\n","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/*! PhotoSwipe - v4.1.3 - 2019-01-08\n* http://photoswipe.com\n* Copyright (c) 2019 Dmitry Semenov; */\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define(factory);\n } else if ((typeof exports === \"undefined\" ? \"undefined\" : _typeof(exports)) === 'object') {\n module.exports = factory();\n } else {\n root.PhotoSwipe = factory();\n }\n})(this, function () {\n 'use strict';\n\n var PhotoSwipe = function PhotoSwipe(template, UiClass, items, options) {\n /*>>framework-bridge*/\n\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 */\n var framework = {\n features: null,\n bind: function bind(target, type, listener, unbind) {\n var methodName = (unbind ? 'remove' : 'add') + 'EventListener';\n type = type.split(' ');\n\n for (var i = 0; i < type.length; i++) {\n if (type[i]) {\n target[methodName](type[i], listener, false);\n }\n }\n },\n isArray: function isArray(obj) {\n return obj instanceof Array;\n },\n createEl: function createEl(classes, tag) {\n var el = document.createElement(tag || 'div');\n\n if (classes) {\n el.className = classes;\n }\n\n return el;\n },\n getScrollY: function getScrollY() {\n var yOffset = window.pageYOffset;\n return yOffset !== undefined ? yOffset : document.documentElement.scrollTop;\n },\n unbind: function unbind(target, type, listener) {\n framework.bind(target, type, listener, true);\n },\n removeClass: function removeClass(el, className) {\n var reg = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)');\n el.className = el.className.replace(reg, ' ').replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n },\n addClass: function addClass(el, className) {\n if (!framework.hasClass(el, className)) {\n el.className += (el.className ? ' ' : '') + className;\n }\n },\n hasClass: function hasClass(el, className) {\n return el.className && new RegExp('(^|\\\\s)' + className + '(\\\\s|$)').test(el.className);\n },\n getChildByClass: function getChildByClass(parentEl, childClassName) {\n var node = parentEl.firstChild;\n\n while (node) {\n if (framework.hasClass(node, childClassName)) {\n return node;\n }\n\n node = node.nextSibling;\n }\n },\n arraySearch: function arraySearch(array, value, key) {\n var i = array.length;\n\n while (i--) {\n if (array[i][key] === value) {\n return i;\n }\n }\n\n return -1;\n },\n extend: function extend(o1, o2, preventOverwrite) {\n for (var prop in o2) {\n if (o2.hasOwnProperty(prop)) {\n if (preventOverwrite && o1.hasOwnProperty(prop)) {\n continue;\n }\n\n o1[prop] = o2[prop];\n }\n }\n },\n easing: {\n sine: {\n out: function out(k) {\n return Math.sin(k * (Math.PI / 2));\n },\n inOut: function inOut(k) {\n return -(Math.cos(Math.PI * k) - 1) / 2;\n }\n },\n cubic: {\n out: function out(k) {\n return --k * k * k + 1;\n }\n }\n /*\n \telastic: {\n \t\tout: function ( k ) {\n \t\t\t\tvar s, a = 0.1, p = 0.4;\n \t\t\tif ( k === 0 ) return 0;\n \t\t\tif ( k === 1 ) return 1;\n \t\t\tif ( !a || a < 1 ) { a = 1; s = p / 4; }\n \t\t\telse s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n \t\t\treturn ( a * Math.pow( 2, - 10 * k) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) + 1 );\n \t\t\t},\n \t},\n \tback: {\n \t\tout: function ( k ) {\n \t\t\tvar s = 1.70158;\n \t\t\treturn --k * k * ( ( s + 1 ) * k + s ) + 1;\n \t\t}\n \t}\n */\n\n },\n\n /**\n * \n * @return {object}\n * \n * {\n * raf : request animation frame function\n * caf : cancel animation frame function\n * transfrom : transform property key (with vendor), or null if not supported\n * oldIE : IE8 or below\n * }\n * \n */\n detectFeatures: function detectFeatures() {\n if (framework.features) {\n return framework.features;\n }\n\n var helperEl = framework.createEl(),\n helperStyle = helperEl.style,\n vendor = '',\n features = {}; // IE8 and below\n\n features.oldIE = document.all && !document.addEventListener;\n features.touch = 'ontouchstart' in window;\n\n if (window.requestAnimationFrame) {\n features.raf = window.requestAnimationFrame;\n features.caf = window.cancelAnimationFrame;\n }\n\n features.pointerEvent = !!window.PointerEvent || navigator.msPointerEnabled; // fix false-positive detection of old Android in new IE\n // (IE11 ua string contains \"Android 4.0\")\n\n if (!features.pointerEvent) {\n var ua = navigator.userAgent; // Detect if device is iPhone or iPod and if it's older than iOS 8\n // http://stackoverflow.com/a/14223920\n // \n // This detection is made because of buggy top/bottom toolbars\n // that don't trigger window.resize event.\n // For more info refer to _isFixedPosition variable in core.js\n\n if (/iP(hone|od)/.test(navigator.platform)) {\n var v = navigator.appVersion.match(/OS (\\d+)_(\\d+)_?(\\d+)?/);\n\n if (v && v.length > 0) {\n v = parseInt(v[1], 10);\n\n if (v >= 1 && v < 8) {\n features.isOldIOSPhone = true;\n }\n }\n } // Detect old Android (before KitKat)\n // due to bugs related to position:fixed\n // http://stackoverflow.com/questions/7184573/pick-up-the-android-version-in-the-browser-by-javascript\n\n\n var match = ua.match(/Android\\s([0-9\\.]*)/);\n var androidversion = match ? match[1] : 0;\n androidversion = parseFloat(androidversion);\n\n if (androidversion >= 1) {\n if (androidversion < 4.4) {\n features.isOldAndroid = true; // for fixed position bug & performance\n }\n\n features.androidVersion = androidversion; // for touchend bug\n }\n\n features.isMobileOpera = /opera mini|opera mobi/i.test(ua); // p.s. yes, yes, UA sniffing is bad, propose your solution for above bugs.\n }\n\n var styleChecks = ['transform', 'perspective', 'animationName'],\n vendors = ['', 'webkit', 'Moz', 'ms', 'O'],\n styleCheckItem,\n styleName;\n\n for (var i = 0; i < 4; i++) {\n vendor = vendors[i];\n\n for (var a = 0; a < 3; a++) {\n styleCheckItem = styleChecks[a]; // uppercase first letter of property name, if vendor is present\n\n styleName = vendor + (vendor ? styleCheckItem.charAt(0).toUpperCase() + styleCheckItem.slice(1) : styleCheckItem);\n\n if (!features[styleCheckItem] && styleName in helperStyle) {\n features[styleCheckItem] = styleName;\n }\n }\n\n if (vendor && !features.raf) {\n vendor = vendor.toLowerCase();\n features.raf = window[vendor + 'RequestAnimationFrame'];\n\n if (features.raf) {\n features.caf = window[vendor + 'CancelAnimationFrame'] || window[vendor + 'CancelRequestAnimationFrame'];\n }\n }\n }\n\n if (!features.raf) {\n var lastTime = 0;\n\n features.raf = function (fn) {\n var currTime = new Date().getTime();\n var timeToCall = Math.max(0, 16 - (currTime - lastTime));\n var id = window.setTimeout(function () {\n fn(currTime + timeToCall);\n }, timeToCall);\n lastTime = currTime + timeToCall;\n return id;\n };\n\n features.caf = function (id) {\n clearTimeout(id);\n };\n } // Detect SVG support\n\n\n features.svg = !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect;\n framework.features = features;\n return features;\n }\n };\n framework.detectFeatures(); // Override addEventListener for old versions of IE\n\n if (framework.features.oldIE) {\n framework.bind = function (target, type, listener, unbind) {\n type = type.split(' ');\n\n var methodName = (unbind ? 'detach' : 'attach') + 'Event',\n evName,\n _handleEv = function _handleEv() {\n listener.handleEvent.call(listener);\n };\n\n for (var i = 0; i < type.length; i++) {\n evName = type[i];\n\n if (evName) {\n if (_typeof(listener) === 'object' && listener.handleEvent) {\n if (!unbind) {\n listener['oldIE' + evName] = _handleEv;\n } else {\n if (!listener['oldIE' + evName]) {\n return false;\n }\n }\n\n target[methodName]('on' + evName, listener['oldIE' + evName]);\n } else {\n target[methodName]('on' + evName, listener);\n }\n }\n }\n };\n }\n /*>>framework-bridge*/\n\n /*>>core*/\n //function(template, UiClass, items, options)\n\n\n var self = this;\n /**\n * Static vars, don't change unless you know what you're doing.\n */\n\n var DOUBLE_TAP_RADIUS = 25,\n NUM_HOLDERS = 3;\n /**\n * Options\n */\n\n var _options = {\n allowPanToNext: true,\n spacing: 0.12,\n bgOpacity: 1,\n mouseUsed: false,\n loop: true,\n pinchToClose: true,\n closeOnScroll: true,\n closeOnVerticalDrag: true,\n verticalDragRange: 0.75,\n hideAnimationDuration: 333,\n showAnimationDuration: 333,\n showHideOpacity: false,\n focus: true,\n escKey: true,\n arrowKeys: true,\n mainScrollEndFriction: 0.35,\n panEndFriction: 0.35,\n isClickableElement: function isClickableElement(el) {\n return el.tagName === 'A';\n },\n getDoubleTapZoom: function getDoubleTapZoom(isMouseClick, item) {\n if (isMouseClick) {\n return 1;\n } else {\n return item.initialZoomLevel < 0.7 ? 1 : 1.33;\n }\n },\n maxSpreadZoom: 1.33,\n modal: true,\n // not fully implemented yet\n scaleMode: 'fit' // TODO\n\n };\n framework.extend(_options, options);\n /**\n * Private helper variables & functions\n */\n\n var _getEmptyPoint = function _getEmptyPoint() {\n return {\n x: 0,\n y: 0\n };\n };\n\n var _isOpen,\n _isDestroying,\n _closedByScroll,\n _currentItemIndex,\n _containerStyle,\n _containerShiftIndex,\n _currPanDist = _getEmptyPoint(),\n _startPanOffset = _getEmptyPoint(),\n _panOffset = _getEmptyPoint(),\n _upMoveEvents,\n // drag move, drag end & drag cancel events array\n _downEvents,\n // drag start events array\n _globalEventHandlers,\n _viewportSize = {},\n _currZoomLevel,\n _startZoomLevel,\n _translatePrefix,\n _translateSufix,\n _updateSizeInterval,\n _itemsNeedUpdate,\n _currPositionIndex = 0,\n _offset = {},\n _slideSize = _getEmptyPoint(),\n // size of slide area, including spacing\n _itemHolders,\n _prevItemIndex,\n _indexDiff = 0,\n // difference of indexes since last content update\n _dragStartEvent,\n _dragMoveEvent,\n _dragEndEvent,\n _dragCancelEvent,\n _transformKey,\n _pointerEventEnabled,\n _isFixedPosition = true,\n _likelyTouchDevice,\n _modules = [],\n _requestAF,\n _cancelAF,\n _initalClassName,\n _initalWindowScrollY,\n _oldIE,\n _currentWindowScrollY,\n _features,\n _windowVisibleSize = {},\n _renderMaxResolution = false,\n _orientationChangeTimeout,\n // Registers PhotoSWipe module (History, Controller ...)\n _registerModule = function _registerModule(name, module) {\n framework.extend(self, module.publicMethods);\n\n _modules.push(name);\n },\n _getLoopedId = function _getLoopedId(index) {\n var numSlides = _getNumItems();\n\n if (index > numSlides - 1) {\n return index - numSlides;\n } else if (index < 0) {\n return numSlides + index;\n }\n\n return index;\n },\n // Micro bind/trigger\n _listeners = {},\n _listen = function _listen(name, fn) {\n if (!_listeners[name]) {\n _listeners[name] = [];\n }\n\n return _listeners[name].push(fn);\n },\n _shout = function _shout(name) {\n var listeners = _listeners[name];\n\n if (listeners) {\n var args = Array.prototype.slice.call(arguments);\n args.shift();\n\n for (var i = 0; i < listeners.length; i++) {\n listeners[i].apply(self, args);\n }\n }\n },\n _getCurrentTime = function _getCurrentTime() {\n return new Date().getTime();\n },\n _applyBgOpacity = function _applyBgOpacity(opacity) {\n _bgOpacity = opacity;\n self.bg.style.opacity = opacity * _options.bgOpacity;\n },\n _applyZoomTransform = function _applyZoomTransform(styleObj, x, y, zoom, item) {\n if (!_renderMaxResolution || item && item !== self.currItem) {\n zoom = zoom / (item ? item.fitRatio : self.currItem.fitRatio);\n }\n\n styleObj[_transformKey] = _translatePrefix + x + 'px, ' + y + 'px' + _translateSufix + ' scale(' + zoom + ')';\n },\n _applyCurrentZoomPan = function _applyCurrentZoomPan(allowRenderResolution) {\n if (_currZoomElementStyle) {\n if (allowRenderResolution) {\n if (_currZoomLevel > self.currItem.fitRatio) {\n if (!_renderMaxResolution) {\n _setImageSize(self.currItem, false, true);\n\n _renderMaxResolution = true;\n }\n } else {\n if (_renderMaxResolution) {\n _setImageSize(self.currItem);\n\n _renderMaxResolution = false;\n }\n }\n }\n\n _applyZoomTransform(_currZoomElementStyle, _panOffset.x, _panOffset.y, _currZoomLevel);\n }\n },\n _applyZoomPanToItem = function _applyZoomPanToItem(item) {\n if (item.container) {\n _applyZoomTransform(item.container.style, item.initialPosition.x, item.initialPosition.y, item.initialZoomLevel, item);\n }\n },\n _setTranslateX = function _setTranslateX(x, elStyle) {\n elStyle[_transformKey] = _translatePrefix + x + 'px, 0px' + _translateSufix;\n },\n _moveMainScroll = function _moveMainScroll(x, dragging) {\n if (!_options.loop && dragging) {\n var newSlideIndexOffset = _currentItemIndex + (_slideSize.x * _currPositionIndex - x) / _slideSize.x,\n delta = Math.round(x - _mainScrollPos.x);\n\n if (newSlideIndexOffset < 0 && delta > 0 || newSlideIndexOffset >= _getNumItems() - 1 && delta < 0) {\n x = _mainScrollPos.x + delta * _options.mainScrollEndFriction;\n }\n }\n\n _mainScrollPos.x = x;\n\n _setTranslateX(x, _containerStyle);\n },\n _calculatePanOffset = function _calculatePanOffset(axis, zoomLevel) {\n var m = _midZoomPoint[axis] - _offset[axis];\n return _startPanOffset[axis] + _currPanDist[axis] + m - m * (zoomLevel / _startZoomLevel);\n },\n _equalizePoints = function _equalizePoints(p1, p2) {\n p1.x = p2.x;\n p1.y = p2.y;\n\n if (p2.id) {\n p1.id = p2.id;\n }\n },\n _roundPoint = function _roundPoint(p) {\n p.x = Math.round(p.x);\n p.y = Math.round(p.y);\n },\n _mouseMoveTimeout = null,\n _onFirstMouseMove = function _onFirstMouseMove() {\n // Wait until mouse move event is fired at least twice during 100ms\n // We do this, because some mobile browsers trigger it on touchstart\n if (_mouseMoveTimeout) {\n framework.unbind(document, 'mousemove', _onFirstMouseMove);\n framework.addClass(template, 'pswp--has_mouse');\n _options.mouseUsed = true;\n\n _shout('mouseUsed');\n }\n\n _mouseMoveTimeout = setTimeout(function () {\n _mouseMoveTimeout = null;\n }, 100);\n },\n _bindEvents = function _bindEvents() {\n framework.bind(document, 'keydown', self);\n\n if (_features.transform) {\n // don't bind click event in browsers that don't support transform (mostly IE8)\n framework.bind(self.scrollWrap, 'click', self);\n }\n\n if (!_options.mouseUsed) {\n framework.bind(document, 'mousemove', _onFirstMouseMove);\n }\n\n framework.bind(window, 'resize scroll orientationchange', self);\n\n _shout('bindEvents');\n },\n _unbindEvents = function _unbindEvents() {\n framework.unbind(window, 'resize scroll orientationchange', self);\n framework.unbind(window, 'scroll', _globalEventHandlers.scroll);\n framework.unbind(document, 'keydown', self);\n framework.unbind(document, 'mousemove', _onFirstMouseMove);\n\n if (_features.transform) {\n framework.unbind(self.scrollWrap, 'click', self);\n }\n\n if (_isDragging) {\n framework.unbind(window, _upMoveEvents, self);\n }\n\n clearTimeout(_orientationChangeTimeout);\n\n _shout('unbindEvents');\n },\n _calculatePanBounds = function _calculatePanBounds(zoomLevel, update) {\n var bounds = _calculateItemSize(self.currItem, _viewportSize, zoomLevel);\n\n if (update) {\n _currPanBounds = bounds;\n }\n\n return bounds;\n },\n _getMinZoomLevel = function _getMinZoomLevel(item) {\n if (!item) {\n item = self.currItem;\n }\n\n return item.initialZoomLevel;\n },\n _getMaxZoomLevel = function _getMaxZoomLevel(item) {\n if (!item) {\n item = self.currItem;\n }\n\n return item.w > 0 ? _options.maxSpreadZoom : 1;\n },\n // Return true if offset is out of the bounds\n _modifyDestPanOffset = function _modifyDestPanOffset(axis, destPanBounds, destPanOffset, destZoomLevel) {\n if (destZoomLevel === self.currItem.initialZoomLevel) {\n destPanOffset[axis] = self.currItem.initialPosition[axis];\n return true;\n } else {\n destPanOffset[axis] = _calculatePanOffset(axis, destZoomLevel);\n\n if (destPanOffset[axis] > destPanBounds.min[axis]) {\n destPanOffset[axis] = destPanBounds.min[axis];\n return true;\n } else if (destPanOffset[axis] < destPanBounds.max[axis]) {\n destPanOffset[axis] = destPanBounds.max[axis];\n return true;\n }\n }\n\n return false;\n },\n _setupTransforms = function _setupTransforms() {\n if (_transformKey) {\n // setup 3d transforms\n var allow3dTransform = _features.perspective && !_likelyTouchDevice;\n _translatePrefix = 'translate' + (allow3dTransform ? '3d(' : '(');\n _translateSufix = _features.perspective ? ', 0px)' : ')';\n return;\n } // Override zoom/pan/move functions in case old browser is used (most likely IE)\n // (so they use left/top/width/height, instead of CSS transform)\n\n\n _transformKey = 'left';\n framework.addClass(template, 'pswp--ie');\n\n _setTranslateX = function _setTranslateX(x, elStyle) {\n elStyle.left = x + 'px';\n };\n\n _applyZoomPanToItem = function _applyZoomPanToItem(item) {\n var zoomRatio = item.fitRatio > 1 ? 1 : item.fitRatio,\n s = item.container.style,\n w = zoomRatio * item.w,\n h = zoomRatio * item.h;\n s.width = w + 'px';\n s.height = h + 'px';\n s.left = item.initialPosition.x + 'px';\n s.top = item.initialPosition.y + 'px';\n };\n\n _applyCurrentZoomPan = function _applyCurrentZoomPan() {\n if (_currZoomElementStyle) {\n var s = _currZoomElementStyle,\n item = self.currItem,\n zoomRatio = item.fitRatio > 1 ? 1 : item.fitRatio,\n w = zoomRatio * item.w,\n h = zoomRatio * item.h;\n s.width = w + 'px';\n s.height = h + 'px';\n s.left = _panOffset.x + 'px';\n s.top = _panOffset.y + 'px';\n }\n };\n },\n _onKeyDown = function _onKeyDown(e) {\n var keydownAction = '';\n\n if (_options.escKey && e.keyCode === 27) {\n keydownAction = 'close';\n } else if (_options.arrowKeys) {\n if (e.keyCode === 37) {\n keydownAction = 'prev';\n } else if (e.keyCode === 39) {\n keydownAction = 'next';\n }\n }\n\n if (keydownAction) {\n // don't do anything if special key pressed to prevent from overriding default browser actions\n // e.g. in Chrome on Mac cmd+arrow-left returns to previous page\n if (!e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) {\n if (e.preventDefault) {\n e.preventDefault();\n } else {\n e.returnValue = false;\n }\n\n self[keydownAction]();\n }\n }\n },\n _onGlobalClick = function _onGlobalClick(e) {\n if (!e) {\n return;\n } // don't allow click event to pass through when triggering after drag or some other gesture\n\n\n if (_moved || _zoomStarted || _mainScrollAnimating || _verticalDragInitiated) {\n e.preventDefault();\n e.stopPropagation();\n }\n },\n _updatePageScrollOffset = function _updatePageScrollOffset() {\n self.setScrollOffset(0, framework.getScrollY());\n }; // Micro animation engine\n\n\n var _animations = {},\n _numAnimations = 0,\n _stopAnimation = function _stopAnimation(name) {\n if (_animations[name]) {\n if (_animations[name].raf) {\n _cancelAF(_animations[name].raf);\n }\n\n _numAnimations--;\n delete _animations[name];\n }\n },\n _registerStartAnimation = function _registerStartAnimation(name) {\n if (_animations[name]) {\n _stopAnimation(name);\n }\n\n if (!_animations[name]) {\n _numAnimations++;\n _animations[name] = {};\n }\n },\n _stopAllAnimations = function _stopAllAnimations() {\n for (var prop in _animations) {\n if (_animations.hasOwnProperty(prop)) {\n _stopAnimation(prop);\n }\n }\n },\n _animateProp = function _animateProp(name, b, endProp, d, easingFn, onUpdate, onComplete) {\n var startAnimTime = _getCurrentTime(),\n t;\n\n _registerStartAnimation(name);\n\n var animloop = function animloop() {\n if (_animations[name]) {\n t = _getCurrentTime() - startAnimTime; // time diff\n //b - beginning (start prop)\n //d - anim duration\n\n if (t >= d) {\n _stopAnimation(name);\n\n onUpdate(endProp);\n\n if (onComplete) {\n onComplete();\n }\n\n return;\n }\n\n onUpdate((endProp - b) * easingFn(t / d) + b);\n _animations[name].raf = _requestAF(animloop);\n }\n };\n\n animloop();\n };\n\n var publicMethods = {\n // make a few local variables and functions public\n shout: _shout,\n listen: _listen,\n viewportSize: _viewportSize,\n options: _options,\n isMainScrollAnimating: function isMainScrollAnimating() {\n return _mainScrollAnimating;\n },\n getZoomLevel: function getZoomLevel() {\n return _currZoomLevel;\n },\n getCurrentIndex: function getCurrentIndex() {\n return _currentItemIndex;\n },\n isDragging: function isDragging() {\n return _isDragging;\n },\n isZooming: function isZooming() {\n return _isZooming;\n },\n setScrollOffset: function setScrollOffset(x, y) {\n _offset.x = x;\n _currentWindowScrollY = _offset.y = y;\n\n _shout('updateScrollOffset', _offset);\n },\n applyZoomPan: function applyZoomPan(zoomLevel, panX, panY, allowRenderResolution) {\n _panOffset.x = panX;\n _panOffset.y = panY;\n _currZoomLevel = zoomLevel;\n\n _applyCurrentZoomPan(allowRenderResolution);\n },\n init: function init() {\n if (_isOpen || _isDestroying) {\n return;\n }\n\n var i;\n self.framework = framework; // basic functionality\n\n self.template = template; // root DOM element of PhotoSwipe\n\n self.bg = framework.getChildByClass(template, 'pswp__bg');\n _initalClassName = template.className;\n _isOpen = true;\n _features = framework.detectFeatures();\n _requestAF = _features.raf;\n _cancelAF = _features.caf;\n _transformKey = _features.transform;\n _oldIE = _features.oldIE;\n self.scrollWrap = framework.getChildByClass(template, 'pswp__scroll-wrap');\n self.container = framework.getChildByClass(self.scrollWrap, 'pswp__container');\n _containerStyle = self.container.style; // for fast access\n // Objects that hold slides (there are only 3 in DOM)\n\n self.itemHolders = _itemHolders = [{\n el: self.container.children[0],\n wrap: 0,\n index: -1\n }, {\n el: self.container.children[1],\n wrap: 0,\n index: -1\n }, {\n el: self.container.children[2],\n wrap: 0,\n index: -1\n }]; // hide nearby item holders until initial zoom animation finishes (to avoid extra Paints)\n\n _itemHolders[0].el.style.display = _itemHolders[2].el.style.display = 'none';\n\n _setupTransforms(); // Setup global events\n\n\n _globalEventHandlers = {\n resize: self.updateSize,\n // Fixes: iOS 10.3 resize event\n // does not update scrollWrap.clientWidth instantly after resize\n // https://github.com/dimsemenov/PhotoSwipe/issues/1315\n orientationchange: function orientationchange() {\n clearTimeout(_orientationChangeTimeout);\n _orientationChangeTimeout = setTimeout(function () {\n if (_viewportSize.x !== self.scrollWrap.clientWidth) {\n self.updateSize();\n }\n }, 500);\n },\n scroll: _updatePageScrollOffset,\n keydown: _onKeyDown,\n click: _onGlobalClick\n }; // disable show/hide effects on old browsers that don't support CSS animations or transforms, \n // old IOS, Android and Opera mobile. Blackberry seems to work fine, even older models.\n\n var oldPhone = _features.isOldIOSPhone || _features.isOldAndroid || _features.isMobileOpera;\n\n if (!_features.animationName || !_features.transform || oldPhone) {\n _options.showAnimationDuration = _options.hideAnimationDuration = 0;\n } // init modules\n\n\n for (i = 0; i < _modules.length; i++) {\n self['init' + _modules[i]]();\n } // init\n\n\n if (UiClass) {\n var ui = self.ui = new UiClass(self, framework);\n ui.init();\n }\n\n _shout('firstUpdate');\n\n _currentItemIndex = _currentItemIndex || _options.index || 0; // validate index\n\n if (isNaN(_currentItemIndex) || _currentItemIndex < 0 || _currentItemIndex >= _getNumItems()) {\n _currentItemIndex = 0;\n }\n\n self.currItem = _getItemAt(_currentItemIndex);\n\n if (_features.isOldIOSPhone || _features.isOldAndroid) {\n _isFixedPosition = false;\n }\n\n template.setAttribute('aria-hidden', 'false');\n\n if (_options.modal) {\n if (!_isFixedPosition) {\n template.style.position = 'absolute';\n template.style.top = framework.getScrollY() + 'px';\n } else {\n template.style.position = 'fixed';\n }\n }\n\n if (_currentWindowScrollY === undefined) {\n _shout('initialLayout');\n\n _currentWindowScrollY = _initalWindowScrollY = framework.getScrollY();\n } // add classes to root element of PhotoSwipe\n\n\n var rootClasses = 'pswp--open ';\n\n if (_options.mainClass) {\n rootClasses += _options.mainClass + ' ';\n }\n\n if (_options.showHideOpacity) {\n rootClasses += 'pswp--animate_opacity ';\n }\n\n rootClasses += _likelyTouchDevice ? 'pswp--touch' : 'pswp--notouch';\n rootClasses += _features.animationName ? ' pswp--css_animation' : '';\n rootClasses += _features.svg ? ' pswp--svg' : '';\n framework.addClass(template, rootClasses);\n self.updateSize(); // initial update\n\n _containerShiftIndex = -1;\n _indexDiff = null;\n\n for (i = 0; i < NUM_HOLDERS; i++) {\n _setTranslateX((i + _containerShiftIndex) * _slideSize.x, _itemHolders[i].el.style);\n }\n\n if (!_oldIE) {\n framework.bind(self.scrollWrap, _downEvents, self); // no dragging for old IE\n }\n\n _listen('initialZoomInEnd', function () {\n self.setContent(_itemHolders[0], _currentItemIndex - 1);\n self.setContent(_itemHolders[2], _currentItemIndex + 1);\n _itemHolders[0].el.style.display = _itemHolders[2].el.style.display = 'block';\n\n if (_options.focus) {\n // focus causes layout, \n // which causes lag during the animation, \n // that's why we delay it untill the initial zoom transition ends\n template.focus();\n }\n\n _bindEvents();\n }); // set content for center slide (first time)\n\n\n self.setContent(_itemHolders[1], _currentItemIndex);\n self.updateCurrItem();\n\n _shout('afterInit');\n\n if (!_isFixedPosition) {\n // On all versions of iOS lower than 8.0, we check size of viewport every second.\n // \n // This is done to detect when Safari top & bottom bars appear, \n // as this action doesn't trigger any events (like resize). \n // \n // On iOS8 they fixed this.\n // \n // 10 Nov 2014: iOS 7 usage ~40%. iOS 8 usage 56%.\n _updateSizeInterval = setInterval(function () {\n if (!_numAnimations && !_isDragging && !_isZooming && _currZoomLevel === self.currItem.initialZoomLevel) {\n self.updateSize();\n }\n }, 1000);\n }\n\n framework.addClass(template, 'pswp--visible');\n },\n // Close the gallery, then destroy it\n close: function close() {\n if (!_isOpen) {\n return;\n }\n\n _isOpen = false;\n _isDestroying = true;\n\n _shout('close');\n\n _unbindEvents();\n\n _showOrHide(self.currItem, null, true, self.destroy);\n },\n // destroys the gallery (unbinds events, cleans up intervals and timeouts to avoid memory leaks)\n destroy: function destroy() {\n _shout('destroy');\n\n if (_showOrHideTimeout) {\n clearTimeout(_showOrHideTimeout);\n }\n\n template.setAttribute('aria-hidden', 'true');\n template.className = _initalClassName;\n\n if (_updateSizeInterval) {\n clearInterval(_updateSizeInterval);\n }\n\n framework.unbind(self.scrollWrap, _downEvents, self); // we unbind scroll event at the end, as closing animation may depend on it\n\n framework.unbind(window, 'scroll', self);\n\n _stopDragUpdateLoop();\n\n _stopAllAnimations();\n\n _listeners = null;\n },\n\n /**\n * Pan image to position\n * @param {Number} x \n * @param {Number} y \n * @param {Boolean} force Will ignore bounds if set to true.\n */\n panTo: function panTo(x, y, force) {\n if (!force) {\n if (x > _currPanBounds.min.x) {\n x = _currPanBounds.min.x;\n } else if (x < _currPanBounds.max.x) {\n x = _currPanBounds.max.x;\n }\n\n if (y > _currPanBounds.min.y) {\n y = _currPanBounds.min.y;\n } else if (y < _currPanBounds.max.y) {\n y = _currPanBounds.max.y;\n }\n }\n\n _panOffset.x = x;\n _panOffset.y = y;\n\n _applyCurrentZoomPan();\n },\n handleEvent: function handleEvent(e) {\n e = e || window.event;\n\n if (_globalEventHandlers[e.type]) {\n _globalEventHandlers[e.type](e);\n }\n },\n goTo: function goTo(index) {\n index = _getLoopedId(index);\n var diff = index - _currentItemIndex;\n _indexDiff = diff;\n _currentItemIndex = index;\n self.currItem = _getItemAt(_currentItemIndex);\n _currPositionIndex -= diff;\n\n _moveMainScroll(_slideSize.x * _currPositionIndex);\n\n _stopAllAnimations();\n\n _mainScrollAnimating = false;\n self.updateCurrItem();\n },\n next: function next() {\n self.goTo(_currentItemIndex + 1);\n },\n prev: function prev() {\n self.goTo(_currentItemIndex - 1);\n },\n // update current zoom/pan objects\n updateCurrZoomItem: function updateCurrZoomItem(emulateSetContent) {\n if (emulateSetContent) {\n _shout('beforeChange', 0);\n } // itemHolder[1] is middle (current) item\n\n\n if (_itemHolders[1].el.children.length) {\n var zoomElement = _itemHolders[1].el.children[0];\n\n if (framework.hasClass(zoomElement, 'pswp__zoom-wrap')) {\n _currZoomElementStyle = zoomElement.style;\n } else {\n _currZoomElementStyle = null;\n }\n } else {\n _currZoomElementStyle = null;\n }\n\n _currPanBounds = self.currItem.bounds;\n _startZoomLevel = _currZoomLevel = self.currItem.initialZoomLevel;\n _panOffset.x = _currPanBounds.center.x;\n _panOffset.y = _currPanBounds.center.y;\n\n if (emulateSetContent) {\n _shout('afterChange');\n }\n },\n invalidateCurrItems: function invalidateCurrItems() {\n _itemsNeedUpdate = true;\n\n for (var i = 0; i < NUM_HOLDERS; i++) {\n if (_itemHolders[i].item) {\n _itemHolders[i].item.needsUpdate = true;\n }\n }\n },\n updateCurrItem: function updateCurrItem(beforeAnimation) {\n if (_indexDiff === 0) {\n return;\n }\n\n var diffAbs = Math.abs(_indexDiff),\n tempHolder;\n\n if (beforeAnimation && diffAbs < 2) {\n return;\n }\n\n self.currItem = _getItemAt(_currentItemIndex);\n _renderMaxResolution = false;\n\n _shout('beforeChange', _indexDiff);\n\n if (diffAbs >= NUM_HOLDERS) {\n _containerShiftIndex += _indexDiff + (_indexDiff > 0 ? -NUM_HOLDERS : NUM_HOLDERS);\n diffAbs = NUM_HOLDERS;\n }\n\n for (var i = 0; i < diffAbs; i++) {\n if (_indexDiff > 0) {\n tempHolder = _itemHolders.shift();\n _itemHolders[NUM_HOLDERS - 1] = tempHolder; // move first to last\n\n _containerShiftIndex++;\n\n _setTranslateX((_containerShiftIndex + 2) * _slideSize.x, tempHolder.el.style);\n\n self.setContent(tempHolder, _currentItemIndex - diffAbs + i + 1 + 1);\n } else {\n tempHolder = _itemHolders.pop();\n\n _itemHolders.unshift(tempHolder); // move last to first\n\n\n _containerShiftIndex--;\n\n _setTranslateX(_containerShiftIndex * _slideSize.x, tempHolder.el.style);\n\n self.setContent(tempHolder, _currentItemIndex + diffAbs - i - 1 - 1);\n }\n } // reset zoom/pan on previous item\n\n\n if (_currZoomElementStyle && Math.abs(_indexDiff) === 1) {\n var prevItem = _getItemAt(_prevItemIndex);\n\n if (prevItem.initialZoomLevel !== _currZoomLevel) {\n _calculateItemSize(prevItem, _viewportSize);\n\n _setImageSize(prevItem);\n\n _applyZoomPanToItem(prevItem);\n }\n } // reset diff after update\n\n\n _indexDiff = 0;\n self.updateCurrZoomItem();\n _prevItemIndex = _currentItemIndex;\n\n _shout('afterChange');\n },\n updateSize: function updateSize(force) {\n if (!_isFixedPosition && _options.modal) {\n var windowScrollY = framework.getScrollY();\n\n if (_currentWindowScrollY !== windowScrollY) {\n template.style.top = windowScrollY + 'px';\n _currentWindowScrollY = windowScrollY;\n }\n\n if (!force && _windowVisibleSize.x === window.innerWidth && _windowVisibleSize.y === window.innerHeight) {\n return;\n }\n\n _windowVisibleSize.x = window.innerWidth;\n _windowVisibleSize.y = window.innerHeight; //template.style.width = _windowVisibleSize.x + 'px';\n\n template.style.height = _windowVisibleSize.y + 'px';\n }\n\n _viewportSize.x = self.scrollWrap.clientWidth;\n _viewportSize.y = self.scrollWrap.clientHeight;\n\n _updatePageScrollOffset();\n\n _slideSize.x = _viewportSize.x + Math.round(_viewportSize.x * _options.spacing);\n _slideSize.y = _viewportSize.y;\n\n _moveMainScroll(_slideSize.x * _currPositionIndex);\n\n _shout('beforeResize'); // even may be used for example to switch image sources\n // don't re-calculate size on inital size update\n\n\n if (_containerShiftIndex !== undefined) {\n var holder, item, hIndex;\n\n for (var i = 0; i < NUM_HOLDERS; i++) {\n holder = _itemHolders[i];\n\n _setTranslateX((i + _containerShiftIndex) * _slideSize.x, holder.el.style);\n\n hIndex = _currentItemIndex + i - 1;\n\n if (_options.loop && _getNumItems() > 2) {\n hIndex = _getLoopedId(hIndex);\n } // update zoom level on items and refresh source (if needsUpdate)\n\n\n item = _getItemAt(hIndex); // re-render gallery item if `needsUpdate`,\n // or doesn't have `bounds` (entirely new slide object)\n\n if (item && (_itemsNeedUpdate || item.needsUpdate || !item.bounds)) {\n self.cleanSlide(item);\n self.setContent(holder, hIndex); // if \"center\" slide\n\n if (i === 1) {\n self.currItem = item;\n self.updateCurrZoomItem(true);\n }\n\n item.needsUpdate = false;\n } else if (holder.index === -1 && hIndex >= 0) {\n // add content first time\n self.setContent(holder, hIndex);\n }\n\n if (item && item.container) {\n _calculateItemSize(item, _viewportSize);\n\n _setImageSize(item);\n\n _applyZoomPanToItem(item);\n }\n }\n\n _itemsNeedUpdate = false;\n }\n\n _startZoomLevel = _currZoomLevel = self.currItem.initialZoomLevel;\n _currPanBounds = self.currItem.bounds;\n\n if (_currPanBounds) {\n _panOffset.x = _currPanBounds.center.x;\n _panOffset.y = _currPanBounds.center.y;\n\n _applyCurrentZoomPan(true);\n }\n\n _shout('resize');\n },\n // Zoom current item to\n zoomTo: function zoomTo(destZoomLevel, centerPoint, speed, easingFn, updateFn) {\n /*\n \tif(destZoomLevel === 'fit') {\n \t\tdestZoomLevel = self.currItem.fitRatio;\n \t} else if(destZoomLevel === 'fill') {\n \t\tdestZoomLevel = self.currItem.fillRatio;\n \t}\n */\n if (centerPoint) {\n _startZoomLevel = _currZoomLevel;\n _midZoomPoint.x = Math.abs(centerPoint.x) - _panOffset.x;\n _midZoomPoint.y = Math.abs(centerPoint.y) - _panOffset.y;\n\n _equalizePoints(_startPanOffset, _panOffset);\n }\n\n var destPanBounds = _calculatePanBounds(destZoomLevel, false),\n destPanOffset = {};\n\n _modifyDestPanOffset('x', destPanBounds, destPanOffset, destZoomLevel);\n\n _modifyDestPanOffset('y', destPanBounds, destPanOffset, destZoomLevel);\n\n var initialZoomLevel = _currZoomLevel;\n var initialPanOffset = {\n x: _panOffset.x,\n y: _panOffset.y\n };\n\n _roundPoint(destPanOffset);\n\n var onUpdate = function onUpdate(now) {\n if (now === 1) {\n _currZoomLevel = destZoomLevel;\n _panOffset.x = destPanOffset.x;\n _panOffset.y = destPanOffset.y;\n } else {\n _currZoomLevel = (destZoomLevel - initialZoomLevel) * now + initialZoomLevel;\n _panOffset.x = (destPanOffset.x - initialPanOffset.x) * now + initialPanOffset.x;\n _panOffset.y = (destPanOffset.y - initialPanOffset.y) * now + initialPanOffset.y;\n }\n\n if (updateFn) {\n updateFn(now);\n }\n\n _applyCurrentZoomPan(now === 1);\n };\n\n if (speed) {\n _animateProp('customZoomTo', 0, 1, speed, easingFn || framework.easing.sine.inOut, onUpdate);\n } else {\n onUpdate(1);\n }\n }\n };\n /*>>core*/\n\n /*>>gestures*/\n\n /**\n * Mouse/touch/pointer event handlers.\n * \n * separated from @core.js for readability\n */\n\n var MIN_SWIPE_DISTANCE = 30,\n DIRECTION_CHECK_OFFSET = 10; // amount of pixels to drag to determine direction of swipe\n\n var _gestureStartTime,\n _gestureCheckSpeedTime,\n // pool of objects that are used during dragging of zooming\n p = {},\n // first point\n p2 = {},\n // second point (for zoom gesture)\n delta = {},\n _currPoint = {},\n _startPoint = {},\n _currPointers = [],\n _startMainScrollPos = {},\n _releaseAnimData,\n _posPoints = [],\n // array of points during dragging, used to determine type of gesture\n _tempPoint = {},\n _isZoomingIn,\n _verticalDragInitiated,\n _oldAndroidTouchEndTimeout,\n _currZoomedItemIndex = 0,\n _centerPoint = _getEmptyPoint(),\n _lastReleaseTime = 0,\n _isDragging,\n // at least one pointer is down\n _isMultitouch,\n // at least two _pointers are down\n _zoomStarted,\n // zoom level changed during zoom gesture\n _moved,\n _dragAnimFrame,\n _mainScrollShifted,\n _currentPoints,\n // array of current touch points\n _isZooming,\n _currPointsDistance,\n _startPointsDistance,\n _currPanBounds,\n _mainScrollPos = _getEmptyPoint(),\n _currZoomElementStyle,\n _mainScrollAnimating,\n // true, if animation after swipe gesture is running\n _midZoomPoint = _getEmptyPoint(),\n _currCenterPoint = _getEmptyPoint(),\n _direction,\n _isFirstMove,\n _opacityChanged,\n _bgOpacity,\n _wasOverInitialZoom,\n _isEqualPoints = function _isEqualPoints(p1, p2) {\n return p1.x === p2.x && p1.y === p2.y;\n },\n _isNearbyPoints = function _isNearbyPoints(touch0, touch1) {\n return Math.abs(touch0.x - touch1.x) < DOUBLE_TAP_RADIUS && Math.abs(touch0.y - touch1.y) < DOUBLE_TAP_RADIUS;\n },\n _calculatePointsDistance = function _calculatePointsDistance(p1, p2) {\n _tempPoint.x = Math.abs(p1.x - p2.x);\n _tempPoint.y = Math.abs(p1.y - p2.y);\n return Math.sqrt(_tempPoint.x * _tempPoint.x + _tempPoint.y * _tempPoint.y);\n },\n _stopDragUpdateLoop = function _stopDragUpdateLoop() {\n if (_dragAnimFrame) {\n _cancelAF(_dragAnimFrame);\n\n _dragAnimFrame = null;\n }\n },\n _dragUpdateLoop = function _dragUpdateLoop() {\n if (_isDragging) {\n _dragAnimFrame = _requestAF(_dragUpdateLoop);\n\n _renderMovement();\n }\n },\n _canPan = function _canPan() {\n return !(_options.scaleMode === 'fit' && _currZoomLevel === self.currItem.initialZoomLevel);\n },\n // find the closest parent DOM element\n _closestElement = function _closestElement(el, fn) {\n if (!el || el === document) {\n return false;\n } // don't search elements above pswp__scroll-wrap\n\n\n if (el.getAttribute('class') && el.getAttribute('class').indexOf('pswp__scroll-wrap') > -1) {\n return false;\n }\n\n if (fn(el)) {\n return el;\n }\n\n return _closestElement(el.parentNode, fn);\n },\n _preventObj = {},\n _preventDefaultEventBehaviour = function _preventDefaultEventBehaviour(e, isDown) {\n _preventObj.prevent = !_closestElement(e.target, _options.isClickableElement);\n\n _shout('preventDragEvent', e, isDown, _preventObj);\n\n return _preventObj.prevent;\n },\n _convertTouchToPoint = function _convertTouchToPoint(touch, p) {\n p.x = touch.pageX;\n p.y = touch.pageY;\n p.id = touch.identifier;\n return p;\n },\n _findCenterOfPoints = function _findCenterOfPoints(p1, p2, pCenter) {\n pCenter.x = (p1.x + p2.x) * 0.5;\n pCenter.y = (p1.y + p2.y) * 0.5;\n },\n _pushPosPoint = function _pushPosPoint(time, x, y) {\n if (time - _gestureCheckSpeedTime > 50) {\n var o = _posPoints.length > 2 ? _posPoints.shift() : {};\n o.x = x;\n o.y = y;\n\n _posPoints.push(o);\n\n _gestureCheckSpeedTime = time;\n }\n },\n _calculateVerticalDragOpacityRatio = function _calculateVerticalDragOpacityRatio() {\n var yOffset = _panOffset.y - self.currItem.initialPosition.y; // difference between initial and current position\n\n return 1 - Math.abs(yOffset / (_viewportSize.y / 2));\n },\n // points pool, reused during touch events\n _ePoint1 = {},\n _ePoint2 = {},\n _tempPointsArr = [],\n _tempCounter,\n _getTouchPoints = function _getTouchPoints(e) {\n // clean up previous points, without recreating array\n while (_tempPointsArr.length > 0) {\n _tempPointsArr.pop();\n }\n\n if (!_pointerEventEnabled) {\n if (e.type.indexOf('touch') > -1) {\n if (e.touches && e.touches.length > 0) {\n _tempPointsArr[0] = _convertTouchToPoint(e.touches[0], _ePoint1);\n\n if (e.touches.length > 1) {\n _tempPointsArr[1] = _convertTouchToPoint(e.touches[1], _ePoint2);\n }\n }\n } else {\n _ePoint1.x = e.pageX;\n _ePoint1.y = e.pageY;\n _ePoint1.id = '';\n _tempPointsArr[0] = _ePoint1; //_ePoint1;\n }\n } else {\n _tempCounter = 0; // we can use forEach, as pointer events are supported only in modern browsers\n\n _currPointers.forEach(function (p) {\n if (_tempCounter === 0) {\n _tempPointsArr[0] = p;\n } else if (_tempCounter === 1) {\n _tempPointsArr[1] = p;\n }\n\n _tempCounter++;\n });\n }\n\n return _tempPointsArr;\n },\n _panOrMoveMainScroll = function _panOrMoveMainScroll(axis, delta) {\n var panFriction,\n overDiff = 0,\n newOffset = _panOffset[axis] + delta[axis],\n startOverDiff,\n dir = delta[axis] > 0,\n newMainScrollPosition = _mainScrollPos.x + delta.x,\n mainScrollDiff = _mainScrollPos.x - _startMainScrollPos.x,\n newPanPos,\n newMainScrollPos; // calculate fdistance over the bounds and friction\n\n if (newOffset > _currPanBounds.min[axis] || newOffset < _currPanBounds.max[axis]) {\n panFriction = _options.panEndFriction; // Linear increasing of friction, so at 1/4 of viewport it's at max value. \n // Looks not as nice as was expected. Left for history.\n // panFriction = (1 - (_panOffset[axis] + delta[axis] + panBounds.min[axis]) / (_viewportSize[axis] / 4) );\n } else {\n panFriction = 1;\n }\n\n newOffset = _panOffset[axis] + delta[axis] * panFriction; // move main scroll or start panning\n\n if (_options.allowPanToNext || _currZoomLevel === self.currItem.initialZoomLevel) {\n if (!_currZoomElementStyle) {\n newMainScrollPos = newMainScrollPosition;\n } else if (_direction === 'h' && axis === 'x' && !_zoomStarted) {\n if (dir) {\n if (newOffset > _currPanBounds.min[axis]) {\n panFriction = _options.panEndFriction;\n overDiff = _currPanBounds.min[axis] - newOffset;\n startOverDiff = _currPanBounds.min[axis] - _startPanOffset[axis];\n } // drag right\n\n\n if ((startOverDiff <= 0 || mainScrollDiff < 0) && _getNumItems() > 1) {\n newMainScrollPos = newMainScrollPosition;\n\n if (mainScrollDiff < 0 && newMainScrollPosition > _startMainScrollPos.x) {\n newMainScrollPos = _startMainScrollPos.x;\n }\n } else {\n if (_currPanBounds.min.x !== _currPanBounds.max.x) {\n newPanPos = newOffset;\n }\n }\n } else {\n if (newOffset < _currPanBounds.max[axis]) {\n panFriction = _options.panEndFriction;\n overDiff = newOffset - _currPanBounds.max[axis];\n startOverDiff = _startPanOffset[axis] - _currPanBounds.max[axis];\n }\n\n if ((startOverDiff <= 0 || mainScrollDiff > 0) && _getNumItems() > 1) {\n newMainScrollPos = newMainScrollPosition;\n\n if (mainScrollDiff > 0 && newMainScrollPosition < _startMainScrollPos.x) {\n newMainScrollPos = _startMainScrollPos.x;\n }\n } else {\n if (_currPanBounds.min.x !== _currPanBounds.max.x) {\n newPanPos = newOffset;\n }\n }\n } //\n\n }\n\n if (axis === 'x') {\n if (newMainScrollPos !== undefined) {\n _moveMainScroll(newMainScrollPos, true);\n\n if (newMainScrollPos === _startMainScrollPos.x) {\n _mainScrollShifted = false;\n } else {\n _mainScrollShifted = true;\n }\n }\n\n if (_currPanBounds.min.x !== _currPanBounds.max.x) {\n if (newPanPos !== undefined) {\n _panOffset.x = newPanPos;\n } else if (!_mainScrollShifted) {\n _panOffset.x += delta.x * panFriction;\n }\n }\n\n return newMainScrollPos !== undefined;\n }\n }\n\n if (!_mainScrollAnimating) {\n if (!_mainScrollShifted) {\n if (_currZoomLevel > self.currItem.fitRatio) {\n _panOffset[axis] += delta[axis] * panFriction;\n }\n }\n }\n },\n // Pointerdown/touchstart/mousedown handler\n _onDragStart = function _onDragStart(e) {\n // Allow dragging only via left mouse button.\n // As this handler is not added in IE8 - we ignore e.which\n // \n // http://www.quirksmode.org/js/events_properties.html\n // https://developer.mozilla.org/en-US/docs/Web/API/event.button\n if (e.type === 'mousedown' && e.button > 0) {\n return;\n }\n\n if (_initialZoomRunning) {\n e.preventDefault();\n return;\n }\n\n if (_oldAndroidTouchEndTimeout && e.type === 'mousedown') {\n return;\n }\n\n if (_preventDefaultEventBehaviour(e, true)) {\n e.preventDefault();\n }\n\n _shout('pointerDown');\n\n if (_pointerEventEnabled) {\n var pointerIndex = framework.arraySearch(_currPointers, e.pointerId, 'id');\n\n if (pointerIndex < 0) {\n pointerIndex = _currPointers.length;\n }\n\n _currPointers[pointerIndex] = {\n x: e.pageX,\n y: e.pageY,\n id: e.pointerId\n };\n }\n\n var startPointsList = _getTouchPoints(e),\n numPoints = startPointsList.length;\n\n _currentPoints = null;\n\n _stopAllAnimations(); // init drag\n\n\n if (!_isDragging || numPoints === 1) {\n _isDragging = _isFirstMove = true;\n framework.bind(window, _upMoveEvents, self);\n _isZoomingIn = _wasOverInitialZoom = _opacityChanged = _verticalDragInitiated = _mainScrollShifted = _moved = _isMultitouch = _zoomStarted = false;\n _direction = null;\n\n _shout('firstTouchStart', startPointsList);\n\n _equalizePoints(_startPanOffset, _panOffset);\n\n _currPanDist.x = _currPanDist.y = 0;\n\n _equalizePoints(_currPoint, startPointsList[0]);\n\n _equalizePoints(_startPoint, _currPoint); //_equalizePoints(_startMainScrollPos, _mainScrollPos);\n\n\n _startMainScrollPos.x = _slideSize.x * _currPositionIndex;\n _posPoints = [{\n x: _currPoint.x,\n y: _currPoint.y\n }];\n _gestureCheckSpeedTime = _gestureStartTime = _getCurrentTime(); //_mainScrollAnimationEnd(true);\n\n _calculatePanBounds(_currZoomLevel, true); // Start rendering\n\n\n _stopDragUpdateLoop();\n\n _dragUpdateLoop();\n } // init zoom\n\n\n if (!_isZooming && numPoints > 1 && !_mainScrollAnimating && !_mainScrollShifted) {\n _startZoomLevel = _currZoomLevel;\n _zoomStarted = false; // true if zoom changed at least once\n\n _isZooming = _isMultitouch = true;\n _currPanDist.y = _currPanDist.x = 0;\n\n _equalizePoints(_startPanOffset, _panOffset);\n\n _equalizePoints(p, startPointsList[0]);\n\n _equalizePoints(p2, startPointsList[1]);\n\n _findCenterOfPoints(p, p2, _currCenterPoint);\n\n _midZoomPoint.x = Math.abs(_currCenterPoint.x) - _panOffset.x;\n _midZoomPoint.y = Math.abs(_currCenterPoint.y) - _panOffset.y;\n _currPointsDistance = _startPointsDistance = _calculatePointsDistance(p, p2);\n }\n },\n // Pointermove/touchmove/mousemove handler\n _onDragMove = function _onDragMove(e) {\n e.preventDefault();\n\n if (_pointerEventEnabled) {\n var pointerIndex = framework.arraySearch(_currPointers, e.pointerId, 'id');\n\n if (pointerIndex > -1) {\n var p = _currPointers[pointerIndex];\n p.x = e.pageX;\n p.y = e.pageY;\n }\n }\n\n if (_isDragging) {\n var touchesList = _getTouchPoints(e);\n\n if (!_direction && !_moved && !_isZooming) {\n if (_mainScrollPos.x !== _slideSize.x * _currPositionIndex) {\n // if main scroll position is shifted – direction is always horizontal\n _direction = 'h';\n } else {\n var diff = Math.abs(touchesList[0].x - _currPoint.x) - Math.abs(touchesList[0].y - _currPoint.y); // check the direction of movement\n\n if (Math.abs(diff) >= DIRECTION_CHECK_OFFSET) {\n _direction = diff > 0 ? 'h' : 'v';\n _currentPoints = touchesList;\n }\n }\n } else {\n _currentPoints = touchesList;\n }\n }\n },\n // \n _renderMovement = function _renderMovement() {\n if (!_currentPoints) {\n return;\n }\n\n var numPoints = _currentPoints.length;\n\n if (numPoints === 0) {\n return;\n }\n\n _equalizePoints(p, _currentPoints[0]);\n\n delta.x = p.x - _currPoint.x;\n delta.y = p.y - _currPoint.y;\n\n if (_isZooming && numPoints > 1) {\n // Handle behaviour for more than 1 point\n _currPoint.x = p.x;\n _currPoint.y = p.y; // check if one of two points changed\n\n if (!delta.x && !delta.y && _isEqualPoints(_currentPoints[1], p2)) {\n return;\n }\n\n _equalizePoints(p2, _currentPoints[1]);\n\n if (!_zoomStarted) {\n _zoomStarted = true;\n\n _shout('zoomGestureStarted');\n } // Distance between two points\n\n\n var pointsDistance = _calculatePointsDistance(p, p2);\n\n var zoomLevel = _calculateZoomLevel(pointsDistance); // slightly over the of initial zoom level\n\n\n if (zoomLevel > self.currItem.initialZoomLevel + self.currItem.initialZoomLevel / 15) {\n _wasOverInitialZoom = true;\n } // Apply the friction if zoom level is out of the bounds\n\n\n var zoomFriction = 1,\n minZoomLevel = _getMinZoomLevel(),\n maxZoomLevel = _getMaxZoomLevel();\n\n if (zoomLevel < minZoomLevel) {\n if (_options.pinchToClose && !_wasOverInitialZoom && _startZoomLevel <= self.currItem.initialZoomLevel) {\n // fade out background if zooming out\n var minusDiff = minZoomLevel - zoomLevel;\n var percent = 1 - minusDiff / (minZoomLevel / 1.2);\n\n _applyBgOpacity(percent);\n\n _shout('onPinchClose', percent);\n\n _opacityChanged = true;\n } else {\n zoomFriction = (minZoomLevel - zoomLevel) / minZoomLevel;\n\n if (zoomFriction > 1) {\n zoomFriction = 1;\n }\n\n zoomLevel = minZoomLevel - zoomFriction * (minZoomLevel / 3);\n }\n } else if (zoomLevel > maxZoomLevel) {\n // 1.5 - extra zoom level above the max. E.g. if max is x6, real max 6 + 1.5 = 7.5\n zoomFriction = (zoomLevel - maxZoomLevel) / (minZoomLevel * 6);\n\n if (zoomFriction > 1) {\n zoomFriction = 1;\n }\n\n zoomLevel = maxZoomLevel + zoomFriction * minZoomLevel;\n }\n\n if (zoomFriction < 0) {\n zoomFriction = 0;\n } // distance between touch points after friction is applied\n\n\n _currPointsDistance = pointsDistance; // _centerPoint - The point in the middle of two pointers\n\n _findCenterOfPoints(p, p2, _centerPoint); // paning with two pointers pressed\n\n\n _currPanDist.x += _centerPoint.x - _currCenterPoint.x;\n _currPanDist.y += _centerPoint.y - _currCenterPoint.y;\n\n _equalizePoints(_currCenterPoint, _centerPoint);\n\n _panOffset.x = _calculatePanOffset('x', zoomLevel);\n _panOffset.y = _calculatePanOffset('y', zoomLevel);\n _isZoomingIn = zoomLevel > _currZoomLevel;\n _currZoomLevel = zoomLevel;\n\n _applyCurrentZoomPan();\n } else {\n // handle behaviour for one point (dragging or panning)\n if (!_direction) {\n return;\n }\n\n if (_isFirstMove) {\n _isFirstMove = false; // subtract drag distance that was used during the detection direction \n\n if (Math.abs(delta.x) >= DIRECTION_CHECK_OFFSET) {\n delta.x -= _currentPoints[0].x - _startPoint.x;\n }\n\n if (Math.abs(delta.y) >= DIRECTION_CHECK_OFFSET) {\n delta.y -= _currentPoints[0].y - _startPoint.y;\n }\n }\n\n _currPoint.x = p.x;\n _currPoint.y = p.y; // do nothing if pointers position hasn't changed\n\n if (delta.x === 0 && delta.y === 0) {\n return;\n }\n\n if (_direction === 'v' && _options.closeOnVerticalDrag) {\n if (!_canPan()) {\n _currPanDist.y += delta.y;\n _panOffset.y += delta.y;\n\n var opacityRatio = _calculateVerticalDragOpacityRatio();\n\n _verticalDragInitiated = true;\n\n _shout('onVerticalDrag', opacityRatio);\n\n _applyBgOpacity(opacityRatio);\n\n _applyCurrentZoomPan();\n\n return;\n }\n }\n\n _pushPosPoint(_getCurrentTime(), p.x, p.y);\n\n _moved = true;\n _currPanBounds = self.currItem.bounds;\n\n var mainScrollChanged = _panOrMoveMainScroll('x', delta);\n\n if (!mainScrollChanged) {\n _panOrMoveMainScroll('y', delta);\n\n _roundPoint(_panOffset);\n\n _applyCurrentZoomPan();\n }\n }\n },\n // Pointerup/pointercancel/touchend/touchcancel/mouseup event handler\n _onDragRelease = function _onDragRelease(e) {\n if (_features.isOldAndroid) {\n if (_oldAndroidTouchEndTimeout && e.type === 'mouseup') {\n return;\n } // on Android (v4.1, 4.2, 4.3 & possibly older) \n // ghost mousedown/up event isn't preventable via e.preventDefault,\n // which causes fake mousedown event\n // so we block mousedown/up for 600ms\n\n\n if (e.type.indexOf('touch') > -1) {\n clearTimeout(_oldAndroidTouchEndTimeout);\n _oldAndroidTouchEndTimeout = setTimeout(function () {\n _oldAndroidTouchEndTimeout = 0;\n }, 600);\n }\n }\n\n _shout('pointerUp');\n\n if (_preventDefaultEventBehaviour(e, false)) {\n e.preventDefault();\n }\n\n var releasePoint;\n\n if (_pointerEventEnabled) {\n var pointerIndex = framework.arraySearch(_currPointers, e.pointerId, 'id');\n\n if (pointerIndex > -1) {\n releasePoint = _currPointers.splice(pointerIndex, 1)[0];\n\n if (navigator.msPointerEnabled) {\n var MSPOINTER_TYPES = {\n 4: 'mouse',\n // event.MSPOINTER_TYPE_MOUSE\n 2: 'touch',\n // event.MSPOINTER_TYPE_TOUCH \n 3: 'pen' // event.MSPOINTER_TYPE_PEN\n\n };\n releasePoint.type = MSPOINTER_TYPES[e.pointerType];\n\n if (!releasePoint.type) {\n releasePoint.type = e.pointerType || 'mouse';\n }\n } else {\n releasePoint.type = e.pointerType || 'mouse';\n }\n }\n }\n\n var touchList = _getTouchPoints(e),\n gestureType,\n numPoints = touchList.length;\n\n if (e.type === 'mouseup') {\n numPoints = 0;\n } // Do nothing if there were 3 touch points or more\n\n\n if (numPoints === 2) {\n _currentPoints = null;\n return true;\n } // if second pointer released\n\n\n if (numPoints === 1) {\n _equalizePoints(_startPoint, touchList[0]);\n } // pointer hasn't moved, send \"tap release\" point\n\n\n if (numPoints === 0 && !_direction && !_mainScrollAnimating) {\n if (!releasePoint) {\n if (e.type === 'mouseup') {\n releasePoint = {\n x: e.pageX,\n y: e.pageY,\n type: 'mouse'\n };\n } else if (e.changedTouches && e.changedTouches[0]) {\n releasePoint = {\n x: e.changedTouches[0].pageX,\n y: e.changedTouches[0].pageY,\n type: 'touch'\n };\n }\n }\n\n _shout('touchRelease', e, releasePoint);\n } // Difference in time between releasing of two last touch points (zoom gesture)\n\n\n var releaseTimeDiff = -1; // Gesture completed, no pointers left\n\n if (numPoints === 0) {\n _isDragging = false;\n framework.unbind(window, _upMoveEvents, self);\n\n _stopDragUpdateLoop();\n\n if (_isZooming) {\n // Two points released at the same time\n releaseTimeDiff = 0;\n } else if (_lastReleaseTime !== -1) {\n releaseTimeDiff = _getCurrentTime() - _lastReleaseTime;\n }\n }\n\n _lastReleaseTime = numPoints === 1 ? _getCurrentTime() : -1;\n\n if (releaseTimeDiff !== -1 && releaseTimeDiff < 150) {\n gestureType = 'zoom';\n } else {\n gestureType = 'swipe';\n }\n\n if (_isZooming && numPoints < 2) {\n _isZooming = false; // Only second point released\n\n if (numPoints === 1) {\n gestureType = 'zoomPointerUp';\n }\n\n _shout('zoomGestureEnded');\n }\n\n _currentPoints = null;\n\n if (!_moved && !_zoomStarted && !_mainScrollAnimating && !_verticalDragInitiated) {\n // nothing to animate\n return;\n }\n\n _stopAllAnimations();\n\n if (!_releaseAnimData) {\n _releaseAnimData = _initDragReleaseAnimationData();\n }\n\n _releaseAnimData.calculateSwipeSpeed('x');\n\n if (_verticalDragInitiated) {\n var opacityRatio = _calculateVerticalDragOpacityRatio();\n\n if (opacityRatio < _options.verticalDragRange) {\n self.close();\n } else {\n var initalPanY = _panOffset.y,\n initialBgOpacity = _bgOpacity;\n\n _animateProp('verticalDrag', 0, 1, 300, framework.easing.cubic.out, function (now) {\n _panOffset.y = (self.currItem.initialPosition.y - initalPanY) * now + initalPanY;\n\n _applyBgOpacity((1 - initialBgOpacity) * now + initialBgOpacity);\n\n _applyCurrentZoomPan();\n });\n\n _shout('onVerticalDrag', 1);\n }\n\n return;\n } // main scroll \n\n\n if ((_mainScrollShifted || _mainScrollAnimating) && numPoints === 0) {\n var itemChanged = _finishSwipeMainScrollGesture(gestureType, _releaseAnimData);\n\n if (itemChanged) {\n return;\n }\n\n gestureType = 'zoomPointerUp';\n } // prevent zoom/pan animation when main scroll animation runs\n\n\n if (_mainScrollAnimating) {\n return;\n } // Complete simple zoom gesture (reset zoom level if it's out of the bounds) \n\n\n if (gestureType !== 'swipe') {\n _completeZoomGesture();\n\n return;\n } // Complete pan gesture if main scroll is not shifted, and it's possible to pan current image\n\n\n if (!_mainScrollShifted && _currZoomLevel > self.currItem.fitRatio) {\n _completePanGesture(_releaseAnimData);\n }\n },\n // Returns object with data about gesture\n // It's created only once and then reused\n _initDragReleaseAnimationData = function _initDragReleaseAnimationData() {\n // temp local vars\n var lastFlickDuration, tempReleasePos; // s = this\n\n var s = {\n lastFlickOffset: {},\n lastFlickDist: {},\n lastFlickSpeed: {},\n slowDownRatio: {},\n slowDownRatioReverse: {},\n speedDecelerationRatio: {},\n speedDecelerationRatioAbs: {},\n distanceOffset: {},\n backAnimDestination: {},\n backAnimStarted: {},\n calculateSwipeSpeed: function calculateSwipeSpeed(axis) {\n if (_posPoints.length > 1) {\n lastFlickDuration = _getCurrentTime() - _gestureCheckSpeedTime + 50;\n tempReleasePos = _posPoints[_posPoints.length - 2][axis];\n } else {\n lastFlickDuration = _getCurrentTime() - _gestureStartTime; // total gesture duration\n\n tempReleasePos = _startPoint[axis];\n }\n\n s.lastFlickOffset[axis] = _currPoint[axis] - tempReleasePos;\n s.lastFlickDist[axis] = Math.abs(s.lastFlickOffset[axis]);\n\n if (s.lastFlickDist[axis] > 20) {\n s.lastFlickSpeed[axis] = s.lastFlickOffset[axis] / lastFlickDuration;\n } else {\n s.lastFlickSpeed[axis] = 0;\n }\n\n if (Math.abs(s.lastFlickSpeed[axis]) < 0.1) {\n s.lastFlickSpeed[axis] = 0;\n }\n\n s.slowDownRatio[axis] = 0.95;\n s.slowDownRatioReverse[axis] = 1 - s.slowDownRatio[axis];\n s.speedDecelerationRatio[axis] = 1;\n },\n calculateOverBoundsAnimOffset: function calculateOverBoundsAnimOffset(axis, speed) {\n if (!s.backAnimStarted[axis]) {\n if (_panOffset[axis] > _currPanBounds.min[axis]) {\n s.backAnimDestination[axis] = _currPanBounds.min[axis];\n } else if (_panOffset[axis] < _currPanBounds.max[axis]) {\n s.backAnimDestination[axis] = _currPanBounds.max[axis];\n }\n\n if (s.backAnimDestination[axis] !== undefined) {\n s.slowDownRatio[axis] = 0.7;\n s.slowDownRatioReverse[axis] = 1 - s.slowDownRatio[axis];\n\n if (s.speedDecelerationRatioAbs[axis] < 0.05) {\n s.lastFlickSpeed[axis] = 0;\n s.backAnimStarted[axis] = true;\n\n _animateProp('bounceZoomPan' + axis, _panOffset[axis], s.backAnimDestination[axis], speed || 300, framework.easing.sine.out, function (pos) {\n _panOffset[axis] = pos;\n\n _applyCurrentZoomPan();\n });\n }\n }\n }\n },\n // Reduces the speed by slowDownRatio (per 10ms)\n calculateAnimOffset: function calculateAnimOffset(axis) {\n if (!s.backAnimStarted[axis]) {\n s.speedDecelerationRatio[axis] = s.speedDecelerationRatio[axis] * (s.slowDownRatio[axis] + s.slowDownRatioReverse[axis] - s.slowDownRatioReverse[axis] * s.timeDiff / 10);\n s.speedDecelerationRatioAbs[axis] = Math.abs(s.lastFlickSpeed[axis] * s.speedDecelerationRatio[axis]);\n s.distanceOffset[axis] = s.lastFlickSpeed[axis] * s.speedDecelerationRatio[axis] * s.timeDiff;\n _panOffset[axis] += s.distanceOffset[axis];\n }\n },\n panAnimLoop: function panAnimLoop() {\n if (_animations.zoomPan) {\n _animations.zoomPan.raf = _requestAF(s.panAnimLoop);\n s.now = _getCurrentTime();\n s.timeDiff = s.now - s.lastNow;\n s.lastNow = s.now;\n s.calculateAnimOffset('x');\n s.calculateAnimOffset('y');\n\n _applyCurrentZoomPan();\n\n s.calculateOverBoundsAnimOffset('x');\n s.calculateOverBoundsAnimOffset('y');\n\n if (s.speedDecelerationRatioAbs.x < 0.05 && s.speedDecelerationRatioAbs.y < 0.05) {\n // round pan position\n _panOffset.x = Math.round(_panOffset.x);\n _panOffset.y = Math.round(_panOffset.y);\n\n _applyCurrentZoomPan();\n\n _stopAnimation('zoomPan');\n\n return;\n }\n }\n }\n };\n return s;\n },\n _completePanGesture = function _completePanGesture(animData) {\n // calculate swipe speed for Y axis (paanning)\n animData.calculateSwipeSpeed('y');\n _currPanBounds = self.currItem.bounds;\n animData.backAnimDestination = {};\n animData.backAnimStarted = {}; // Avoid acceleration animation if speed is too low\n\n if (Math.abs(animData.lastFlickSpeed.x) <= 0.05 && Math.abs(animData.lastFlickSpeed.y) <= 0.05) {\n animData.speedDecelerationRatioAbs.x = animData.speedDecelerationRatioAbs.y = 0; // Run pan drag release animation. E.g. if you drag image and release finger without momentum.\n\n animData.calculateOverBoundsAnimOffset('x');\n animData.calculateOverBoundsAnimOffset('y');\n return true;\n } // Animation loop that controls the acceleration after pan gesture ends\n\n\n _registerStartAnimation('zoomPan');\n\n animData.lastNow = _getCurrentTime();\n animData.panAnimLoop();\n },\n _finishSwipeMainScrollGesture = function _finishSwipeMainScrollGesture(gestureType, _releaseAnimData) {\n var itemChanged;\n\n if (!_mainScrollAnimating) {\n _currZoomedItemIndex = _currentItemIndex;\n }\n\n var itemsDiff;\n\n if (gestureType === 'swipe') {\n var totalShiftDist = _currPoint.x - _startPoint.x,\n isFastLastFlick = _releaseAnimData.lastFlickDist.x < 10; // if container is shifted for more than MIN_SWIPE_DISTANCE, \n // and last flick gesture was in right direction\n\n if (totalShiftDist > MIN_SWIPE_DISTANCE && (isFastLastFlick || _releaseAnimData.lastFlickOffset.x > 20)) {\n // go to prev item\n itemsDiff = -1;\n } else if (totalShiftDist < -MIN_SWIPE_DISTANCE && (isFastLastFlick || _releaseAnimData.lastFlickOffset.x < -20)) {\n // go to next item\n itemsDiff = 1;\n }\n }\n\n var nextCircle;\n\n if (itemsDiff) {\n _currentItemIndex += itemsDiff;\n\n if (_currentItemIndex < 0) {\n _currentItemIndex = _options.loop ? _getNumItems() - 1 : 0;\n nextCircle = true;\n } else if (_currentItemIndex >= _getNumItems()) {\n _currentItemIndex = _options.loop ? 0 : _getNumItems() - 1;\n nextCircle = true;\n }\n\n if (!nextCircle || _options.loop) {\n _indexDiff += itemsDiff;\n _currPositionIndex -= itemsDiff;\n itemChanged = true;\n }\n }\n\n var animateToX = _slideSize.x * _currPositionIndex;\n var animateToDist = Math.abs(animateToX - _mainScrollPos.x);\n var finishAnimDuration;\n\n if (!itemChanged && animateToX > _mainScrollPos.x !== _releaseAnimData.lastFlickSpeed.x > 0) {\n // \"return to current\" duration, e.g. when dragging from slide 0 to -1\n finishAnimDuration = 333;\n } else {\n finishAnimDuration = Math.abs(_releaseAnimData.lastFlickSpeed.x) > 0 ? animateToDist / Math.abs(_releaseAnimData.lastFlickSpeed.x) : 333;\n finishAnimDuration = Math.min(finishAnimDuration, 400);\n finishAnimDuration = Math.max(finishAnimDuration, 250);\n }\n\n if (_currZoomedItemIndex === _currentItemIndex) {\n itemChanged = false;\n }\n\n _mainScrollAnimating = true;\n\n _shout('mainScrollAnimStart');\n\n _animateProp('mainScroll', _mainScrollPos.x, animateToX, finishAnimDuration, framework.easing.cubic.out, _moveMainScroll, function () {\n _stopAllAnimations();\n\n _mainScrollAnimating = false;\n _currZoomedItemIndex = -1;\n\n if (itemChanged || _currZoomedItemIndex !== _currentItemIndex) {\n self.updateCurrItem();\n }\n\n _shout('mainScrollAnimComplete');\n });\n\n if (itemChanged) {\n self.updateCurrItem(true);\n }\n\n return itemChanged;\n },\n _calculateZoomLevel = function _calculateZoomLevel(touchesDistance) {\n return 1 / _startPointsDistance * touchesDistance * _startZoomLevel;\n },\n // Resets zoom if it's out of bounds\n _completeZoomGesture = function _completeZoomGesture() {\n var destZoomLevel = _currZoomLevel,\n minZoomLevel = _getMinZoomLevel(),\n maxZoomLevel = _getMaxZoomLevel();\n\n if (_currZoomLevel < minZoomLevel) {\n destZoomLevel = minZoomLevel;\n } else if (_currZoomLevel > maxZoomLevel) {\n destZoomLevel = maxZoomLevel;\n }\n\n var destOpacity = 1,\n onUpdate,\n initialOpacity = _bgOpacity;\n\n if (_opacityChanged && !_isZoomingIn && !_wasOverInitialZoom && _currZoomLevel < minZoomLevel) {\n //_closedByScroll = true;\n self.close();\n return true;\n }\n\n if (_opacityChanged) {\n onUpdate = function onUpdate(now) {\n _applyBgOpacity((destOpacity - initialOpacity) * now + initialOpacity);\n };\n }\n\n self.zoomTo(destZoomLevel, 0, 200, framework.easing.cubic.out, onUpdate);\n return true;\n };\n\n _registerModule('Gestures', {\n publicMethods: {\n initGestures: function initGestures() {\n // helper function that builds touch/pointer/mouse events\n var addEventNames = function addEventNames(pref, down, move, up, cancel) {\n _dragStartEvent = pref + down;\n _dragMoveEvent = pref + move;\n _dragEndEvent = pref + up;\n\n if (cancel) {\n _dragCancelEvent = pref + cancel;\n } else {\n _dragCancelEvent = '';\n }\n };\n\n _pointerEventEnabled = _features.pointerEvent;\n\n if (_pointerEventEnabled && _features.touch) {\n // we don't need touch events, if browser supports pointer events\n _features.touch = false;\n }\n\n if (_pointerEventEnabled) {\n if (navigator.msPointerEnabled) {\n // IE10 pointer events are case-sensitive\n addEventNames('MSPointer', 'Down', 'Move', 'Up', 'Cancel');\n } else {\n addEventNames('pointer', 'down', 'move', 'up', 'cancel');\n }\n } else if (_features.touch) {\n addEventNames('touch', 'start', 'move', 'end', 'cancel');\n _likelyTouchDevice = true;\n } else {\n addEventNames('mouse', 'down', 'move', 'up');\n }\n\n _upMoveEvents = _dragMoveEvent + ' ' + _dragEndEvent + ' ' + _dragCancelEvent;\n _downEvents = _dragStartEvent;\n\n if (_pointerEventEnabled && !_likelyTouchDevice) {\n _likelyTouchDevice = navigator.maxTouchPoints > 1 || navigator.msMaxTouchPoints > 1;\n } // make variable public\n\n\n self.likelyTouchDevice = _likelyTouchDevice;\n _globalEventHandlers[_dragStartEvent] = _onDragStart;\n _globalEventHandlers[_dragMoveEvent] = _onDragMove;\n _globalEventHandlers[_dragEndEvent] = _onDragRelease; // the Kraken\n\n if (_dragCancelEvent) {\n _globalEventHandlers[_dragCancelEvent] = _globalEventHandlers[_dragEndEvent];\n } // Bind mouse events on device with detected hardware touch support, in case it supports multiple types of input.\n\n\n if (_features.touch) {\n _downEvents += ' mousedown';\n _upMoveEvents += ' mousemove mouseup';\n _globalEventHandlers.mousedown = _globalEventHandlers[_dragStartEvent];\n _globalEventHandlers.mousemove = _globalEventHandlers[_dragMoveEvent];\n _globalEventHandlers.mouseup = _globalEventHandlers[_dragEndEvent];\n }\n\n if (!_likelyTouchDevice) {\n // don't allow pan to next slide from zoomed state on Desktop\n _options.allowPanToNext = false;\n }\n }\n }\n });\n /*>>gestures*/\n\n /*>>show-hide-transition*/\n\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\n var _showOrHideTimeout,\n _showOrHide = function _showOrHide(item, img, out, completeFn) {\n if (_showOrHideTimeout) {\n clearTimeout(_showOrHideTimeout);\n }\n\n _initialZoomRunning = true;\n _initialContentSet = true; // dimensions of small thumbnail {x:,y:,w:}.\n // Height is optional, as calculated based on large image.\n\n var thumbBounds;\n\n if (item.initialLayout) {\n thumbBounds = item.initialLayout;\n item.initialLayout = null;\n } else {\n thumbBounds = _options.getThumbBoundsFn && _options.getThumbBoundsFn(_currentItemIndex);\n }\n\n var duration = out ? _options.hideAnimationDuration : _options.showAnimationDuration;\n\n var onComplete = function onComplete() {\n _stopAnimation('initialZoom');\n\n if (!out) {\n _applyBgOpacity(1);\n\n if (img) {\n img.style.display = 'block';\n }\n\n framework.addClass(template, 'pswp--animated-in');\n\n _shout('initialZoom' + (out ? 'OutEnd' : 'InEnd'));\n } else {\n self.template.removeAttribute('style');\n self.bg.removeAttribute('style');\n }\n\n if (completeFn) {\n completeFn();\n }\n\n _initialZoomRunning = false;\n }; // if bounds aren't provided, just open gallery without animation\n\n\n if (!duration || !thumbBounds || thumbBounds.x === undefined) {\n _shout('initialZoom' + (out ? 'Out' : 'In'));\n\n _currZoomLevel = item.initialZoomLevel;\n\n _equalizePoints(_panOffset, item.initialPosition);\n\n _applyCurrentZoomPan();\n\n template.style.opacity = out ? 0 : 1;\n\n _applyBgOpacity(1);\n\n if (duration) {\n setTimeout(function () {\n onComplete();\n }, duration);\n } else {\n onComplete();\n }\n\n return;\n }\n\n var startAnimation = function startAnimation() {\n var closeWithRaf = _closedByScroll,\n fadeEverything = !self.currItem.src || self.currItem.loadError || _options.showHideOpacity; // apply hw-acceleration to image\n\n if (item.miniImg) {\n item.miniImg.style.webkitBackfaceVisibility = 'hidden';\n }\n\n if (!out) {\n _currZoomLevel = thumbBounds.w / item.w;\n _panOffset.x = thumbBounds.x;\n _panOffset.y = thumbBounds.y - _initalWindowScrollY;\n self[fadeEverything ? 'template' : 'bg'].style.opacity = 0.001;\n\n _applyCurrentZoomPan();\n }\n\n _registerStartAnimation('initialZoom');\n\n if (out && !closeWithRaf) {\n framework.removeClass(template, 'pswp--animated-in');\n }\n\n if (fadeEverything) {\n if (out) {\n framework[(closeWithRaf ? 'remove' : 'add') + 'Class'](template, 'pswp--animate_opacity');\n } else {\n setTimeout(function () {\n framework.addClass(template, 'pswp--animate_opacity');\n }, 30);\n }\n }\n\n _showOrHideTimeout = setTimeout(function () {\n _shout('initialZoom' + (out ? 'Out' : 'In'));\n\n if (!out) {\n // \"in\" animation always uses CSS transitions (instead of rAF).\n // CSS transition work faster here, \n // as developer may also want to animate other things, \n // like ui on top of sliding area, which can be animated just via CSS\n _currZoomLevel = item.initialZoomLevel;\n\n _equalizePoints(_panOffset, item.initialPosition);\n\n _applyCurrentZoomPan();\n\n _applyBgOpacity(1);\n\n if (fadeEverything) {\n template.style.opacity = 1;\n } else {\n _applyBgOpacity(1);\n }\n\n _showOrHideTimeout = setTimeout(onComplete, duration + 20);\n } else {\n // \"out\" animation uses rAF only when PhotoSwipe is closed by browser scroll, to recalculate position\n var destZoomLevel = thumbBounds.w / item.w,\n initialPanOffset = {\n x: _panOffset.x,\n y: _panOffset.y\n },\n initialZoomLevel = _currZoomLevel,\n initalBgOpacity = _bgOpacity,\n onUpdate = function onUpdate(now) {\n if (now === 1) {\n _currZoomLevel = destZoomLevel;\n _panOffset.x = thumbBounds.x;\n _panOffset.y = thumbBounds.y - _currentWindowScrollY;\n } else {\n _currZoomLevel = (destZoomLevel - initialZoomLevel) * now + initialZoomLevel;\n _panOffset.x = (thumbBounds.x - initialPanOffset.x) * now + initialPanOffset.x;\n _panOffset.y = (thumbBounds.y - _currentWindowScrollY - initialPanOffset.y) * now + initialPanOffset.y;\n }\n\n _applyCurrentZoomPan();\n\n if (fadeEverything) {\n template.style.opacity = 1 - now;\n } else {\n _applyBgOpacity(initalBgOpacity - now * initalBgOpacity);\n }\n };\n\n if (closeWithRaf) {\n _animateProp('initialZoom', 0, 1, duration, framework.easing.cubic.out, onUpdate, onComplete);\n } else {\n onUpdate(1);\n _showOrHideTimeout = setTimeout(onComplete, duration + 20);\n }\n }\n }, out ? 25 : 90); // Main purpose of this delay is to give browser time to paint and\n // create composite layers of PhotoSwipe UI parts (background, controls, caption, arrows).\n // Which avoids lag at the beginning of scale transition.\n };\n\n startAnimation();\n };\n /*>>show-hide-transition*/\n\n /*>>items-controller*/\n\n /**\n *\n * Controller manages gallery items, their dimensions, and their content.\n * \n */\n\n\n var _items,\n _tempPanAreaSize = {},\n _imagesToAppendPool = [],\n _initialContentSet,\n _initialZoomRunning,\n _controllerDefaultOptions = {\n index: 0,\n errorMsg: '