{"version":3,"file":"static/js/6667.859d9632.js","mappings":"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","sources":["webpack://finnish-art/./node_modules/photoswipe/dist/photoswipe-ui-default.js","webpack://finnish-art/./node_modules/photoswipe/dist/photoswipe.js"],"sourcesContent":["/*! 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] && listeners[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: '