{"version":3,"file":"photoswipe-1Hl64aZ1.js","sources":["../../../node_modules/photoswipe/dist/photoswipe.js"],"sourcesContent":["/*! PhotoSwipe - v4.1.3 - 2019-01-08\n* http://photoswipe.com\n* Copyright (c) 2019 Dmitry Semenov; */\n(function (root, factory) { \n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(factory);\n\t} else if (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t} else {\n\t\troot.PhotoSwipe = factory();\n\t}\n})(this, function () {\n\n\t'use strict';\n\tvar PhotoSwipe = function(template, UiClass, items, options){\n\n/*>>framework-bridge*/\n/**\n *\n * Set of generic functions used by gallery.\n * \n * You're free to modify anything here as long as functionality is kept.\n * \n */\nvar framework = {\n\tfeatures: null,\n\tbind: function(target, type, listener, unbind) {\n\t\tvar methodName = (unbind ? 'remove' : 'add') + 'EventListener';\n\t\ttype = type.split(' ');\n\t\tfor(var i = 0; i < type.length; i++) {\n\t\t\tif(type[i]) {\n\t\t\t\ttarget[methodName]( type[i], listener, false);\n\t\t\t}\n\t\t}\n\t},\n\tisArray: function(obj) {\n\t\treturn (obj instanceof Array);\n\t},\n\tcreateEl: function(classes, tag) {\n\t\tvar el = document.createElement(tag || 'div');\n\t\tif(classes) {\n\t\t\tel.className = classes;\n\t\t}\n\t\treturn el;\n\t},\n\tgetScrollY: function() {\n\t\tvar yOffset = window.pageYOffset;\n\t\treturn yOffset !== undefined ? yOffset : document.documentElement.scrollTop;\n\t},\n\tunbind: function(target, type, listener) {\n\t\tframework.bind(target,type,listener,true);\n\t},\n\tremoveClass: function(el, className) {\n\t\tvar reg = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)');\n\t\tel.className = el.className.replace(reg, ' ').replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, ''); \n\t},\n\taddClass: function(el, className) {\n\t\tif( !framework.hasClass(el,className) ) {\n\t\t\tel.className += (el.className ? ' ' : '') + className;\n\t\t}\n\t},\n\thasClass: function(el, className) {\n\t\treturn el.className && new RegExp('(^|\\\\s)' + className + '(\\\\s|$)').test(el.className);\n\t},\n\tgetChildByClass: function(parentEl, childClassName) {\n\t\tvar node = parentEl.firstChild;\n\t\twhile(node) {\n\t\t\tif( framework.hasClass(node, childClassName) ) {\n\t\t\t\treturn node;\n\t\t\t}\n\t\t\tnode = node.nextSibling;\n\t\t}\n\t},\n\tarraySearch: function(array, value, key) {\n\t\tvar i = array.length;\n\t\twhile(i--) {\n\t\t\tif(array[i][key] === value) {\n\t\t\t\treturn i;\n\t\t\t} \n\t\t}\n\t\treturn -1;\n\t},\n\textend: function(o1, o2, preventOverwrite) {\n\t\tfor (var prop in o2) {\n\t\t\tif (o2.hasOwnProperty(prop)) {\n\t\t\t\tif(preventOverwrite && o1.hasOwnProperty(prop)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\to1[prop] = o2[prop];\n\t\t\t}\n\t\t}\n\t},\n\teasing: {\n\t\tsine: {\n\t\t\tout: function(k) {\n\t\t\t\treturn Math.sin(k * (Math.PI / 2));\n\t\t\t},\n\t\t\tinOut: function(k) {\n\t\t\t\treturn - (Math.cos(Math.PI * k) - 1) / 2;\n\t\t\t}\n\t\t},\n\t\tcubic: {\n\t\t\tout: function(k) {\n\t\t\t\treturn --k * k * k + 1;\n\t\t\t}\n\t\t}\n\t\t/*\n\t\t\telastic: {\n\t\t\t\tout: function ( k ) {\n\n\t\t\t\t\tvar s, a = 0.1, p = 0.4;\n\t\t\t\t\tif ( k === 0 ) return 0;\n\t\t\t\t\tif ( k === 1 ) return 1;\n\t\t\t\t\tif ( !a || a < 1 ) { a = 1; s = p / 4; }\n\t\t\t\t\telse s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n\t\t\t\t\treturn ( a * Math.pow( 2, - 10 * k) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) + 1 );\n\n\t\t\t\t},\n\t\t\t},\n\t\t\tback: {\n\t\t\t\tout: function ( k ) {\n\t\t\t\t\tvar s = 1.70158;\n\t\t\t\t\treturn --k * k * ( ( s + 1 ) * k + s ) + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t*/\n\t},\n\n\t/**\n\t * \n\t * @return {object}\n\t * \n\t * {\n\t *  raf : request animation frame function\n\t *  caf : cancel animation frame function\n\t *  transfrom : transform property key (with vendor), or null if not supported\n\t *  oldIE : IE8 or below\n\t * }\n\t * \n\t */\n\tdetectFeatures: function() {\n\t\tif(framework.features) {\n\t\t\treturn framework.features;\n\t\t}\n\t\tvar helperEl = framework.createEl(),\n\t\t\thelperStyle = helperEl.style,\n\t\t\tvendor = '',\n\t\t\tfeatures = {};\n\n\t\t// IE8 and below\n\t\tfeatures.oldIE = document.all && !document.addEventListener;\n\n\t\tfeatures.touch = 'ontouchstart' in window;\n\n\t\tif(window.requestAnimationFrame) {\n\t\t\tfeatures.raf = window.requestAnimationFrame;\n\t\t\tfeatures.caf = window.cancelAnimationFrame;\n\t\t}\n\n\t\tfeatures.pointerEvent = !!(window.PointerEvent) || navigator.msPointerEnabled;\n\n\t\t// fix false-positive detection of old Android in new IE\n\t\t// (IE11 ua string contains \"Android 4.0\")\n\t\t\n\t\tif(!features.pointerEvent) { \n\n\t\t\tvar ua = navigator.userAgent;\n\n\t\t\t// Detect if device is iPhone or iPod and if it's older than iOS 8\n\t\t\t// http://stackoverflow.com/a/14223920\n\t\t\t// \n\t\t\t// This detection is made because of buggy top/bottom toolbars\n\t\t\t// that don't trigger window.resize event.\n\t\t\t// For more info refer to _isFixedPosition variable in core.js\n\n\t\t\tif (/iP(hone|od)/.test(navigator.platform)) {\n\t\t\t\tvar v = (navigator.appVersion).match(/OS (\\d+)_(\\d+)_?(\\d+)?/);\n\t\t\t\tif(v && v.length > 0) {\n\t\t\t\t\tv = parseInt(v[1], 10);\n\t\t\t\t\tif(v >= 1 && v < 8 ) {\n\t\t\t\t\t\tfeatures.isOldIOSPhone = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Detect old Android (before KitKat)\n\t\t\t// due to bugs related to position:fixed\n\t\t\t// http://stackoverflow.com/questions/7184573/pick-up-the-android-version-in-the-browser-by-javascript\n\t\t\t\n\t\t\tvar match = ua.match(/Android\\s([0-9\\.]*)/);\n\t\t\tvar androidversion =  match ? match[1] : 0;\n\t\t\tandroidversion = parseFloat(androidversion);\n\t\t\tif(androidversion >= 1 ) {\n\t\t\t\tif(androidversion < 4.4) {\n\t\t\t\t\tfeatures.isOldAndroid = true; // for fixed position bug & performance\n\t\t\t\t}\n\t\t\t\tfeatures.androidVersion = androidversion; // for touchend bug\n\t\t\t}\t\n\t\t\tfeatures.isMobileOpera = /opera mini|opera mobi/i.test(ua);\n\n\t\t\t// p.s. yes, yes, UA sniffing is bad, propose your solution for above bugs.\n\t\t}\n\t\t\n\t\tvar styleChecks = ['transform', 'perspective', 'animationName'],\n\t\t\tvendors = ['', 'webkit','Moz','ms','O'],\n\t\t\tstyleCheckItem,\n\t\t\tstyleName;\n\n\t\tfor(var i = 0; i < 4; i++) {\n\t\t\tvendor = vendors[i];\n\n\t\t\tfor(var a = 0; a < 3; a++) {\n\t\t\t\tstyleCheckItem = styleChecks[a];\n\n\t\t\t\t// uppercase first letter of property name, if vendor is present\n\t\t\t\tstyleName = vendor + (vendor ? \n\t\t\t\t\t\t\t\t\t\tstyleCheckItem.charAt(0).toUpperCase() + styleCheckItem.slice(1) : \n\t\t\t\t\t\t\t\t\t\tstyleCheckItem);\n\t\t\t\n\t\t\t\tif(!features[styleCheckItem] && styleName in helperStyle ) {\n\t\t\t\t\tfeatures[styleCheckItem] = styleName;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(vendor && !features.raf) {\n\t\t\t\tvendor = vendor.toLowerCase();\n\t\t\t\tfeatures.raf = window[vendor+'RequestAnimationFrame'];\n\t\t\t\tif(features.raf) {\n\t\t\t\t\tfeatures.caf = window[vendor+'CancelAnimationFrame'] || \n\t\t\t\t\t\t\t\t\twindow[vendor+'CancelRequestAnimationFrame'];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\t\n\t\tif(!features.raf) {\n\t\t\tvar lastTime = 0;\n\t\t\tfeatures.raf = function(fn) {\n\t\t\t\tvar currTime = new Date().getTime();\n\t\t\t\tvar timeToCall = Math.max(0, 16 - (currTime - lastTime));\n\t\t\t\tvar id = window.setTimeout(function() { fn(currTime + timeToCall); }, timeToCall);\n\t\t\t\tlastTime = currTime + timeToCall;\n\t\t\t\treturn id;\n\t\t\t};\n\t\t\tfeatures.caf = function(id) { clearTimeout(id); };\n\t\t}\n\n\t\t// Detect SVG support\n\t\tfeatures.svg = !!document.createElementNS && \n\t\t\t\t\t\t!!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect;\n\n\t\tframework.features = features;\n\n\t\treturn features;\n\t}\n};\n\nframework.detectFeatures();\n\n// Override addEventListener for old versions of IE\nif(framework.features.oldIE) {\n\n\tframework.bind = function(target, type, listener, unbind) {\n\t\t\n\t\ttype = type.split(' ');\n\n\t\tvar methodName = (unbind ? 'detach' : 'attach') + 'Event',\n\t\t\tevName,\n\t\t\t_handleEv = function() {\n\t\t\t\tlistener.handleEvent.call(listener);\n\t\t\t};\n\n\t\tfor(var i = 0; i < type.length; i++) {\n\t\t\tevName = type[i];\n\t\t\tif(evName) {\n\n\t\t\t\tif(typeof listener === 'object' && listener.handleEvent) {\n\t\t\t\t\tif(!unbind) {\n\t\t\t\t\t\tlistener['oldIE' + evName] = _handleEv;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(!listener['oldIE' + evName]) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\ttarget[methodName]( 'on' + evName, listener['oldIE' + evName]);\n\t\t\t\t} else {\n\t\t\t\t\ttarget[methodName]( 'on' + evName, listener);\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t};\n\t\n}\n\n/*>>framework-bridge*/\n\n/*>>core*/\n//function(template, UiClass, items, options)\n\nvar self = this;\n\n/**\n * Static vars, don't change unless you know what you're doing.\n */\nvar DOUBLE_TAP_RADIUS = 25, \n\tNUM_HOLDERS = 3;\n\n/**\n * Options\n */\nvar _options = {\n\tallowPanToNext:true,\n\tspacing: 0.12,\n\tbgOpacity: 1,\n\tmouseUsed: false,\n\tloop: true,\n\tpinchToClose: true,\n\tcloseOnScroll: true,\n\tcloseOnVerticalDrag: true,\n\tverticalDragRange: 0.75,\n\thideAnimationDuration: 333,\n\tshowAnimationDuration: 333,\n\tshowHideOpacity: false,\n\tfocus: true,\n\tescKey: true,\n\tarrowKeys: true,\n\tmainScrollEndFriction: 0.35,\n\tpanEndFriction: 0.35,\n\tisClickableElement: function(el) {\n        return el.tagName === 'A';\n    },\n    getDoubleTapZoom: function(isMouseClick, item) {\n    \tif(isMouseClick) {\n    \t\treturn 1;\n    \t} else {\n    \t\treturn item.initialZoomLevel < 0.7 ? 1 : 1.33;\n    \t}\n    },\n    maxSpreadZoom: 1.33,\n\tmodal: true,\n\n\t// not fully implemented yet\n\tscaleMode: 'fit' // TODO\n};\nframework.extend(_options, options);\n\n\n/**\n * Private helper variables & functions\n */\n\nvar _getEmptyPoint = function() { \n\t\treturn {x:0,y:0}; \n\t};\n\nvar _isOpen,\n\t_isDestroying,\n\t_closedByScroll,\n\t_currentItemIndex,\n\t_containerStyle,\n\t_containerShiftIndex,\n\t_currPanDist = _getEmptyPoint(),\n\t_startPanOffset = _getEmptyPoint(),\n\t_panOffset = _getEmptyPoint(),\n\t_upMoveEvents, // drag move, drag end & drag cancel events array\n\t_downEvents, // drag start events array\n\t_globalEventHandlers,\n\t_viewportSize = {},\n\t_currZoomLevel,\n\t_startZoomLevel,\n\t_translatePrefix,\n\t_translateSufix,\n\t_updateSizeInterval,\n\t_itemsNeedUpdate,\n\t_currPositionIndex = 0,\n\t_offset = {},\n\t_slideSize = _getEmptyPoint(), // size of slide area, including spacing\n\t_itemHolders,\n\t_prevItemIndex,\n\t_indexDiff = 0, // difference of indexes since last content update\n\t_dragStartEvent,\n\t_dragMoveEvent,\n\t_dragEndEvent,\n\t_dragCancelEvent,\n\t_transformKey,\n\t_pointerEventEnabled,\n\t_isFixedPosition = true,\n\t_likelyTouchDevice,\n\t_modules = [],\n\t_requestAF,\n\t_cancelAF,\n\t_initalClassName,\n\t_initalWindowScrollY,\n\t_oldIE,\n\t_currentWindowScrollY,\n\t_features,\n\t_windowVisibleSize = {},\n\t_renderMaxResolution = false,\n\t_orientationChangeTimeout,\n\n\n\t// Registers PhotoSWipe module (History, Controller ...)\n\t_registerModule = function(name, module) {\n\t\tframework.extend(self, module.publicMethods);\n\t\t_modules.push(name);\n\t},\n\n\t_getLoopedId = function(index) {\n\t\tvar numSlides = _getNumItems();\n\t\tif(index > numSlides - 1) {\n\t\t\treturn index - numSlides;\n\t\t} else  if(index < 0) {\n\t\t\treturn numSlides + index;\n\t\t}\n\t\treturn index;\n\t},\n\t\n\t// Micro bind/trigger\n\t_listeners = {},\n\t_listen = function(name, fn) {\n\t\tif(!_listeners[name]) {\n\t\t\t_listeners[name] = [];\n\t\t}\n\t\treturn _listeners[name].push(fn);\n\t},\n\t_shout = function(name) {\n\t\tvar listeners = _listeners[name];\n\n\t\tif(listeners) {\n\t\t\tvar args = Array.prototype.slice.call(arguments);\n\t\t\targs.shift();\n\n\t\t\tfor(var i = 0; i < listeners.length; i++) {\n\t\t\t\tlisteners[i].apply(self, args);\n\t\t\t}\n\t\t}\n\t},\n\n\t_getCurrentTime = function() {\n\t\treturn new Date().getTime();\n\t},\n\t_applyBgOpacity = function(opacity) {\n\t\t_bgOpacity = opacity;\n\t\tself.bg.style.opacity = opacity * _options.bgOpacity;\n\t},\n\n\t_applyZoomTransform = function(styleObj,x,y,zoom,item) {\n\t\tif(!_renderMaxResolution || (item && item !== self.currItem) ) {\n\t\t\tzoom = zoom / (item ? item.fitRatio : self.currItem.fitRatio);\t\n\t\t}\n\t\t\t\n\t\tstyleObj[_transformKey] = _translatePrefix + x + 'px, ' + y + 'px' + _translateSufix + ' scale(' + zoom + ')';\n\t},\n\t_applyCurrentZoomPan = function( allowRenderResolution ) {\n\t\tif(_currZoomElementStyle) {\n\n\t\t\tif(allowRenderResolution) {\n\t\t\t\tif(_currZoomLevel > self.currItem.fitRatio) {\n\t\t\t\t\tif(!_renderMaxResolution) {\n\t\t\t\t\t\t_setImageSize(self.currItem, false, true);\n\t\t\t\t\t\t_renderMaxResolution = true;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif(_renderMaxResolution) {\n\t\t\t\t\t\t_setImageSize(self.currItem);\n\t\t\t\t\t\t_renderMaxResolution = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\n\t\t\t_applyZoomTransform(_currZoomElementStyle, _panOffset.x, _panOffset.y, _currZoomLevel);\n\t\t}\n\t},\n\t_applyZoomPanToItem = function(item) {\n\t\tif(item.container) {\n\n\t\t\t_applyZoomTransform(item.container.style, \n\t\t\t\t\t\t\t\titem.initialPosition.x, \n\t\t\t\t\t\t\t\titem.initialPosition.y, \n\t\t\t\t\t\t\t\titem.initialZoomLevel,\n\t\t\t\t\t\t\t\titem);\n\t\t}\n\t},\n\t_setTranslateX = function(x, elStyle) {\n\t\telStyle[_transformKey] = _translatePrefix + x + 'px, 0px' + _translateSufix;\n\t},\n\t_moveMainScroll = function(x, dragging) {\n\n\t\tif(!_options.loop && dragging) {\n\t\t\tvar newSlideIndexOffset = _currentItemIndex + (_slideSize.x * _currPositionIndex - x) / _slideSize.x,\n\t\t\t\tdelta = Math.round(x - _mainScrollPos.x);\n\n\t\t\tif( (newSlideIndexOffset < 0 && delta > 0) || \n\t\t\t\t(newSlideIndexOffset >= _getNumItems() - 1 && delta < 0) ) {\n\t\t\t\tx = _mainScrollPos.x + delta * _options.mainScrollEndFriction;\n\t\t\t} \n\t\t}\n\t\t\n\t\t_mainScrollPos.x = x;\n\t\t_setTranslateX(x, _containerStyle);\n\t},\n\t_calculatePanOffset = function(axis, zoomLevel) {\n\t\tvar m = _midZoomPoint[axis] - _offset[axis];\n\t\treturn _startPanOffset[axis] + _currPanDist[axis] + m - m * ( zoomLevel / _startZoomLevel );\n\t},\n\t\n\t_equalizePoints = function(p1, p2) {\n\t\tp1.x = p2.x;\n\t\tp1.y = p2.y;\n\t\tif(p2.id) {\n\t\t\tp1.id = p2.id;\n\t\t}\n\t},\n\t_roundPoint = function(p) {\n\t\tp.x = Math.round(p.x);\n\t\tp.y = Math.round(p.y);\n\t},\n\n\t_mouseMoveTimeout = null,\n\t_onFirstMouseMove = function() {\n\t\t// Wait until mouse move event is fired at least twice during 100ms\n\t\t// We do this, because some mobile browsers trigger it on touchstart\n\t\tif(_mouseMoveTimeout ) { \n\t\t\tframework.unbind(document, 'mousemove', _onFirstMouseMove);\n\t\t\tframework.addClass(template, 'pswp--has_mouse');\n\t\t\t_options.mouseUsed = true;\n\t\t\t_shout('mouseUsed');\n\t\t}\n\t\t_mouseMoveTimeout = setTimeout(function() {\n\t\t\t_mouseMoveTimeout = null;\n\t\t}, 100);\n\t},\n\n\t_bindEvents = function() {\n\t\tframework.bind(document, 'keydown', self);\n\n\t\tif(_features.transform) {\n\t\t\t// don't bind click event in browsers that don't support transform (mostly IE8)\n\t\t\tframework.bind(self.scrollWrap, 'click', self);\n\t\t}\n\t\t\n\n\t\tif(!_options.mouseUsed) {\n\t\t\tframework.bind(document, 'mousemove', _onFirstMouseMove);\n\t\t}\n\n\t\tframework.bind(window, 'resize scroll orientationchange', self);\n\n\t\t_shout('bindEvents');\n\t},\n\n\t_unbindEvents = function() {\n\t\tframework.unbind(window, 'resize scroll orientationchange', self);\n\t\tframework.unbind(window, 'scroll', _globalEventHandlers.scroll);\n\t\tframework.unbind(document, 'keydown', self);\n\t\tframework.unbind(document, 'mousemove', _onFirstMouseMove);\n\n\t\tif(_features.transform) {\n\t\t\tframework.unbind(self.scrollWrap, 'click', self);\n\t\t}\n\n\t\tif(_isDragging) {\n\t\t\tframework.unbind(window, _upMoveEvents, self);\n\t\t}\n\n\t\tclearTimeout(_orientationChangeTimeout);\n\n\t\t_shout('unbindEvents');\n\t},\n\t\n\t_calculatePanBounds = function(zoomLevel, update) {\n\t\tvar bounds = _calculateItemSize( self.currItem, _viewportSize, zoomLevel );\n\t\tif(update) {\n\t\t\t_currPanBounds = bounds;\n\t\t}\n\t\treturn bounds;\n\t},\n\t\n\t_getMinZoomLevel = function(item) {\n\t\tif(!item) {\n\t\t\titem = self.currItem;\n\t\t}\n\t\treturn item.initialZoomLevel;\n\t},\n\t_getMaxZoomLevel = function(item) {\n\t\tif(!item) {\n\t\t\titem = self.currItem;\n\t\t}\n\t\treturn item.w > 0 ? _options.maxSpreadZoom : 1;\n\t},\n\n\t// Return true if offset is out of the bounds\n\t_modifyDestPanOffset = function(axis, destPanBounds, destPanOffset, destZoomLevel) {\n\t\tif(destZoomLevel === self.currItem.initialZoomLevel) {\n\t\t\tdestPanOffset[axis] = self.currItem.initialPosition[axis];\n\t\t\treturn true;\n\t\t} else {\n\t\t\tdestPanOffset[axis] = _calculatePanOffset(axis, destZoomLevel); \n\n\t\t\tif(destPanOffset[axis] > destPanBounds.min[axis]) {\n\t\t\t\tdestPanOffset[axis] = destPanBounds.min[axis];\n\t\t\t\treturn true;\n\t\t\t} else if(destPanOffset[axis] < destPanBounds.max[axis] ) {\n\t\t\t\tdestPanOffset[axis] = destPanBounds.max[axis];\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\t_setupTransforms = function() {\n\n\t\tif(_transformKey) {\n\t\t\t// setup 3d transforms\n\t\t\tvar allow3dTransform = _features.perspective && !_likelyTouchDevice;\n\t\t\t_translatePrefix = 'translate' + (allow3dTransform ? '3d(' : '(');\n\t\t\t_translateSufix = _features.perspective ? ', 0px)' : ')';\t\n\t\t\treturn;\n\t\t}\n\n\t\t// Override zoom/pan/move functions in case old browser is used (most likely IE)\n\t\t// (so they use left/top/width/height, instead of CSS transform)\n\t\n\t\t_transformKey = 'left';\n\t\tframework.addClass(template, 'pswp--ie');\n\n\t\t_setTranslateX = function(x, elStyle) {\n\t\t\telStyle.left = x + 'px';\n\t\t};\n\t\t_applyZoomPanToItem = function(item) {\n\n\t\t\tvar zoomRatio = item.fitRatio > 1 ? 1 : item.fitRatio,\n\t\t\t\ts = item.container.style,\n\t\t\t\tw = zoomRatio * item.w,\n\t\t\t\th = zoomRatio * item.h;\n\n\t\t\ts.width = w + 'px';\n\t\t\ts.height = h + 'px';\n\t\t\ts.left = item.initialPosition.x + 'px';\n\t\t\ts.top = item.initialPosition.y + 'px';\n\n\t\t};\n\t\t_applyCurrentZoomPan = function() {\n\t\t\tif(_currZoomElementStyle) {\n\n\t\t\t\tvar s = _currZoomElementStyle,\n\t\t\t\t\titem = self.currItem,\n\t\t\t\t\tzoomRatio = item.fitRatio > 1 ? 1 : item.fitRatio,\n\t\t\t\t\tw = zoomRatio * item.w,\n\t\t\t\t\th = zoomRatio * item.h;\n\n\t\t\t\ts.width = w + 'px';\n\t\t\t\ts.height = h + 'px';\n\n\n\t\t\t\ts.left = _panOffset.x + 'px';\n\t\t\t\ts.top = _panOffset.y + 'px';\n\t\t\t}\n\t\t\t\n\t\t};\n\t},\n\n\t_onKeyDown = function(e) {\n\t\tvar keydownAction = '';\n\t\tif(_options.escKey && e.keyCode === 27) { \n\t\t\tkeydownAction = 'close';\n\t\t} else if(_options.arrowKeys) {\n\t\t\tif(e.keyCode === 37) {\n\t\t\t\tkeydownAction = 'prev';\n\t\t\t} else if(e.keyCode === 39) { \n\t\t\t\tkeydownAction = 'next';\n\t\t\t}\n\t\t}\n\n\t\tif(keydownAction) {\n\t\t\t// don't do anything if special key pressed to prevent from overriding default browser actions\n\t\t\t// e.g. in Chrome on Mac cmd+arrow-left returns to previous page\n\t\t\tif( !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey ) {\n\t\t\t\tif(e.preventDefault) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t} else {\n\t\t\t\t\te.returnValue = false;\n\t\t\t\t} \n\t\t\t\tself[keydownAction]();\n\t\t\t}\n\t\t}\n\t},\n\n\t_onGlobalClick = function(e) {\n\t\tif(!e) {\n\t\t\treturn;\n\t\t}\n\n\t\t// don't allow click event to pass through when triggering after drag or some other gesture\n\t\tif(_moved || _zoomStarted || _mainScrollAnimating || _verticalDragInitiated) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\n\t_updatePageScrollOffset = function() {\n\t\tself.setScrollOffset(0, framework.getScrollY());\t\t\n\t};\n\t\n\n\n\t\n\n\n\n// Micro animation engine\nvar _animations = {},\n\t_numAnimations = 0,\n\t_stopAnimation = function(name) {\n\t\tif(_animations[name]) {\n\t\t\tif(_animations[name].raf) {\n\t\t\t\t_cancelAF( _animations[name].raf );\n\t\t\t}\n\t\t\t_numAnimations--;\n\t\t\tdelete _animations[name];\n\t\t}\n\t},\n\t_registerStartAnimation = function(name) {\n\t\tif(_animations[name]) {\n\t\t\t_stopAnimation(name);\n\t\t}\n\t\tif(!_animations[name]) {\n\t\t\t_numAnimations++;\n\t\t\t_animations[name] = {};\n\t\t}\n\t},\n\t_stopAllAnimations = function() {\n\t\tfor (var prop in _animations) {\n\n\t\t\tif( _animations.hasOwnProperty( prop ) ) {\n\t\t\t\t_stopAnimation(prop);\n\t\t\t} \n\t\t\t\n\t\t}\n\t},\n\t_animateProp = function(name, b, endProp, d, easingFn, onUpdate, onComplete) {\n\t\tvar startAnimTime = _getCurrentTime(), t;\n\t\t_registerStartAnimation(name);\n\n\t\tvar animloop = function(){\n\t\t\tif ( _animations[name] ) {\n\t\t\t\t\n\t\t\t\tt = _getCurrentTime() - startAnimTime; // time diff\n\t\t\t\t//b - beginning (start prop)\n\t\t\t\t//d - anim duration\n\n\t\t\t\tif ( t >= d ) {\n\t\t\t\t\t_stopAnimation(name);\n\t\t\t\t\tonUpdate(endProp);\n\t\t\t\t\tif(onComplete) {\n\t\t\t\t\t\tonComplete();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonUpdate( (endProp - b) * easingFn(t/d) + b );\n\n\t\t\t\t_animations[name].raf = _requestAF(animloop);\n\t\t\t}\n\t\t};\n\t\tanimloop();\n\t};\n\t\n\n\nvar publicMethods = {\n\n\t// make a few local variables and functions public\n\tshout: _shout,\n\tlisten: _listen,\n\tviewportSize: _viewportSize,\n\toptions: _options,\n\n\tisMainScrollAnimating: function() {\n\t\treturn _mainScrollAnimating;\n\t},\n\tgetZoomLevel: function() {\n\t\treturn _currZoomLevel;\n\t},\n\tgetCurrentIndex: function() {\n\t\treturn _currentItemIndex;\n\t},\n\tisDragging: function() {\n\t\treturn _isDragging;\n\t},\t\n\tisZooming: function() {\n\t\treturn _isZooming;\n\t},\n\tsetScrollOffset: function(x,y) {\n\t\t_offset.x = x;\n\t\t_currentWindowScrollY = _offset.y = y;\n\t\t_shout('updateScrollOffset', _offset);\n\t},\n\tapplyZoomPan: function(zoomLevel,panX,panY,allowRenderResolution) {\n\t\t_panOffset.x = panX;\n\t\t_panOffset.y = panY;\n\t\t_currZoomLevel = zoomLevel;\n\t\t_applyCurrentZoomPan( allowRenderResolution );\n\t},\n\n\tinit: function() {\n\n\t\tif(_isOpen || _isDestroying) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar i;\n\n\t\tself.framework = framework; // basic functionality\n\t\tself.template = template; // root DOM element of PhotoSwipe\n\t\tself.bg = framework.getChildByClass(template, 'pswp__bg');\n\n\t\t_initalClassName = template.className;\n\t\t_isOpen = true;\n\t\t\t\t\n\t\t_features = framework.detectFeatures();\n\t\t_requestAF = _features.raf;\n\t\t_cancelAF = _features.caf;\n\t\t_transformKey = _features.transform;\n\t\t_oldIE = _features.oldIE;\n\t\t\n\t\tself.scrollWrap = framework.getChildByClass(template, 'pswp__scroll-wrap');\n\t\tself.container = framework.getChildByClass(self.scrollWrap, 'pswp__container');\n\n\t\t_containerStyle = self.container.style; // for fast access\n\n\t\t// Objects that hold slides (there are only 3 in DOM)\n\t\tself.itemHolders = _itemHolders = [\n\t\t\t{el:self.container.children[0] , wrap:0, index: -1},\n\t\t\t{el:self.container.children[1] , wrap:0, index: -1},\n\t\t\t{el:self.container.children[2] , wrap:0, index: -1}\n\t\t];\n\n\t\t// hide nearby item holders until initial zoom animation finishes (to avoid extra Paints)\n\t\t_itemHolders[0].el.style.display = _itemHolders[2].el.style.display = 'none';\n\n\t\t_setupTransforms();\n\n\t\t// Setup global events\n\t\t_globalEventHandlers = {\n\t\t\tresize: self.updateSize,\n\n\t\t\t// Fixes: iOS 10.3 resize event\n\t\t\t// does not update scrollWrap.clientWidth instantly after resize\n\t\t\t// https://github.com/dimsemenov/PhotoSwipe/issues/1315\n\t\t\torientationchange: function() {\n\t\t\t\tclearTimeout(_orientationChangeTimeout);\n\t\t\t\t_orientationChangeTimeout = setTimeout(function() {\n\t\t\t\t\tif(_viewportSize.x !== self.scrollWrap.clientWidth) {\n\t\t\t\t\t\tself.updateSize();\n\t\t\t\t\t}\n\t\t\t\t}, 500);\n\t\t\t},\n\t\t\tscroll: _updatePageScrollOffset,\n\t\t\tkeydown: _onKeyDown,\n\t\t\tclick: _onGlobalClick\n\t\t};\n\n\t\t// disable show/hide effects on old browsers that don't support CSS animations or transforms, \n\t\t// old IOS, Android and Opera mobile. Blackberry seems to work fine, even older models.\n\t\tvar oldPhone = _features.isOldIOSPhone || _features.isOldAndroid || _features.isMobileOpera;\n\t\tif(!_features.animationName || !_features.transform || oldPhone) {\n\t\t\t_options.showAnimationDuration = _options.hideAnimationDuration = 0;\n\t\t}\n\n\t\t// init modules\n\t\tfor(i = 0; i < _modules.length; i++) {\n\t\t\tself['init' + _modules[i]]();\n\t\t}\n\t\t\n\t\t// init\n\t\tif(UiClass) {\n\t\t\tvar ui = self.ui = new UiClass(self, framework);\n\t\t\tui.init();\n\t\t}\n\n\t\t_shout('firstUpdate');\n\t\t_currentItemIndex = _currentItemIndex || _options.index || 0;\n\t\t// validate index\n\t\tif( isNaN(_currentItemIndex) || _currentItemIndex < 0 || _currentItemIndex >= _getNumItems() ) {\n\t\t\t_currentItemIndex = 0;\n\t\t}\n\t\tself.currItem = _getItemAt( _currentItemIndex );\n\n\t\t\n\t\tif(_features.isOldIOSPhone || _features.isOldAndroid) {\n\t\t\t_isFixedPosition = false;\n\t\t}\n\t\t\n\t\ttemplate.setAttribute('aria-hidden', 'false');\n\t\tif(_options.modal) {\n\t\t\tif(!_isFixedPosition) {\n\t\t\t\ttemplate.style.position = 'absolute';\n\t\t\t\ttemplate.style.top = framework.getScrollY() + 'px';\n\t\t\t} else {\n\t\t\t\ttemplate.style.position = 'fixed';\n\t\t\t}\n\t\t}\n\n\t\tif(_currentWindowScrollY === undefined) {\n\t\t\t_shout('initialLayout');\n\t\t\t_currentWindowScrollY = _initalWindowScrollY = framework.getScrollY();\n\t\t}\n\t\t\n\t\t// add classes to root element of PhotoSwipe\n\t\tvar rootClasses = 'pswp--open ';\n\t\tif(_options.mainClass) {\n\t\t\trootClasses += _options.mainClass + ' ';\n\t\t}\n\t\tif(_options.showHideOpacity) {\n\t\t\trootClasses += 'pswp--animate_opacity ';\n\t\t}\n\t\trootClasses += _likelyTouchDevice ? 'pswp--touch' : 'pswp--notouch';\n\t\trootClasses += _features.animationName ? ' pswp--css_animation' : '';\n\t\trootClasses += _features.svg ? ' pswp--svg' : '';\n\t\tframework.addClass(template, rootClasses);\n\n\t\tself.updateSize();\n\n\t\t// initial update\n\t\t_containerShiftIndex = -1;\n\t\t_indexDiff = null;\n\t\tfor(i = 0; i < NUM_HOLDERS; i++) {\n\t\t\t_setTranslateX( (i+_containerShiftIndex) * _slideSize.x, _itemHolders[i].el.style);\n\t\t}\n\n\t\tif(!_oldIE) {\n\t\t\tframework.bind(self.scrollWrap, _downEvents, self); // no dragging for old IE\n\t\t}\t\n\n\t\t_listen('initialZoomInEnd', function() {\n\t\t\tself.setContent(_itemHolders[0], _currentItemIndex-1);\n\t\t\tself.setContent(_itemHolders[2], _currentItemIndex+1);\n\n\t\t\t_itemHolders[0].el.style.display = _itemHolders[2].el.style.display = 'block';\n\n\t\t\tif(_options.focus) {\n\t\t\t\t// focus causes layout, \n\t\t\t\t// which causes lag during the animation, \n\t\t\t\t// that's why we delay it untill the initial zoom transition ends\n\t\t\t\ttemplate.focus();\n\t\t\t}\n\t\t\t \n\n\t\t\t_bindEvents();\n\t\t});\n\n\t\t// set content for center slide (first time)\n\t\tself.setContent(_itemHolders[1], _currentItemIndex);\n\t\t\n\t\tself.updateCurrItem();\n\n\t\t_shout('afterInit');\n\n\t\tif(!_isFixedPosition) {\n\n\t\t\t// On all versions of iOS lower than 8.0, we check size of viewport every second.\n\t\t\t// \n\t\t\t// This is done to detect when Safari top & bottom bars appear, \n\t\t\t// as this action doesn't trigger any events (like resize). \n\t\t\t// \n\t\t\t// On iOS8 they fixed this.\n\t\t\t// \n\t\t\t// 10 Nov 2014: iOS 7 usage ~40%. iOS 8 usage 56%.\n\t\t\t\n\t\t\t_updateSizeInterval = setInterval(function() {\n\t\t\t\tif(!_numAnimations && !_isDragging && !_isZooming && (_currZoomLevel === self.currItem.initialZoomLevel)  ) {\n\t\t\t\t\tself.updateSize();\n\t\t\t\t}\n\t\t\t}, 1000);\n\t\t}\n\n\t\tframework.addClass(template, 'pswp--visible');\n\t},\n\n\t// Close the gallery, then destroy it\n\tclose: function() {\n\t\tif(!_isOpen) {\n\t\t\treturn;\n\t\t}\n\n\t\t_isOpen = false;\n\t\t_isDestroying = true;\n\t\t_shout('close');\n\t\t_unbindEvents();\n\n\t\t_showOrHide(self.currItem, null, true, self.destroy);\n\t},\n\n\t// destroys the gallery (unbinds events, cleans up intervals and timeouts to avoid memory leaks)\n\tdestroy: function() {\n\t\t_shout('destroy');\n\n\t\tif(_showOrHideTimeout) {\n\t\t\tclearTimeout(_showOrHideTimeout);\n\t\t}\n\t\t\n\t\ttemplate.setAttribute('aria-hidden', 'true');\n\t\ttemplate.className = _initalClassName;\n\n\t\tif(_updateSizeInterval) {\n\t\t\tclearInterval(_updateSizeInterval);\n\t\t}\n\n\t\tframework.unbind(self.scrollWrap, _downEvents, self);\n\n\t\t// we unbind scroll event at the end, as closing animation may depend on it\n\t\tframework.unbind(window, 'scroll', self);\n\n\t\t_stopDragUpdateLoop();\n\n\t\t_stopAllAnimations();\n\n\t\t_listeners = null;\n\t},\n\n\t/**\n\t * Pan image to position\n\t * @param {Number} x     \n\t * @param {Number} y     \n\t * @param {Boolean} force Will ignore bounds if set to true.\n\t */\n\tpanTo: function(x,y,force) {\n\t\tif(!force) {\n\t\t\tif(x > _currPanBounds.min.x) {\n\t\t\t\tx = _currPanBounds.min.x;\n\t\t\t} else if(x < _currPanBounds.max.x) {\n\t\t\t\tx = _currPanBounds.max.x;\n\t\t\t}\n\n\t\t\tif(y > _currPanBounds.min.y) {\n\t\t\t\ty = _currPanBounds.min.y;\n\t\t\t} else if(y < _currPanBounds.max.y) {\n\t\t\t\ty = _currPanBounds.max.y;\n\t\t\t}\n\t\t}\n\t\t\n\t\t_panOffset.x = x;\n\t\t_panOffset.y = y;\n\t\t_applyCurrentZoomPan();\n\t},\n\t\n\thandleEvent: function (e) {\n\t\te = e || window.event;\n\t\tif(_globalEventHandlers[e.type]) {\n\t\t\t_globalEventHandlers[e.type](e);\n\t\t}\n\t},\n\n\n\tgoTo: function(index) {\n\n\t\tindex = _getLoopedId(index);\n\n\t\tvar diff = index - _currentItemIndex;\n\t\t_indexDiff = diff;\n\n\t\t_currentItemIndex = index;\n\t\tself.currItem = _getItemAt( _currentItemIndex );\n\t\t_currPositionIndex -= diff;\n\t\t\n\t\t_moveMainScroll(_slideSize.x * _currPositionIndex);\n\t\t\n\n\t\t_stopAllAnimations();\n\t\t_mainScrollAnimating = false;\n\n\t\tself.updateCurrItem();\n\t},\n\tnext: function() {\n\t\tself.goTo( _currentItemIndex + 1);\n\t},\n\tprev: function() {\n\t\tself.goTo( _currentItemIndex - 1);\n\t},\n\n\t// update current zoom/pan objects\n\tupdateCurrZoomItem: function(emulateSetContent) {\n\t\tif(emulateSetContent) {\n\t\t\t_shout('beforeChange', 0);\n\t\t}\n\n\t\t// itemHolder[1] is middle (current) item\n\t\tif(_itemHolders[1].el.children.length) {\n\t\t\tvar zoomElement = _itemHolders[1].el.children[0];\n\t\t\tif( framework.hasClass(zoomElement, 'pswp__zoom-wrap') ) {\n\t\t\t\t_currZoomElementStyle = zoomElement.style;\n\t\t\t} else {\n\t\t\t\t_currZoomElementStyle = null;\n\t\t\t}\n\t\t} else {\n\t\t\t_currZoomElementStyle = null;\n\t\t}\n\t\t\n\t\t_currPanBounds = self.currItem.bounds;\t\n\t\t_startZoomLevel = _currZoomLevel = self.currItem.initialZoomLevel;\n\n\t\t_panOffset.x = _currPanBounds.center.x;\n\t\t_panOffset.y = _currPanBounds.center.y;\n\n\t\tif(emulateSetContent) {\n\t\t\t_shout('afterChange');\n\t\t}\n\t},\n\n\n\tinvalidateCurrItems: function() {\n\t\t_itemsNeedUpdate = true;\n\t\tfor(var i = 0; i < NUM_HOLDERS; i++) {\n\t\t\tif( _itemHolders[i].item ) {\n\t\t\t\t_itemHolders[i].item.needsUpdate = true;\n\t\t\t}\n\t\t}\n\t},\n\n\tupdateCurrItem: function(beforeAnimation) {\n\n\t\tif(_indexDiff === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar diffAbs = Math.abs(_indexDiff),\n\t\t\ttempHolder;\n\n\t\tif(beforeAnimation && diffAbs < 2) {\n\t\t\treturn;\n\t\t}\n\n\n\t\tself.currItem = _getItemAt( _currentItemIndex );\n\t\t_renderMaxResolution = false;\n\t\t\n\t\t_shout('beforeChange', _indexDiff);\n\n\t\tif(diffAbs >= NUM_HOLDERS) {\n\t\t\t_containerShiftIndex += _indexDiff + (_indexDiff > 0 ? -NUM_HOLDERS : NUM_HOLDERS);\n\t\t\tdiffAbs = NUM_HOLDERS;\n\t\t}\n\t\tfor(var i = 0; i < diffAbs; i++) {\n\t\t\tif(_indexDiff > 0) {\n\t\t\t\ttempHolder = _itemHolders.shift();\n\t\t\t\t_itemHolders[NUM_HOLDERS-1] = tempHolder; // move first to last\n\n\t\t\t\t_containerShiftIndex++;\n\t\t\t\t_setTranslateX( (_containerShiftIndex+2) * _slideSize.x, tempHolder.el.style);\n\t\t\t\tself.setContent(tempHolder, _currentItemIndex - diffAbs + i + 1 + 1);\n\t\t\t} else {\n\t\t\t\ttempHolder = _itemHolders.pop();\n\t\t\t\t_itemHolders.unshift( tempHolder ); // move last to first\n\n\t\t\t\t_containerShiftIndex--;\n\t\t\t\t_setTranslateX( _containerShiftIndex * _slideSize.x, tempHolder.el.style);\n\t\t\t\tself.setContent(tempHolder, _currentItemIndex + diffAbs - i - 1 - 1);\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t\t// reset zoom/pan on previous item\n\t\tif(_currZoomElementStyle && Math.abs(_indexDiff) === 1) {\n\n\t\t\tvar prevItem = _getItemAt(_prevItemIndex);\n\t\t\tif(prevItem.initialZoomLevel !== _currZoomLevel) {\n\t\t\t\t_calculateItemSize(prevItem , _viewportSize );\n\t\t\t\t_setImageSize(prevItem);\n\t\t\t\t_applyZoomPanToItem( prevItem ); \t\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\t// reset diff after update\n\t\t_indexDiff = 0;\n\n\t\tself.updateCurrZoomItem();\n\n\t\t_prevItemIndex = _currentItemIndex;\n\n\t\t_shout('afterChange');\n\t\t\n\t},\n\n\n\n\tupdateSize: function(force) {\n\t\t\n\t\tif(!_isFixedPosition && _options.modal) {\n\t\t\tvar windowScrollY = framework.getScrollY();\n\t\t\tif(_currentWindowScrollY !== windowScrollY) {\n\t\t\t\ttemplate.style.top = windowScrollY + 'px';\n\t\t\t\t_currentWindowScrollY = windowScrollY;\n\t\t\t}\n\t\t\tif(!force && _windowVisibleSize.x === window.innerWidth && _windowVisibleSize.y === window.innerHeight) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t_windowVisibleSize.x = window.innerWidth;\n\t\t\t_windowVisibleSize.y = window.innerHeight;\n\n\t\t\t//template.style.width = _windowVisibleSize.x + 'px';\n\t\t\ttemplate.style.height = _windowVisibleSize.y + 'px';\n\t\t}\n\n\n\n\t\t_viewportSize.x = self.scrollWrap.clientWidth;\n\t\t_viewportSize.y = self.scrollWrap.clientHeight;\n\n\t\t_updatePageScrollOffset();\n\n\t\t_slideSize.x = _viewportSize.x + Math.round(_viewportSize.x * _options.spacing);\n\t\t_slideSize.y = _viewportSize.y;\n\n\t\t_moveMainScroll(_slideSize.x * _currPositionIndex);\n\n\t\t_shout('beforeResize'); // even may be used for example to switch image sources\n\n\n\t\t// don't re-calculate size on inital size update\n\t\tif(_containerShiftIndex !== undefined) {\n\n\t\t\tvar holder,\n\t\t\t\titem,\n\t\t\t\thIndex;\n\n\t\t\tfor(var i = 0; i < NUM_HOLDERS; i++) {\n\t\t\t\tholder = _itemHolders[i];\n\t\t\t\t_setTranslateX( (i+_containerShiftIndex) * _slideSize.x, holder.el.style);\n\n\t\t\t\thIndex = _currentItemIndex+i-1;\n\n\t\t\t\tif(_options.loop && _getNumItems() > 2) {\n\t\t\t\t\thIndex = _getLoopedId(hIndex);\n\t\t\t\t}\n\n\t\t\t\t// update zoom level on items and refresh source (if needsUpdate)\n\t\t\t\titem = _getItemAt( hIndex );\n\n\t\t\t\t// re-render gallery item if `needsUpdate`,\n\t\t\t\t// or doesn't have `bounds` (entirely new slide object)\n\t\t\t\tif( item && (_itemsNeedUpdate || item.needsUpdate || !item.bounds) ) {\n\n\t\t\t\t\tself.cleanSlide( item );\n\t\t\t\t\t\n\t\t\t\t\tself.setContent( holder, hIndex );\n\n\t\t\t\t\t// if \"center\" slide\n\t\t\t\t\tif(i === 1) {\n\t\t\t\t\t\tself.currItem = item;\n\t\t\t\t\t\tself.updateCurrZoomItem(true);\n\t\t\t\t\t}\n\n\t\t\t\t\titem.needsUpdate = false;\n\n\t\t\t\t} else if(holder.index === -1 && hIndex >= 0) {\n\t\t\t\t\t// add content first time\n\t\t\t\t\tself.setContent( holder, hIndex );\n\t\t\t\t}\n\t\t\t\tif(item && item.container) {\n\t\t\t\t\t_calculateItemSize(item, _viewportSize);\n\t\t\t\t\t_setImageSize(item);\n\t\t\t\t\t_applyZoomPanToItem( item );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t_itemsNeedUpdate = false;\n\t\t}\t\n\n\t\t_startZoomLevel = _currZoomLevel = self.currItem.initialZoomLevel;\n\t\t_currPanBounds = self.currItem.bounds;\n\n\t\tif(_currPanBounds) {\n\t\t\t_panOffset.x = _currPanBounds.center.x;\n\t\t\t_panOffset.y = _currPanBounds.center.y;\n\t\t\t_applyCurrentZoomPan( true );\n\t\t}\n\t\t\n\t\t_shout('resize');\n\t},\n\t\n\t// Zoom current item to\n\tzoomTo: function(destZoomLevel, centerPoint, speed, easingFn, updateFn) {\n\t\t/*\n\t\t\tif(destZoomLevel === 'fit') {\n\t\t\t\tdestZoomLevel = self.currItem.fitRatio;\n\t\t\t} else if(destZoomLevel === 'fill') {\n\t\t\t\tdestZoomLevel = self.currItem.fillRatio;\n\t\t\t}\n\t\t*/\n\n\t\tif(centerPoint) {\n\t\t\t_startZoomLevel = _currZoomLevel;\n\t\t\t_midZoomPoint.x = Math.abs(centerPoint.x) - _panOffset.x ;\n\t\t\t_midZoomPoint.y = Math.abs(centerPoint.y) - _panOffset.y ;\n\t\t\t_equalizePoints(_startPanOffset, _panOffset);\n\t\t}\n\n\t\tvar destPanBounds = _calculatePanBounds(destZoomLevel, false),\n\t\t\tdestPanOffset = {};\n\n\t\t_modifyDestPanOffset('x', destPanBounds, destPanOffset, destZoomLevel);\n\t\t_modifyDestPanOffset('y', destPanBounds, destPanOffset, destZoomLevel);\n\n\t\tvar initialZoomLevel = _currZoomLevel;\n\t\tvar initialPanOffset = {\n\t\t\tx: _panOffset.x,\n\t\t\ty: _panOffset.y\n\t\t};\n\n\t\t_roundPoint(destPanOffset);\n\n\t\tvar onUpdate = function(now) {\n\t\t\tif(now === 1) {\n\t\t\t\t_currZoomLevel = destZoomLevel;\n\t\t\t\t_panOffset.x = destPanOffset.x;\n\t\t\t\t_panOffset.y = destPanOffset.y;\n\t\t\t} else {\n\t\t\t\t_currZoomLevel = (destZoomLevel - initialZoomLevel) * now + initialZoomLevel;\n\t\t\t\t_panOffset.x = (destPanOffset.x - initialPanOffset.x) * now + initialPanOffset.x;\n\t\t\t\t_panOffset.y = (destPanOffset.y - initialPanOffset.y) * now + initialPanOffset.y;\n\t\t\t}\n\n\t\t\tif(updateFn) {\n\t\t\t\tupdateFn(now);\n\t\t\t}\n\n\t\t\t_applyCurrentZoomPan( now === 1 );\n\t\t};\n\n\t\tif(speed) {\n\t\t\t_animateProp('customZoomTo', 0, 1, speed, easingFn || framework.easing.sine.inOut, onUpdate);\n\t\t} else {\n\t\t\tonUpdate(1);\n\t\t}\n\t}\n\n\n};\n\n\n/*>>core*/\n\n/*>>gestures*/\n/**\n * Mouse/touch/pointer event handlers.\n * \n * separated from @core.js for readability\n */\n\nvar MIN_SWIPE_DISTANCE = 30,\n\tDIRECTION_CHECK_OFFSET = 10; // amount of pixels to drag to determine direction of swipe\n\nvar _gestureStartTime,\n\t_gestureCheckSpeedTime,\n\n\t// pool of objects that are used during dragging of zooming\n\tp = {}, // first point\n\tp2 = {}, // second point (for zoom gesture)\n\tdelta = {},\n\t_currPoint = {},\n\t_startPoint = {},\n\t_currPointers = [],\n\t_startMainScrollPos = {},\n\t_releaseAnimData,\n\t_posPoints = [], // array of points during dragging, used to determine type of gesture\n\t_tempPoint = {},\n\n\t_isZoomingIn,\n\t_verticalDragInitiated,\n\t_oldAndroidTouchEndTimeout,\n\t_currZoomedItemIndex = 0,\n\t_centerPoint = _getEmptyPoint(),\n\t_lastReleaseTime = 0,\n\t_isDragging, // at least one pointer is down\n\t_isMultitouch, // at least two _pointers are down\n\t_zoomStarted, // zoom level changed during zoom gesture\n\t_moved,\n\t_dragAnimFrame,\n\t_mainScrollShifted,\n\t_currentPoints, // array of current touch points\n\t_isZooming,\n\t_currPointsDistance,\n\t_startPointsDistance,\n\t_currPanBounds,\n\t_mainScrollPos = _getEmptyPoint(),\n\t_currZoomElementStyle,\n\t_mainScrollAnimating, // true, if animation after swipe gesture is running\n\t_midZoomPoint = _getEmptyPoint(),\n\t_currCenterPoint = _getEmptyPoint(),\n\t_direction,\n\t_isFirstMove,\n\t_opacityChanged,\n\t_bgOpacity,\n\t_wasOverInitialZoom,\n\n\t_isEqualPoints = function(p1, p2) {\n\t\treturn p1.x === p2.x && p1.y === p2.y;\n\t},\n\t_isNearbyPoints = function(touch0, touch1) {\n\t\treturn Math.abs(touch0.x - touch1.x) < DOUBLE_TAP_RADIUS && Math.abs(touch0.y - touch1.y) < DOUBLE_TAP_RADIUS;\n\t},\n\t_calculatePointsDistance = function(p1, p2) {\n\t\t_tempPoint.x = Math.abs( p1.x - p2.x );\n\t\t_tempPoint.y = Math.abs( p1.y - p2.y );\n\t\treturn Math.sqrt(_tempPoint.x * _tempPoint.x + _tempPoint.y * _tempPoint.y);\n\t},\n\t_stopDragUpdateLoop = function() {\n\t\tif(_dragAnimFrame) {\n\t\t\t_cancelAF(_dragAnimFrame);\n\t\t\t_dragAnimFrame = null;\n\t\t}\n\t},\n\t_dragUpdateLoop = function() {\n\t\tif(_isDragging) {\n\t\t\t_dragAnimFrame = _requestAF(_dragUpdateLoop);\n\t\t\t_renderMovement();\n\t\t}\n\t},\n\t_canPan = function() {\n\t\treturn !(_options.scaleMode === 'fit' && _currZoomLevel ===  self.currItem.initialZoomLevel);\n\t},\n\t\n\t// find the closest parent DOM element\n\t_closestElement = function(el, fn) {\n\t  \tif(!el || el === document) {\n\t  \t\treturn false;\n\t  \t}\n\n\t  \t// don't search elements above pswp__scroll-wrap\n\t  \tif(el.getAttribute('class') && el.getAttribute('class').indexOf('pswp__scroll-wrap') > -1 ) {\n\t  \t\treturn false;\n\t  \t}\n\n\t  \tif( fn(el) ) {\n\t  \t\treturn el;\n\t  \t}\n\n\t  \treturn _closestElement(el.parentNode, fn);\n\t},\n\n\t_preventObj = {},\n\t_preventDefaultEventBehaviour = function(e, isDown) {\n\t    _preventObj.prevent = !_closestElement(e.target, _options.isClickableElement);\n\n\t\t_shout('preventDragEvent', e, isDown, _preventObj);\n\t\treturn _preventObj.prevent;\n\n\t},\n\t_convertTouchToPoint = function(touch, p) {\n\t\tp.x = touch.pageX;\n\t\tp.y = touch.pageY;\n\t\tp.id = touch.identifier;\n\t\treturn p;\n\t},\n\t_findCenterOfPoints = function(p1, p2, pCenter) {\n\t\tpCenter.x = (p1.x + p2.x) * 0.5;\n\t\tpCenter.y = (p1.y + p2.y) * 0.5;\n\t},\n\t_pushPosPoint = function(time, x, y) {\n\t\tif(time - _gestureCheckSpeedTime > 50) {\n\t\t\tvar o = _posPoints.length > 2 ? _posPoints.shift() : {};\n\t\t\to.x = x;\n\t\t\to.y = y; \n\t\t\t_posPoints.push(o);\n\t\t\t_gestureCheckSpeedTime = time;\n\t\t}\n\t},\n\n\t_calculateVerticalDragOpacityRatio = function() {\n\t\tvar yOffset = _panOffset.y - self.currItem.initialPosition.y; // difference between initial and current position\n\t\treturn 1 -  Math.abs( yOffset / (_viewportSize.y / 2)  );\n\t},\n\n\t\n\t// points pool, reused during touch events\n\t_ePoint1 = {},\n\t_ePoint2 = {},\n\t_tempPointsArr = [],\n\t_tempCounter,\n\t_getTouchPoints = function(e) {\n\t\t// clean up previous points, without recreating array\n\t\twhile(_tempPointsArr.length > 0) {\n\t\t\t_tempPointsArr.pop();\n\t\t}\n\n\t\tif(!_pointerEventEnabled) {\n\t\t\tif(e.type.indexOf('touch') > -1) {\n\n\t\t\t\tif(e.touches && e.touches.length > 0) {\n\t\t\t\t\t_tempPointsArr[0] = _convertTouchToPoint(e.touches[0], _ePoint1);\n\t\t\t\t\tif(e.touches.length > 1) {\n\t\t\t\t\t\t_tempPointsArr[1] = _convertTouchToPoint(e.touches[1], _ePoint2);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\t_ePoint1.x = e.pageX;\n\t\t\t\t_ePoint1.y = e.pageY;\n\t\t\t\t_ePoint1.id = '';\n\t\t\t\t_tempPointsArr[0] = _ePoint1;//_ePoint1;\n\t\t\t}\n\t\t} else {\n\t\t\t_tempCounter = 0;\n\t\t\t// we can use forEach, as pointer events are supported only in modern browsers\n\t\t\t_currPointers.forEach(function(p) {\n\t\t\t\tif(_tempCounter === 0) {\n\t\t\t\t\t_tempPointsArr[0] = p;\n\t\t\t\t} else if(_tempCounter === 1) {\n\t\t\t\t\t_tempPointsArr[1] = p;\n\t\t\t\t}\n\t\t\t\t_tempCounter++;\n\n\t\t\t});\n\t\t}\n\t\treturn _tempPointsArr;\n\t},\n\n\t_panOrMoveMainScroll = function(axis, delta) {\n\n\t\tvar panFriction,\n\t\t\toverDiff = 0,\n\t\t\tnewOffset = _panOffset[axis] + delta[axis],\n\t\t\tstartOverDiff,\n\t\t\tdir = delta[axis] > 0,\n\t\t\tnewMainScrollPosition = _mainScrollPos.x + delta.x,\n\t\t\tmainScrollDiff = _mainScrollPos.x - _startMainScrollPos.x,\n\t\t\tnewPanPos,\n\t\t\tnewMainScrollPos;\n\n\t\t// calculate fdistance over the bounds and friction\n\t\tif(newOffset > _currPanBounds.min[axis] || newOffset < _currPanBounds.max[axis]) {\n\t\t\tpanFriction = _options.panEndFriction;\n\t\t\t// Linear increasing of friction, so at 1/4 of viewport it's at max value. \n\t\t\t// Looks not as nice as was expected. Left for history.\n\t\t\t// panFriction = (1 - (_panOffset[axis] + delta[axis] + panBounds.min[axis]) / (_viewportSize[axis] / 4) );\n\t\t} else {\n\t\t\tpanFriction = 1;\n\t\t}\n\t\t\n\t\tnewOffset = _panOffset[axis] + delta[axis] * panFriction;\n\n\t\t// move main scroll or start panning\n\t\tif(_options.allowPanToNext || _currZoomLevel === self.currItem.initialZoomLevel) {\n\n\n\t\t\tif(!_currZoomElementStyle) {\n\t\t\t\t\n\t\t\t\tnewMainScrollPos = newMainScrollPosition;\n\n\t\t\t} else if(_direction === 'h' && axis === 'x' && !_zoomStarted ) {\n\t\t\t\t\n\t\t\t\tif(dir) {\n\t\t\t\t\tif(newOffset > _currPanBounds.min[axis]) {\n\t\t\t\t\t\tpanFriction = _options.panEndFriction;\n\t\t\t\t\t\toverDiff = _currPanBounds.min[axis] - newOffset;\n\t\t\t\t\t\tstartOverDiff = _currPanBounds.min[axis] - _startPanOffset[axis];\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// drag right\n\t\t\t\t\tif( (startOverDiff <= 0 || mainScrollDiff < 0) && _getNumItems() > 1 ) {\n\t\t\t\t\t\tnewMainScrollPos = newMainScrollPosition;\n\t\t\t\t\t\tif(mainScrollDiff < 0 && newMainScrollPosition > _startMainScrollPos.x) {\n\t\t\t\t\t\t\tnewMainScrollPos = _startMainScrollPos.x;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(_currPanBounds.min.x !== _currPanBounds.max.x) {\n\t\t\t\t\t\t\tnewPanPos = newOffset;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif(newOffset < _currPanBounds.max[axis] ) {\n\t\t\t\t\t\tpanFriction =_options.panEndFriction;\n\t\t\t\t\t\toverDiff = newOffset - _currPanBounds.max[axis];\n\t\t\t\t\t\tstartOverDiff = _startPanOffset[axis] - _currPanBounds.max[axis];\n\t\t\t\t\t}\n\n\t\t\t\t\tif( (startOverDiff <= 0 || mainScrollDiff > 0) && _getNumItems() > 1 ) {\n\t\t\t\t\t\tnewMainScrollPos = newMainScrollPosition;\n\n\t\t\t\t\t\tif(mainScrollDiff > 0 && newMainScrollPosition < _startMainScrollPos.x) {\n\t\t\t\t\t\t\tnewMainScrollPos = _startMainScrollPos.x;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(_currPanBounds.min.x !== _currPanBounds.max.x) {\n\t\t\t\t\t\t\tnewPanPos = newOffset;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t\t//\n\t\t\t}\n\n\t\t\tif(axis === 'x') {\n\n\t\t\t\tif(newMainScrollPos !== undefined) {\n\t\t\t\t\t_moveMainScroll(newMainScrollPos, true);\n\t\t\t\t\tif(newMainScrollPos === _startMainScrollPos.x) {\n\t\t\t\t\t\t_mainScrollShifted = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_mainScrollShifted = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(_currPanBounds.min.x !== _currPanBounds.max.x) {\n\t\t\t\t\tif(newPanPos !== undefined) {\n\t\t\t\t\t\t_panOffset.x = newPanPos;\n\t\t\t\t\t} else if(!_mainScrollShifted) {\n\t\t\t\t\t\t_panOffset.x += delta.x * panFriction;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn newMainScrollPos !== undefined;\n\t\t\t}\n\n\t\t}\n\n\t\tif(!_mainScrollAnimating) {\n\t\t\t\n\t\t\tif(!_mainScrollShifted) {\n\t\t\t\tif(_currZoomLevel > self.currItem.fitRatio) {\n\t\t\t\t\t_panOffset[axis] += delta[axis] * panFriction;\n\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t\n\t\t}\n\t\t\n\t},\n\n\t// Pointerdown/touchstart/mousedown handler\n\t_onDragStart = function(e) {\n\n\t\t// Allow dragging only via left mouse button.\n\t\t// As this handler is not added in IE8 - we ignore e.which\n\t\t// \n\t\t// http://www.quirksmode.org/js/events_properties.html\n\t\t// https://developer.mozilla.org/en-US/docs/Web/API/event.button\n\t\tif(e.type === 'mousedown' && e.button > 0  ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(_initialZoomRunning) {\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tif(_oldAndroidTouchEndTimeout && e.type === 'mousedown') {\n\t\t\treturn;\n\t\t}\n\n\t\tif(_preventDefaultEventBehaviour(e, true)) {\n\t\t\te.preventDefault();\n\t\t}\n\n\n\n\t\t_shout('pointerDown');\n\n\t\tif(_pointerEventEnabled) {\n\t\t\tvar pointerIndex = framework.arraySearch(_currPointers, e.pointerId, 'id');\n\t\t\tif(pointerIndex < 0) {\n\t\t\t\tpointerIndex = _currPointers.length;\n\t\t\t}\n\t\t\t_currPointers[pointerIndex] = {x:e.pageX, y:e.pageY, id: e.pointerId};\n\t\t}\n\t\t\n\n\n\t\tvar startPointsList = _getTouchPoints(e),\n\t\t\tnumPoints = startPointsList.length;\n\n\t\t_currentPoints = null;\n\n\t\t_stopAllAnimations();\n\n\t\t// init drag\n\t\tif(!_isDragging || numPoints === 1) {\n\n\t\t\t\n\n\t\t\t_isDragging = _isFirstMove = true;\n\t\t\tframework.bind(window, _upMoveEvents, self);\n\n\t\t\t_isZoomingIn = \n\t\t\t\t_wasOverInitialZoom = \n\t\t\t\t_opacityChanged = \n\t\t\t\t_verticalDragInitiated = \n\t\t\t\t_mainScrollShifted = \n\t\t\t\t_moved = \n\t\t\t\t_isMultitouch = \n\t\t\t\t_zoomStarted = false;\n\n\t\t\t_direction = null;\n\n\t\t\t_shout('firstTouchStart', startPointsList);\n\n\t\t\t_equalizePoints(_startPanOffset, _panOffset);\n\n\t\t\t_currPanDist.x = _currPanDist.y = 0;\n\t\t\t_equalizePoints(_currPoint, startPointsList[0]);\n\t\t\t_equalizePoints(_startPoint, _currPoint);\n\n\t\t\t//_equalizePoints(_startMainScrollPos, _mainScrollPos);\n\t\t\t_startMainScrollPos.x = _slideSize.x * _currPositionIndex;\n\n\t\t\t_posPoints = [{\n\t\t\t\tx: _currPoint.x,\n\t\t\t\ty: _currPoint.y\n\t\t\t}];\n\n\t\t\t_gestureCheckSpeedTime = _gestureStartTime = _getCurrentTime();\n\n\t\t\t//_mainScrollAnimationEnd(true);\n\t\t\t_calculatePanBounds( _currZoomLevel, true );\n\t\t\t\n\t\t\t// Start rendering\n\t\t\t_stopDragUpdateLoop();\n\t\t\t_dragUpdateLoop();\n\t\t\t\n\t\t}\n\n\t\t// init zoom\n\t\tif(!_isZooming && numPoints > 1 && !_mainScrollAnimating && !_mainScrollShifted) {\n\t\t\t_startZoomLevel = _currZoomLevel;\n\t\t\t_zoomStarted = false; // true if zoom changed at least once\n\n\t\t\t_isZooming = _isMultitouch = true;\n\t\t\t_currPanDist.y = _currPanDist.x = 0;\n\n\t\t\t_equalizePoints(_startPanOffset, _panOffset);\n\n\t\t\t_equalizePoints(p, startPointsList[0]);\n\t\t\t_equalizePoints(p2, startPointsList[1]);\n\n\t\t\t_findCenterOfPoints(p, p2, _currCenterPoint);\n\n\t\t\t_midZoomPoint.x = Math.abs(_currCenterPoint.x) - _panOffset.x;\n\t\t\t_midZoomPoint.y = Math.abs(_currCenterPoint.y) - _panOffset.y;\n\t\t\t_currPointsDistance = _startPointsDistance = _calculatePointsDistance(p, p2);\n\t\t}\n\n\n\t},\n\n\t// Pointermove/touchmove/mousemove handler\n\t_onDragMove = function(e) {\n\n\t\te.preventDefault();\n\n\t\tif(_pointerEventEnabled) {\n\t\t\tvar pointerIndex = framework.arraySearch(_currPointers, e.pointerId, 'id');\n\t\t\tif(pointerIndex > -1) {\n\t\t\t\tvar p = _currPointers[pointerIndex];\n\t\t\t\tp.x = e.pageX;\n\t\t\t\tp.y = e.pageY; \n\t\t\t}\n\t\t}\n\n\t\tif(_isDragging) {\n\t\t\tvar touchesList = _getTouchPoints(e);\n\t\t\tif(!_direction && !_moved && !_isZooming) {\n\n\t\t\t\tif(_mainScrollPos.x !== _slideSize.x * _currPositionIndex) {\n\t\t\t\t\t// if main scroll position is shifted – direction is always horizontal\n\t\t\t\t\t_direction = 'h';\n\t\t\t\t} else {\n\t\t\t\t\tvar diff = Math.abs(touchesList[0].x - _currPoint.x) - Math.abs(touchesList[0].y - _currPoint.y);\n\t\t\t\t\t// check the direction of movement\n\t\t\t\t\tif(Math.abs(diff) >= DIRECTION_CHECK_OFFSET) {\n\t\t\t\t\t\t_direction = diff > 0 ? 'h' : 'v';\n\t\t\t\t\t\t_currentPoints = touchesList;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\t_currentPoints = touchesList;\n\t\t\t}\n\t\t}\t\n\t},\n\t// \n\t_renderMovement =  function() {\n\n\t\tif(!_currentPoints) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar numPoints = _currentPoints.length;\n\n\t\tif(numPoints === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t_equalizePoints(p, _currentPoints[0]);\n\n\t\tdelta.x = p.x - _currPoint.x;\n\t\tdelta.y = p.y - _currPoint.y;\n\n\t\tif(_isZooming && numPoints > 1) {\n\t\t\t// Handle behaviour for more than 1 point\n\n\t\t\t_currPoint.x = p.x;\n\t\t\t_currPoint.y = p.y;\n\t\t\n\t\t\t// check if one of two points changed\n\t\t\tif( !delta.x && !delta.y && _isEqualPoints(_currentPoints[1], p2) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_equalizePoints(p2, _currentPoints[1]);\n\n\n\t\t\tif(!_zoomStarted) {\n\t\t\t\t_zoomStarted = true;\n\t\t\t\t_shout('zoomGestureStarted');\n\t\t\t}\n\t\t\t\n\t\t\t// Distance between two points\n\t\t\tvar pointsDistance = _calculatePointsDistance(p,p2);\n\n\t\t\tvar zoomLevel = _calculateZoomLevel(pointsDistance);\n\n\t\t\t// slightly over the of initial zoom level\n\t\t\tif(zoomLevel > self.currItem.initialZoomLevel + self.currItem.initialZoomLevel / 15) {\n\t\t\t\t_wasOverInitialZoom = true;\n\t\t\t}\n\n\t\t\t// Apply the friction if zoom level is out of the bounds\n\t\t\tvar zoomFriction = 1,\n\t\t\t\tminZoomLevel = _getMinZoomLevel(),\n\t\t\t\tmaxZoomLevel = _getMaxZoomLevel();\n\n\t\t\tif ( zoomLevel < minZoomLevel ) {\n\t\t\t\t\n\t\t\t\tif(_options.pinchToClose && !_wasOverInitialZoom && _startZoomLevel <= self.currItem.initialZoomLevel) {\n\t\t\t\t\t// fade out background if zooming out\n\t\t\t\t\tvar minusDiff = minZoomLevel - zoomLevel;\n\t\t\t\t\tvar percent = 1 - minusDiff / (minZoomLevel / 1.2);\n\n\t\t\t\t\t_applyBgOpacity(percent);\n\t\t\t\t\t_shout('onPinchClose', percent);\n\t\t\t\t\t_opacityChanged = true;\n\t\t\t\t} else {\n\t\t\t\t\tzoomFriction = (minZoomLevel - zoomLevel) / minZoomLevel;\n\t\t\t\t\tif(zoomFriction > 1) {\n\t\t\t\t\t\tzoomFriction = 1;\n\t\t\t\t\t}\n\t\t\t\t\tzoomLevel = minZoomLevel - zoomFriction * (minZoomLevel / 3);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else if ( zoomLevel > maxZoomLevel ) {\n\t\t\t\t// 1.5 - extra zoom level above the max. E.g. if max is x6, real max 6 + 1.5 = 7.5\n\t\t\t\tzoomFriction = (zoomLevel - maxZoomLevel) / ( minZoomLevel * 6 );\n\t\t\t\tif(zoomFriction > 1) {\n\t\t\t\t\tzoomFriction = 1;\n\t\t\t\t}\n\t\t\t\tzoomLevel = maxZoomLevel + zoomFriction * minZoomLevel;\n\t\t\t}\n\n\t\t\tif(zoomFriction < 0) {\n\t\t\t\tzoomFriction = 0;\n\t\t\t}\n\n\t\t\t// distance between touch points after friction is applied\n\t\t\t_currPointsDistance = pointsDistance;\n\n\t\t\t// _centerPoint - The point in the middle of two pointers\n\t\t\t_findCenterOfPoints(p, p2, _centerPoint);\n\t\t\n\t\t\t// paning with two pointers pressed\n\t\t\t_currPanDist.x += _centerPoint.x - _currCenterPoint.x;\n\t\t\t_currPanDist.y += _centerPoint.y - _currCenterPoint.y;\n\t\t\t_equalizePoints(_currCenterPoint, _centerPoint);\n\n\t\t\t_panOffset.x = _calculatePanOffset('x', zoomLevel);\n\t\t\t_panOffset.y = _calculatePanOffset('y', zoomLevel);\n\n\t\t\t_isZoomingIn = zoomLevel > _currZoomLevel;\n\t\t\t_currZoomLevel = zoomLevel;\n\t\t\t_applyCurrentZoomPan();\n\n\t\t} else {\n\n\t\t\t// handle behaviour for one point (dragging or panning)\n\n\t\t\tif(!_direction) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(_isFirstMove) {\n\t\t\t\t_isFirstMove = false;\n\n\t\t\t\t// subtract drag distance that was used during the detection direction  \n\n\t\t\t\tif( Math.abs(delta.x) >= DIRECTION_CHECK_OFFSET) {\n\t\t\t\t\tdelta.x -= _currentPoints[0].x - _startPoint.x;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif( Math.abs(delta.y) >= DIRECTION_CHECK_OFFSET) {\n\t\t\t\t\tdelta.y -= _currentPoints[0].y - _startPoint.y;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_currPoint.x = p.x;\n\t\t\t_currPoint.y = p.y;\n\n\t\t\t// do nothing if pointers position hasn't changed\n\t\t\tif(delta.x === 0 && delta.y === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(_direction === 'v' && _options.closeOnVerticalDrag) {\n\t\t\t\tif(!_canPan()) {\n\t\t\t\t\t_currPanDist.y += delta.y;\n\t\t\t\t\t_panOffset.y += delta.y;\n\n\t\t\t\t\tvar opacityRatio = _calculateVerticalDragOpacityRatio();\n\n\t\t\t\t\t_verticalDragInitiated = true;\n\t\t\t\t\t_shout('onVerticalDrag', opacityRatio);\n\n\t\t\t\t\t_applyBgOpacity(opacityRatio);\n\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\treturn ;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_pushPosPoint(_getCurrentTime(), p.x, p.y);\n\n\t\t\t_moved = true;\n\t\t\t_currPanBounds = self.currItem.bounds;\n\t\t\t\n\t\t\tvar mainScrollChanged = _panOrMoveMainScroll('x', delta);\n\t\t\tif(!mainScrollChanged) {\n\t\t\t\t_panOrMoveMainScroll('y', delta);\n\n\t\t\t\t_roundPoint(_panOffset);\n\t\t\t\t_applyCurrentZoomPan();\n\t\t\t}\n\n\t\t}\n\n\t},\n\t\n\t// Pointerup/pointercancel/touchend/touchcancel/mouseup event handler\n\t_onDragRelease = function(e) {\n\n\t\tif(_features.isOldAndroid ) {\n\n\t\t\tif(_oldAndroidTouchEndTimeout && e.type === 'mouseup') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// on Android (v4.1, 4.2, 4.3 & possibly older) \n\t\t\t// ghost mousedown/up event isn't preventable via e.preventDefault,\n\t\t\t// which causes fake mousedown event\n\t\t\t// so we block mousedown/up for 600ms\n\t\t\tif( e.type.indexOf('touch') > -1 ) {\n\t\t\t\tclearTimeout(_oldAndroidTouchEndTimeout);\n\t\t\t\t_oldAndroidTouchEndTimeout = setTimeout(function() {\n\t\t\t\t\t_oldAndroidTouchEndTimeout = 0;\n\t\t\t\t}, 600);\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t\t_shout('pointerUp');\n\n\t\tif(_preventDefaultEventBehaviour(e, false)) {\n\t\t\te.preventDefault();\n\t\t}\n\n\t\tvar releasePoint;\n\n\t\tif(_pointerEventEnabled) {\n\t\t\tvar pointerIndex = framework.arraySearch(_currPointers, e.pointerId, 'id');\n\t\t\t\n\t\t\tif(pointerIndex > -1) {\n\t\t\t\treleasePoint = _currPointers.splice(pointerIndex, 1)[0];\n\n\t\t\t\tif(navigator.msPointerEnabled) {\n\t\t\t\t\tvar MSPOINTER_TYPES = {\n\t\t\t\t\t\t4: 'mouse', // event.MSPOINTER_TYPE_MOUSE\n\t\t\t\t\t\t2: 'touch', // event.MSPOINTER_TYPE_TOUCH \n\t\t\t\t\t\t3: 'pen' // event.MSPOINTER_TYPE_PEN\n\t\t\t\t\t};\n\t\t\t\t\treleasePoint.type = MSPOINTER_TYPES[e.pointerType];\n\n\t\t\t\t\tif(!releasePoint.type) {\n\t\t\t\t\t\treleasePoint.type = e.pointerType || 'mouse';\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treleasePoint.type = e.pointerType || 'mouse';\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t\tvar touchList = _getTouchPoints(e),\n\t\t\tgestureType,\n\t\t\tnumPoints = touchList.length;\n\n\t\tif(e.type === 'mouseup') {\n\t\t\tnumPoints = 0;\n\t\t}\n\n\t\t// Do nothing if there were 3 touch points or more\n\t\tif(numPoints === 2) {\n\t\t\t_currentPoints = null;\n\t\t\treturn true;\n\t\t}\n\n\t\t// if second pointer released\n\t\tif(numPoints === 1) {\n\t\t\t_equalizePoints(_startPoint, touchList[0]);\n\t\t}\t\t\t\t\n\n\n\t\t// pointer hasn't moved, send \"tap release\" point\n\t\tif(numPoints === 0 && !_direction && !_mainScrollAnimating) {\n\t\t\tif(!releasePoint) {\n\t\t\t\tif(e.type === 'mouseup') {\n\t\t\t\t\treleasePoint = {x: e.pageX, y: e.pageY, type:'mouse'};\n\t\t\t\t} else if(e.changedTouches && e.changedTouches[0]) {\n\t\t\t\t\treleasePoint = {x: e.changedTouches[0].pageX, y: e.changedTouches[0].pageY, type:'touch'};\n\t\t\t\t}\t\t\n\t\t\t}\n\n\t\t\t_shout('touchRelease', e, releasePoint);\n\t\t}\n\n\t\t// Difference in time between releasing of two last touch points (zoom gesture)\n\t\tvar releaseTimeDiff = -1;\n\n\t\t// Gesture completed, no pointers left\n\t\tif(numPoints === 0) {\n\t\t\t_isDragging = false;\n\t\t\tframework.unbind(window, _upMoveEvents, self);\n\n\t\t\t_stopDragUpdateLoop();\n\n\t\t\tif(_isZooming) {\n\t\t\t\t// Two points released at the same time\n\t\t\t\treleaseTimeDiff = 0;\n\t\t\t} else if(_lastReleaseTime !== -1) {\n\t\t\t\treleaseTimeDiff = _getCurrentTime() - _lastReleaseTime;\n\t\t\t}\n\t\t}\n\t\t_lastReleaseTime = numPoints === 1 ? _getCurrentTime() : -1;\n\t\t\n\t\tif(releaseTimeDiff !== -1 && releaseTimeDiff < 150) {\n\t\t\tgestureType = 'zoom';\n\t\t} else {\n\t\t\tgestureType = 'swipe';\n\t\t}\n\n\t\tif(_isZooming && numPoints < 2) {\n\t\t\t_isZooming = false;\n\n\t\t\t// Only second point released\n\t\t\tif(numPoints === 1) {\n\t\t\t\tgestureType = 'zoomPointerUp';\n\t\t\t}\n\t\t\t_shout('zoomGestureEnded');\n\t\t}\n\n\t\t_currentPoints = null;\n\t\tif(!_moved && !_zoomStarted && !_mainScrollAnimating && !_verticalDragInitiated) {\n\t\t\t// nothing to animate\n\t\t\treturn;\n\t\t}\n\t\n\t\t_stopAllAnimations();\n\n\t\t\n\t\tif(!_releaseAnimData) {\n\t\t\t_releaseAnimData = _initDragReleaseAnimationData();\n\t\t}\n\t\t\n\t\t_releaseAnimData.calculateSwipeSpeed('x');\n\n\n\t\tif(_verticalDragInitiated) {\n\n\t\t\tvar opacityRatio = _calculateVerticalDragOpacityRatio();\n\n\t\t\tif(opacityRatio < _options.verticalDragRange) {\n\t\t\t\tself.close();\n\t\t\t} else {\n\t\t\t\tvar initalPanY = _panOffset.y,\n\t\t\t\t\tinitialBgOpacity = _bgOpacity;\n\n\t\t\t\t_animateProp('verticalDrag', 0, 1, 300, framework.easing.cubic.out, function(now) {\n\t\t\t\t\t\n\t\t\t\t\t_panOffset.y = (self.currItem.initialPosition.y - initalPanY) * now + initalPanY;\n\n\t\t\t\t\t_applyBgOpacity(  (1 - initialBgOpacity) * now + initialBgOpacity );\n\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t});\n\n\t\t\t\t_shout('onVerticalDrag', 1);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\n\t\t// main scroll \n\t\tif(  (_mainScrollShifted || _mainScrollAnimating) && numPoints === 0) {\n\t\t\tvar itemChanged = _finishSwipeMainScrollGesture(gestureType, _releaseAnimData);\n\t\t\tif(itemChanged) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgestureType = 'zoomPointerUp';\n\t\t}\n\n\t\t// prevent zoom/pan animation when main scroll animation runs\n\t\tif(_mainScrollAnimating) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// Complete simple zoom gesture (reset zoom level if it's out of the bounds)  \n\t\tif(gestureType !== 'swipe') {\n\t\t\t_completeZoomGesture();\n\t\t\treturn;\n\t\t}\n\t\n\t\t// Complete pan gesture if main scroll is not shifted, and it's possible to pan current image\n\t\tif(!_mainScrollShifted && _currZoomLevel > self.currItem.fitRatio) {\n\t\t\t_completePanGesture(_releaseAnimData);\n\t\t}\n\t},\n\n\n\t// Returns object with data about gesture\n\t// It's created only once and then reused\n\t_initDragReleaseAnimationData  = function() {\n\t\t// temp local vars\n\t\tvar lastFlickDuration,\n\t\t\ttempReleasePos;\n\n\t\t// s = this\n\t\tvar s = {\n\t\t\tlastFlickOffset: {},\n\t\t\tlastFlickDist: {},\n\t\t\tlastFlickSpeed: {},\n\t\t\tslowDownRatio:  {},\n\t\t\tslowDownRatioReverse:  {},\n\t\t\tspeedDecelerationRatio:  {},\n\t\t\tspeedDecelerationRatioAbs:  {},\n\t\t\tdistanceOffset:  {},\n\t\t\tbackAnimDestination: {},\n\t\t\tbackAnimStarted: {},\n\t\t\tcalculateSwipeSpeed: function(axis) {\n\t\t\t\t\n\n\t\t\t\tif( _posPoints.length > 1) {\n\t\t\t\t\tlastFlickDuration = _getCurrentTime() - _gestureCheckSpeedTime + 50;\n\t\t\t\t\ttempReleasePos = _posPoints[_posPoints.length-2][axis];\n\t\t\t\t} else {\n\t\t\t\t\tlastFlickDuration = _getCurrentTime() - _gestureStartTime; // total gesture duration\n\t\t\t\t\ttempReleasePos = _startPoint[axis];\n\t\t\t\t}\n\t\t\t\ts.lastFlickOffset[axis] = _currPoint[axis] - tempReleasePos;\n\t\t\t\ts.lastFlickDist[axis] = Math.abs(s.lastFlickOffset[axis]);\n\t\t\t\tif(s.lastFlickDist[axis] > 20) {\n\t\t\t\t\ts.lastFlickSpeed[axis] = s.lastFlickOffset[axis] / lastFlickDuration;\n\t\t\t\t} else {\n\t\t\t\t\ts.lastFlickSpeed[axis] = 0;\n\t\t\t\t}\n\t\t\t\tif( Math.abs(s.lastFlickSpeed[axis]) < 0.1 ) {\n\t\t\t\t\ts.lastFlickSpeed[axis] = 0;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\ts.slowDownRatio[axis] = 0.95;\n\t\t\t\ts.slowDownRatioReverse[axis] = 1 - s.slowDownRatio[axis];\n\t\t\t\ts.speedDecelerationRatio[axis] = 1;\n\t\t\t},\n\n\t\t\tcalculateOverBoundsAnimOffset: function(axis, speed) {\n\t\t\t\tif(!s.backAnimStarted[axis]) {\n\n\t\t\t\t\tif(_panOffset[axis] > _currPanBounds.min[axis]) {\n\t\t\t\t\t\ts.backAnimDestination[axis] = _currPanBounds.min[axis];\n\t\t\t\t\t\t\n\t\t\t\t\t} else if(_panOffset[axis] < _currPanBounds.max[axis]) {\n\t\t\t\t\t\ts.backAnimDestination[axis] = _currPanBounds.max[axis];\n\t\t\t\t\t}\n\n\t\t\t\t\tif(s.backAnimDestination[axis] !== undefined) {\n\t\t\t\t\t\ts.slowDownRatio[axis] = 0.7;\n\t\t\t\t\t\ts.slowDownRatioReverse[axis] = 1 - s.slowDownRatio[axis];\n\t\t\t\t\t\tif(s.speedDecelerationRatioAbs[axis] < 0.05) {\n\n\t\t\t\t\t\t\ts.lastFlickSpeed[axis] = 0;\n\t\t\t\t\t\t\ts.backAnimStarted[axis] = true;\n\n\t\t\t\t\t\t\t_animateProp('bounceZoomPan'+axis,_panOffset[axis], \n\t\t\t\t\t\t\t\ts.backAnimDestination[axis], \n\t\t\t\t\t\t\t\tspeed || 300, \n\t\t\t\t\t\t\t\tframework.easing.sine.out, \n\t\t\t\t\t\t\t\tfunction(pos) {\n\t\t\t\t\t\t\t\t\t_panOffset[axis] = pos;\n\t\t\t\t\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Reduces the speed by slowDownRatio (per 10ms)\n\t\t\tcalculateAnimOffset: function(axis) {\n\t\t\t\tif(!s.backAnimStarted[axis]) {\n\t\t\t\t\ts.speedDecelerationRatio[axis] = s.speedDecelerationRatio[axis] * (s.slowDownRatio[axis] + \n\t\t\t\t\t\t\t\t\t\t\t\ts.slowDownRatioReverse[axis] - \n\t\t\t\t\t\t\t\t\t\t\t\ts.slowDownRatioReverse[axis] * s.timeDiff / 10);\n\n\t\t\t\t\ts.speedDecelerationRatioAbs[axis] = Math.abs(s.lastFlickSpeed[axis] * s.speedDecelerationRatio[axis]);\n\t\t\t\t\ts.distanceOffset[axis] = s.lastFlickSpeed[axis] * s.speedDecelerationRatio[axis] * s.timeDiff;\n\t\t\t\t\t_panOffset[axis] += s.distanceOffset[axis];\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tpanAnimLoop: function() {\n\t\t\t\tif ( _animations.zoomPan ) {\n\t\t\t\t\t_animations.zoomPan.raf = _requestAF(s.panAnimLoop);\n\n\t\t\t\t\ts.now = _getCurrentTime();\n\t\t\t\t\ts.timeDiff = s.now - s.lastNow;\n\t\t\t\t\ts.lastNow = s.now;\n\t\t\t\t\t\n\t\t\t\t\ts.calculateAnimOffset('x');\n\t\t\t\t\ts.calculateAnimOffset('y');\n\n\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\t\n\t\t\t\t\ts.calculateOverBoundsAnimOffset('x');\n\t\t\t\t\ts.calculateOverBoundsAnimOffset('y');\n\n\n\t\t\t\t\tif (s.speedDecelerationRatioAbs.x < 0.05 && s.speedDecelerationRatioAbs.y < 0.05) {\n\n\t\t\t\t\t\t// round pan position\n\t\t\t\t\t\t_panOffset.x = Math.round(_panOffset.x);\n\t\t\t\t\t\t_panOffset.y = Math.round(_panOffset.y);\n\t\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\t\t\n\t\t\t\t\t\t_stopAnimation('zoomPan');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t};\n\t\treturn s;\n\t},\n\n\t_completePanGesture = function(animData) {\n\t\t// calculate swipe speed for Y axis (paanning)\n\t\tanimData.calculateSwipeSpeed('y');\n\n\t\t_currPanBounds = self.currItem.bounds;\n\t\t\n\t\tanimData.backAnimDestination = {};\n\t\tanimData.backAnimStarted = {};\n\n\t\t// Avoid acceleration animation if speed is too low\n\t\tif(Math.abs(animData.lastFlickSpeed.x) <= 0.05 && Math.abs(animData.lastFlickSpeed.y) <= 0.05 ) {\n\t\t\tanimData.speedDecelerationRatioAbs.x = animData.speedDecelerationRatioAbs.y = 0;\n\n\t\t\t// Run pan drag release animation. E.g. if you drag image and release finger without momentum.\n\t\t\tanimData.calculateOverBoundsAnimOffset('x');\n\t\t\tanimData.calculateOverBoundsAnimOffset('y');\n\t\t\treturn true;\n\t\t}\n\n\t\t// Animation loop that controls the acceleration after pan gesture ends\n\t\t_registerStartAnimation('zoomPan');\n\t\tanimData.lastNow = _getCurrentTime();\n\t\tanimData.panAnimLoop();\n\t},\n\n\n\t_finishSwipeMainScrollGesture = function(gestureType, _releaseAnimData) {\n\t\tvar itemChanged;\n\t\tif(!_mainScrollAnimating) {\n\t\t\t_currZoomedItemIndex = _currentItemIndex;\n\t\t}\n\n\n\t\t\n\t\tvar itemsDiff;\n\n\t\tif(gestureType === 'swipe') {\n\t\t\tvar totalShiftDist = _currPoint.x - _startPoint.x,\n\t\t\t\tisFastLastFlick = _releaseAnimData.lastFlickDist.x < 10;\n\n\t\t\t// if container is shifted for more than MIN_SWIPE_DISTANCE, \n\t\t\t// and last flick gesture was in right direction\n\t\t\tif(totalShiftDist > MIN_SWIPE_DISTANCE && \n\t\t\t\t(isFastLastFlick || _releaseAnimData.lastFlickOffset.x > 20) ) {\n\t\t\t\t// go to prev item\n\t\t\t\titemsDiff = -1;\n\t\t\t} else if(totalShiftDist < -MIN_SWIPE_DISTANCE && \n\t\t\t\t(isFastLastFlick || _releaseAnimData.lastFlickOffset.x < -20) ) {\n\t\t\t\t// go to next item\n\t\t\t\titemsDiff = 1;\n\t\t\t}\n\t\t}\n\n\t\tvar nextCircle;\n\n\t\tif(itemsDiff) {\n\t\t\t\n\t\t\t_currentItemIndex += itemsDiff;\n\n\t\t\tif(_currentItemIndex < 0) {\n\t\t\t\t_currentItemIndex = _options.loop ? _getNumItems()-1 : 0;\n\t\t\t\tnextCircle = true;\n\t\t\t} else if(_currentItemIndex >= _getNumItems()) {\n\t\t\t\t_currentItemIndex = _options.loop ? 0 : _getNumItems()-1;\n\t\t\t\tnextCircle = true;\n\t\t\t}\n\n\t\t\tif(!nextCircle || _options.loop) {\n\t\t\t\t_indexDiff += itemsDiff;\n\t\t\t\t_currPositionIndex -= itemsDiff;\n\t\t\t\titemChanged = true;\n\t\t\t}\n\t\t\t\n\n\t\t\t\n\t\t}\n\n\t\tvar animateToX = _slideSize.x * _currPositionIndex;\n\t\tvar animateToDist = Math.abs( animateToX - _mainScrollPos.x );\n\t\tvar finishAnimDuration;\n\n\n\t\tif(!itemChanged && animateToX > _mainScrollPos.x !== _releaseAnimData.lastFlickSpeed.x > 0) {\n\t\t\t// \"return to current\" duration, e.g. when dragging from slide 0 to -1\n\t\t\tfinishAnimDuration = 333; \n\t\t} else {\n\t\t\tfinishAnimDuration = Math.abs(_releaseAnimData.lastFlickSpeed.x) > 0 ? \n\t\t\t\t\t\t\t\t\tanimateToDist / Math.abs(_releaseAnimData.lastFlickSpeed.x) : \n\t\t\t\t\t\t\t\t\t333;\n\n\t\t\tfinishAnimDuration = Math.min(finishAnimDuration, 400);\n\t\t\tfinishAnimDuration = Math.max(finishAnimDuration, 250);\n\t\t}\n\n\t\tif(_currZoomedItemIndex === _currentItemIndex) {\n\t\t\titemChanged = false;\n\t\t}\n\t\t\n\t\t_mainScrollAnimating = true;\n\t\t\n\t\t_shout('mainScrollAnimStart');\n\n\t\t_animateProp('mainScroll', _mainScrollPos.x, animateToX, finishAnimDuration, framework.easing.cubic.out, \n\t\t\t_moveMainScroll,\n\t\t\tfunction() {\n\t\t\t\t_stopAllAnimations();\n\t\t\t\t_mainScrollAnimating = false;\n\t\t\t\t_currZoomedItemIndex = -1;\n\t\t\t\t\n\t\t\t\tif(itemChanged || _currZoomedItemIndex !== _currentItemIndex) {\n\t\t\t\t\tself.updateCurrItem();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t_shout('mainScrollAnimComplete');\n\t\t\t}\n\t\t);\n\n\t\tif(itemChanged) {\n\t\t\tself.updateCurrItem(true);\n\t\t}\n\n\t\treturn itemChanged;\n\t},\n\n\t_calculateZoomLevel = function(touchesDistance) {\n\t\treturn  1 / _startPointsDistance * touchesDistance * _startZoomLevel;\n\t},\n\n\t// Resets zoom if it's out of bounds\n\t_completeZoomGesture = function() {\n\t\tvar destZoomLevel = _currZoomLevel,\n\t\t\tminZoomLevel = _getMinZoomLevel(),\n\t\t\tmaxZoomLevel = _getMaxZoomLevel();\n\n\t\tif ( _currZoomLevel < minZoomLevel ) {\n\t\t\tdestZoomLevel = minZoomLevel;\n\t\t} else if ( _currZoomLevel > maxZoomLevel ) {\n\t\t\tdestZoomLevel = maxZoomLevel;\n\t\t}\n\n\t\tvar destOpacity = 1,\n\t\t\tonUpdate,\n\t\t\tinitialOpacity = _bgOpacity;\n\n\t\tif(_opacityChanged && !_isZoomingIn && !_wasOverInitialZoom && _currZoomLevel < minZoomLevel) {\n\t\t\t//_closedByScroll = true;\n\t\t\tself.close();\n\t\t\treturn true;\n\t\t}\n\n\t\tif(_opacityChanged) {\n\t\t\tonUpdate = function(now) {\n\t\t\t\t_applyBgOpacity(  (destOpacity - initialOpacity) * now + initialOpacity );\n\t\t\t};\n\t\t}\n\n\t\tself.zoomTo(destZoomLevel, 0, 200,  framework.easing.cubic.out, onUpdate);\n\t\treturn true;\n\t};\n\n\n_registerModule('Gestures', {\n\tpublicMethods: {\n\n\t\tinitGestures: function() {\n\n\t\t\t// helper function that builds touch/pointer/mouse events\n\t\t\tvar addEventNames = function(pref, down, move, up, cancel) {\n\t\t\t\t_dragStartEvent = pref + down;\n\t\t\t\t_dragMoveEvent = pref + move;\n\t\t\t\t_dragEndEvent = pref + up;\n\t\t\t\tif(cancel) {\n\t\t\t\t\t_dragCancelEvent = pref + cancel;\n\t\t\t\t} else {\n\t\t\t\t\t_dragCancelEvent = '';\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t_pointerEventEnabled = _features.pointerEvent;\n\t\t\tif(_pointerEventEnabled && _features.touch) {\n\t\t\t\t// we don't need touch events, if browser supports pointer events\n\t\t\t\t_features.touch = false;\n\t\t\t}\n\n\t\t\tif(_pointerEventEnabled) {\n\t\t\t\tif(navigator.msPointerEnabled) {\n\t\t\t\t\t// IE10 pointer events are case-sensitive\n\t\t\t\t\taddEventNames('MSPointer', 'Down', 'Move', 'Up', 'Cancel');\n\t\t\t\t} else {\n\t\t\t\t\taddEventNames('pointer', 'down', 'move', 'up', 'cancel');\n\t\t\t\t}\n\t\t\t} else if(_features.touch) {\n\t\t\t\taddEventNames('touch', 'start', 'move', 'end', 'cancel');\n\t\t\t\t_likelyTouchDevice = true;\n\t\t\t} else {\n\t\t\t\taddEventNames('mouse', 'down', 'move', 'up');\t\n\t\t\t}\n\n\t\t\t_upMoveEvents = _dragMoveEvent + ' ' + _dragEndEvent  + ' ' +  _dragCancelEvent;\n\t\t\t_downEvents = _dragStartEvent;\n\n\t\t\tif(_pointerEventEnabled && !_likelyTouchDevice) {\n\t\t\t\t_likelyTouchDevice = (navigator.maxTouchPoints > 1) || (navigator.msMaxTouchPoints > 1);\n\t\t\t}\n\t\t\t// make variable public\n\t\t\tself.likelyTouchDevice = _likelyTouchDevice; \n\t\t\t\n\t\t\t_globalEventHandlers[_dragStartEvent] = _onDragStart;\n\t\t\t_globalEventHandlers[_dragMoveEvent] = _onDragMove;\n\t\t\t_globalEventHandlers[_dragEndEvent] = _onDragRelease; // the Kraken\n\n\t\t\tif(_dragCancelEvent) {\n\t\t\t\t_globalEventHandlers[_dragCancelEvent] = _globalEventHandlers[_dragEndEvent];\n\t\t\t}\n\n\t\t\t// Bind mouse events on device with detected hardware touch support, in case it supports multiple types of input.\n\t\t\tif(_features.touch) {\n\t\t\t\t_downEvents += ' mousedown';\n\t\t\t\t_upMoveEvents += ' mousemove mouseup';\n\t\t\t\t_globalEventHandlers.mousedown = _globalEventHandlers[_dragStartEvent];\n\t\t\t\t_globalEventHandlers.mousemove = _globalEventHandlers[_dragMoveEvent];\n\t\t\t\t_globalEventHandlers.mouseup = _globalEventHandlers[_dragEndEvent];\n\t\t\t}\n\n\t\t\tif(!_likelyTouchDevice) {\n\t\t\t\t// don't allow pan to next slide from zoomed state on Desktop\n\t\t\t\t_options.allowPanToNext = false;\n\t\t\t}\n\t\t}\n\n\t}\n});\n\n\n/*>>gestures*/\n\n/*>>show-hide-transition*/\n/**\n * show-hide-transition.js:\n *\n * Manages initial opening or closing transition.\n *\n * If you're not planning to use transition for gallery at all,\n * you may set options hideAnimationDuration and showAnimationDuration to 0,\n * and just delete startAnimation function.\n * \n */\n\n\nvar _showOrHideTimeout,\n\t_showOrHide = function(item, img, out, completeFn) {\n\n\t\tif(_showOrHideTimeout) {\n\t\t\tclearTimeout(_showOrHideTimeout);\n\t\t}\n\n\t\t_initialZoomRunning = true;\n\t\t_initialContentSet = true;\n\t\t\n\t\t// dimensions of small thumbnail {x:,y:,w:}.\n\t\t// Height is optional, as calculated based on large image.\n\t\tvar thumbBounds; \n\t\tif(item.initialLayout) {\n\t\t\tthumbBounds = item.initialLayout;\n\t\t\titem.initialLayout = null;\n\t\t} else {\n\t\t\tthumbBounds = _options.getThumbBoundsFn && _options.getThumbBoundsFn(_currentItemIndex);\n\t\t}\n\n\t\tvar duration = out ? _options.hideAnimationDuration : _options.showAnimationDuration;\n\n\t\tvar onComplete = function() {\n\t\t\t_stopAnimation('initialZoom');\n\t\t\tif(!out) {\n\t\t\t\t_applyBgOpacity(1);\n\t\t\t\tif(img) {\n\t\t\t\t\timg.style.display = 'block';\n\t\t\t\t}\n\t\t\t\tframework.addClass(template, 'pswp--animated-in');\n\t\t\t\t_shout('initialZoom' + (out ? 'OutEnd' : 'InEnd'));\n\t\t\t} else {\n\t\t\t\tself.template.removeAttribute('style');\n\t\t\t\tself.bg.removeAttribute('style');\n\t\t\t}\n\n\t\t\tif(completeFn) {\n\t\t\t\tcompleteFn();\n\t\t\t}\n\t\t\t_initialZoomRunning = false;\n\t\t};\n\n\t\t// if bounds aren't provided, just open gallery without animation\n\t\tif(!duration || !thumbBounds || thumbBounds.x === undefined) {\n\n\t\t\t_shout('initialZoom' + (out ? 'Out' : 'In') );\n\n\t\t\t_currZoomLevel = item.initialZoomLevel;\n\t\t\t_equalizePoints(_panOffset,  item.initialPosition );\n\t\t\t_applyCurrentZoomPan();\n\n\t\t\ttemplate.style.opacity = out ? 0 : 1;\n\t\t\t_applyBgOpacity(1);\n\n\t\t\tif(duration) {\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tonComplete();\n\t\t\t\t}, duration);\n\t\t\t} else {\n\t\t\t\tonComplete();\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvar startAnimation = function() {\n\t\t\tvar closeWithRaf = _closedByScroll,\n\t\t\t\tfadeEverything = !self.currItem.src || self.currItem.loadError || _options.showHideOpacity;\n\t\t\t\n\t\t\t// apply hw-acceleration to image\n\t\t\tif(item.miniImg) {\n\t\t\t\titem.miniImg.style.webkitBackfaceVisibility = 'hidden';\n\t\t\t}\n\n\t\t\tif(!out) {\n\t\t\t\t_currZoomLevel = thumbBounds.w / item.w;\n\t\t\t\t_panOffset.x = thumbBounds.x;\n\t\t\t\t_panOffset.y = thumbBounds.y - _initalWindowScrollY;\n\n\t\t\t\tself[fadeEverything ? 'template' : 'bg'].style.opacity = 0.001;\n\t\t\t\t_applyCurrentZoomPan();\n\t\t\t}\n\n\t\t\t_registerStartAnimation('initialZoom');\n\t\t\t\n\t\t\tif(out && !closeWithRaf) {\n\t\t\t\tframework.removeClass(template, 'pswp--animated-in');\n\t\t\t}\n\n\t\t\tif(fadeEverything) {\n\t\t\t\tif(out) {\n\t\t\t\t\tframework[ (closeWithRaf ? 'remove' : 'add') + 'Class' ](template, 'pswp--animate_opacity');\n\t\t\t\t} else {\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tframework.addClass(template, 'pswp--animate_opacity');\n\t\t\t\t\t}, 30);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_showOrHideTimeout = setTimeout(function() {\n\n\t\t\t\t_shout('initialZoom' + (out ? 'Out' : 'In') );\n\t\t\t\t\n\n\t\t\t\tif(!out) {\n\n\t\t\t\t\t// \"in\" animation always uses CSS transitions (instead of rAF).\n\t\t\t\t\t// CSS transition work faster here, \n\t\t\t\t\t// as developer may also want to animate other things, \n\t\t\t\t\t// like ui on top of sliding area, which can be animated just via CSS\n\t\t\t\t\t\n\t\t\t\t\t_currZoomLevel = item.initialZoomLevel;\n\t\t\t\t\t_equalizePoints(_panOffset,  item.initialPosition );\n\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\t_applyBgOpacity(1);\n\n\t\t\t\t\tif(fadeEverything) {\n\t\t\t\t\t\ttemplate.style.opacity = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_applyBgOpacity(1);\n\t\t\t\t\t}\n\n\t\t\t\t\t_showOrHideTimeout = setTimeout(onComplete, duration + 20);\n\t\t\t\t} else {\n\n\t\t\t\t\t// \"out\" animation uses rAF only when PhotoSwipe is closed by browser scroll, to recalculate position\n\t\t\t\t\tvar destZoomLevel = thumbBounds.w / item.w,\n\t\t\t\t\t\tinitialPanOffset = {\n\t\t\t\t\t\t\tx: _panOffset.x,\n\t\t\t\t\t\t\ty: _panOffset.y\n\t\t\t\t\t\t},\n\t\t\t\t\t\tinitialZoomLevel = _currZoomLevel,\n\t\t\t\t\t\tinitalBgOpacity = _bgOpacity,\n\t\t\t\t\t\tonUpdate = function(now) {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(now === 1) {\n\t\t\t\t\t\t\t\t_currZoomLevel = destZoomLevel;\n\t\t\t\t\t\t\t\t_panOffset.x = thumbBounds.x;\n\t\t\t\t\t\t\t\t_panOffset.y = thumbBounds.y  - _currentWindowScrollY;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_currZoomLevel = (destZoomLevel - initialZoomLevel) * now + initialZoomLevel;\n\t\t\t\t\t\t\t\t_panOffset.x = (thumbBounds.x - initialPanOffset.x) * now + initialPanOffset.x;\n\t\t\t\t\t\t\t\t_panOffset.y = (thumbBounds.y - _currentWindowScrollY - initialPanOffset.y) * now + initialPanOffset.y;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t_applyCurrentZoomPan();\n\t\t\t\t\t\t\tif(fadeEverything) {\n\t\t\t\t\t\t\t\ttemplate.style.opacity = 1 - now;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_applyBgOpacity( initalBgOpacity - now * initalBgOpacity );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\tif(closeWithRaf) {\n\t\t\t\t\t\t_animateProp('initialZoom', 0, 1, duration, framework.easing.cubic.out, onUpdate, onComplete);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tonUpdate(1);\n\t\t\t\t\t\t_showOrHideTimeout = setTimeout(onComplete, duration + 20);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t}, out ? 25 : 90); // Main purpose of this delay is to give browser time to paint and\n\t\t\t\t\t// create composite layers of PhotoSwipe UI parts (background, controls, caption, arrows).\n\t\t\t\t\t// Which avoids lag at the beginning of scale transition.\n\t\t};\n\t\tstartAnimation();\n\n\t\t\n\t};\n\n/*>>show-hide-transition*/\n\n/*>>items-controller*/\n/**\n*\n* Controller manages gallery items, their dimensions, and their content.\n* \n*/\n\nvar _items,\n\t_tempPanAreaSize = {},\n\t_imagesToAppendPool = [],\n\t_initialContentSet,\n\t_initialZoomRunning,\n\t_controllerDefaultOptions = {\n\t\tindex: 0,\n\t\terrorMsg: '<div class=\"pswp__error-msg\"><a href=\"%url%\" target=\"_blank\">The image</a> could not be loaded.</div>',\n\t\tforceProgressiveLoading: false, // TODO\n\t\tpreload: [1,1],\n\t\tgetNumItemsFn: function() {\n\t\t\treturn _items.length;\n\t\t}\n\t};\n\n\nvar _getItemAt,\n\t_getNumItems,\n\t_initialIsLoop,\n\t_getZeroBounds = function() {\n\t\treturn {\n\t\t\tcenter:{x:0,y:0}, \n\t\t\tmax:{x:0,y:0}, \n\t\t\tmin:{x:0,y:0}\n\t\t};\n\t},\n\t_calculateSingleItemPanBounds = function(item, realPanElementW, realPanElementH ) {\n\t\tvar bounds = item.bounds;\n\n\t\t// position of element when it's centered\n\t\tbounds.center.x = Math.round((_tempPanAreaSize.x - realPanElementW) / 2);\n\t\tbounds.center.y = Math.round((_tempPanAreaSize.y - realPanElementH) / 2) + item.vGap.top;\n\n\t\t// maximum pan position\n\t\tbounds.max.x = (realPanElementW > _tempPanAreaSize.x) ? \n\t\t\t\t\t\t\tMath.round(_tempPanAreaSize.x - realPanElementW) : \n\t\t\t\t\t\t\tbounds.center.x;\n\t\t\n\t\tbounds.max.y = (realPanElementH > _tempPanAreaSize.y) ? \n\t\t\t\t\t\t\tMath.round(_tempPanAreaSize.y - realPanElementH) + item.vGap.top : \n\t\t\t\t\t\t\tbounds.center.y;\n\t\t\n\t\t// minimum pan position\n\t\tbounds.min.x = (realPanElementW > _tempPanAreaSize.x) ? 0 : bounds.center.x;\n\t\tbounds.min.y = (realPanElementH > _tempPanAreaSize.y) ? item.vGap.top : bounds.center.y;\n\t},\n\t_calculateItemSize = function(item, viewportSize, zoomLevel) {\n\n\t\tif (item.src && !item.loadError) {\n\t\t\tvar isInitial = !zoomLevel;\n\t\t\t\n\t\t\tif(isInitial) {\n\t\t\t\tif(!item.vGap) {\n\t\t\t\t\titem.vGap = {top:0,bottom:0};\n\t\t\t\t}\n\t\t\t\t// allows overriding vertical margin for individual items\n\t\t\t\t_shout('parseVerticalMargin', item);\n\t\t\t}\n\n\n\t\t\t_tempPanAreaSize.x = viewportSize.x;\n\t\t\t_tempPanAreaSize.y = viewportSize.y - item.vGap.top - item.vGap.bottom;\n\n\t\t\tif (isInitial) {\n\t\t\t\tvar hRatio = _tempPanAreaSize.x / item.w;\n\t\t\t\tvar vRatio = _tempPanAreaSize.y / item.h;\n\n\t\t\t\titem.fitRatio = hRatio < vRatio ? hRatio : vRatio;\n\t\t\t\t//item.fillRatio = hRatio > vRatio ? hRatio : vRatio;\n\n\t\t\t\tvar scaleMode = _options.scaleMode;\n\n\t\t\t\tif (scaleMode === 'orig') {\n\t\t\t\t\tzoomLevel = 1;\n\t\t\t\t} else if (scaleMode === 'fit') {\n\t\t\t\t\tzoomLevel = item.fitRatio;\n\t\t\t\t}\n\n\t\t\t\tif (zoomLevel > 1) {\n\t\t\t\t\tzoomLevel = 1;\n\t\t\t\t}\n\n\t\t\t\titem.initialZoomLevel = zoomLevel;\n\t\t\t\t\n\t\t\t\tif(!item.bounds) {\n\t\t\t\t\t// reuse bounds object\n\t\t\t\t\titem.bounds = _getZeroBounds(); \n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!zoomLevel) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_calculateSingleItemPanBounds(item, item.w * zoomLevel, item.h * zoomLevel);\n\n\t\t\tif (isInitial && zoomLevel === item.initialZoomLevel) {\n\t\t\t\titem.initialPosition = item.bounds.center;\n\t\t\t}\n\n\t\t\treturn item.bounds;\n\t\t} else {\n\t\t\titem.w = item.h = 0;\n\t\t\titem.initialZoomLevel = item.fitRatio = 1;\n\t\t\titem.bounds = _getZeroBounds();\n\t\t\titem.initialPosition = item.bounds.center;\n\n\t\t\t// if it's not image, we return zero bounds (content is not zoomable)\n\t\t\treturn item.bounds;\n\t\t}\n\t\t\n\t},\n\n\t\n\n\n\t_appendImage = function(index, item, baseDiv, img, preventAnimation, keepPlaceholder) {\n\t\t\n\n\t\tif(item.loadError) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(img) {\n\n\t\t\titem.imageAppended = true;\n\t\t\t_setImageSize(item, img, (item === self.currItem && _renderMaxResolution) );\n\t\t\t\n\t\t\tbaseDiv.appendChild(img);\n\n\t\t\tif(keepPlaceholder) {\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tif(item && item.loaded && item.placeholder) {\n\t\t\t\t\t\titem.placeholder.style.display = 'none';\n\t\t\t\t\t\titem.placeholder = null;\n\t\t\t\t\t}\n\t\t\t\t}, 500);\n\t\t\t}\n\t\t}\n\t},\n\t\n\n\n\t_preloadImage = function(item) {\n\t\titem.loading = true;\n\t\titem.loaded = false;\n\t\tvar img = item.img = framework.createEl('pswp__img', 'img');\n\t\tvar onComplete = function() {\n\t\t\titem.loading = false;\n\t\t\titem.loaded = true;\n\n\t\t\tif(item.loadComplete) {\n\t\t\t\titem.loadComplete(item);\n\t\t\t} else {\n\t\t\t\titem.img = null; // no need to store image object\n\t\t\t}\n\t\t\timg.onload = img.onerror = null;\n\t\t\timg = null;\n\t\t};\n\t\timg.onload = onComplete;\n\t\timg.onerror = function() {\n\t\t\titem.loadError = true;\n\t\t\tonComplete();\n\t\t};\t\t\n\n\t\timg.src = item.src;// + '?a=' + Math.random();\n\n\t\treturn img;\n\t},\n\t_checkForError = function(item, cleanUp) {\n\t\tif(item.src && item.loadError && item.container) {\n\n\t\t\tif(cleanUp) {\n\t\t\t\titem.container.innerHTML = '';\n\t\t\t}\n\n\t\t\titem.container.innerHTML = _options.errorMsg.replace('%url%',  item.src );\n\t\t\treturn true;\n\t\t\t\n\t\t}\n\t},\n\t_setImageSize = function(item, img, maxRes) {\n\t\tif(!item.src) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(!img) {\n\t\t\timg = item.container.lastChild;\n\t\t}\n\n\t\tvar w = maxRes ? item.w : Math.round(item.w * item.fitRatio),\n\t\t\th = maxRes ? item.h : Math.round(item.h * item.fitRatio);\n\t\t\n\t\tif(item.placeholder && !item.loaded) {\n\t\t\titem.placeholder.style.width = w + 'px';\n\t\t\titem.placeholder.style.height = h + 'px';\n\t\t}\n\n\t\timg.style.width = w + 'px';\n\t\timg.style.height = h + 'px';\n\t},\n\t_appendImagesPool = function() {\n\n\t\tif(_imagesToAppendPool.length) {\n\t\t\tvar poolItem;\n\n\t\t\tfor(var i = 0; i < _imagesToAppendPool.length; i++) {\n\t\t\t\tpoolItem = _imagesToAppendPool[i];\n\t\t\t\tif( poolItem.holder.index === poolItem.index ) {\n\t\t\t\t\t_appendImage(poolItem.index, poolItem.item, poolItem.baseDiv, poolItem.img, false, poolItem.clearPlaceholder);\n\t\t\t\t}\n\t\t\t}\n\t\t\t_imagesToAppendPool = [];\n\t\t}\n\t};\n\t\n\n\n_registerModule('Controller', {\n\n\tpublicMethods: {\n\n\t\tlazyLoadItem: function(index) {\n\t\t\tindex = _getLoopedId(index);\n\t\t\tvar item = _getItemAt(index);\n\n\t\t\tif(!item || ((item.loaded || item.loading) && !_itemsNeedUpdate)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_shout('gettingData', index, item);\n\n\t\t\tif (!item.src) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_preloadImage(item);\n\t\t},\n\t\tinitController: function() {\n\t\t\tframework.extend(_options, _controllerDefaultOptions, true);\n\t\t\tself.items = _items = items;\n\t\t\t_getItemAt = self.getItemAt;\n\t\t\t_getNumItems = _options.getNumItemsFn; //self.getNumItems;\n\n\n\n\t\t\t_initialIsLoop = _options.loop;\n\t\t\tif(_getNumItems() < 3) {\n\t\t\t\t_options.loop = false; // disable loop if less then 3 items\n\t\t\t}\n\n\t\t\t_listen('beforeChange', function(diff) {\n\n\t\t\t\tvar p = _options.preload,\n\t\t\t\t\tisNext = diff === null ? true : (diff >= 0),\n\t\t\t\t\tpreloadBefore = Math.min(p[0], _getNumItems() ),\n\t\t\t\t\tpreloadAfter = Math.min(p[1], _getNumItems() ),\n\t\t\t\t\ti;\n\n\n\t\t\t\tfor(i = 1; i <= (isNext ? preloadAfter : preloadBefore); i++) {\n\t\t\t\t\tself.lazyLoadItem(_currentItemIndex+i);\n\t\t\t\t}\n\t\t\t\tfor(i = 1; i <= (isNext ? preloadBefore : preloadAfter); i++) {\n\t\t\t\t\tself.lazyLoadItem(_currentItemIndex-i);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_listen('initialLayout', function() {\n\t\t\t\tself.currItem.initialLayout = _options.getThumbBoundsFn && _options.getThumbBoundsFn(_currentItemIndex);\n\t\t\t});\n\n\t\t\t_listen('mainScrollAnimComplete', _appendImagesPool);\n\t\t\t_listen('initialZoomInEnd', _appendImagesPool);\n\n\n\n\t\t\t_listen('destroy', function() {\n\t\t\t\tvar item;\n\t\t\t\tfor(var i = 0; i < _items.length; i++) {\n\t\t\t\t\titem = _items[i];\n\t\t\t\t\t// remove reference to DOM elements, for GC\n\t\t\t\t\tif(item.container) {\n\t\t\t\t\t\titem.container = null; \n\t\t\t\t\t}\n\t\t\t\t\tif(item.placeholder) {\n\t\t\t\t\t\titem.placeholder = null;\n\t\t\t\t\t}\n\t\t\t\t\tif(item.img) {\n\t\t\t\t\t\titem.img = null;\n\t\t\t\t\t}\n\t\t\t\t\tif(item.preloader) {\n\t\t\t\t\t\titem.preloader = null;\n\t\t\t\t\t}\n\t\t\t\t\tif(item.loadError) {\n\t\t\t\t\t\titem.loaded = item.loadError = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t_imagesToAppendPool = null;\n\t\t\t});\n\t\t},\n\n\n\t\tgetItemAt: function(index) {\n\t\t\tif (index >= 0) {\n\t\t\t\treturn _items[index] !== undefined ? _items[index] : false;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\tallowProgressiveImg: function() {\n\t\t\t// 1. Progressive image loading isn't working on webkit/blink \n\t\t\t//    when hw-acceleration (e.g. translateZ) is applied to IMG element.\n\t\t\t//    That's why in PhotoSwipe parent element gets zoom transform, not image itself.\n\t\t\t//    \n\t\t\t// 2. Progressive image loading sometimes blinks in webkit/blink when applying animation to parent element.\n\t\t\t//    That's why it's disabled on touch devices (mainly because of swipe transition)\n\t\t\t//    \n\t\t\t// 3. Progressive image loading sometimes doesn't work in IE (up to 11).\n\n\t\t\t// Don't allow progressive loading on non-large touch devices\n\t\t\treturn _options.forceProgressiveLoading || !_likelyTouchDevice || _options.mouseUsed || screen.width > 1200; \n\t\t\t// 1200 - to eliminate touch devices with large screen (like Chromebook Pixel)\n\t\t},\n\n\t\tsetContent: function(holder, index) {\n\n\t\t\tif(_options.loop) {\n\t\t\t\tindex = _getLoopedId(index);\n\t\t\t}\n\n\t\t\tvar prevItem = self.getItemAt(holder.index);\n\t\t\tif(prevItem) {\n\t\t\t\tprevItem.container = null;\n\t\t\t}\n\t\n\t\t\tvar item = self.getItemAt(index),\n\t\t\t\timg;\n\t\t\t\n\t\t\tif(!item) {\n\t\t\t\tholder.el.innerHTML = '';\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// allow to override data\n\t\t\t_shout('gettingData', index, item);\n\n\t\t\tholder.index = index;\n\t\t\tholder.item = item;\n\n\t\t\t// base container DIV is created only once for each of 3 holders\n\t\t\tvar baseDiv = item.container = framework.createEl('pswp__zoom-wrap'); \n\n\t\t\t\n\n\t\t\tif(!item.src && item.html) {\n\t\t\t\tif(item.html.tagName) {\n\t\t\t\t\tbaseDiv.appendChild(item.html);\n\t\t\t\t} else {\n\t\t\t\t\tbaseDiv.innerHTML = item.html;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_checkForError(item);\n\n\t\t\t_calculateItemSize(item, _viewportSize);\n\t\t\t\n\t\t\tif(item.src && !item.loadError && !item.loaded) {\n\n\t\t\t\titem.loadComplete = function(item) {\n\n\t\t\t\t\t// gallery closed before image finished loading\n\t\t\t\t\tif(!_isOpen) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// check if holder hasn't changed while image was loading\n\t\t\t\t\tif(holder && holder.index === index ) {\n\t\t\t\t\t\tif( _checkForError(item, true) ) {\n\t\t\t\t\t\t\titem.loadComplete = item.img = null;\n\t\t\t\t\t\t\t_calculateItemSize(item, _viewportSize);\n\t\t\t\t\t\t\t_applyZoomPanToItem(item);\n\n\t\t\t\t\t\t\tif(holder.index === _currentItemIndex) {\n\t\t\t\t\t\t\t\t// recalculate dimensions\n\t\t\t\t\t\t\t\tself.updateCurrZoomItem();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif( !item.imageAppended ) {\n\t\t\t\t\t\t\tif(_features.transform && (_mainScrollAnimating || _initialZoomRunning) ) {\n\t\t\t\t\t\t\t\t_imagesToAppendPool.push({\n\t\t\t\t\t\t\t\t\titem:item,\n\t\t\t\t\t\t\t\t\tbaseDiv:baseDiv,\n\t\t\t\t\t\t\t\t\timg:item.img,\n\t\t\t\t\t\t\t\t\tindex:index,\n\t\t\t\t\t\t\t\t\tholder:holder,\n\t\t\t\t\t\t\t\t\tclearPlaceholder:true\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_appendImage(index, item, baseDiv, item.img, _mainScrollAnimating || _initialZoomRunning, true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// remove preloader & mini-img\n\t\t\t\t\t\t\tif(!_initialZoomRunning && item.placeholder) {\n\t\t\t\t\t\t\t\titem.placeholder.style.display = 'none';\n\t\t\t\t\t\t\t\titem.placeholder = null;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\titem.loadComplete = null;\n\t\t\t\t\titem.img = null; // no need to store image element after it's added\n\n\t\t\t\t\t_shout('imageLoadComplete', index, item);\n\t\t\t\t};\n\n\t\t\t\tif(framework.features.transform) {\n\t\t\t\t\t\n\t\t\t\t\tvar placeholderClassName = 'pswp__img pswp__img--placeholder'; \n\t\t\t\t\tplaceholderClassName += (item.msrc ? '' : ' pswp__img--placeholder--blank');\n\n\t\t\t\t\tvar placeholder = framework.createEl(placeholderClassName, item.msrc ? 'img' : '');\n\t\t\t\t\tif(item.msrc) {\n\t\t\t\t\t\tplaceholder.src = item.msrc;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t_setImageSize(item, placeholder);\n\n\t\t\t\t\tbaseDiv.appendChild(placeholder);\n\t\t\t\t\titem.placeholder = placeholder;\n\n\t\t\t\t}\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\tif(!item.loading) {\n\t\t\t\t\t_preloadImage(item);\n\t\t\t\t}\n\n\n\t\t\t\tif( self.allowProgressiveImg() ) {\n\t\t\t\t\t// just append image\n\t\t\t\t\tif(!_initialContentSet && _features.transform) {\n\t\t\t\t\t\t_imagesToAppendPool.push({\n\t\t\t\t\t\t\titem:item, \n\t\t\t\t\t\t\tbaseDiv:baseDiv, \n\t\t\t\t\t\t\timg:item.img, \n\t\t\t\t\t\t\tindex:index, \n\t\t\t\t\t\t\tholder:holder\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_appendImage(index, item, baseDiv, item.img, true, true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else if(item.src && !item.loadError) {\n\t\t\t\t// image object is created every time, due to bugs of image loading & delay when switching images\n\t\t\t\timg = framework.createEl('pswp__img', 'img');\n\t\t\t\timg.style.opacity = 1;\n\t\t\t\timg.src = item.src;\n\t\t\t\t_setImageSize(item, img);\n\t\t\t\t_appendImage(index, item, baseDiv, img, true);\n\t\t\t}\n\t\t\t\n\n\t\t\tif(!_initialContentSet && index === _currentItemIndex) {\n\t\t\t\t_currZoomElementStyle = baseDiv.style;\n\t\t\t\t_showOrHide(item, (img ||item.img) );\n\t\t\t} else {\n\t\t\t\t_applyZoomPanToItem(item);\n\t\t\t}\n\n\t\t\tholder.el.innerHTML = '';\n\t\t\tholder.el.appendChild(baseDiv);\n\t\t},\n\n\t\tcleanSlide: function( item ) {\n\t\t\tif(item.img ) {\n\t\t\t\titem.img.onload = item.img.onerror = null;\n\t\t\t}\n\t\t\titem.loaded = item.loading = item.img = item.imageAppended = false;\n\t\t}\n\n\t}\n});\n\n/*>>items-controller*/\n\n/*>>tap*/\n/**\n * tap.js:\n *\n * Displatches tap and double-tap events.\n * \n */\n\nvar tapTimer,\n\ttapReleasePoint = {},\n\t_dispatchTapEvent = function(origEvent, releasePoint, pointerType) {\t\t\n\t\tvar e = document.createEvent( 'CustomEvent' ),\n\t\t\teDetail = {\n\t\t\t\torigEvent:origEvent, \n\t\t\t\ttarget:origEvent.target, \n\t\t\t\treleasePoint: releasePoint, \n\t\t\t\tpointerType:pointerType || 'touch'\n\t\t\t};\n\n\t\te.initCustomEvent( 'pswpTap', true, true, eDetail );\n\t\torigEvent.target.dispatchEvent(e);\n\t};\n\n_registerModule('Tap', {\n\tpublicMethods: {\n\t\tinitTap: function() {\n\t\t\t_listen('firstTouchStart', self.onTapStart);\n\t\t\t_listen('touchRelease', self.onTapRelease);\n\t\t\t_listen('destroy', function() {\n\t\t\t\ttapReleasePoint = {};\n\t\t\t\ttapTimer = null;\n\t\t\t});\n\t\t},\n\t\tonTapStart: function(touchList) {\n\t\t\tif(touchList.length > 1) {\n\t\t\t\tclearTimeout(tapTimer);\n\t\t\t\ttapTimer = null;\n\t\t\t}\n\t\t},\n\t\tonTapRelease: function(e, releasePoint) {\n\t\t\tif(!releasePoint) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(!_moved && !_isMultitouch && !_numAnimations) {\n\t\t\t\tvar p0 = releasePoint;\n\t\t\t\tif(tapTimer) {\n\t\t\t\t\tclearTimeout(tapTimer);\n\t\t\t\t\ttapTimer = null;\n\n\t\t\t\t\t// Check if taped on the same place\n\t\t\t\t\tif ( _isNearbyPoints(p0, tapReleasePoint) ) {\n\t\t\t\t\t\t_shout('doubleTap', p0);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(releasePoint.type === 'mouse') {\n\t\t\t\t\t_dispatchTapEvent(e, releasePoint, 'mouse');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar clickedTagName = e.target.tagName.toUpperCase();\n\t\t\t\t// avoid double tap delay on buttons and elements that have class pswp__single-tap\n\t\t\t\tif(clickedTagName === 'BUTTON' || framework.hasClass(e.target, 'pswp__single-tap') ) {\n\t\t\t\t\t_dispatchTapEvent(e, releasePoint);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t_equalizePoints(tapReleasePoint, p0);\n\n\t\t\t\ttapTimer = setTimeout(function() {\n\t\t\t\t\t_dispatchTapEvent(e, releasePoint);\n\t\t\t\t\ttapTimer = null;\n\t\t\t\t}, 300);\n\t\t\t}\n\t\t}\n\t}\n});\n\n/*>>tap*/\n\n/*>>desktop-zoom*/\n/**\n *\n * desktop-zoom.js:\n *\n * - Binds mousewheel event for paning zoomed image.\n * - Manages \"dragging\", \"zoomed-in\", \"zoom-out\" classes.\n *   (which are used for cursors and zoom icon)\n * - Adds toggleDesktopZoom function.\n * \n */\n\nvar _wheelDelta;\n\t\n_registerModule('DesktopZoom', {\n\n\tpublicMethods: {\n\n\t\tinitDesktopZoom: function() {\n\n\t\t\tif(_oldIE) {\n\t\t\t\t// no zoom for old IE (<=8)\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(_likelyTouchDevice) {\n\t\t\t\t// if detected hardware touch support, we wait until mouse is used,\n\t\t\t\t// and only then apply desktop-zoom features\n\t\t\t\t_listen('mouseUsed', function() {\n\t\t\t\t\tself.setupDesktopZoom();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tself.setupDesktopZoom(true);\n\t\t\t}\n\n\t\t},\n\n\t\tsetupDesktopZoom: function(onInit) {\n\n\t\t\t_wheelDelta = {};\n\n\t\t\tvar events = 'wheel mousewheel DOMMouseScroll';\n\t\t\t\n\t\t\t_listen('bindEvents', function() {\n\t\t\t\tframework.bind(template, events,  self.handleMouseWheel);\n\t\t\t});\n\n\t\t\t_listen('unbindEvents', function() {\n\t\t\t\tif(_wheelDelta) {\n\t\t\t\t\tframework.unbind(template, events, self.handleMouseWheel);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tself.mouseZoomedIn = false;\n\n\t\t\tvar hasDraggingClass,\n\t\t\t\tupdateZoomable = function() {\n\t\t\t\t\tif(self.mouseZoomedIn) {\n\t\t\t\t\t\tframework.removeClass(template, 'pswp--zoomed-in');\n\t\t\t\t\t\tself.mouseZoomedIn = false;\n\t\t\t\t\t}\n\t\t\t\t\tif(_currZoomLevel < 1) {\n\t\t\t\t\t\tframework.addClass(template, 'pswp--zoom-allowed');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tframework.removeClass(template, 'pswp--zoom-allowed');\n\t\t\t\t\t}\n\t\t\t\t\tremoveDraggingClass();\n\t\t\t\t},\n\t\t\t\tremoveDraggingClass = function() {\n\t\t\t\t\tif(hasDraggingClass) {\n\t\t\t\t\t\tframework.removeClass(template, 'pswp--dragging');\n\t\t\t\t\t\thasDraggingClass = false;\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t_listen('resize' , updateZoomable);\n\t\t\t_listen('afterChange' , updateZoomable);\n\t\t\t_listen('pointerDown', function() {\n\t\t\t\tif(self.mouseZoomedIn) {\n\t\t\t\t\thasDraggingClass = true;\n\t\t\t\t\tframework.addClass(template, 'pswp--dragging');\n\t\t\t\t}\n\t\t\t});\n\t\t\t_listen('pointerUp', removeDraggingClass);\n\n\t\t\tif(!onInit) {\n\t\t\t\tupdateZoomable();\n\t\t\t}\n\t\t\t\n\t\t},\n\n\t\thandleMouseWheel: function(e) {\n\n\t\t\tif(_currZoomLevel <= self.currItem.fitRatio) {\n\t\t\t\tif( _options.modal ) {\n\n\t\t\t\t\tif (!_options.closeOnScroll || _numAnimations || _isDragging) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t} else if(_transformKey && Math.abs(e.deltaY) > 2) {\n\t\t\t\t\t\t// close PhotoSwipe\n\t\t\t\t\t\t// if browser supports transforms & scroll changed enough\n\t\t\t\t\t\t_closedByScroll = true;\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// allow just one event to fire\n\t\t\te.stopPropagation();\n\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/Events/wheel\n\t\t\t_wheelDelta.x = 0;\n\n\t\t\tif('deltaX' in e) {\n\t\t\t\tif(e.deltaMode === 1 /* DOM_DELTA_LINE */) {\n\t\t\t\t\t// 18 - average line height\n\t\t\t\t\t_wheelDelta.x = e.deltaX * 18;\n\t\t\t\t\t_wheelDelta.y = e.deltaY * 18;\n\t\t\t\t} else {\n\t\t\t\t\t_wheelDelta.x = e.deltaX;\n\t\t\t\t\t_wheelDelta.y = e.deltaY;\n\t\t\t\t}\n\t\t\t} else if('wheelDelta' in e) {\n\t\t\t\tif(e.wheelDeltaX) {\n\t\t\t\t\t_wheelDelta.x = -0.16 * e.wheelDeltaX;\n\t\t\t\t}\n\t\t\t\tif(e.wheelDeltaY) {\n\t\t\t\t\t_wheelDelta.y = -0.16 * e.wheelDeltaY;\n\t\t\t\t} else {\n\t\t\t\t\t_wheelDelta.y = -0.16 * e.wheelDelta;\n\t\t\t\t}\n\t\t\t} else if('detail' in e) {\n\t\t\t\t_wheelDelta.y = e.detail;\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_calculatePanBounds(_currZoomLevel, true);\n\n\t\t\tvar newPanX = _panOffset.x - _wheelDelta.x,\n\t\t\t\tnewPanY = _panOffset.y - _wheelDelta.y;\n\n\t\t\t// only prevent scrolling in nonmodal mode when not at edges\n\t\t\tif (_options.modal ||\n\t\t\t\t(\n\t\t\t\tnewPanX <= _currPanBounds.min.x && newPanX >= _currPanBounds.max.x &&\n\t\t\t\tnewPanY <= _currPanBounds.min.y && newPanY >= _currPanBounds.max.y\n\t\t\t\t) ) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\n\t\t\t// TODO: use rAF instead of mousewheel?\n\t\t\tself.panTo(newPanX, newPanY);\n\t\t},\n\n\t\ttoggleDesktopZoom: function(centerPoint) {\n\t\t\tcenterPoint = centerPoint || {x:_viewportSize.x/2 + _offset.x, y:_viewportSize.y/2 + _offset.y };\n\n\t\t\tvar doubleTapZoomLevel = _options.getDoubleTapZoom(true, self.currItem);\n\t\t\tvar zoomOut = _currZoomLevel === doubleTapZoomLevel;\n\t\t\t\n\t\t\tself.mouseZoomedIn = !zoomOut;\n\n\t\t\tself.zoomTo(zoomOut ? self.currItem.initialZoomLevel : doubleTapZoomLevel, centerPoint, 333);\n\t\t\tframework[ (!zoomOut ? 'add' : 'remove') + 'Class'](template, 'pswp--zoomed-in');\n\t\t}\n\n\t}\n});\n\n\n/*>>desktop-zoom*/\n\n/*>>history*/\n/**\n *\n * history.js:\n *\n * - Back button to close gallery.\n * \n * - Unique URL for each slide: example.com/&pid=1&gid=3\n *   (where PID is picture index, and GID and gallery index)\n *   \n * - Switch URL when slides change.\n * \n */\n\n\nvar _historyDefaultOptions = {\n\thistory: true,\n\tgalleryUID: 1\n};\n\nvar _historyUpdateTimeout,\n\t_hashChangeTimeout,\n\t_hashAnimCheckTimeout,\n\t_hashChangedByScript,\n\t_hashChangedByHistory,\n\t_hashReseted,\n\t_initialHash,\n\t_historyChanged,\n\t_closedFromURL,\n\t_urlChangedOnce,\n\t_windowLoc,\n\n\t_supportsPushState,\n\n\t_getHash = function() {\n\t\treturn _windowLoc.hash.substring(1);\n\t},\n\t_cleanHistoryTimeouts = function() {\n\n\t\tif(_historyUpdateTimeout) {\n\t\t\tclearTimeout(_historyUpdateTimeout);\n\t\t}\n\n\t\tif(_hashAnimCheckTimeout) {\n\t\t\tclearTimeout(_hashAnimCheckTimeout);\n\t\t}\n\t},\n\n\t// pid - Picture index\n\t// gid - Gallery index\n\t_parseItemIndexFromURL = function() {\n\t\tvar hash = _getHash(),\n\t\t\tparams = {};\n\n\t\tif(hash.length < 5) { // pid=1\n\t\t\treturn params;\n\t\t}\n\n\t\tvar i, vars = hash.split('&');\n\t\tfor (i = 0; i < vars.length; i++) {\n\t\t\tif(!vars[i]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar pair = vars[i].split('=');\t\n\t\t\tif(pair.length < 2) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tparams[pair[0]] = pair[1];\n\t\t}\n\t\tif(_options.galleryPIDs) {\n\t\t\t// detect custom pid in hash and search for it among the items collection\n\t\t\tvar searchfor = params.pid;\n\t\t\tparams.pid = 0; // if custom pid cannot be found, fallback to the first item\n\t\t\tfor(i = 0; i < _items.length; i++) {\n\t\t\t\tif(_items[i].pid === searchfor) {\n\t\t\t\t\tparams.pid = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tparams.pid = parseInt(params.pid,10)-1;\n\t\t}\n\t\tif( params.pid < 0 ) {\n\t\t\tparams.pid = 0;\n\t\t}\n\t\treturn params;\n\t},\n\t_updateHash = function() {\n\n\t\tif(_hashAnimCheckTimeout) {\n\t\t\tclearTimeout(_hashAnimCheckTimeout);\n\t\t}\n\n\n\t\tif(_numAnimations || _isDragging) {\n\t\t\t// changing browser URL forces layout/paint in some browsers, which causes noticable lag during animation\n\t\t\t// that's why we update hash only when no animations running\n\t\t\t_hashAnimCheckTimeout = setTimeout(_updateHash, 500);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif(_hashChangedByScript) {\n\t\t\tclearTimeout(_hashChangeTimeout);\n\t\t} else {\n\t\t\t_hashChangedByScript = true;\n\t\t}\n\n\n\t\tvar pid = (_currentItemIndex + 1);\n\t\tvar item = _getItemAt( _currentItemIndex );\n\t\tif(item.hasOwnProperty('pid')) {\n\t\t\t// carry forward any custom pid assigned to the item\n\t\t\tpid = item.pid;\n\t\t}\n\t\tvar newHash = _initialHash + '&'  +  'gid=' + _options.galleryUID + '&' + 'pid=' + pid;\n\n\t\tif(!_historyChanged) {\n\t\t\tif(_windowLoc.hash.indexOf(newHash) === -1) {\n\t\t\t\t_urlChangedOnce = true;\n\t\t\t}\n\t\t\t// first time - add new hisory record, then just replace\n\t\t}\n\n\t\tvar newURL = _windowLoc.href.split('#')[0] + '#' +  newHash;\n\n\t\tif( _supportsPushState ) {\n\n\t\t\tif('#' + newHash !== window.location.hash) {\n\t\t\t\thistory[_historyChanged ? 'replaceState' : 'pushState']('', document.title, newURL);\n\t\t\t}\n\n\t\t} else {\n\t\t\tif(_historyChanged) {\n\t\t\t\t_windowLoc.replace( newURL );\n\t\t\t} else {\n\t\t\t\t_windowLoc.hash = newHash;\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\n\t\t_historyChanged = true;\n\t\t_hashChangeTimeout = setTimeout(function() {\n\t\t\t_hashChangedByScript = false;\n\t\t}, 60);\n\t};\n\n\n\n\t\n\n_registerModule('History', {\n\n\t\n\n\tpublicMethods: {\n\t\tinitHistory: function() {\n\n\t\t\tframework.extend(_options, _historyDefaultOptions, true);\n\n\t\t\tif( !_options.history ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\n\t\t\t_windowLoc = window.location;\n\t\t\t_urlChangedOnce = false;\n\t\t\t_closedFromURL = false;\n\t\t\t_historyChanged = false;\n\t\t\t_initialHash = _getHash();\n\t\t\t_supportsPushState = ('pushState' in history);\n\n\n\t\t\tif(_initialHash.indexOf('gid=') > -1) {\n\t\t\t\t_initialHash = _initialHash.split('&gid=')[0];\n\t\t\t\t_initialHash = _initialHash.split('?gid=')[0];\n\t\t\t}\n\t\t\t\n\n\t\t\t_listen('afterChange', self.updateURL);\n\t\t\t_listen('unbindEvents', function() {\n\t\t\t\tframework.unbind(window, 'hashchange', self.onHashChange);\n\t\t\t});\n\n\n\t\t\tvar returnToOriginal = function() {\n\t\t\t\t_hashReseted = true;\n\t\t\t\tif(!_closedFromURL) {\n\n\t\t\t\t\tif(_urlChangedOnce) {\n\t\t\t\t\t\thistory.back();\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif(_initialHash) {\n\t\t\t\t\t\t\t_windowLoc.hash = _initialHash;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (_supportsPushState) {\n\n\t\t\t\t\t\t\t\t// remove hash from url without refreshing it or scrolling to top\n\t\t\t\t\t\t\t\thistory.pushState('', document.title,  _windowLoc.pathname + _windowLoc.search );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_windowLoc.hash = '';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\t_cleanHistoryTimeouts();\n\t\t\t};\n\n\n\t\t\t_listen('unbindEvents', function() {\n\t\t\t\tif(_closedByScroll) {\n\t\t\t\t\t// if PhotoSwipe is closed by scroll, we go \"back\" before the closing animation starts\n\t\t\t\t\t// this is done to keep the scroll position\n\t\t\t\t\treturnToOriginal();\n\t\t\t\t}\n\t\t\t});\n\t\t\t_listen('destroy', function() {\n\t\t\t\tif(!_hashReseted) {\n\t\t\t\t\treturnToOriginal();\n\t\t\t\t}\n\t\t\t});\n\t\t\t_listen('firstUpdate', function() {\n\t\t\t\t_currentItemIndex = _parseItemIndexFromURL().pid;\n\t\t\t});\n\n\t\t\t\n\n\t\t\t\n\t\t\tvar index = _initialHash.indexOf('pid=');\n\t\t\tif(index > -1) {\n\t\t\t\t_initialHash = _initialHash.substring(0, index);\n\t\t\t\tif(_initialHash.slice(-1) === '&') {\n\t\t\t\t\t_initialHash = _initialHash.slice(0, -1);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\n\t\t\tsetTimeout(function() {\n\t\t\t\tif(_isOpen) { // hasn't destroyed yet\n\t\t\t\t\tframework.bind(window, 'hashchange', self.onHashChange);\n\t\t\t\t}\n\t\t\t}, 40);\n\t\t\t\n\t\t},\n\t\tonHashChange: function() {\n\n\t\t\tif(_getHash() === _initialHash) {\n\n\t\t\t\t_closedFromURL = true;\n\t\t\t\tself.close();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(!_hashChangedByScript) {\n\n\t\t\t\t_hashChangedByHistory = true;\n\t\t\t\tself.goTo( _parseItemIndexFromURL().pid );\n\t\t\t\t_hashChangedByHistory = false;\n\t\t\t}\n\t\t\t\n\t\t},\n\t\tupdateURL: function() {\n\n\t\t\t// Delay the update of URL, to avoid lag during transition, \n\t\t\t// and to not to trigger actions like \"refresh page sound\" or \"blinking favicon\" to often\n\t\t\t\n\t\t\t_cleanHistoryTimeouts();\n\t\t\t\n\n\t\t\tif(_hashChangedByHistory) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(!_historyChanged) {\n\t\t\t\t_updateHash(); // first time\n\t\t\t} else {\n\t\t\t\t_historyUpdateTimeout = setTimeout(_updateHash, 800);\n\t\t\t}\n\t\t}\n\t\n\t}\n});\n\n\n/*>>history*/\n\tframework.extend(self, publicMethods); };\n\treturn PhotoSwipe;\n});"],"names":["root","factory","module","this","PhotoSwipe","template","UiClass","items","options","framework","target","type","listener","unbind","methodName","i","obj","classes","tag","el","yOffset","className","reg","parentEl","childClassName","node","array","value","key","o1","o2","preventOverwrite","prop","k","helperEl","helperStyle","vendor","features","ua","v","match","androidversion","styleChecks","vendors","styleCheckItem","styleName","a","lastTime","fn","currTime","timeToCall","id","evName","_handleEv","self","DOUBLE_TAP_RADIUS","NUM_HOLDERS","_options","isMouseClick","item","_getEmptyPoint","_isOpen","_isDestroying","_closedByScroll","_currentItemIndex","_containerStyle","_containerShiftIndex","_currPanDist","_startPanOffset","_panOffset","_upMoveEvents","_downEvents","_globalEventHandlers","_viewportSize","_currZoomLevel","_startZoomLevel","_translatePrefix","_translateSufix","_updateSizeInterval","_itemsNeedUpdate","_currPositionIndex","_offset","_slideSize","_itemHolders","_prevItemIndex","_indexDiff","_dragStartEvent","_dragMoveEvent","_dragEndEvent","_dragCancelEvent","_transformKey","_pointerEventEnabled","_isFixedPosition","_likelyTouchDevice","_modules","_requestAF","_cancelAF","_initalClassName","_initalWindowScrollY","_oldIE","_currentWindowScrollY","_features","_windowVisibleSize","_renderMaxResolution","_orientationChangeTimeout","_registerModule","name","_getLoopedId","index","numSlides","_getNumItems","_listeners","_listen","_shout","listeners","args","_getCurrentTime","_applyBgOpacity","opacity","_bgOpacity","_applyZoomTransform","styleObj","x","y","zoom","_applyCurrentZoomPan","allowRenderResolution","_currZoomElementStyle","_setImageSize","_applyZoomPanToItem","_setTranslateX","elStyle","_moveMainScroll","dragging","newSlideIndexOffset","delta","_mainScrollPos","_calculatePanOffset","axis","zoomLevel","m","_midZoomPoint","_equalizePoints","p1","p2","_roundPoint","p","_mouseMoveTimeout","_onFirstMouseMove","_bindEvents","_unbindEvents","_isDragging","_calculatePanBounds","update","bounds","_calculateItemSize","_currPanBounds","_getMinZoomLevel","_getMaxZoomLevel","_modifyDestPanOffset","destPanBounds","destPanOffset","destZoomLevel","_setupTransforms","allow3dTransform","zoomRatio","s","w","h","_onKeyDown","keydownAction","_onGlobalClick","_moved","_zoomStarted","_mainScrollAnimating","_verticalDragInitiated","_updatePageScrollOffset","_animations","_numAnimations","_stopAnimation","_registerStartAnimation","_stopAllAnimations","_animateProp","b","endProp","d","easingFn","onUpdate","onComplete","startAnimTime","t","animloop","publicMethods","_isZooming","panX","panY","oldPhone","ui","_getItemAt","rootClasses","_showOrHide","_showOrHideTimeout","_stopDragUpdateLoop","force","diff","emulateSetContent","zoomElement","beforeAnimation","diffAbs","tempHolder","prevItem","windowScrollY","holder","hIndex","centerPoint","speed","updateFn","initialZoomLevel","initialPanOffset","now","MIN_SWIPE_DISTANCE","DIRECTION_CHECK_OFFSET","_gestureStartTime","_gestureCheckSpeedTime","_currPoint","_startPoint","_currPointers","_startMainScrollPos","_releaseAnimData","_posPoints","_tempPoint","_isZoomingIn","_oldAndroidTouchEndTimeout","_currZoomedItemIndex","_centerPoint","_lastReleaseTime","_isMultitouch","_dragAnimFrame","_mainScrollShifted","_currentPoints","_startPointsDistance","_currCenterPoint","_direction","_isFirstMove","_opacityChanged","_wasOverInitialZoom","_isEqualPoints","_isNearbyPoints","touch0","touch1","_calculatePointsDistance","_dragUpdateLoop","_renderMovement","_canPan","_closestElement","_preventObj","_preventDefaultEventBehaviour","isDown","_convertTouchToPoint","touch","_findCenterOfPoints","pCenter","_pushPosPoint","time","o","_calculateVerticalDragOpacityRatio","_ePoint1","_ePoint2","_tempPointsArr","_tempCounter","_getTouchPoints","_panOrMoveMainScroll","panFriction","newOffset","startOverDiff","dir","newMainScrollPosition","mainScrollDiff","newPanPos","newMainScrollPos","_onDragStart","_initialZoomRunning","pointerIndex","startPointsList","numPoints","_onDragMove","touchesList","pointsDistance","_calculateZoomLevel","zoomFriction","minZoomLevel","maxZoomLevel","minusDiff","percent","opacityRatio","mainScrollChanged","_onDragRelease","releasePoint","MSPOINTER_TYPES","touchList","gestureType","releaseTimeDiff","_initDragReleaseAnimationData","initalPanY","initialBgOpacity","itemChanged","_finishSwipeMainScrollGesture","_completeZoomGesture","_completePanGesture","lastFlickDuration","tempReleasePos","pos","animData","itemsDiff","totalShiftDist","isFastLastFlick","nextCircle","animateToX","animateToDist","finishAnimDuration","touchesDistance","destOpacity","initialOpacity","addEventNames","pref","down","move","up","cancel","img","out","completeFn","_initialContentSet","thumbBounds","duration","startAnimation","closeWithRaf","fadeEverything","initalBgOpacity","_items","_tempPanAreaSize","_imagesToAppendPool","_controllerDefaultOptions","_getZeroBounds","_calculateSingleItemPanBounds","realPanElementW","realPanElementH","viewportSize","isInitial","hRatio","vRatio","scaleMode","_appendImage","baseDiv","preventAnimation","keepPlaceholder","_preloadImage","_checkForError","cleanUp","maxRes","_appendImagesPool","poolItem","isNext","preloadBefore","preloadAfter","placeholderClassName","placeholder","tapTimer","tapReleasePoint","_dispatchTapEvent","origEvent","pointerType","e","eDetail","p0","clickedTagName","_wheelDelta","onInit","events","hasDraggingClass","updateZoomable","removeDraggingClass","newPanX","newPanY","doubleTapZoomLevel","zoomOut","_historyDefaultOptions","_historyUpdateTimeout","_hashChangeTimeout","_hashAnimCheckTimeout","_hashChangedByScript","_hashChangedByHistory","_hashReseted","_initialHash","_historyChanged","_closedFromURL","_urlChangedOnce","_windowLoc","_supportsPushState","_getHash","_cleanHistoryTimeouts","_parseItemIndexFromURL","hash","params","vars","pair","searchfor","_updateHash","pid","newHash","newURL","returnToOriginal"],"mappings":"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","x_google_ignoreList":[0]}