diff --git a/sigal/themes/photoswipe/static/default-skin/default-skin.css b/sigal/themes/photoswipe/static/default-skin/default-skin.css
index c961632..bc42eba 100644
--- a/sigal/themes/photoswipe/static/default-skin/default-skin.css
+++ b/sigal/themes/photoswipe/static/default-skin/default-skin.css
@@ -72,6 +72,9 @@
.pswp__button--share {
background-position: -44px -44px; }
+.pswp__button--download {
+ background-position: -176px 0; }
+
.pswp__button--fs {
display: none; }
@@ -92,8 +95,8 @@
background-position: -132px 0; }
/* no arrows on touch screens */
-.pswp--touch .pswp__button--arrow--left,
-.pswp--touch .pswp__button--arrow--right {
+.pswp--touch:not(.pswp--preventswipe) .pswp__button--arrow--left,
+.pswp--touch:not(.pswp--preventswipe) .pswp__button--arrow--right {
visibility: hidden; }
/*
@@ -140,7 +143,6 @@
.pswp__counter,
.pswp__share-modal {
-webkit-user-select: none;
- -moz-user-select: none;
-ms-user-select: none;
user-select: none; }
@@ -153,7 +155,7 @@
left: 0;
padding: 10px;
position: absolute;
- z-index: 1600;
+ z-index: 16777371;
opacity: 0;
-webkit-transition: opacity 0.25s ease-out;
transition: opacity 0.25s ease-out;
@@ -164,9 +166,9 @@
display: none; }
.pswp__share-tooltip {
- z-index: 1620;
+ z-index: 16777391;
position: absolute;
- background: #FFF;
+ background: #fff;
top: 56px;
border-radius: 2px;
display: block;
@@ -216,28 +218,28 @@ a.pswp__share--facebook:before {
position: absolute;
top: -12px;
right: 15px;
- border: 6px solid transparent;
- border-bottom-color: #FFF;
+ border: 6px solid rgba(0, 0, 0, 0);
+ border-bottom-color: #fff;
-webkit-pointer-events: none;
-moz-pointer-events: none;
pointer-events: none; }
a.pswp__share--facebook:hover {
- background: #3E5C9A;
- color: #FFF; }
+ background: #3e5c9a;
+ color: #fff; }
a.pswp__share--facebook:hover:before {
- border-bottom-color: #3E5C9A; }
+ border-bottom-color: #3e5c9a; }
a.pswp__share--twitter:hover {
- background: #55ACEE;
- color: #FFF; }
+ background: #55acee;
+ color: #fff; }
a.pswp__share--pinterest:hover {
- background: #CCC;
- color: #CE272D; }
+ background: #ccc;
+ color: #ce272d; }
a.pswp__share--download:hover {
- background: #DDD; }
+ background: #ddd; }
/*
@@ -251,7 +253,7 @@ a.pswp__share--download:hover {
height: 44px;
font-size: 13px;
line-height: 44px;
- color: #FFF;
+ color: #fff;
opacity: 0.75;
padding: 0 10px; }
@@ -268,16 +270,16 @@ a.pswp__share--download:hover {
min-height: 44px; }
.pswp__caption small {
font-size: 11px;
- color: #BBB; }
+ color: #bbb; }
.pswp__caption__center {
- text-align: left;
+ text-align: center;
max-width: 420px;
margin: 0 auto;
font-size: 13px;
padding: 10px;
line-height: 20px;
- color: #CCC; }
+ color: #ccc; }
.pswp__caption--empty {
display: none; }
@@ -351,7 +353,7 @@ a.pswp__share--download:hover {
box-sizing: border-box;
width: 14px;
height: 14px;
- border: 2px solid #FFF;
+ border: 2px solid #fff;
border-radius: 50%;
border-left-color: transparent;
border-bottom-color: transparent;
@@ -417,7 +419,7 @@ a.pswp__share--download:hover {
-webkit-font-smoothing: auto;
visibility: visible;
opacity: 1;
- z-index: 1550; }
+ z-index: 16777321; }
/* top black bar with buttons and "1 of X" indicator */
.pswp__top-bar {
@@ -467,7 +469,8 @@ a.pswp__share--download:hover {
.pswp__ui--hidden .pswp__button--arrow--left,
.pswp__ui--hidden .pswp__button--arrow--right {
/* Force paint & create composition layer for controls. */
- opacity: 0.001; }
+ opacity: 0.001;
+ visibility: hidden; }
/* pswp__ui--one-slide class is added when there is just one item in gallery */
.pswp__ui--one-slide .pswp__button--arrow--left,
@@ -479,4 +482,4 @@ a.pswp__share--download:hover {
display: none !important; }
.pswp--minimal--dark .pswp__top-bar {
- background: none; }
+ background: none; }
\ No newline at end of file
diff --git a/sigal/themes/photoswipe/static/default-skin/default-skin.css.map b/sigal/themes/photoswipe/static/default-skin/default-skin.css.map
new file mode 100644
index 0000000..4e30a8b
--- /dev/null
+++ b/sigal/themes/photoswipe/static/default-skin/default-skin.css.map
@@ -0,0 +1,10 @@
+{
+ "version": 3,
+ "file": "default-skin.css",
+ "sources": [
+ "../../src/css/default-skin/default-skin.scss",
+ "../../src/css/_main-settings.scss"
+ ],
+ "names": [],
+ "mappings": "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"
+}
\ No newline at end of file
diff --git a/sigal/themes/photoswipe/static/default-skin/default-skin.png b/sigal/themes/photoswipe/static/default-skin/default-skin.png
index 441c502..777ed34 100644
Binary files a/sigal/themes/photoswipe/static/default-skin/default-skin.png and b/sigal/themes/photoswipe/static/default-skin/default-skin.png differ
diff --git a/sigal/themes/photoswipe/static/default-skin/default-skin.svg b/sigal/themes/photoswipe/static/default-skin/default-skin.svg
index 9d5f0c6..a1ff7fc 100644
--- a/sigal/themes/photoswipe/static/default-skin/default-skin.svg
+++ b/sigal/themes/photoswipe/static/default-skin/default-skin.svg
@@ -1 +1,36 @@
-
\ No newline at end of file
+
+
diff --git a/sigal/themes/photoswipe/static/photoswipe-ui-default.js b/sigal/themes/photoswipe/static/photoswipe-ui-default.js
index f3733e1..62cb920 100644
--- a/sigal/themes/photoswipe/static/photoswipe-ui-default.js
+++ b/sigal/themes/photoswipe/static/photoswipe-ui-default.js
@@ -1,13 +1,16 @@
-/*! PhotoSwipe Default UI - 4.1.3 - 2019-01-08
-* http://photoswipe.com
-* Copyright (c) 2019 Dmitry Semenov; */
+/*!
+ * PhotoSwipe Default UI - 4.4.0 - 2020-12-06
+ * http://photoswipe.com
+ * Copyright (c) 2020 Dmitry Semenov;
+ */
+
/**
-*
-* UI on top of main sliding area (caption, arrows, close button, etc.).
-* Built just using public methods/properties of PhotoSwipe.
-*
-*/
-(function (root, factory) {
+ *
+ * UI on top of main sliding area (caption, arrows, close button, etc.).
+ * Built just using public methods/properties of PhotoSwipe.
+ *
+ */
+(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define(factory);
} else if (typeof exports === 'object') {
@@ -16,846 +19,853 @@
root.PhotoSwipeUI_Default = factory();
}
})(this, function () {
-
'use strict';
+ var PhotoSwipeUI_Default = function (pswp, framework) {
+ var ui = this;
+ var _overlayUIUpdated = false,
+ _controlsVisible = true,
+ _fullscrenAPI,
+ _stopAllAnimations,
+ _controls,
+ _captionContainer,
+ _fakeCaptionContainer,
+ _indexIndicator,
+ _prevButton,
+ _nextButton,
+ _shareButton,
+ _shareModal,
+ _shareModalHidden = true,
+ _downloadButton,
+ _initalCloseOnScrollValue,
+ _isIdle,
+ _listen,
+ _loadingIndicator,
+ _loadingIndicatorHidden,
+ _loadingIndicatorTimeout,
+ _galleryHasOneSlide,
+ _options,
+ _defaultUIOptions = {
+ barsSize: {top: 44, bottom: 'auto'},
+ closeElClasses: ['item', 'caption', 'zoom-wrap', 'ui', 'top-bar'],
+ timeToIdle: 4000,
+ timeToIdleOutside: 1000,
+ loadingIndicatorDelay: 1000, // 2s
+ addCaptionHTMLFn: function (item, captionEl /*, isFake */) {
+ if (!item.title) {
+ framework.resetEl(captionEl.firstChild);
+ return false;
+ }
+ captionEl.children[0].innerHTML = item.title;
+ return true;
+ },
-var PhotoSwipeUI_Default =
- function(pswp, framework) {
+ closeEl: true,
+ captionEl: true,
+ fullscreenEl: true,
+ zoomEl: true,
+ shareEl: true,
+ downloadEl: true,
+ counterEl: true,
+ arrowEl: true,
+ preloaderEl: true,
+ closeOnOutsideClick: true,
- var ui = this;
- var _overlayUIUpdated = false,
- _controlsVisible = true,
- _fullscrenAPI,
- _controls,
- _captionContainer,
- _fakeCaptionContainer,
- _indexIndicator,
- _shareButton,
- _shareModal,
- _shareModalHidden = true,
- _initalCloseOnScrollValue,
- _isIdle,
- _listen,
+ tapToClose: false,
+ tapToToggleControls: true,
- _loadingIndicator,
- _loadingIndicatorHidden,
- _loadingIndicatorTimeout,
+ clickToCloseNonZoomable: true,
+ clickToShowNextNonZoomable: false,
- _galleryHasOneSlide,
+ shareButtons: [
+ {id: 'facebook', label: 'Share on Facebook', url: 'https://www.facebook.com/sharer/sharer.php?u={{url}}'},
+ {id: 'twitter', label: 'Tweet', url: 'https://twitter.com/intent/tweet?text={{text}}&url={{url}}'},
+ {
+ id: 'pinterest',
+ label: 'Pin it',
+ url: 'http://www.pinterest.com/pin/create/button/' + '?url={{url}}&media={{image_url}}&description={{text}}'
+ },
+ {id: 'download', label: 'Download image', url: '{{raw_image_url}}', download: true}
+ ],
+ getImageURLForShare: function (/* shareButtonData */) {
+ return pswp.currItem.src || '';
+ },
+ getPageURLForShare: function (/* shareButtonData */) {
+ return window.location.href;
+ },
+ getTextForShare: function (/* shareButtonData */) {
+ return pswp.currItem.title || '';
+ },
- _options,
- _defaultUIOptions = {
- barsSize: {top:44, bottom:'auto'},
- closeElClasses: ['item', 'caption', 'zoom-wrap', 'ui', 'top-bar'],
- timeToIdle: 4000,
- timeToIdleOutside: 1000,
- loadingIndicatorDelay: 1000, // 2s
-
- addCaptionHTMLFn: function(item, captionEl /*, isFake */) {
- if(!item.title) {
- captionEl.children[0].innerHTML = '';
+ indexIndicatorSep: ' / ',
+ fitControlsWidth: 1200
+ },
+ _blockControlsTap,
+ _blockControlsTapTimeout;
+
+ var _onControlsTap = function (e) {
+ if (_blockControlsTap) {
+ return true;
+ }
+
+ e = e || window.event;
+
+ if (_options.timeToIdle && _options.mouseUsed && !_isIdle) {
+ // reset idle timer
+ _onIdleMouseMove();
+ }
+
+ var target = e.target || e.srcElement,
+ uiElement,
+ clickedClass = target.getAttribute('class') || '',
+ found;
+
+ for (var i = 0; i < _uiElements.length; i++) {
+ uiElement = _uiElements[i];
+ if (uiElement.onTap && clickedClass.indexOf('pswp__' + uiElement.name) > -1) {
+ uiElement.onTap();
+ found = true;
+ }
+ }
+
+ if (found) {
+ if (e.stopPropagation) {
+ e.stopPropagation();
+ }
+ _blockControlsTap = true;
+
+ // Some versions of Android don't prevent ghost click event
+ // when preventDefault() was called on touchstart and/or touchend.
+ //
+ // This happens on v4.3, 4.2, 4.1,
+ // older versions strangely work correctly,
+ // but just in case we add delay on all of them)
+ var tapDelay = framework.features.isOldAndroid ? 600 : 30;
+ _blockControlsTapTimeout = setTimeout(function () {
+ _blockControlsTap = false;
+ }, tapDelay);
+ }
+ },
+ _fitControlsInViewport = function () {
+ return !pswp.likelyTouchDevice || _options.mouseUsed || screen.width > _options.fitControlsWidth;
+ },
+ _togglePswpClass = function (el, cName, add) {
+ framework[(add ? 'add' : 'remove') + 'Class'](el, 'pswp__' + cName);
+ },
+ // add class when there is just one item in the gallery
+ // (by default it hides left/right arrows and 1ofX counter)
+ _countNumItems = function () {
+ var hasOneSlide = _options.getNumItemsFn() === 1;
+
+ if (hasOneSlide !== _galleryHasOneSlide) {
+ _togglePswpClass(_controls, 'ui--one-slide', hasOneSlide);
+ _galleryHasOneSlide = hasOneSlide;
+ }
+ },
+ _downloadFile = function () {
+ var link = document.createElement('A');
+ link.setAttribute('href', pswp.currItem.downloadURL || pswp.currItem.src || '');
+ link.setAttribute('target', '_blank');
+ link.setAttribute('download', '');
+
+ _downloadButton.appendChild(link);
+ link.click();
+ _downloadButton.removeChild(link);
+ },
+ _toggleShareModalClass = function () {
+ _togglePswpClass(_shareModal, 'share-modal--hidden', _shareModalHidden);
+ },
+ _toggleShareModal = function () {
+ _shareModalHidden = !_shareModalHidden;
+
+ if (!_shareModalHidden) {
+ _toggleShareModalClass();
+ setTimeout(function () {
+ if (!_shareModalHidden) {
+ framework.addClass(_shareModal, 'pswp__share-modal--fade-in');
+ }
+ }, 30);
+ } else {
+ framework.removeClass(_shareModal, 'pswp__share-modal--fade-in');
+ setTimeout(function () {
+ if (_shareModalHidden) {
+ _toggleShareModalClass();
+ }
+ }, 300);
+ }
+
+ if (!_shareModalHidden) {
+ _updateShareURLs();
+ }
+ return false;
+ },
+ _openWindowPopup = function (e) {
+ e = e || window.event;
+ var target = e.target || e.srcElement;
+
+ pswp.shout('shareLinkClick', e, target);
+
+ if (!target.href) {
return false;
}
- captionEl.children[0].innerHTML = item.title;
- return true;
- },
-
- closeEl:true,
- captionEl: true,
- fullscreenEl: true,
- zoomEl: true,
- shareEl: true,
- counterEl: true,
- arrowEl: true,
- preloaderEl: true,
-
- tapToClose: false,
- tapToToggleControls: true,
-
- clickToCloseNonZoomable: true,
-
- shareButtons: [
- {id:'facebook', label:'Share on Facebook', url:'https://www.facebook.com/sharer/sharer.php?u={{url}}'},
- {id:'twitter', label:'Tweet', url:'https://twitter.com/intent/tweet?text={{text}}&url={{url}}'},
- {id:'pinterest', label:'Pin it', url:'http://www.pinterest.com/pin/create/button/'+
- '?url={{url}}&media={{image_url}}&description={{text}}'},
- {id:'download', label:'Download image', url:'{{raw_image_url}}', download:true}
- ],
- getImageURLForShare: function( /* shareButtonData */ ) {
- return pswp.currItem.src || '';
- },
- getPageURLForShare: function( /* shareButtonData */ ) {
- return window.location.href;
- },
- getTextForShare: function( /* shareButtonData */ ) {
- return pswp.currItem.title || '';
- },
-
- indexIndicatorSep: ' / ',
- fitControlsWidth: 1200
-
- },
- _blockControlsTap,
- _blockControlsTapTimeout;
-
-
-
- var _onControlsTap = function(e) {
- if(_blockControlsTap) {
- return true;
- }
-
-
- e = e || window.event;
-
- if(_options.timeToIdle && _options.mouseUsed && !_isIdle) {
- // reset idle timer
- _onIdleMouseMove();
- }
-
-
- var target = e.target || e.srcElement,
- uiElement,
- clickedClass = target.getAttribute('class') || '',
- found;
-
- for(var i = 0; i < _uiElements.length; i++) {
- uiElement = _uiElements[i];
- if(uiElement.onTap && clickedClass.indexOf('pswp__' + uiElement.name ) > -1 ) {
- uiElement.onTap();
- found = true;
+ if (target.hasAttribute('download')) {
+ return true;
}
- }
- if(found) {
- if(e.stopPropagation) {
- e.stopPropagation();
+ window.open(
+ target.href,
+ 'pswp_share',
+ 'scrollbars=yes,resizable=yes,toolbar=no,' +
+ 'location=yes,width=550,height=420,top=100,left=' +
+ (window.screen ? Math.round(screen.width / 2 - 275) : 100)
+ );
+
+ if (!_shareModalHidden) {
+ _toggleShareModal();
}
- _blockControlsTap = true;
- // Some versions of Android don't prevent ghost click event
- // when preventDefault() was called on touchstart and/or touchend.
- //
- // This happens on v4.3, 4.2, 4.1,
- // older versions strangely work correctly,
- // but just in case we add delay on all of them)
- var tapDelay = framework.features.isOldAndroid ? 600 : 30;
- _blockControlsTapTimeout = setTimeout(function() {
- _blockControlsTap = false;
- }, tapDelay);
- }
+ return false;
+ },
+ _updateShareURLs = function () {
+ var shareButtonOut = '',
+ shareButtonData,
+ shareURL,
+ image_url,
+ page_url,
+ share_text;
- },
- _fitControlsInViewport = function() {
- return !pswp.likelyTouchDevice || _options.mouseUsed || screen.width > _options.fitControlsWidth;
- },
- _togglePswpClass = function(el, cName, add) {
- framework[ (add ? 'add' : 'remove') + 'Class' ](el, 'pswp__' + cName);
- },
+ for (var i = 0; i < _options.shareButtons.length; i++) {
+ shareButtonData = _options.shareButtons[i];
- // add class when there is just one item in the gallery
- // (by default it hides left/right arrows and 1ofX counter)
- _countNumItems = function() {
- var hasOneSlide = (_options.getNumItemsFn() === 1);
+ image_url = _options.getImageURLForShare(shareButtonData);
+ page_url = _options.getPageURLForShare(shareButtonData);
+ share_text = _options.getTextForShare(shareButtonData);
- if(hasOneSlide !== _galleryHasOneSlide) {
- _togglePswpClass(_controls, 'ui--one-slide', hasOneSlide);
- _galleryHasOneSlide = hasOneSlide;
- }
- },
- _toggleShareModalClass = function() {
- _togglePswpClass(_shareModal, 'share-modal--hidden', _shareModalHidden);
- },
- _toggleShareModal = function() {
+ shareURL = shareButtonData.url
+ .replace('{{url}}', encodeURIComponent(page_url))
+ .replace('{{image_url}}', encodeURIComponent(image_url))
+ .replace('{{raw_image_url}}', image_url)
+ .replace('{{text}}', encodeURIComponent(share_text));
- _shareModalHidden = !_shareModalHidden;
-
-
- if(!_shareModalHidden) {
- _toggleShareModalClass();
- setTimeout(function() {
- if(!_shareModalHidden) {
- framework.addClass(_shareModal, 'pswp__share-modal--fade-in');
+ shareButtonOut +=
+ '' +
+ shareButtonData.label +
+ '';
+
+ if (_options.parseShareButtonOut) {
+ shareButtonOut = _options.parseShareButtonOut(shareButtonData, shareButtonOut);
}
- }, 30);
+ }
+ _shareModal.children[0].innerHTML = shareButtonOut;
+ _shareModal.children[0].onclick = _openWindowPopup;
+ },
+ _hasCloseClass = function (target) {
+ for (var i = 0; i < _options.closeElClasses.length; i++) {
+ if (framework.hasClass(target, 'pswp__' + _options.closeElClasses[i])) {
+ return true;
+ }
+ }
+ },
+ _idleInterval,
+ _idleTimer,
+ _idleIncrement = 0,
+ _onIdleMouseMove = function () {
+ clearTimeout(_idleTimer);
+ _idleIncrement = 0;
+ if (_isIdle) {
+ ui.setIdle(false);
+ }
+ },
+ _onMouseLeaveWindow = function (e) {
+ e = e ? e : window.event;
+ var from = e.relatedTarget || e.toElement;
+ if (!from || from.nodeName === 'HTML') {
+ clearTimeout(_idleTimer);
+ _idleTimer = setTimeout(function () {
+ ui.setIdle(true);
+ }, _options.timeToIdleOutside);
+ }
+ },
+ _setupFullscreenAPI = function () {
+ if (_options.fullscreenEl && !framework.features.isOldAndroid) {
+ if (!_fullscrenAPI) {
+ _fullscrenAPI = ui.getFullscreenAPI();
+ }
+ if (_fullscrenAPI) {
+ framework.bind(document, _fullscrenAPI.eventK, ui.updateFullscreen);
+ ui.updateFullscreen();
+ framework.addClass(pswp.template, 'pswp--supports-fs');
+ } else {
+ framework.removeClass(pswp.template, 'pswp--supports-fs');
+ }
+ }
+ },
+ _setupLoadingIndicator = function () {
+ // Setup loading indicator
+ if (_options.preloaderEl) {
+ _toggleLoadingIndicator(true);
+
+ _listen('beforeChange', function () {
+ clearTimeout(_loadingIndicatorTimeout);
+
+ // display loading indicator with delay
+ _loadingIndicatorTimeout = setTimeout(function () {
+ if (pswp.currItem && pswp.currItem.loading) {
+ if (!pswp.allowProgressiveImg() || (pswp.currItem.img && !pswp.currItem.img.naturalWidth)) {
+ // show preloader if progressive loading is not enabled,
+ // or image width is not defined yet (because of slow connection)
+ _toggleLoadingIndicator(false);
+ // items-controller.js function allowProgressiveImg
+ }
+ } else {
+ _toggleLoadingIndicator(true); // hide preloader
+ }
+ }, _options.loadingIndicatorDelay);
+ });
+ _listen('imageLoadComplete', function (index, item) {
+ if (pswp.currItem === item) {
+ _toggleLoadingIndicator(true);
+ }
+ });
+ }
+ },
+ _toggleLoadingIndicator = function (hide) {
+ if (_loadingIndicatorHidden !== hide) {
+ _togglePswpClass(_loadingIndicator, 'preloader--active', !hide);
+ _loadingIndicatorHidden = hide;
+ }
+ },
+ _applyNavBarGaps = function (item) {
+ var gap = item.vGap;
+ var bars = _options.barsSize;
+
+ if (_fitControlsInViewport()) {
+ if (_options.captionEl && bars.bottom === 'auto') {
+ if (!_fakeCaptionContainer) {
+ _fakeCaptionContainer = framework.createEl('pswp__caption pswp__caption--fake');
+ _fakeCaptionContainer.appendChild(framework.createEl('pswp__caption__center'));
+ _controls.insertBefore(_fakeCaptionContainer, _captionContainer);
+ framework.addClass(_controls, 'pswp__ui--fit');
+ }
+ if (_options.addCaptionHTMLFn(item, _fakeCaptionContainer, true)) {
+ var captionSize = _fakeCaptionContainer.clientHeight;
+ gap.bottom = parseInt(captionSize, 10) || 44;
+ } else {
+ gap.bottom = bars.top; // if no caption, set size of bottom gap to size of top
+ }
+ } else {
+ gap.bottom = bars.bottom === 'auto' ? 0 : bars.bottom;
+ }
+
+ // height of top bar is static, no need to calculate it
+ gap.top = bars.top;
+ } else {
+ gap.top = gap.bottom = 0;
+ }
+ },
+ _setupIdle = function () {
+ // Hide controls when mouse is used
+ if (_options.timeToIdle) {
+ _listen('mouseUsed', function () {
+ framework.bind(document, 'mousemove', _onIdleMouseMove);
+ framework.bind(document, 'mouseout', _onMouseLeaveWindow);
+
+ _idleInterval = setInterval(function () {
+ _idleIncrement++;
+ if (_idleIncrement === 2) {
+ ui.setIdle(true);
+ }
+ }, _options.timeToIdle / 2);
+ });
+ }
+ },
+ _setupHidingControlsDuringGestures = function () {
+ // Hide controls on vertical drag
+ _listen('onVerticalDrag', function (now) {
+ if (_controlsVisible && now < 0.95) {
+ ui.hideControls();
+ } else if (!_controlsVisible && now >= 0.95) {
+ ui.showControls();
+ }
+ });
+
+ // Hide controls when pinching to close
+ var pinchControlsHidden;
+ _listen('onPinchClose', function (now) {
+ if (_controlsVisible && now < 0.9) {
+ ui.hideControls();
+ pinchControlsHidden = true;
+ } else if (pinchControlsHidden && !_controlsVisible && now > 0.9) {
+ ui.showControls();
+ }
+ });
+
+ _listen('zoomGestureEnded', function () {
+ pinchControlsHidden = false;
+ if (pinchControlsHidden && !_controlsVisible) {
+ ui.showControls();
+ }
+ });
+ };
+
+ var _uiElements = [
+ {
+ name: 'caption',
+ option: 'captionEl',
+ onInit: function (el) {
+ _captionContainer = el;
+ }
+ },
+ {
+ name: 'share-modal',
+ option: 'shareEl',
+ onInit: function (el) {
+ _shareModal = el;
+ },
+ onTap: function () {
+ _toggleShareModal();
+ }
+ },
+ {
+ name: 'button--share',
+ option: 'shareEl',
+ onInit: function (el) {
+ _shareButton = el;
+ },
+ onTap: function () {
+ _toggleShareModal();
+ }
+ },
+ {
+ name: 'button--download',
+ option: 'downloadEl',
+ onInit: function (el) {
+ _downloadButton = el;
+ },
+ onTap: _downloadFile
+ },
+ {
+ name: 'button--zoom',
+ option: 'zoomEl',
+ onTap: pswp.toggleDesktopZoom
+ },
+ {
+ name: 'counter',
+ option: 'counterEl',
+ onInit: function (el) {
+ _indexIndicator = el;
+ }
+ },
+ {
+ name: 'button--close',
+ option: 'closeEl',
+ onTap: function () {
+ setTimeout(pswp.close);
+ }
+ },
+ {
+ name: 'button--arrow--left',
+ option: 'arrowEl',
+ onInit: function (el) {
+ _prevButton = el;
+ },
+ onTap: pswp.prev
+ },
+ {
+ name: 'button--arrow--right',
+ option: 'arrowEl',
+ onInit: function (el) {
+ _nextButton = el;
+ },
+ onTap: pswp.next
+ },
+ {
+ name: 'button--fs',
+ option: 'fullscreenEl',
+ onTap: function () {
+ if (_fullscrenAPI.isFullscreen()) {
+ _fullscrenAPI.exit();
+ } else {
+ _fullscrenAPI.enter();
+ }
+ }
+ },
+ {
+ name: 'preloader',
+ option: 'preloaderEl',
+ onInit: function (el) {
+ _loadingIndicator = el;
+ }
+ }
+ ];
+
+ var _setupUIElements = function () {
+ var item, classAttr, uiElement;
+
+ var loopThroughChildElements = function (sChildren) {
+ if (!sChildren) {
+ return;
+ }
+
+ var l = sChildren.length;
+ for (var i = 0; i < l; i++) {
+ item = sChildren[i];
+ classAttr = item.className;
+
+ for (var a = 0; a < _uiElements.length; a++) {
+ uiElement = _uiElements[a];
+
+ if (classAttr.indexOf('pswp__' + uiElement.name) > -1) {
+ if (_options[uiElement.option]) {
+ // if element is not disabled from options
+
+ framework.removeClass(item, 'pswp__element--disabled');
+ if (uiElement.onInit) {
+ uiElement.onInit(item);
+ }
+
+ //item.style.display = 'block';
+ } else {
+ framework.addClass(item, 'pswp__element--disabled');
+ //item.style.display = 'none';
+ }
+ }
+ }
+ }
+ };
+ loopThroughChildElements(_controls.children);
+
+ var topBar = framework.getChildByClass(_controls, 'pswp__top-bar');
+ if (topBar) {
+ loopThroughChildElements(topBar.children);
+ }
+ };
+
+ ui.init = function () {
+ // extend options
+ framework.extend(pswp.options, _defaultUIOptions, true);
+
+ // create local link for fast access
+ _options = pswp.options;
+
+ // find pswp__ui element
+ _controls = framework.getChildByClass(pswp.scrollWrap, 'pswp__ui');
+
+ // create local link
+ _listen = pswp.listen;
+
+ _setupHidingControlsDuringGestures();
+
+ // update controls when slides change
+ _listen('beforeChange', ui.update);
+
+ // toggle zoom on double-tap
+ _listen('doubleTap', function (point) {
+ var initialZoomLevel = pswp.currItem.initialZoomLevel;
+ if (pswp.getZoomLevel() !== initialZoomLevel) {
+ pswp.zoomTo(initialZoomLevel, point, 333);
+ } else {
+ pswp.zoomTo(_options.getDoubleTapZoom(false, pswp.currItem), point, 333);
+ }
+ });
+
+ // Allow text selection in caption
+ _listen('preventDragEvent', function (e, isDown, preventObj) {
+ var t = e.target || e.srcElement;
+ if (
+ t &&
+ t.nodeType === 1 &&
+ t.getAttribute('class') &&
+ e.type.indexOf('mouse') > -1 &&
+ (t.getAttribute('class').indexOf('__caption') > 0 || /(SMALL|STRONG|EM)/i.test(t.tagName))
+ ) {
+ preventObj.prevent = false;
+ _stopAllAnimations();
+ }
+ });
+
+ // bind events for UI
+ _listen('bindEvents', function () {
+ framework.bind(_controls, 'pswpTap click', _onControlsTap);
+ framework.bind(pswp.scrollWrap, 'pswpTap', ui.onGlobalTap);
+
+ if (!pswp.likelyTouchDevice) {
+ framework.bind(pswp.scrollWrap, 'mouseover', ui.onMouseOver);
+ }
+ });
+
+ // unbind events for UI
+ _listen('unbindEvents', function () {
+ if (!_shareModalHidden) {
+ _toggleShareModal();
+ }
+ if (_idleInterval) {
+ clearInterval(_idleInterval);
+ }
+ framework.unbind(document, 'mouseout', _onMouseLeaveWindow);
+ framework.unbind(document, 'mousemove', _onIdleMouseMove);
+ framework.unbind(_controls, 'pswpTap click', _onControlsTap);
+ framework.unbind(pswp.scrollWrap, 'pswpTap', ui.onGlobalTap);
+ framework.unbind(pswp.scrollWrap, 'mouseover', ui.onMouseOver);
+
+ if (_fullscrenAPI) {
+ framework.unbind(document, _fullscrenAPI.eventK, ui.updateFullscreen);
+ if (_fullscrenAPI.isFullscreen()) {
+ _options.hideAnimationDuration = 0;
+ _fullscrenAPI.exit();
+ }
+ _fullscrenAPI = null;
+ }
+ });
+
+ // clean up things when gallery is destroyed
+ _listen('destroy', function () {
+ if (_options.captionEl) {
+ if (_fakeCaptionContainer) {
+ _controls.removeChild(_fakeCaptionContainer);
+ }
+ framework.removeClass(_captionContainer, 'pswp__caption--empty');
+ }
+
+ if (_shareModal) {
+ _shareModal.children[0].onclick = null;
+ }
+ framework.removeClass(_controls, 'pswp__ui--over-close');
+ framework.addClass(_controls, 'pswp__ui--hidden');
+ ui.setIdle(false);
+ });
+
+ if (!_options.showAnimationDuration) {
+ framework.removeClass(_controls, 'pswp__ui--hidden');
+ }
+ _listen('initialZoomIn', function () {
+ if (_options.showAnimationDuration) {
+ framework.removeClass(_controls, 'pswp__ui--hidden');
+ }
+ });
+ _listen('initialZoomOut', function () {
+ framework.addClass(_controls, 'pswp__ui--hidden');
+ });
+
+ _listen('parseVerticalMargin', _applyNavBarGaps);
+
+ _setupUIElements();
+
+ if (_options.shareEl && _shareButton && _shareModal) {
+ _shareModalHidden = true;
+ }
+
+ _countNumItems();
+
+ _setupIdle();
+
+ _setupFullscreenAPI();
+
+ _setupLoadingIndicator();
+ };
+
+ ui.setIdle = function (isIdle) {
+ _isIdle = isIdle;
+ _togglePswpClass(_controls, 'ui--idle', isIdle);
+ };
+
+ ui.update = function () {
+ // Don't update UI if it's hidden
+ if (_controlsVisible && pswp.currItem) {
+ ui.updateIndexIndicator();
+
+ if (_options.captionEl) {
+ var captionExists = _options.addCaptionHTMLFn(pswp.currItem, _captionContainer);
+
+ _togglePswpClass(_captionContainer, 'caption--empty', !captionExists);
+ }
+
+ _overlayUIUpdated = true;
} else {
- framework.removeClass(_shareModal, 'pswp__share-modal--fade-in');
- setTimeout(function() {
- if(_shareModalHidden) {
- _toggleShareModalClass();
- }
- }, 300);
+ _overlayUIUpdated = false;
}
-
- if(!_shareModalHidden) {
- _updateShareURLs();
- }
- return false;
- },
- _openWindowPopup = function(e) {
+ if (!_shareModalHidden) {
+ _toggleShareModal();
+ }
+
+ _countNumItems();
+ };
+
+ ui.updateFullscreen = function (e) {
+ if (e) {
+ // some browsers change window scroll position during the fullscreen
+ // so PhotoSwipe updates it just in case
+ setTimeout(function () {
+ pswp.setScrollOffset(0, framework.getScrollY());
+ }, 50);
+ }
+
+ // toogle pswp--fs class on root element
+ framework[(_fullscrenAPI.isFullscreen() ? 'add' : 'remove') + 'Class'](pswp.template, 'pswp--fs');
+ };
+
+ ui.updateIndexIndicator = function () {
+ if (_options.counterEl) {
+ _indexIndicator.innerHTML = pswp.getCurrentIndex() + 1 + _options.indexIndicatorSep + _options.getNumItemsFn();
+ }
+ if (!_options.loop) {
+ if (pswp.getCurrentIndex() === 0) {
+ framework.addClass(_prevButton, 'pswp__element--disabled');
+ } else {
+ framework.removeClass(_prevButton, 'pswp__element--disabled');
+ }
+ if (pswp.getCurrentIndex() === _options.getNumItemsFn() - 1) {
+ framework.addClass(_nextButton, 'pswp__element--disabled');
+ } else {
+ framework.removeClass(_nextButton, 'pswp__element--disabled');
+ }
+ }
+ };
+
+ ui.onGlobalTap = function (e) {
e = e || window.event;
var target = e.target || e.srcElement;
- pswp.shout('shareLinkClick', e, target);
-
- if(!target.href) {
- return false;
- }
-
- if( target.hasAttribute('download') ) {
- return true;
- }
-
- window.open(target.href, 'pswp_share', 'scrollbars=yes,resizable=yes,toolbar=no,'+
- 'location=yes,width=550,height=420,top=100,left=' +
- (window.screen ? Math.round(screen.width / 2 - 275) : 100) );
-
- if(!_shareModalHidden) {
- _toggleShareModal();
- }
-
- return false;
- },
- _updateShareURLs = function() {
- var shareButtonOut = '',
- shareButtonData,
- shareURL,
- image_url,
- page_url,
- share_text;
-
- for(var i = 0; i < _options.shareButtons.length; i++) {
- shareButtonData = _options.shareButtons[i];
-
- image_url = _options.getImageURLForShare(shareButtonData);
- page_url = _options.getPageURLForShare(shareButtonData);
- share_text = _options.getTextForShare(shareButtonData);
-
- shareURL = shareButtonData.url.replace('{{url}}', encodeURIComponent(page_url) )
- .replace('{{image_url}}', encodeURIComponent(image_url) )
- .replace('{{raw_image_url}}', image_url )
- .replace('{{text}}', encodeURIComponent(share_text) );
-
- shareButtonOut += '' +
- shareButtonData.label + '';
-
- if(_options.parseShareButtonOut) {
- shareButtonOut = _options.parseShareButtonOut(shareButtonData, shareButtonOut);
- }
- }
- _shareModal.children[0].innerHTML = shareButtonOut;
- _shareModal.children[0].onclick = _openWindowPopup;
-
- },
- _hasCloseClass = function(target) {
- for(var i = 0; i < _options.closeElClasses.length; i++) {
- if( framework.hasClass(target, 'pswp__' + _options.closeElClasses[i]) ) {
- return true;
- }
- }
- },
- _idleInterval,
- _idleTimer,
- _idleIncrement = 0,
- _onIdleMouseMove = function() {
- clearTimeout(_idleTimer);
- _idleIncrement = 0;
- if(_isIdle) {
- ui.setIdle(false);
- }
- },
- _onMouseLeaveWindow = function(e) {
- e = e ? e : window.event;
- var from = e.relatedTarget || e.toElement;
- if (!from || from.nodeName === 'HTML') {
- clearTimeout(_idleTimer);
- _idleTimer = setTimeout(function() {
- ui.setIdle(true);
- }, _options.timeToIdleOutside);
- }
- },
- _setupFullscreenAPI = function() {
- if(_options.fullscreenEl && !framework.features.isOldAndroid) {
- if(!_fullscrenAPI) {
- _fullscrenAPI = ui.getFullscreenAPI();
- }
- if(_fullscrenAPI) {
- framework.bind(document, _fullscrenAPI.eventK, ui.updateFullscreen);
- ui.updateFullscreen();
- framework.addClass(pswp.template, 'pswp--supports-fs');
- } else {
- framework.removeClass(pswp.template, 'pswp--supports-fs');
- }
- }
- },
- _setupLoadingIndicator = function() {
- // Setup loading indicator
- if(_options.preloaderEl) {
-
- _toggleLoadingIndicator(true);
-
- _listen('beforeChange', function() {
-
- clearTimeout(_loadingIndicatorTimeout);
-
- // display loading indicator with delay
- _loadingIndicatorTimeout = setTimeout(function() {
-
- if(pswp.currItem && pswp.currItem.loading) {
-
- if( !pswp.allowProgressiveImg() || (pswp.currItem.img && !pswp.currItem.img.naturalWidth) ) {
- // show preloader if progressive loading is not enabled,
- // or image width is not defined yet (because of slow connection)
- _toggleLoadingIndicator(false);
- // items-controller.js function allowProgressiveImg
- }
-
- } else {
- _toggleLoadingIndicator(true); // hide preloader
- }
-
- }, _options.loadingIndicatorDelay);
-
- });
- _listen('imageLoadComplete', function(index, item) {
- if(pswp.currItem === item) {
- _toggleLoadingIndicator(true);
- }
- });
-
- }
- },
- _toggleLoadingIndicator = function(hide) {
- if( _loadingIndicatorHidden !== hide ) {
- _togglePswpClass(_loadingIndicator, 'preloader--active', !hide);
- _loadingIndicatorHidden = hide;
- }
- },
- _applyNavBarGaps = function(item) {
- var gap = item.vGap;
-
- if( _fitControlsInViewport() ) {
-
- var bars = _options.barsSize;
- if(_options.captionEl && bars.bottom === 'auto') {
- if(!_fakeCaptionContainer) {
- _fakeCaptionContainer = framework.createEl('pswp__caption pswp__caption--fake');
- _fakeCaptionContainer.appendChild( framework.createEl('pswp__caption__center') );
- _controls.insertBefore(_fakeCaptionContainer, _captionContainer);
- framework.addClass(_controls, 'pswp__ui--fit');
- }
- if( _options.addCaptionHTMLFn(item, _fakeCaptionContainer, true) ) {
-
- var captionSize = _fakeCaptionContainer.clientHeight;
- gap.bottom = parseInt(captionSize,10) || 44;
- } else {
- gap.bottom = bars.top; // if no caption, set size of bottom gap to size of top
- }
- } else {
- gap.bottom = bars.bottom === 'auto' ? 0 : bars.bottom;
- }
-
- // height of top bar is static, no need to calculate it
- gap.top = bars.top;
- } else {
- gap.top = gap.bottom = 0;
- }
- },
- _setupIdle = function() {
- // Hide controls when mouse is used
- if(_options.timeToIdle) {
- _listen('mouseUsed', function() {
-
- framework.bind(document, 'mousemove', _onIdleMouseMove);
- framework.bind(document, 'mouseout', _onMouseLeaveWindow);
-
- _idleInterval = setInterval(function() {
- _idleIncrement++;
- if(_idleIncrement === 2) {
- ui.setIdle(true);
- }
- }, _options.timeToIdle / 2);
- });
- }
- },
- _setupHidingControlsDuringGestures = function() {
-
- // Hide controls on vertical drag
- _listen('onVerticalDrag', function(now) {
- if(_controlsVisible && now < 0.95) {
- ui.hideControls();
- } else if(!_controlsVisible && now >= 0.95) {
- ui.showControls();
- }
- });
-
- // Hide controls when pinching to close
- var pinchControlsHidden;
- _listen('onPinchClose' , function(now) {
- if(_controlsVisible && now < 0.9) {
- ui.hideControls();
- pinchControlsHidden = true;
- } else if(pinchControlsHidden && !_controlsVisible && now > 0.9) {
- ui.showControls();
- }
- });
-
- _listen('zoomGestureEnded', function() {
- pinchControlsHidden = false;
- if(pinchControlsHidden && !_controlsVisible) {
- ui.showControls();
- }
- });
-
- };
-
-
-
- var _uiElements = [
- {
- name: 'caption',
- option: 'captionEl',
- onInit: function(el) {
- _captionContainer = el;
- }
- },
- {
- name: 'share-modal',
- option: 'shareEl',
- onInit: function(el) {
- _shareModal = el;
- },
- onTap: function() {
- _toggleShareModal();
- }
- },
- {
- name: 'button--share',
- option: 'shareEl',
- onInit: function(el) {
- _shareButton = el;
- },
- onTap: function() {
- _toggleShareModal();
- }
- },
- {
- name: 'button--zoom',
- option: 'zoomEl',
- onTap: pswp.toggleDesktopZoom
- },
- {
- name: 'counter',
- option: 'counterEl',
- onInit: function(el) {
- _indexIndicator = el;
- }
- },
- {
- name: 'button--close',
- option: 'closeEl',
- onTap: pswp.close
- },
- {
- name: 'button--arrow--left',
- option: 'arrowEl',
- onTap: pswp.prev
- },
- {
- name: 'button--arrow--right',
- option: 'arrowEl',
- onTap: pswp.next
- },
- {
- name: 'button--fs',
- option: 'fullscreenEl',
- onTap: function() {
- if(_fullscrenAPI.isFullscreen()) {
- _fullscrenAPI.exit();
- } else {
- _fullscrenAPI.enter();
- }
- }
- },
- {
- name: 'preloader',
- option: 'preloaderEl',
- onInit: function(el) {
- _loadingIndicator = el;
- }
- }
-
- ];
-
- var _setupUIElements = function() {
- var item,
- classAttr,
- uiElement;
-
- var loopThroughChildElements = function(sChildren) {
- if(!sChildren) {
+ if (_blockControlsTap) {
return;
}
- var l = sChildren.length;
- for(var i = 0; i < l; i++) {
- item = sChildren[i];
- classAttr = item.className;
-
- for(var a = 0; a < _uiElements.length; a++) {
- uiElement = _uiElements[a];
-
- if(classAttr.indexOf('pswp__' + uiElement.name) > -1 ) {
-
- if( _options[uiElement.option] ) { // if element is not disabled from options
-
- framework.removeClass(item, 'pswp__element--disabled');
- if(uiElement.onInit) {
- uiElement.onInit(item);
- }
-
- //item.style.display = 'block';
- } else {
- framework.addClass(item, 'pswp__element--disabled');
- //item.style.display = 'none';
- }
- }
- }
- }
- };
- loopThroughChildElements(_controls.children);
-
- var topBar = framework.getChildByClass(_controls, 'pswp__top-bar');
- if(topBar) {
- loopThroughChildElements( topBar.children );
- }
- };
-
-
-
-
- ui.init = function() {
-
- // extend options
- framework.extend(pswp.options, _defaultUIOptions, true);
-
- // create local link for fast access
- _options = pswp.options;
-
- // find pswp__ui element
- _controls = framework.getChildByClass(pswp.scrollWrap, 'pswp__ui');
-
- // create local link
- _listen = pswp.listen;
-
-
- _setupHidingControlsDuringGestures();
-
- // update controls when slides change
- _listen('beforeChange', ui.update);
-
- // toggle zoom on double-tap
- _listen('doubleTap', function(point) {
- var initialZoomLevel = pswp.currItem.initialZoomLevel;
- if(pswp.getZoomLevel() !== initialZoomLevel) {
- pswp.zoomTo(initialZoomLevel, point, 333);
- } else {
- pswp.zoomTo(_options.getDoubleTapZoom(false, pswp.currItem), point, 333);
- }
- });
-
- // Allow text selection in caption
- _listen('preventDragEvent', function(e, isDown, preventObj) {
- var t = e.target || e.srcElement;
- if(
- t &&
- t.getAttribute('class') && e.type.indexOf('mouse') > -1 &&
- ( t.getAttribute('class').indexOf('__caption') > 0 || (/(SMALL|STRONG|EM)/i).test(t.tagName) )
- ) {
- preventObj.prevent = false;
- }
- });
-
- // bind events for UI
- _listen('bindEvents', function() {
- framework.bind(_controls, 'pswpTap click', _onControlsTap);
- framework.bind(pswp.scrollWrap, 'pswpTap', ui.onGlobalTap);
-
- if(!pswp.likelyTouchDevice) {
- framework.bind(pswp.scrollWrap, 'mouseover', ui.onMouseOver);
- }
- });
-
- // unbind events for UI
- _listen('unbindEvents', function() {
- if(!_shareModalHidden) {
- _toggleShareModal();
- }
-
- if(_idleInterval) {
- clearInterval(_idleInterval);
- }
- framework.unbind(document, 'mouseout', _onMouseLeaveWindow);
- framework.unbind(document, 'mousemove', _onIdleMouseMove);
- framework.unbind(_controls, 'pswpTap click', _onControlsTap);
- framework.unbind(pswp.scrollWrap, 'pswpTap', ui.onGlobalTap);
- framework.unbind(pswp.scrollWrap, 'mouseover', ui.onMouseOver);
-
- if(_fullscrenAPI) {
- framework.unbind(document, _fullscrenAPI.eventK, ui.updateFullscreen);
- if(_fullscrenAPI.isFullscreen()) {
- _options.hideAnimationDuration = 0;
- _fullscrenAPI.exit();
- }
- _fullscrenAPI = null;
- }
- });
-
-
- // clean up things when gallery is destroyed
- _listen('destroy', function() {
- if(_options.captionEl) {
- if(_fakeCaptionContainer) {
- _controls.removeChild(_fakeCaptionContainer);
- }
- framework.removeClass(_captionContainer, 'pswp__caption--empty');
- }
-
- if(_shareModal) {
- _shareModal.children[0].onclick = null;
- }
- framework.removeClass(_controls, 'pswp__ui--over-close');
- framework.addClass( _controls, 'pswp__ui--hidden');
- ui.setIdle(false);
- });
-
-
- if(!_options.showAnimationDuration) {
- framework.removeClass( _controls, 'pswp__ui--hidden');
- }
- _listen('initialZoomIn', function() {
- if(_options.showAnimationDuration) {
- framework.removeClass( _controls, 'pswp__ui--hidden');
- }
- });
- _listen('initialZoomOut', function() {
- framework.addClass( _controls, 'pswp__ui--hidden');
- });
-
- _listen('parseVerticalMargin', _applyNavBarGaps);
-
- _setupUIElements();
-
- if(_options.shareEl && _shareButton && _shareModal) {
- _shareModalHidden = true;
- }
-
- _countNumItems();
-
- _setupIdle();
-
- _setupFullscreenAPI();
-
- _setupLoadingIndicator();
- };
-
- ui.setIdle = function(isIdle) {
- _isIdle = isIdle;
- _togglePswpClass(_controls, 'ui--idle', isIdle);
- };
-
- ui.update = function() {
- // Don't update UI if it's hidden
- if(_controlsVisible && pswp.currItem) {
-
- ui.updateIndexIndicator();
-
- if(_options.captionEl) {
- _options.addCaptionHTMLFn(pswp.currItem, _captionContainer);
-
- _togglePswpClass(_captionContainer, 'caption--empty', !pswp.currItem.title);
- }
-
- _overlayUIUpdated = true;
-
- } else {
- _overlayUIUpdated = false;
- }
-
- if(!_shareModalHidden) {
- _toggleShareModal();
- }
-
- _countNumItems();
- };
-
- ui.updateFullscreen = function(e) {
-
- if(e) {
- // some browsers change window scroll position during the fullscreen
- // so PhotoSwipe updates it just in case
- setTimeout(function() {
- pswp.setScrollOffset( 0, framework.getScrollY() );
- }, 50);
- }
-
- // toogle pswp--fs class on root element
- framework[ (_fullscrenAPI.isFullscreen() ? 'add' : 'remove') + 'Class' ](pswp.template, 'pswp--fs');
- };
-
- ui.updateIndexIndicator = function() {
- if(_options.counterEl) {
- _indexIndicator.innerHTML = (pswp.getCurrentIndex()+1) +
- _options.indexIndicatorSep +
- _options.getNumItemsFn();
- }
- };
-
- ui.onGlobalTap = function(e) {
- e = e || window.event;
- var target = e.target || e.srcElement;
-
- if(_blockControlsTap) {
- return;
- }
-
- if(e.detail && e.detail.pointerType === 'mouse') {
-
- // close gallery if clicked outside of the image
- if(_hasCloseClass(target)) {
- pswp.close();
- return;
- }
-
- if(framework.hasClass(target, 'pswp__img')) {
- if(pswp.getZoomLevel() === 1 && pswp.getZoomLevel() <= pswp.currItem.fitRatio) {
- if(_options.clickToCloseNonZoomable) {
+ if (e.detail && e.detail.pointerType === 'mouse') {
+ // Silently ignore right-click events.
+ if (!e.detail.rightClick) {
+ // close gallery if clicked outside of the image
+ if (_options.closeOnOutsideClick && _hasCloseClass(target)) {
pswp.close();
+ return;
}
- } else {
- pswp.toggleDesktopZoom(e.detail.releasePoint);
+
+ if (framework.hasClass(target, 'pswp__img')) {
+ if (pswp.getZoomLevel() === 1 && pswp.getZoomLevel() <= pswp.currItem.fitRatio) {
+ if (_options.clickToCloseNonZoomable) {
+ pswp.close();
+ } else if (_options.clickToShowNextNonZoomable) {
+ pswp.next();
+ }
+ } else {
+ pswp.toggleDesktopZoom(e.detail.releasePoint);
+ }
+ }
+ }
+ } else {
+ // tap anywhere (except buttons) to toggle visibility of controls
+ if (_options.tapToToggleControls) {
+ if (_controlsVisible) {
+ ui.hideControls();
+ } else {
+ ui.showControls();
+ }
+ }
+
+ // tap to close gallery
+ if (
+ _options.tapToClose &&
+ (framework.hasClass(target, 'pswp__img') || (_options.closeOnOutsideClick && _hasCloseClass(target)))
+ ) {
+ pswp.close();
+ return;
}
}
-
- } else {
+ };
+ ui.onMouseOver = function (e) {
+ e = e || window.event;
+ var target = e.target || e.srcElement;
- // tap anywhere (except buttons) to toggle visibility of controls
- if(_options.tapToToggleControls) {
- if(_controlsVisible) {
- ui.hideControls();
- } else {
- ui.showControls();
- }
+ // add class when mouse is over an element that should close the gallery
+ _togglePswpClass(_controls, 'ui--over-close', _hasCloseClass(target));
+ };
+
+ ui.hideControls = function () {
+ framework.addClass(_controls, 'pswp__ui--hidden');
+ _controlsVisible = false;
+ };
+
+ ui.showControls = function () {
+ _controlsVisible = true;
+ if (!_overlayUIUpdated) {
+ ui.update();
+ }
+ framework.removeClass(_controls, 'pswp__ui--hidden');
+ };
+
+ ui.supportsFullscreen = function () {
+ var d = document;
+ return !!(d.exitFullscreen || d.mozCancelFullScreen || d.webkitExitFullscreen || d.msExitFullscreen);
+ };
+
+ ui.getFullscreenAPI = function () {
+ var dE = document.documentElement,
+ api,
+ tF = 'fullscreenchange';
+
+ if (dE.requestFullscreen) {
+ api = {
+ enterK: 'requestFullscreen',
+ exitK: 'exitFullscreen',
+ elementK: 'fullscreenElement',
+ eventK: tF
+ };
+ } else if (dE.mozRequestFullScreen) {
+ api = {
+ enterK: 'mozRequestFullScreen',
+ exitK: 'mozCancelFullScreen',
+ elementK: 'mozFullScreenElement',
+ eventK: 'moz' + tF
+ };
+ } else if (dE.webkitRequestFullscreen) {
+ api = {
+ enterK: 'webkitRequestFullscreen',
+ exitK: 'webkitExitFullscreen',
+ elementK: 'webkitFullscreenElement',
+ eventK: 'webkit' + tF
+ };
+ } else if (dE.msRequestFullscreen) {
+ api = {
+ enterK: 'msRequestFullscreen',
+ exitK: 'msExitFullscreen',
+ elementK: 'msFullscreenElement',
+ eventK: 'MSFullscreenChange'
+ };
}
- // tap to close gallery
- if(_options.tapToClose && (framework.hasClass(target, 'pswp__img') || _hasCloseClass(target)) ) {
- pswp.close();
- return;
+ if (api) {
+ api.enter = function () {
+ // disable close-on-scroll in fullscreen
+ _initalCloseOnScrollValue = _options.closeOnScroll;
+ _options.closeOnScroll = false;
+
+ if (this.enterK === 'webkitRequestFullscreen') {
+ pswp.template[this.enterK](Element.ALLOW_KEYBOARD_INPUT);
+ } else {
+ return pswp.template[this.enterK]();
+ }
+ };
+ api.exit = function () {
+ _options.closeOnScroll = _initalCloseOnScrollValue;
+
+ return document[this.exitK]();
+ };
+ api.isFullscreen = function () {
+ return document[this.elementK];
+ };
}
-
- }
+
+ return api;
+ };
};
- ui.onMouseOver = function(e) {
- e = e || window.event;
- var target = e.target || e.srcElement;
-
- // add class when mouse is over an element that should close the gallery
- _togglePswpClass(_controls, 'ui--over-close', _hasCloseClass(target));
- };
-
- ui.hideControls = function() {
- framework.addClass(_controls,'pswp__ui--hidden');
- _controlsVisible = false;
- };
-
- ui.showControls = function() {
- _controlsVisible = true;
- if(!_overlayUIUpdated) {
- ui.update();
- }
- framework.removeClass(_controls,'pswp__ui--hidden');
- };
-
- ui.supportsFullscreen = function() {
- var d = document;
- return !!(d.exitFullscreen || d.mozCancelFullScreen || d.webkitExitFullscreen || d.msExitFullscreen);
- };
-
- ui.getFullscreenAPI = function() {
- var dE = document.documentElement,
- api,
- tF = 'fullscreenchange';
-
- if (dE.requestFullscreen) {
- api = {
- enterK: 'requestFullscreen',
- exitK: 'exitFullscreen',
- elementK: 'fullscreenElement',
- eventK: tF
- };
-
- } else if(dE.mozRequestFullScreen ) {
- api = {
- enterK: 'mozRequestFullScreen',
- exitK: 'mozCancelFullScreen',
- elementK: 'mozFullScreenElement',
- eventK: 'moz' + tF
- };
-
-
-
- } else if(dE.webkitRequestFullscreen) {
- api = {
- enterK: 'webkitRequestFullscreen',
- exitK: 'webkitExitFullscreen',
- elementK: 'webkitFullscreenElement',
- eventK: 'webkit' + tF
- };
-
- } else if(dE.msRequestFullscreen) {
- api = {
- enterK: 'msRequestFullscreen',
- exitK: 'msExitFullscreen',
- elementK: 'msFullscreenElement',
- eventK: 'MSFullscreenChange'
- };
- }
-
- if(api) {
- api.enter = function() {
- // disable close-on-scroll in fullscreen
- _initalCloseOnScrollValue = _options.closeOnScroll;
- _options.closeOnScroll = false;
-
- if(this.enterK === 'webkitRequestFullscreen') {
- pswp.template[this.enterK]( Element.ALLOW_KEYBOARD_INPUT );
- } else {
- return pswp.template[this.enterK]();
- }
- };
- api.exit = function() {
- _options.closeOnScroll = _initalCloseOnScrollValue;
-
- return document[this.exitK]();
-
- };
- api.isFullscreen = function() { return document[this.elementK]; };
- }
-
- return api;
- };
-
-
-
-};
-return PhotoSwipeUI_Default;
-
-
+ return PhotoSwipeUI_Default;
});
diff --git a/sigal/themes/photoswipe/static/photoswipe-ui-default.min.js b/sigal/themes/photoswipe/static/photoswipe-ui-default.min.js
index ab7bedc..73e2811 100644
--- a/sigal/themes/photoswipe/static/photoswipe-ui-default.min.js
+++ b/sigal/themes/photoswipe/static/photoswipe-ui-default.min.js
@@ -1,4 +1 @@
-/*! PhotoSwipe Default UI - 4.1.3 - 2019-01-08
-* http://photoswipe.com
-* Copyright (c) 2019 Dmitry Semenov; */
-!function(a,b){"function"==typeof define&&define.amd?define(b):"object"==typeof exports?module.exports=b():a.PhotoSwipeUI_Default=b()}(this,function(){"use strict";var a=function(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v=this,w=!1,x=!0,y=!0,z={barsSize:{top:44,bottom:"auto"},closeElClasses:["item","caption","zoom-wrap","ui","top-bar"],timeToIdle:4e3,timeToIdleOutside:1e3,loadingIndicatorDelay:1e3,addCaptionHTMLFn:function(a,b){return a.title?(b.children[0].innerHTML=a.title,!0):(b.children[0].innerHTML="",!1)},closeEl:!0,captionEl:!0,fullscreenEl:!0,zoomEl:!0,shareEl:!0,counterEl:!0,arrowEl:!0,preloaderEl:!0,tapToClose:!1,tapToToggleControls:!0,clickToCloseNonZoomable:!0,shareButtons:[{id:"facebook",label:"Share on Facebook",url:"https://www.facebook.com/sharer/sharer.php?u={{url}}"},{id:"twitter",label:"Tweet",url:"https://twitter.com/intent/tweet?text={{text}}&url={{url}}"},{id:"pinterest",label:"Pin it",url:"http://www.pinterest.com/pin/create/button/?url={{url}}&media={{image_url}}&description={{text}}"},{id:"download",label:"Download image",url:"{{raw_image_url}}",download:!0}],getImageURLForShare:function(){return a.currItem.src||""},getPageURLForShare:function(){return window.location.href},getTextForShare:function(){return a.currItem.title||""},indexIndicatorSep:" / ",fitControlsWidth:1200},A=function(a){if(r)return!0;a=a||window.event,q.timeToIdle&&q.mouseUsed&&!k&&K();for(var c,d,e=a.target||a.srcElement,f=e.getAttribute("class")||"",g=0;g-1&&(c.onTap(),d=!0);if(d){a.stopPropagation&&a.stopPropagation(),r=!0;var h=b.features.isOldAndroid?600:30;s=setTimeout(function(){r=!1},h)}},B=function(){return!a.likelyTouchDevice||q.mouseUsed||screen.width>q.fitControlsWidth},C=function(a,c,d){b[(d?"add":"remove")+"Class"](a,"pswp__"+c)},D=function(){var a=1===q.getNumItemsFn();a!==p&&(C(d,"ui--one-slide",a),p=a)},E=function(){C(i,"share-modal--hidden",y)},F=function(){return y=!y,y?(b.removeClass(i,"pswp__share-modal--fade-in"),setTimeout(function(){y&&E()},300)):(E(),setTimeout(function(){y||b.addClass(i,"pswp__share-modal--fade-in")},30)),y||H(),!1},G=function(b){b=b||window.event;var c=b.target||b.srcElement;return a.shout("shareLinkClick",b,c),!!c.href&&(!!c.hasAttribute("download")||(window.open(c.href,"pswp_share","scrollbars=yes,resizable=yes,toolbar=no,location=yes,width=550,height=420,top=100,left="+(window.screen?Math.round(screen.width/2-275):100)),y||F(),!1))},H=function(){for(var a,b,c,d,e,f="",g=0;g"+a.label+"",q.parseShareButtonOut&&(f=q.parseShareButtonOut(a,f));i.children[0].innerHTML=f,i.children[0].onclick=G},I=function(a){for(var c=0;c=.95&&v.showControls()});var a;l("onPinchClose",function(b){x&&b<.9?(v.hideControls(),a=!0):a&&!x&&b>.9&&v.showControls()}),l("zoomGestureEnded",function(){a=!1,a&&!x&&v.showControls()})},S=[{name:"caption",option:"captionEl",onInit:function(a){e=a}},{name:"share-modal",option:"shareEl",onInit:function(a){i=a},onTap:function(){F()}},{name:"button--share",option:"shareEl",onInit:function(a){h=a},onTap:function(){F()}},{name:"button--zoom",option:"zoomEl",onTap:a.toggleDesktopZoom},{name:"counter",option:"counterEl",onInit:function(a){g=a}},{name:"button--close",option:"closeEl",onTap:a.close},{name:"button--arrow--left",option:"arrowEl",onTap:a.prev},{name:"button--arrow--right",option:"arrowEl",onTap:a.next},{name:"button--fs",option:"fullscreenEl",onTap:function(){c.isFullscreen()?c.exit():c.enter()}},{name:"preloader",option:"preloaderEl",onInit:function(a){m=a}}],T=function(){var a,c,e,f=function(d){if(d)for(var f=d.length,g=0;g-1&&(q[e.option]?(b.removeClass(a,"pswp__element--disabled"),e.onInit&&e.onInit(a)):b.addClass(a,"pswp__element--disabled"))}};f(d.children);var g=b.getChildByClass(d,"pswp__top-bar");g&&f(g.children)};v.init=function(){b.extend(a.options,z,!0),q=a.options,d=b.getChildByClass(a.scrollWrap,"pswp__ui"),l=a.listen,R(),l("beforeChange",v.update),l("doubleTap",function(b){var c=a.currItem.initialZoomLevel;a.getZoomLevel()!==c?a.zoomTo(c,b,333):a.zoomTo(q.getDoubleTapZoom(!1,a.currItem),b,333)}),l("preventDragEvent",function(a,b,c){var d=a.target||a.srcElement;d&&d.getAttribute("class")&&a.type.indexOf("mouse")>-1&&(d.getAttribute("class").indexOf("__caption")>0||/(SMALL|STRONG|EM)/i.test(d.tagName))&&(c.prevent=!1)}),l("bindEvents",function(){b.bind(d,"pswpTap click",A),b.bind(a.scrollWrap,"pswpTap",v.onGlobalTap),a.likelyTouchDevice||b.bind(a.scrollWrap,"mouseover",v.onMouseOver)}),l("unbindEvents",function(){y||F(),t&&clearInterval(t),b.unbind(document,"mouseout",L),b.unbind(document,"mousemove",K),b.unbind(d,"pswpTap click",A),b.unbind(a.scrollWrap,"pswpTap",v.onGlobalTap),b.unbind(a.scrollWrap,"mouseover",v.onMouseOver),c&&(b.unbind(document,c.eventK,v.updateFullscreen),c.isFullscreen()&&(q.hideAnimationDuration=0,c.exit()),c=null)}),l("destroy",function(){q.captionEl&&(f&&d.removeChild(f),b.removeClass(e,"pswp__caption--empty")),i&&(i.children[0].onclick=null),b.removeClass(d,"pswp__ui--over-close"),b.addClass(d,"pswp__ui--hidden"),v.setIdle(!1)}),q.showAnimationDuration||b.removeClass(d,"pswp__ui--hidden"),l("initialZoomIn",function(){q.showAnimationDuration&&b.removeClass(d,"pswp__ui--hidden")}),l("initialZoomOut",function(){b.addClass(d,"pswp__ui--hidden")}),l("parseVerticalMargin",P),T(),q.shareEl&&h&&i&&(y=!0),D(),Q(),M(),N()},v.setIdle=function(a){k=a,C(d,"ui--idle",a)},v.update=function(){x&&a.currItem?(v.updateIndexIndicator(),q.captionEl&&(q.addCaptionHTMLFn(a.currItem,e),C(e,"caption--empty",!a.currItem.title)),w=!0):w=!1,y||F(),D()},v.updateFullscreen=function(d){d&&setTimeout(function(){a.setScrollOffset(0,b.getScrollY())},50),b[(c.isFullscreen()?"add":"remove")+"Class"](a.template,"pswp--fs")},v.updateIndexIndicator=function(){q.counterEl&&(g.innerHTML=a.getCurrentIndex()+1+q.indexIndicatorSep+q.getNumItemsFn())},v.onGlobalTap=function(c){c=c||window.event;var d=c.target||c.srcElement;if(!r)if(c.detail&&"mouse"===c.detail.pointerType){if(I(d))return void a.close();b.hasClass(d,"pswp__img")&&(1===a.getZoomLevel()&&a.getZoomLevel()<=a.currItem.fitRatio?q.clickToCloseNonZoomable&&a.close():a.toggleDesktopZoom(c.detail.releasePoint))}else if(q.tapToToggleControls&&(x?v.hideControls():v.showControls()),q.tapToClose&&(b.hasClass(d,"pswp__img")||I(d)))return void a.close()},v.onMouseOver=function(a){a=a||window.event;var b=a.target||a.srcElement;C(d,"ui--over-close",I(b))},v.hideControls=function(){b.addClass(d,"pswp__ui--hidden"),x=!1},v.showControls=function(){x=!0,w||v.update(),b.removeClass(d,"pswp__ui--hidden")},v.supportsFullscreen=function(){var a=document;return!!(a.exitFullscreen||a.mozCancelFullScreen||a.webkitExitFullscreen||a.msExitFullscreen)},v.getFullscreenAPI=function(){var b,c=document.documentElement,d="fullscreenchange";return c.requestFullscreen?b={enterK:"requestFullscreen",exitK:"exitFullscreen",elementK:"fullscreenElement",eventK:d}:c.mozRequestFullScreen?b={enterK:"mozRequestFullScreen",exitK:"mozCancelFullScreen",elementK:"mozFullScreenElement",eventK:"moz"+d}:c.webkitRequestFullscreen?b={enterK:"webkitRequestFullscreen",exitK:"webkitExitFullscreen",elementK:"webkitFullscreenElement",eventK:"webkit"+d}:c.msRequestFullscreen&&(b={enterK:"msRequestFullscreen",exitK:"msExitFullscreen",elementK:"msFullscreenElement",eventK:"MSFullscreenChange"}),b&&(b.enter=function(){return j=q.closeOnScroll,q.closeOnScroll=!1,"webkitRequestFullscreen"!==this.enterK?a.template[this.enterK]():void a.template[this.enterK](Element.ALLOW_KEYBOARD_INPUT)},b.exit=function(){return q.closeOnScroll=j,document[this.exitK]()},b.isFullscreen=function(){return document[this.elementK]}),b}};return a});
\ No newline at end of file
+!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.PhotoSwipeUI_Default=t()}(this,function(){"use strict";return function(l,s){function e(e){if(K)return!0;e=e||window.event,O.timeToIdle&&O.mouseUsed&&!I&&Z();for(var t,n,o,l=(e.target||e.srcElement).getAttribute("class")||"",i=0;iO.fitControlsWidth?(O.captionEl&&"auto"===o.bottom?(h||((h=s.createEl("pswp__caption pswp__caption--fake")).appendChild(s.createEl("pswp__caption__center")),m.insertBefore(h,f),s.addClass(m,"pswp__ui--fit")),O.addCaptionHTMLFn(e,h,!0)?(t=h.clientHeight,n.bottom=parseInt(t,10)||44):n.bottom=o.top):n.bottom="auto"===o.bottom?0:o.bottom,n.top=o.top):n.top=n.bottom=0}function d(){function e(e){if(e)for(var t=e.length,n=0;n"+e.label+"",O.parseShareButtonOut&&(l=O.parseShareButtonOut(e,l));C.children[0].innerHTML=l,C.children[0].onclick=r},U=0,Z=function(){clearTimeout(A),U=0,I&&R.setIdle(!1)},P=function(e){x!==e&&(n(F,"preloader--active",!e),x=e)},q=[{name:"caption",option:"captionEl",onInit:function(e){f=e}},{name:"share-modal",option:"shareEl",onInit:function(e){C=e},onTap:function(){i()}},{name:"button--share",option:"shareEl",onInit:function(e){v=e},onTap:function(){i()}},{name:"button--download",option:"downloadEl",onInit:function(e){_=e},onTap:function(){var e=document.createElement("A");e.setAttribute("href",l.currItem.downloadURL||l.currItem.src||""),e.setAttribute("target","_blank"),e.setAttribute("download",""),_.appendChild(e),e.click(),_.removeChild(e)}},{name:"button--zoom",option:"zoomEl",onTap:l.toggleDesktopZoom},{name:"counter",option:"counterEl",onInit:function(e){w=e}},{name:"button--close",option:"closeEl",onTap:function(){setTimeout(l.close)}},{name:"button--arrow--left",option:"arrowEl",onInit:function(e){b=e},onTap:l.prev},{name:"button--arrow--right",option:"arrowEl",onInit:function(e){g=e},onTap:l.next},{name:"button--fs",option:"fullscreenEl",onTap:function(){p.isFullscreen()?p.exit():p.enter()}},{name:"preloader",option:"preloaderEl",onInit:function(e){F=e}}];R.init=function(){var t;s.extend(l.options,M,!0),O=l.options,m=s.getChildByClass(l.scrollWrap,"pswp__ui"),(E=l.listen)("onVerticalDrag",function(e){z&&e<.95?R.hideControls():!z&&.95<=e&&R.showControls()}),E("onPinchClose",function(e){z&&e<.9?(R.hideControls(),t=!0):t&&!z&&.9 0) {
+ var v = navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/);
+ if (v && v.length > 0) {
v = parseInt(v[1], 10);
- if(v >= 1 && v < 8 ) {
+ if (v >= 1 && v < 8) {
features.isOldIOSPhone = true;
}
}
@@ -186,67 +199,67 @@ var framework = {
// Detect old Android (before KitKat)
// due to bugs related to position:fixed
// http://stackoverflow.com/questions/7184573/pick-up-the-android-version-in-the-browser-by-javascript
-
+
var match = ua.match(/Android\s([0-9\.]*)/);
- var androidversion = match ? match[1] : 0;
+ var androidversion = match ? match[1] : 0;
androidversion = parseFloat(androidversion);
- if(androidversion >= 1 ) {
- if(androidversion < 4.4) {
+ if (androidversion >= 1) {
+ if (androidversion < 4.4) {
features.isOldAndroid = true; // for fixed position bug & performance
}
features.androidVersion = androidversion; // for touchend bug
- }
+ }
features.isMobileOpera = /opera mini|opera mobi/i.test(ua);
// p.s. yes, yes, UA sniffing is bad, propose your solution for above bugs.
}
-
+
var styleChecks = ['transform', 'perspective', 'animationName'],
- vendors = ['', 'webkit','Moz','ms','O'],
+ vendors = ['', 'webkit', 'Moz', 'ms', 'O'],
styleCheckItem,
styleName;
- for(var i = 0; i < 4; i++) {
+ for (var i = 0; i < 4; i++) {
vendor = vendors[i];
- for(var a = 0; a < 3; a++) {
+ for (var a = 0; a < 3; a++) {
styleCheckItem = styleChecks[a];
// uppercase first letter of property name, if vendor is present
- styleName = vendor + (vendor ?
- styleCheckItem.charAt(0).toUpperCase() + styleCheckItem.slice(1) :
- styleCheckItem);
-
- if(!features[styleCheckItem] && styleName in helperStyle ) {
+ styleName = vendor + (vendor ? styleCheckItem.charAt(0).toUpperCase() + styleCheckItem.slice(1) : styleCheckItem);
+
+ if (!features[styleCheckItem] && styleName in helperStyle) {
features[styleCheckItem] = styleName;
}
}
- if(vendor && !features.raf) {
+ if (vendor && !features.raf) {
vendor = vendor.toLowerCase();
- features.raf = window[vendor+'RequestAnimationFrame'];
- if(features.raf) {
- features.caf = window[vendor+'CancelAnimationFrame'] ||
- window[vendor+'CancelRequestAnimationFrame'];
+ features.raf = window[vendor + 'RequestAnimationFrame'];
+ if (features.raf) {
+ features.caf = window[vendor + 'CancelAnimationFrame'] || window[vendor + 'CancelRequestAnimationFrame'];
}
}
}
-
- if(!features.raf) {
+
+ if (!features.raf) {
var lastTime = 0;
- features.raf = function(fn) {
+ features.raf = function (fn) {
var currTime = new Date().getTime();
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
- var id = window.setTimeout(function() { fn(currTime + timeToCall); }, timeToCall);
+ var id = window.setTimeout(function () {
+ fn(currTime + timeToCall);
+ }, timeToCall);
lastTime = currTime + timeToCall;
return id;
};
- features.caf = function(id) { clearTimeout(id); };
+ features.caf = function (id) {
+ clearTimeout(id);
+ };
}
// Detect SVG support
- features.svg = !!document.createElementNS &&
- !!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect;
+ features.svg = !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect;
framework.features = features;
@@ -257,42 +270,38 @@ var framework = {
framework.detectFeatures();
// Override addEventListener for old versions of IE
-if(framework.features.oldIE) {
-
- framework.bind = function(target, type, listener, unbind) {
-
+if (framework.features.oldIE) {
+ framework.bind = function (target, type, listener, unbind) {
type = type.split(' ');
var methodName = (unbind ? 'detach' : 'attach') + 'Event',
evName,
- _handleEv = function() {
+ _handleEv = function () {
listener.handleEvent.call(listener);
};
- for(var i = 0; i < type.length; i++) {
+ for (var i = 0; i < type.length; i++) {
evName = type[i];
- if(evName) {
-
- if(typeof listener === 'object' && listener.handleEvent) {
- if(!unbind) {
+ if (evName) {
+ if (typeof listener === 'object' && listener.handleEvent) {
+ if (!unbind) {
listener['oldIE' + evName] = _handleEv;
} else {
- if(!listener['oldIE' + evName]) {
+ if (!listener['oldIE' + evName]) {
return false;
}
}
- target[methodName]( 'on' + evName, listener['oldIE' + evName]);
+ target[methodName]('on' + evName, listener['oldIE' + evName]);
} else {
- target[methodName]( 'on' + evName, listener);
+ target[methodName]('on' + evName, listener);
}
-
}
}
};
-
}
+
/*>>framework-bridge*/
/*>>core*/
@@ -303,14 +312,15 @@ var self = this;
/**
* Static vars, don't change unless you know what you're doing.
*/
-var DOUBLE_TAP_RADIUS = 25,
+var DOUBLE_TAP_RADIUS = 25,
NUM_HOLDERS = 3;
/**
* Options
*/
var _options = {
- allowPanToNext:true,
+ allowPanToNext: true,
+ preventSwiping: false,
spacing: 0.12,
bgOpacity: 1,
mouseUsed: false,
@@ -327,17 +337,18 @@ var _options = {
arrowKeys: true,
mainScrollEndFriction: 0.35,
panEndFriction: 0.35,
- isClickableElement: function(el) {
- return el.tagName === 'A';
- },
- getDoubleTapZoom: function(isMouseClick, item) {
- if(isMouseClick) {
- return 1;
- } else {
- return item.initialZoomLevel < 0.7 ? 1 : 1.33;
- }
- },
- maxSpreadZoom: 1.33,
+ animateTransitions: false,
+ isClickableElement: function (el) {
+ return el.tagName === 'A';
+ },
+ getDoubleTapZoom: function (isMouseClick, item) {
+ if (isMouseClick) {
+ return 1;
+ } else {
+ return item.initialZoomLevel < 0.7 ? 1 : 1.33;
+ }
+ },
+ maxSpreadZoom: 1.33,
modal: true,
// not fully implemented yet
@@ -345,14 +356,13 @@ var _options = {
};
framework.extend(_options, options);
-
/**
* Private helper variables & functions
*/
-var _getEmptyPoint = function() {
- return {x:0,y:0};
- };
+var _getEmptyPoint = function () {
+ return {x: 0, y: 0};
+};
var _isOpen,
_isDestroying,
@@ -398,151 +408,132 @@ var _isOpen,
_windowVisibleSize = {},
_renderMaxResolution = false,
_orientationChangeTimeout,
-
-
// Registers PhotoSWipe module (History, Controller ...)
- _registerModule = function(name, module) {
+ _registerModule = function (name, module) {
framework.extend(self, module.publicMethods);
_modules.push(name);
},
-
- _getLoopedId = function(index) {
+ _getLoopedId = function (index) {
var numSlides = _getNumItems();
- if(index > numSlides - 1) {
+ if (index > numSlides - 1) {
return index - numSlides;
- } else if(index < 0) {
+ } else if (index < 0) {
return numSlides + index;
}
return index;
},
-
// Micro bind/trigger
_listeners = {},
- _listen = function(name, fn) {
- if(!_listeners[name]) {
+ _listen = function (name, fn) {
+ if (!_listeners[name]) {
_listeners[name] = [];
}
return _listeners[name].push(fn);
},
- _shout = function(name) {
+ _shout = function (name) {
var listeners = _listeners[name];
- if(listeners) {
+ if (listeners) {
var args = Array.prototype.slice.call(arguments);
args.shift();
- for(var i = 0; i < listeners.length; i++) {
+ for (var i = 0; i < listeners.length; i++) {
listeners[i].apply(self, args);
}
}
},
-
- _getCurrentTime = function() {
+ _getCurrentTime = function () {
return new Date().getTime();
},
- _applyBgOpacity = function(opacity) {
+ _applyBgOpacity = function (opacity) {
_bgOpacity = opacity;
self.bg.style.opacity = opacity * _options.bgOpacity;
},
-
- _applyZoomTransform = function(styleObj,x,y,zoom,item) {
- if(!_renderMaxResolution || (item && item !== self.currItem) ) {
- zoom = zoom / (item ? item.fitRatio : self.currItem.fitRatio);
+ _applyZoomTransform = function (styleObj, x, y, zoom, item) {
+ if (!_renderMaxResolution || (item && item !== self.currItem)) {
+ zoom = zoom / (item ? item.fitRatio : self.currItem.fitRatio);
}
-
+
styleObj[_transformKey] = _translatePrefix + x + 'px, ' + y + 'px' + _translateSufix + ' scale(' + zoom + ')';
},
- _applyCurrentZoomPan = function( allowRenderResolution ) {
- if(_currZoomElementStyle) {
-
- if(allowRenderResolution) {
- if(_currZoomLevel > self.currItem.fitRatio) {
- if(!_renderMaxResolution) {
+ _applyCurrentZoomPan = function (allowRenderResolution) {
+ if (_currZoomElementStyle && !self.currItem.loadError) {
+ if (allowRenderResolution) {
+ if (_currZoomLevel > self.currItem.fitRatio) {
+ if (!_renderMaxResolution) {
_setImageSize(self.currItem, false, true);
_renderMaxResolution = true;
}
} else {
- if(_renderMaxResolution) {
+ if (_renderMaxResolution) {
_setImageSize(self.currItem);
_renderMaxResolution = false;
}
}
}
-
_applyZoomTransform(_currZoomElementStyle, _panOffset.x, _panOffset.y, _currZoomLevel);
}
},
- _applyZoomPanToItem = function(item) {
- if(item.container) {
-
- _applyZoomTransform(item.container.style,
- item.initialPosition.x,
- item.initialPosition.y,
- item.initialZoomLevel,
- item);
+ _applyZoomPanToItem = function (item) {
+ if (item.container) {
+ _applyZoomTransform(item.container.style, item.initialPosition.x, item.initialPosition.y, item.initialZoomLevel, item);
}
},
- _setTranslateX = function(x, elStyle) {
+ _setTranslateX = function (x, elStyle) {
elStyle[_transformKey] = _translatePrefix + x + 'px, 0px' + _translateSufix;
},
- _moveMainScroll = function(x, dragging) {
-
- if(!_options.loop && dragging) {
+ _moveMainScroll = function (x, dragging) {
+ if (!_options.loop && dragging) {
var newSlideIndexOffset = _currentItemIndex + (_slideSize.x * _currPositionIndex - x) / _slideSize.x,
delta = Math.round(x - _mainScrollPos.x);
- if( (newSlideIndexOffset < 0 && delta > 0) ||
- (newSlideIndexOffset >= _getNumItems() - 1 && delta < 0) ) {
+ if ((newSlideIndexOffset < 0 && delta > 0) || (newSlideIndexOffset >= _getNumItems() - 1 && delta < 0)) {
x = _mainScrollPos.x + delta * _options.mainScrollEndFriction;
- }
+ }
}
-
+
_mainScrollPos.x = x;
_setTranslateX(x, _containerStyle);
},
- _calculatePanOffset = function(axis, zoomLevel) {
+ _calculatePanOffset = function (axis, zoomLevel) {
var m = _midZoomPoint[axis] - _offset[axis];
- return _startPanOffset[axis] + _currPanDist[axis] + m - m * ( zoomLevel / _startZoomLevel );
+ return _startPanOffset[axis] + _currPanDist[axis] + m - m * (zoomLevel / _startZoomLevel);
},
-
- _equalizePoints = function(p1, p2) {
+ _equalizePoints = function (p1, p2) {
p1.x = p2.x;
p1.y = p2.y;
- if(p2.id) {
+ if (p2.id) {
p1.id = p2.id;
}
},
- _roundPoint = function(p) {
+ _roundPoint = function (p) {
p.x = Math.round(p.x);
p.y = Math.round(p.y);
},
-
_mouseMoveTimeout = null,
- _onFirstMouseMove = function() {
+ _onFirstMouseMove = function () {
// Wait until mouse move event is fired at least twice during 100ms
// We do this, because some mobile browsers trigger it on touchstart
- if(_mouseMoveTimeout ) {
+ if (_mouseMoveTimeout) {
framework.unbind(document, 'mousemove', _onFirstMouseMove);
framework.addClass(template, 'pswp--has_mouse');
_options.mouseUsed = true;
_shout('mouseUsed');
}
- _mouseMoveTimeout = setTimeout(function() {
+ _mouseMoveTimeout = setTimeout(function () {
_mouseMoveTimeout = null;
}, 100);
},
-
- _bindEvents = function() {
+ _bindEvents = function () {
framework.bind(document, 'keydown', self);
- if(_features.transform) {
+ if (_features.transform) {
// don't bind click event in browsers that don't support transform (mostly IE8)
framework.bind(self.scrollWrap, 'click', self);
}
-
- if(!_options.mouseUsed) {
+ if (!_options.mouseUsed) {
framework.bind(document, 'mousemove', _onFirstMouseMove);
}
@@ -550,18 +541,19 @@ var _isOpen,
_shout('bindEvents');
},
-
- _unbindEvents = function() {
- framework.unbind(window, 'resize scroll orientationchange', self);
+ _unbindEvents = function () {
+ setTimeout(function () {
+ framework.unbind(window, 'resize scroll orientationchange', self);
+ }, 400);
framework.unbind(window, 'scroll', _globalEventHandlers.scroll);
framework.unbind(document, 'keydown', self);
framework.unbind(document, 'mousemove', _onFirstMouseMove);
- if(_features.transform) {
+ if (_features.transform) {
framework.unbind(self.scrollWrap, 'click', self);
}
- if(_isDragging) {
+ if (_isDragging) {
framework.unbind(window, _upMoveEvents, self);
}
@@ -569,68 +561,62 @@ var _isOpen,
_shout('unbindEvents');
},
-
- _calculatePanBounds = function(zoomLevel, update) {
- var bounds = _calculateItemSize( self.currItem, _viewportSize, zoomLevel );
- if(update) {
+ _calculatePanBounds = function (zoomLevel, update) {
+ var bounds = _calculateItemSize(self.currItem, _viewportSize, zoomLevel);
+ if (update) {
_currPanBounds = bounds;
}
return bounds;
},
-
- _getMinZoomLevel = function(item) {
- if(!item) {
+ _getMinZoomLevel = function (item) {
+ if (!item) {
item = self.currItem;
}
return item.initialZoomLevel;
},
- _getMaxZoomLevel = function(item) {
- if(!item) {
+ _getMaxZoomLevel = function (item) {
+ if (!item) {
item = self.currItem;
}
return item.w > 0 ? _options.maxSpreadZoom : 1;
},
-
// Return true if offset is out of the bounds
- _modifyDestPanOffset = function(axis, destPanBounds, destPanOffset, destZoomLevel) {
- if(destZoomLevel === self.currItem.initialZoomLevel) {
+ _modifyDestPanOffset = function (axis, destPanBounds, destPanOffset, destZoomLevel) {
+ if (destZoomLevel === self.currItem.initialZoomLevel) {
destPanOffset[axis] = self.currItem.initialPosition[axis];
return true;
} else {
- destPanOffset[axis] = _calculatePanOffset(axis, destZoomLevel);
+ destPanOffset[axis] = _calculatePanOffset(axis, destZoomLevel);
- if(destPanOffset[axis] > destPanBounds.min[axis]) {
+ if (destPanOffset[axis] > destPanBounds.min[axis]) {
destPanOffset[axis] = destPanBounds.min[axis];
return true;
- } else if(destPanOffset[axis] < destPanBounds.max[axis] ) {
+ } else if (destPanOffset[axis] < destPanBounds.max[axis]) {
destPanOffset[axis] = destPanBounds.max[axis];
return true;
}
}
return false;
},
-
- _setupTransforms = function() {
-
- if(_transformKey) {
+ _setupTransforms = function () {
+ if (_transformKey) {
// setup 3d transforms
var allow3dTransform = _features.perspective && !_likelyTouchDevice;
_translatePrefix = 'translate' + (allow3dTransform ? '3d(' : '(');
- _translateSufix = _features.perspective ? ', 0px)' : ')';
+ _translateSufix = _features.perspective ? ', 0px)' : ')';
return;
}
// Override zoom/pan/move functions in case old browser is used (most likely IE)
// (so they use left/top/width/height, instead of CSS transform)
-
+
_transformKey = 'left';
framework.addClass(template, 'pswp--ie');
- _setTranslateX = function(x, elStyle) {
+ _setTranslateX = function (x, elStyle) {
elStyle.left = x + 'px';
};
- _applyZoomPanToItem = function(item) {
-
+ _applyZoomPanToItem = function (item) {
var zoomRatio = item.fitRatio > 1 ? 1 : item.fitRatio,
s = item.container.style,
w = zoomRatio * item.w,
@@ -640,11 +626,9 @@ var _isOpen,
s.height = h + 'px';
s.left = item.initialPosition.x + 'px';
s.top = item.initialPosition.y + 'px';
-
};
- _applyCurrentZoomPan = function() {
- if(_currZoomElementStyle) {
-
+ _applyCurrentZoomPan = function () {
+ if (_currZoomElementStyle) {
var s = _currZoomElementStyle,
item = self.currItem,
zoomRatio = item.fitRatio > 1 ? 1 : item.fitRatio,
@@ -654,159 +638,142 @@ var _isOpen,
s.width = w + 'px';
s.height = h + 'px';
-
s.left = _panOffset.x + 'px';
s.top = _panOffset.y + 'px';
}
-
};
},
-
- _onKeyDown = function(e) {
+ _onKeyDown = function (e) {
var keydownAction = '';
- if(_options.escKey && e.keyCode === 27) {
+ if (_options.escKey && e.keyCode === 27) {
keydownAction = 'close';
- } else if(_options.arrowKeys) {
- if(e.keyCode === 37) {
+ } else if (_options.arrowKeys) {
+ if (e.keyCode === 37) {
keydownAction = 'prev';
- } else if(e.keyCode === 39) {
+ } else if (e.keyCode === 39) {
keydownAction = 'next';
}
}
- if(keydownAction) {
+ if (keydownAction) {
// don't do anything if special key pressed to prevent from overriding default browser actions
// e.g. in Chrome on Mac cmd+arrow-left returns to previous page
- if( !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey ) {
- if(e.preventDefault) {
+ if (!e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) {
+ if (e.preventDefault) {
e.preventDefault();
} else {
e.returnValue = false;
- }
+ }
self[keydownAction]();
}
}
},
-
- _onGlobalClick = function(e) {
- if(!e) {
+ _onGlobalClick = function (e) {
+ if (!e) {
return;
}
// don't allow click event to pass through when triggering after drag or some other gesture
- if(_moved || _zoomStarted || _mainScrollAnimating || _verticalDragInitiated) {
+ if (_moved || _zoomStarted || _mainScrollAnimating || _verticalDragInitiated) {
e.preventDefault();
e.stopPropagation();
}
},
-
- _updatePageScrollOffset = function() {
- self.setScrollOffset(0, framework.getScrollY());
+ _updatePageScrollOffset = function () {
+ self.setScrollOffset(0, framework.getScrollY());
};
-
-
-
-
-
-
// Micro animation engine
var _animations = {},
_numAnimations = 0,
- _stopAnimation = function(name) {
- if(_animations[name]) {
- if(_animations[name].raf) {
- _cancelAF( _animations[name].raf );
+ _stopAnimation = function (name) {
+ if (_animations[name]) {
+ if (_animations[name].raf) {
+ _cancelAF(_animations[name].raf);
}
_numAnimations--;
delete _animations[name];
}
},
- _registerStartAnimation = function(name) {
- if(_animations[name]) {
+ _registerStartAnimation = function (name) {
+ if (_animations[name]) {
_stopAnimation(name);
}
- if(!_animations[name]) {
+ if (!_animations[name]) {
_numAnimations++;
_animations[name] = {};
}
},
- _stopAllAnimations = function() {
+ _stopAllAnimations = function () {
for (var prop in _animations) {
-
- if( _animations.hasOwnProperty( prop ) ) {
+ if (_animations.hasOwnProperty(prop)) {
_stopAnimation(prop);
- }
-
+ }
}
},
- _animateProp = function(name, b, endProp, d, easingFn, onUpdate, onComplete) {
- var startAnimTime = _getCurrentTime(), t;
+ _animateProp = function (name, b, endProp, d, easingFn, onUpdate, onComplete) {
+ var startAnimTime = _getCurrentTime(),
+ t;
_registerStartAnimation(name);
- var animloop = function(){
- if ( _animations[name] ) {
-
+ var animloop = function () {
+ if (_animations[name]) {
t = _getCurrentTime() - startAnimTime; // time diff
//b - beginning (start prop)
//d - anim duration
- if ( t >= d ) {
+ if (t >= d) {
_stopAnimation(name);
onUpdate(endProp);
- if(onComplete) {
+ if (onComplete) {
onComplete();
}
return;
}
- onUpdate( (endProp - b) * easingFn(t/d) + b );
+ onUpdate((endProp - b) * easingFn(t / d) + b);
_animations[name].raf = _requestAF(animloop);
}
};
animloop();
};
-
-
var publicMethods = {
-
// make a few local variables and functions public
shout: _shout,
listen: _listen,
viewportSize: _viewportSize,
options: _options,
- isMainScrollAnimating: function() {
+ isMainScrollAnimating: function () {
return _mainScrollAnimating;
},
- getZoomLevel: function() {
+ getZoomLevel: function () {
return _currZoomLevel;
},
- getCurrentIndex: function() {
+ getCurrentIndex: function () {
return _currentItemIndex;
},
- isDragging: function() {
+ isDragging: function () {
return _isDragging;
- },
- isZooming: function() {
+ },
+ isZooming: function () {
return _isZooming;
},
- setScrollOffset: function(x,y) {
+ setScrollOffset: function (x, y) {
_offset.x = x;
_currentWindowScrollY = _offset.y = y;
_shout('updateScrollOffset', _offset);
},
- applyZoomPan: function(zoomLevel,panX,panY,allowRenderResolution) {
+ applyZoomPan: function (zoomLevel, panX, panY, allowRenderResolution) {
_panOffset.x = panX;
_panOffset.y = panY;
_currZoomLevel = zoomLevel;
- _applyCurrentZoomPan( allowRenderResolution );
+ _applyCurrentZoomPan(allowRenderResolution);
},
- init: function() {
-
- if(_isOpen || _isDestroying) {
+ init: function () {
+ if (_isOpen || _isDestroying) {
return;
}
@@ -818,13 +785,13 @@ var publicMethods = {
_initalClassName = template.className;
_isOpen = true;
-
+
_features = framework.detectFeatures();
_requestAF = _features.raf;
_cancelAF = _features.caf;
_transformKey = _features.transform;
_oldIE = _features.oldIE;
-
+
self.scrollWrap = framework.getChildByClass(template, 'pswp__scroll-wrap');
self.container = framework.getChildByClass(self.scrollWrap, 'pswp__container');
@@ -832,9 +799,9 @@ var publicMethods = {
// Objects that hold slides (there are only 3 in DOM)
self.itemHolders = _itemHolders = [
- {el:self.container.children[0] , wrap:0, index: -1},
- {el:self.container.children[1] , wrap:0, index: -1},
- {el:self.container.children[2] , wrap:0, index: -1}
+ {el: self.container.children[0], wrap: 0, index: -1},
+ {el: self.container.children[1], wrap: 0, index: -1},
+ {el: self.container.children[2], wrap: 0, index: -1}
];
// hide nearby item holders until initial zoom animation finishes (to avoid extra Paints)
@@ -849,10 +816,10 @@ var publicMethods = {
// Fixes: iOS 10.3 resize event
// does not update scrollWrap.clientWidth instantly after resize
// https://github.com/dimsemenov/PhotoSwipe/issues/1315
- orientationchange: function() {
+ orientationchange: function () {
clearTimeout(_orientationChangeTimeout);
- _orientationChangeTimeout = setTimeout(function() {
- if(_viewportSize.x !== self.scrollWrap.clientWidth) {
+ _orientationChangeTimeout = setTimeout(function () {
+ if (_viewportSize.x !== self.scrollWrap.clientWidth) {
self.updateSize();
}
}, 500);
@@ -862,40 +829,39 @@ var publicMethods = {
click: _onGlobalClick
};
- // disable show/hide effects on old browsers that don't support CSS animations or transforms,
+ // disable show/hide effects on old browsers that don't support CSS animations or transforms,
// old IOS, Android and Opera mobile. Blackberry seems to work fine, even older models.
var oldPhone = _features.isOldIOSPhone || _features.isOldAndroid || _features.isMobileOpera;
- if(!_features.animationName || !_features.transform || oldPhone) {
+ if (!_features.animationName || !_features.transform || oldPhone) {
_options.showAnimationDuration = _options.hideAnimationDuration = 0;
}
// init modules
- for(i = 0; i < _modules.length; i++) {
+ for (i = 0; i < _modules.length; i++) {
self['init' + _modules[i]]();
}
-
+
// init
- if(UiClass) {
- var ui = self.ui = new UiClass(self, framework);
+ if (UiClass) {
+ var ui = (self.ui = new UiClass(self, framework));
ui.init();
}
_shout('firstUpdate');
_currentItemIndex = _currentItemIndex || _options.index || 0;
// validate index
- if( isNaN(_currentItemIndex) || _currentItemIndex < 0 || _currentItemIndex >= _getNumItems() ) {
+ if (isNaN(_currentItemIndex) || _currentItemIndex < 0 || _currentItemIndex >= _getNumItems()) {
_currentItemIndex = 0;
}
- self.currItem = _getItemAt( _currentItemIndex );
+ self.currItem = _getItemAt(_currentItemIndex);
-
- if(_features.isOldIOSPhone || _features.isOldAndroid) {
+ if (_features.isOldIOSPhone || _features.isOldAndroid) {
_isFixedPosition = false;
}
-
+
template.setAttribute('aria-hidden', 'false');
- if(_options.modal) {
- if(!_isFixedPosition) {
+ if (_options.modal) {
+ if (!_isFixedPosition) {
template.style.position = 'absolute';
template.style.top = framework.getScrollY() + 'px';
} else {
@@ -903,20 +869,21 @@ var publicMethods = {
}
}
- if(_currentWindowScrollY === undefined) {
+ if (_currentWindowScrollY === undefined) {
_shout('initialLayout');
_currentWindowScrollY = _initalWindowScrollY = framework.getScrollY();
}
-
+
// add classes to root element of PhotoSwipe
var rootClasses = 'pswp--open ';
- if(_options.mainClass) {
+ if (_options.mainClass) {
rootClasses += _options.mainClass + ' ';
}
- if(_options.showHideOpacity) {
+ if (_options.showHideOpacity) {
rootClasses += 'pswp--animate_opacity ';
}
rootClasses += _likelyTouchDevice ? 'pswp--touch' : 'pswp--notouch';
+ rootClasses += _options.preventSwiping ? ' pswp--preventswipe' : '';
rootClasses += _features.animationName ? ' pswp--css_animation' : '';
rootClasses += _features.svg ? ' pswp--svg' : '';
framework.addClass(template, rootClasses);
@@ -926,51 +893,49 @@ var publicMethods = {
// initial update
_containerShiftIndex = -1;
_indexDiff = null;
- for(i = 0; i < NUM_HOLDERS; i++) {
- _setTranslateX( (i+_containerShiftIndex) * _slideSize.x, _itemHolders[i].el.style);
+ for (i = 0; i < NUM_HOLDERS; i++) {
+ _setTranslateX((i + _containerShiftIndex) * _slideSize.x, _itemHolders[i].el.style);
}
- if(!_oldIE) {
+ if (!_oldIE) {
framework.bind(self.scrollWrap, _downEvents, self); // no dragging for old IE
- }
+ }
- _listen('initialZoomInEnd', function() {
- self.setContent(_itemHolders[0], _currentItemIndex-1);
- self.setContent(_itemHolders[2], _currentItemIndex+1);
+ _listen('initialZoomInEnd', function () {
+ self.setContent(_itemHolders[0], _currentItemIndex - 1);
+ self.setContent(_itemHolders[2], _currentItemIndex + 1);
_itemHolders[0].el.style.display = _itemHolders[2].el.style.display = 'block';
- if(_options.focus) {
- // focus causes layout,
- // which causes lag during the animation,
- // that's why we delay it untill the initial zoom transition ends
+ if (_options.focus) {
+ // focus causes layout,
+ // which causes lag during the animation,
+ // that's why we delay it until the initial zoom transition ends
template.focus();
}
-
_bindEvents();
});
// set content for center slide (first time)
self.setContent(_itemHolders[1], _currentItemIndex);
-
+
self.updateCurrItem();
_shout('afterInit');
- if(!_isFixedPosition) {
-
+ if (!_isFixedPosition) {
// On all versions of iOS lower than 8.0, we check size of viewport every second.
- //
- // This is done to detect when Safari top & bottom bars appear,
- // as this action doesn't trigger any events (like resize).
- //
+ //
+ // This is done to detect when Safari top & bottom bars appear,
+ // as this action doesn't trigger any events (like resize).
+ //
// On iOS8 they fixed this.
- //
+ //
// 10 Nov 2014: iOS 7 usage ~40%. iOS 8 usage 56%.
-
- _updateSizeInterval = setInterval(function() {
- if(!_numAnimations && !_isDragging && !_isZooming && (_currZoomLevel === self.currItem.initialZoomLevel) ) {
+
+ _updateSizeInterval = setInterval(function () {
+ if (!_numAnimations && !_isDragging && !_isZooming && _currZoomLevel === self.currItem.initialZoomLevel) {
self.updateSize();
}
}, 1000);
@@ -980,8 +945,8 @@ var publicMethods = {
},
// Close the gallery, then destroy it
- close: function() {
- if(!_isOpen) {
+ close: function () {
+ if (!_isOpen) {
return;
}
@@ -994,17 +959,17 @@ var publicMethods = {
},
// destroys the gallery (unbinds events, cleans up intervals and timeouts to avoid memory leaks)
- destroy: function() {
+ destroy: function () {
_shout('destroy');
- if(_showOrHideTimeout) {
+ if (_showOrHideTimeout) {
clearTimeout(_showOrHideTimeout);
}
-
+
template.setAttribute('aria-hidden', 'true');
template.className = _initalClassName;
- if(_updateSizeInterval) {
+ if (_updateSizeInterval) {
clearInterval(_updateSizeInterval);
}
@@ -1017,79 +982,137 @@ var publicMethods = {
_stopAllAnimations();
- _listeners = null;
+ _listeners = {};
},
/**
* Pan image to position
- * @param {Number} x
- * @param {Number} y
+ * @param {Number} x
+ * @param {Number} y
* @param {Boolean} force Will ignore bounds if set to true.
*/
- panTo: function(x,y,force) {
- if(!force) {
- if(x > _currPanBounds.min.x) {
+ panTo: function (x, y, force) {
+ if (!force) {
+ if (x > _currPanBounds.min.x) {
x = _currPanBounds.min.x;
- } else if(x < _currPanBounds.max.x) {
+ } else if (x < _currPanBounds.max.x) {
x = _currPanBounds.max.x;
}
- if(y > _currPanBounds.min.y) {
+ if (y > _currPanBounds.min.y) {
y = _currPanBounds.min.y;
- } else if(y < _currPanBounds.max.y) {
+ } else if (y < _currPanBounds.max.y) {
y = _currPanBounds.max.y;
}
}
-
+
_panOffset.x = x;
_panOffset.y = y;
_applyCurrentZoomPan();
},
-
+
handleEvent: function (e) {
e = e || window.event;
- if(_globalEventHandlers[e.type]) {
+ if (_globalEventHandlers[e.type]) {
_globalEventHandlers[e.type](e);
}
},
+ goTo: function (index) {
+ if (_options.animateTransitions) {
+ _finishSwipeMainScrollGesture('swipe', 80 * index, {
+ lastFlickDist: {
+ x: 80,
+ y: 0
+ },
+ lastFlickOffset: {
+ x: 80 * index,
+ y: 0
+ },
+ lastFlickSpeed: {
+ x: 2 * index,
+ y: 0
+ }
+ });
+ } else {
+ index = _getLoopedId(index);
- goTo: function(index) {
+ var diff = index - _currentItemIndex;
+ _indexDiff = diff;
- index = _getLoopedId(index);
+ _currentItemIndex = index;
+ self.currItem = _getItemAt(_currentItemIndex);
+ _currPositionIndex -= diff;
- var diff = index - _currentItemIndex;
- _indexDiff = diff;
+ _moveMainScroll(_slideSize.x * _currPositionIndex);
- _currentItemIndex = index;
- self.currItem = _getItemAt( _currentItemIndex );
- _currPositionIndex -= diff;
-
- _moveMainScroll(_slideSize.x * _currPositionIndex);
-
+ _stopAllAnimations();
+ _mainScrollAnimating = false;
- _stopAllAnimations();
- _mainScrollAnimating = false;
-
- self.updateCurrItem();
+ self.updateCurrItem();
+ }
},
- next: function() {
- self.goTo( _currentItemIndex + 1);
+ next: function () {
+ if (!_options.loop && _currentItemIndex === _getNumItems() - 1) {
+ return;
+ }
+ if (_options.animateTransitions) {
+ self.goTo(-1);
+ } else {
+ self.goTo(parseInt(_currentItemIndex) + 1);
+ }
},
- prev: function() {
- self.goTo( _currentItemIndex - 1);
+
+ prev: function () {
+ if (!_options.loop && _currentItemIndex === 0) {
+ return;
+ }
+ if (_options.animateTransitions) {
+ self.goTo(1);
+ } else {
+ self.goTo(parseInt(_currentItemIndex) - 1);
+ }
+ },
+
+ setItems: function (items) {
+ var last = items.length - 1;
+ var currItem = self.currItem;
+ var prevItem = self.items[_prevItemIndex];
+ self.items.splice(0, self.items.length);
+ var newIndex;
+ for (var i = 0; i < items.length; i++) {
+ self.items.push(items[i]);
+ if (items[i] === currItem) {
+ newIndex = i;
+ }
+ }
+ if (!newIndex) {
+ if (_currentItemIndex >= last) {
+ _currentItemIndex = last;
+ }
+ } else {
+ _currentItemIndex = newIndex;
+ }
+ if (self.items[_currentItemIndex - 1] === prevItem) {
+ _prevItemIndex = _currentItemIndex - 1;
+ } else {
+ _prevItemIndex = _currentItemIndex;
+ }
+
+ self.invalidateCurrItems();
+ self.updateSize(true);
},
// update current zoom/pan objects
- updateCurrZoomItem: function(emulateSetContent) {
- if(emulateSetContent) {
+ updateCurrZoomItem: function (emulateSetContent) {
+ if (emulateSetContent) {
_shout('beforeChange', 0);
}
// itemHolder[1] is middle (current) item
- if(_itemHolders[1].el.children.length) {
+ if (_itemHolders[1].el.children.length) {
var zoomElement = _itemHolders[1].el.children[0];
- if( framework.hasClass(zoomElement, 'pswp__zoom-wrap') ) {
+ if (framework.hasClass(zoomElement, 'pswp__zoom-wrap')) {
_currZoomElementStyle = zoomElement.style;
} else {
_currZoomElementStyle = null;
@@ -1097,80 +1120,74 @@ var publicMethods = {
} else {
_currZoomElementStyle = null;
}
-
- _currPanBounds = self.currItem.bounds;
+
+ _currPanBounds = self.currItem.bounds;
_startZoomLevel = _currZoomLevel = self.currItem.initialZoomLevel;
_panOffset.x = _currPanBounds.center.x;
_panOffset.y = _currPanBounds.center.y;
- if(emulateSetContent) {
+ if (emulateSetContent) {
_shout('afterChange');
}
},
-
- invalidateCurrItems: function() {
+ invalidateCurrItems: function () {
_itemsNeedUpdate = true;
- for(var i = 0; i < NUM_HOLDERS; i++) {
- if( _itemHolders[i].item ) {
+ for (var i = 0; i < NUM_HOLDERS; i++) {
+ if (_itemHolders[i].item) {
_itemHolders[i].item.needsUpdate = true;
}
}
},
- updateCurrItem: function(beforeAnimation) {
-
- if(_indexDiff === 0) {
+ updateCurrItem: function (beforeAnimation) {
+ if (_indexDiff === 0) {
return;
}
var diffAbs = Math.abs(_indexDiff),
tempHolder;
- if(beforeAnimation && diffAbs < 2) {
+ if (beforeAnimation && diffAbs < 2) {
return;
}
-
- self.currItem = _getItemAt( _currentItemIndex );
+ self.currItem = _getItemAt(_currentItemIndex);
_renderMaxResolution = false;
-
+
_shout('beforeChange', _indexDiff);
- if(diffAbs >= NUM_HOLDERS) {
+ if (diffAbs >= NUM_HOLDERS) {
_containerShiftIndex += _indexDiff + (_indexDiff > 0 ? -NUM_HOLDERS : NUM_HOLDERS);
diffAbs = NUM_HOLDERS;
}
- for(var i = 0; i < diffAbs; i++) {
- if(_indexDiff > 0) {
+ for (var i = 0; i < diffAbs; i++) {
+ if (_indexDiff > 0) {
tempHolder = _itemHolders.shift();
- _itemHolders[NUM_HOLDERS-1] = tempHolder; // move first to last
+ _itemHolders[NUM_HOLDERS - 1] = tempHolder; // move first to last
_containerShiftIndex++;
- _setTranslateX( (_containerShiftIndex+2) * _slideSize.x, tempHolder.el.style);
+ _setTranslateX((_containerShiftIndex + 2) * _slideSize.x, tempHolder.el.style);
self.setContent(tempHolder, _currentItemIndex - diffAbs + i + 1 + 1);
} else {
tempHolder = _itemHolders.pop();
- _itemHolders.unshift( tempHolder ); // move last to first
+ _itemHolders.unshift(tempHolder); // move last to first
_containerShiftIndex--;
- _setTranslateX( _containerShiftIndex * _slideSize.x, tempHolder.el.style);
+ _setTranslateX(_containerShiftIndex * _slideSize.x, tempHolder.el.style);
self.setContent(tempHolder, _currentItemIndex + diffAbs - i - 1 - 1);
}
-
}
// reset zoom/pan on previous item
- if(_currZoomElementStyle && Math.abs(_indexDiff) === 1) {
-
+ if (_currZoomElementStyle && Math.abs(_indexDiff) === 1) {
var prevItem = _getItemAt(_prevItemIndex);
- if(prevItem.initialZoomLevel !== _currZoomLevel) {
- _calculateItemSize(prevItem , _viewportSize );
+ if (prevItem.initialZoomLevel !== _currZoomLevel) {
+ _calculateItemSize(prevItem, _viewportSize);
_setImageSize(prevItem);
- _applyZoomPanToItem( prevItem );
+ _applyZoomPanToItem(prevItem);
}
-
}
// reset diff after update
@@ -1181,20 +1198,16 @@ var publicMethods = {
_prevItemIndex = _currentItemIndex;
_shout('afterChange');
-
},
-
-
- updateSize: function(force) {
-
- if(!_isFixedPosition && _options.modal) {
+ updateSize: function (force) {
+ if (!_isFixedPosition && _options.modal) {
var windowScrollY = framework.getScrollY();
- if(_currentWindowScrollY !== windowScrollY) {
+ if (_currentWindowScrollY !== windowScrollY) {
template.style.top = windowScrollY + 'px';
_currentWindowScrollY = windowScrollY;
}
- if(!force && _windowVisibleSize.x === window.innerWidth && _windowVisibleSize.y === window.innerHeight) {
+ if (!force && _windowVisibleSize.x === window.innerWidth && _windowVisibleSize.y === window.innerHeight) {
return;
}
_windowVisibleSize.x = window.innerWidth;
@@ -1204,8 +1217,6 @@ var publicMethods = {
template.style.height = _windowVisibleSize.y + 'px';
}
-
-
_viewportSize.x = self.scrollWrap.clientWidth;
_viewportSize.y = self.scrollWrap.clientHeight;
@@ -1218,71 +1229,64 @@ var publicMethods = {
_shout('beforeResize'); // even may be used for example to switch image sources
-
// don't re-calculate size on inital size update
- if(_containerShiftIndex !== undefined) {
+ if (_containerShiftIndex !== undefined) {
+ var holder, item, hIndex;
- var holder,
- item,
- hIndex;
-
- for(var i = 0; i < NUM_HOLDERS; i++) {
+ for (var i = 0; i < NUM_HOLDERS; i++) {
holder = _itemHolders[i];
- _setTranslateX( (i+_containerShiftIndex) * _slideSize.x, holder.el.style);
+ _setTranslateX((i + _containerShiftIndex) * _slideSize.x, holder.el.style);
- hIndex = _currentItemIndex+i-1;
+ hIndex = _currentItemIndex + i - 1;
- if(_options.loop && _getNumItems() > 2) {
+ if (_options.loop && _getNumItems() > 2) {
hIndex = _getLoopedId(hIndex);
}
// update zoom level on items and refresh source (if needsUpdate)
- item = _getItemAt( hIndex );
+ item = _getItemAt(hIndex);
// re-render gallery item if `needsUpdate`,
// or doesn't have `bounds` (entirely new slide object)
- if( item && (_itemsNeedUpdate || item.needsUpdate || !item.bounds) ) {
+ if (item && (_itemsNeedUpdate || item.needsUpdate || !item.bounds)) {
+ self.cleanSlide(item);
- self.cleanSlide( item );
-
- self.setContent( holder, hIndex );
+ self.setContent(holder, hIndex);
// if "center" slide
- if(i === 1) {
+ if (i === 1) {
self.currItem = item;
self.updateCurrZoomItem(true);
}
item.needsUpdate = false;
-
- } else if(holder.index === -1 && hIndex >= 0) {
+ } else if (holder.index === -1 && hIndex >= 0) {
// add content first time
- self.setContent( holder, hIndex );
+ self.setContent(holder, hIndex);
}
- if(item && item.container) {
+ if (item && item.container) {
_calculateItemSize(item, _viewportSize);
_setImageSize(item);
- _applyZoomPanToItem( item );
+ _applyZoomPanToItem(item);
}
-
}
_itemsNeedUpdate = false;
- }
+ }
_startZoomLevel = _currZoomLevel = self.currItem.initialZoomLevel;
_currPanBounds = self.currItem.bounds;
- if(_currPanBounds) {
+ if (_currPanBounds) {
_panOffset.x = _currPanBounds.center.x;
_panOffset.y = _currPanBounds.center.y;
- _applyCurrentZoomPan( true );
+ _applyCurrentZoomPan(true);
}
-
+
_shout('resize');
},
-
+
// Zoom current item to
- zoomTo: function(destZoomLevel, centerPoint, speed, easingFn, updateFn) {
+ zoomTo: function (destZoomLevel, centerPoint, speed, easingFn, updateFn) {
/*
if(destZoomLevel === 'fit') {
destZoomLevel = self.currItem.fitRatio;
@@ -1291,10 +1295,10 @@ var publicMethods = {
}
*/
- if(centerPoint) {
+ if (centerPoint) {
_startZoomLevel = _currZoomLevel;
- _midZoomPoint.x = Math.abs(centerPoint.x) - _panOffset.x ;
- _midZoomPoint.y = Math.abs(centerPoint.y) - _panOffset.y ;
+ _midZoomPoint.x = Math.abs(centerPoint.x) - _panOffset.x;
+ _midZoomPoint.y = Math.abs(centerPoint.y) - _panOffset.y;
_equalizePoints(_startPanOffset, _panOffset);
}
@@ -1312,8 +1316,8 @@ var publicMethods = {
_roundPoint(destPanOffset);
- var onUpdate = function(now) {
- if(now === 1) {
+ var onUpdate = function (now) {
+ if (now === 1) {
_currZoomLevel = destZoomLevel;
_panOffset.x = destPanOffset.x;
_panOffset.y = destPanOffset.y;
@@ -1323,21 +1327,19 @@ var publicMethods = {
_panOffset.y = (destPanOffset.y - initialPanOffset.y) * now + initialPanOffset.y;
}
- if(updateFn) {
+ if (updateFn) {
updateFn(now);
}
- _applyCurrentZoomPan( now === 1 );
+ _applyCurrentZoomPan(now === 1);
};
- if(speed) {
+ if (speed) {
_animateProp('customZoomTo', 0, 1, speed, easingFn || framework.easing.sine.inOut, onUpdate);
} else {
onUpdate(1);
}
}
-
-
};
@@ -1346,7 +1348,7 @@ var publicMethods = {
/*>>gestures*/
/**
* Mouse/touch/pointer event handlers.
- *
+ *
* separated from @core.js for readability
*/
@@ -1355,7 +1357,6 @@ var MIN_SWIPE_DISTANCE = 30,
var _gestureStartTime,
_gestureCheckSpeedTime,
-
// pool of objects that are used during dragging of zooming
p = {}, // first point
p2 = {}, // second point (for zoom gesture)
@@ -1367,7 +1368,6 @@ var _gestureStartTime,
_releaseAnimData,
_posPoints = [], // array of points during dragging, used to determine type of gesture
_tempPoint = {},
-
_isZoomingIn,
_verticalDragInitiated,
_oldAndroidTouchEndTimeout,
@@ -1395,131 +1395,119 @@ var _gestureStartTime,
_opacityChanged,
_bgOpacity,
_wasOverInitialZoom,
-
- _isEqualPoints = function(p1, p2) {
+ _isEqualPoints = function (p1, p2) {
return p1.x === p2.x && p1.y === p2.y;
},
- _isNearbyPoints = function(touch0, touch1) {
+ _isNearbyPoints = function (touch0, touch1) {
return Math.abs(touch0.x - touch1.x) < DOUBLE_TAP_RADIUS && Math.abs(touch0.y - touch1.y) < DOUBLE_TAP_RADIUS;
},
- _calculatePointsDistance = function(p1, p2) {
- _tempPoint.x = Math.abs( p1.x - p2.x );
- _tempPoint.y = Math.abs( p1.y - p2.y );
+ _calculatePointsDistance = function (p1, p2) {
+ _tempPoint.x = Math.abs(p1.x - p2.x);
+ _tempPoint.y = Math.abs(p1.y - p2.y);
return Math.sqrt(_tempPoint.x * _tempPoint.x + _tempPoint.y * _tempPoint.y);
},
- _stopDragUpdateLoop = function() {
- if(_dragAnimFrame) {
+ _stopDragUpdateLoop = function () {
+ if (_dragAnimFrame) {
_cancelAF(_dragAnimFrame);
_dragAnimFrame = null;
}
},
- _dragUpdateLoop = function() {
- if(_isDragging) {
+ _dragUpdateLoop = function () {
+ if (_isDragging) {
_dragAnimFrame = _requestAF(_dragUpdateLoop);
_renderMovement();
}
},
- _canPan = function() {
- return !(_options.scaleMode === 'fit' && _currZoomLevel === self.currItem.initialZoomLevel);
+ _canPan = function () {
+ return !(_options.scaleMode === 'fit' && _currZoomLevel === self.currItem.initialZoomLevel);
},
-
// find the closest parent DOM element
- _closestElement = function(el, fn) {
- if(!el || el === document) {
- return false;
- }
+ _closestElement = function (el, fn) {
+ if (!el || el === document) {
+ return false;
+ }
- // don't search elements above pswp__scroll-wrap
- if(el.getAttribute('class') && el.getAttribute('class').indexOf('pswp__scroll-wrap') > -1 ) {
- return false;
- }
+ // don't search elements above pswp__scroll-wrap
+ if (el.getAttribute('class') && el.getAttribute('class').indexOf('pswp__scroll-wrap') > -1) {
+ return false;
+ }
- if( fn(el) ) {
- return el;
- }
+ if (fn(el)) {
+ return el;
+ }
- return _closestElement(el.parentNode, fn);
+ return _closestElement(el.parentNode, fn);
},
-
_preventObj = {},
- _preventDefaultEventBehaviour = function(e, isDown) {
- _preventObj.prevent = !_closestElement(e.target, _options.isClickableElement);
+ _preventDefaultEventBehaviour = function (e, isDown) {
+ _preventObj.prevent = !_closestElement(e.target, _options.isClickableElement);
_shout('preventDragEvent', e, isDown, _preventObj);
return _preventObj.prevent;
-
},
- _convertTouchToPoint = function(touch, p) {
+ _convertTouchToPoint = function (touch, p) {
p.x = touch.pageX;
p.y = touch.pageY;
p.id = touch.identifier;
return p;
},
- _findCenterOfPoints = function(p1, p2, pCenter) {
+ _findCenterOfPoints = function (p1, p2, pCenter) {
pCenter.x = (p1.x + p2.x) * 0.5;
pCenter.y = (p1.y + p2.y) * 0.5;
},
- _pushPosPoint = function(time, x, y) {
- if(time - _gestureCheckSpeedTime > 50) {
+ _pushPosPoint = function (time, x, y) {
+ if (time - _gestureCheckSpeedTime > 50) {
var o = _posPoints.length > 2 ? _posPoints.shift() : {};
o.x = x;
- o.y = y;
+ o.y = y;
_posPoints.push(o);
_gestureCheckSpeedTime = time;
}
},
-
- _calculateVerticalDragOpacityRatio = function() {
+ _calculateVerticalDragOpacityRatio = function () {
var yOffset = _panOffset.y - self.currItem.initialPosition.y; // difference between initial and current position
- return 1 - Math.abs( yOffset / (_viewportSize.y / 2) );
+ return 1 - Math.abs(yOffset / (_viewportSize.y / 2));
},
-
-
// points pool, reused during touch events
_ePoint1 = {},
_ePoint2 = {},
_tempPointsArr = [],
_tempCounter,
- _getTouchPoints = function(e) {
+ _getTouchPoints = function (e) {
// clean up previous points, without recreating array
- while(_tempPointsArr.length > 0) {
+ while (_tempPointsArr.length > 0) {
_tempPointsArr.pop();
}
- if(!_pointerEventEnabled) {
- if(e.type.indexOf('touch') > -1) {
-
- if(e.touches && e.touches.length > 0) {
+ if (!_pointerEventEnabled) {
+ if (e.type.indexOf('touch') > -1) {
+ if (e.touches && e.touches.length > 0) {
_tempPointsArr[0] = _convertTouchToPoint(e.touches[0], _ePoint1);
- if(e.touches.length > 1) {
+ if (e.touches.length > 1) {
_tempPointsArr[1] = _convertTouchToPoint(e.touches[1], _ePoint2);
}
}
-
} else {
_ePoint1.x = e.pageX;
_ePoint1.y = e.pageY;
_ePoint1.id = '';
- _tempPointsArr[0] = _ePoint1;//_ePoint1;
+ _tempPointsArr[0] = _ePoint1; //_ePoint1;
}
} else {
_tempCounter = 0;
// we can use forEach, as pointer events are supported only in modern browsers
- _currPointers.forEach(function(p) {
- if(_tempCounter === 0) {
+ _currPointers.forEach(function (p) {
+ if (_tempCounter === 0) {
_tempPointsArr[0] = p;
- } else if(_tempCounter === 1) {
+ } else if (_tempCounter === 1) {
_tempPointsArr[1] = p;
}
_tempCounter++;
-
});
}
return _tempPointsArr;
},
-
- _panOrMoveMainScroll = function(axis, delta) {
-
+ _panOrMoveMainScroll = function (axis, delta) {
var panFriction,
overDiff = 0,
newOffset = _panOffset[axis] + delta[axis],
@@ -1531,150 +1519,130 @@ var _gestureStartTime,
newMainScrollPos;
// calculate fdistance over the bounds and friction
- if(newOffset > _currPanBounds.min[axis] || newOffset < _currPanBounds.max[axis]) {
+ if (newOffset > _currPanBounds.min[axis] || newOffset < _currPanBounds.max[axis]) {
panFriction = _options.panEndFriction;
- // Linear increasing of friction, so at 1/4 of viewport it's at max value.
+ // Linear increasing of friction, so at 1/4 of viewport it's at max value.
// Looks not as nice as was expected. Left for history.
// panFriction = (1 - (_panOffset[axis] + delta[axis] + panBounds.min[axis]) / (_viewportSize[axis] / 4) );
} else {
panFriction = 1;
}
-
+
newOffset = _panOffset[axis] + delta[axis] * panFriction;
// move main scroll or start panning
- if(_options.allowPanToNext || _currZoomLevel === self.currItem.initialZoomLevel) {
-
-
- if(!_currZoomElementStyle) {
-
+ if (_options.allowPanToNext || _currZoomLevel === self.currItem.initialZoomLevel) {
+ if (!_currZoomElementStyle) {
newMainScrollPos = newMainScrollPosition;
-
- } else if(_direction === 'h' && axis === 'x' && !_zoomStarted ) {
-
- if(dir) {
- if(newOffset > _currPanBounds.min[axis]) {
+ } else if (_direction === 'h' && axis === 'x' && !_zoomStarted) {
+ if (dir) {
+ if (newOffset > _currPanBounds.min[axis]) {
panFriction = _options.panEndFriction;
overDiff = _currPanBounds.min[axis] - newOffset;
startOverDiff = _currPanBounds.min[axis] - _startPanOffset[axis];
}
-
+
// drag right
- if( (startOverDiff <= 0 || mainScrollDiff < 0) && _getNumItems() > 1 ) {
+ if ((startOverDiff <= 0 || mainScrollDiff < 0) && _getNumItems() > 1) {
newMainScrollPos = newMainScrollPosition;
- if(mainScrollDiff < 0 && newMainScrollPosition > _startMainScrollPos.x) {
+ if (mainScrollDiff < 0 && newMainScrollPosition > _startMainScrollPos.x) {
newMainScrollPos = _startMainScrollPos.x;
}
} else {
- if(_currPanBounds.min.x !== _currPanBounds.max.x) {
+ if (_currPanBounds.min.x !== _currPanBounds.max.x) {
newPanPos = newOffset;
}
-
}
-
} else {
-
- if(newOffset < _currPanBounds.max[axis] ) {
- panFriction =_options.panEndFriction;
+ if (newOffset < _currPanBounds.max[axis]) {
+ panFriction = _options.panEndFriction;
overDiff = newOffset - _currPanBounds.max[axis];
startOverDiff = _startPanOffset[axis] - _currPanBounds.max[axis];
}
- if( (startOverDiff <= 0 || mainScrollDiff > 0) && _getNumItems() > 1 ) {
+ if ((startOverDiff <= 0 || mainScrollDiff > 0) && _getNumItems() > 1) {
newMainScrollPos = newMainScrollPosition;
- if(mainScrollDiff > 0 && newMainScrollPosition < _startMainScrollPos.x) {
+ if (mainScrollDiff > 0 && newMainScrollPosition < _startMainScrollPos.x) {
newMainScrollPos = _startMainScrollPos.x;
}
-
} else {
- if(_currPanBounds.min.x !== _currPanBounds.max.x) {
+ if (_currPanBounds.min.x !== _currPanBounds.max.x) {
newPanPos = newOffset;
}
}
-
}
-
//
}
- if(axis === 'x') {
-
- if(newMainScrollPos !== undefined) {
+ if (axis === 'x') {
+ if (newMainScrollPos !== undefined) {
_moveMainScroll(newMainScrollPos, true);
- if(newMainScrollPos === _startMainScrollPos.x) {
+ if (newMainScrollPos === _startMainScrollPos.x) {
_mainScrollShifted = false;
} else {
_mainScrollShifted = true;
}
}
- if(_currPanBounds.min.x !== _currPanBounds.max.x) {
- if(newPanPos !== undefined) {
+ if (_currPanBounds.min.x !== _currPanBounds.max.x) {
+ if (newPanPos !== undefined) {
_panOffset.x = newPanPos;
- } else if(!_mainScrollShifted) {
+ } else if (!_mainScrollShifted) {
_panOffset.x += delta.x * panFriction;
}
}
return newMainScrollPos !== undefined;
}
-
}
- if(!_mainScrollAnimating) {
-
- if(!_mainScrollShifted) {
- if(_currZoomLevel > self.currItem.fitRatio) {
+ if (!_mainScrollAnimating) {
+ if (!_mainScrollShifted) {
+ if (_currZoomLevel > self.currItem.fitRatio) {
_panOffset[axis] += delta[axis] * panFriction;
-
}
}
-
-
}
-
},
-
// Pointerdown/touchstart/mousedown handler
- _onDragStart = function(e) {
-
+ _onDragStart = function (e) {
// Allow dragging only via left mouse button.
// As this handler is not added in IE8 - we ignore e.which
- //
+ //
// http://www.quirksmode.org/js/events_properties.html
// https://developer.mozilla.org/en-US/docs/Web/API/event.button
- if(e.type === 'mousedown' && e.button > 0 ) {
+ if (e.type === 'mousedown' && (e.button > 0 || e.buttons === 0)) {
return;
}
- if(_initialZoomRunning) {
+ if (_options.preventSwiping) {
+ return;
+ }
+
+ if (_initialZoomRunning) {
e.preventDefault();
return;
}
- if(_oldAndroidTouchEndTimeout && e.type === 'mousedown') {
+ if (_oldAndroidTouchEndTimeout && e.type === 'mousedown') {
return;
}
- if(_preventDefaultEventBehaviour(e, true)) {
+ if (_preventDefaultEventBehaviour(e, true)) {
e.preventDefault();
}
-
-
_shout('pointerDown');
- if(_pointerEventEnabled) {
+ if (_pointerEventEnabled) {
var pointerIndex = framework.arraySearch(_currPointers, e.pointerId, 'id');
- if(pointerIndex < 0) {
+ if (pointerIndex < 0) {
pointerIndex = _currPointers.length;
}
- _currPointers[pointerIndex] = {x:e.pageX, y:e.pageY, id: e.pointerId};
+ _currPointers[pointerIndex] = {x: e.pageX, y: e.pageY, id: e.pointerId};
}
-
-
var startPointsList = _getTouchPoints(e),
numPoints = startPointsList.length;
@@ -1684,21 +1652,11 @@ var _gestureStartTime,
_stopAllAnimations();
// init drag
- if(!_isDragging || numPoints === 1) {
-
-
-
+ if (!_isDragging || numPoints === 1) {
_isDragging = _isFirstMove = true;
framework.bind(window, _upMoveEvents, self);
- _isZoomingIn =
- _wasOverInitialZoom =
- _opacityChanged =
- _verticalDragInitiated =
- _mainScrollShifted =
- _moved =
- _isMultitouch =
- _zoomStarted = false;
+ _isZoomingIn = _wasOverInitialZoom = _opacityChanged = _verticalDragInitiated = _mainScrollShifted = _moved = _isMultitouch = _zoomStarted = false;
_direction = null;
@@ -1713,24 +1671,25 @@ var _gestureStartTime,
//_equalizePoints(_startMainScrollPos, _mainScrollPos);
_startMainScrollPos.x = _slideSize.x * _currPositionIndex;
- _posPoints = [{
- x: _currPoint.x,
- y: _currPoint.y
- }];
+ _posPoints = [
+ {
+ x: _currPoint.x,
+ y: _currPoint.y
+ }
+ ];
_gestureCheckSpeedTime = _gestureStartTime = _getCurrentTime();
//_mainScrollAnimationEnd(true);
- _calculatePanBounds( _currZoomLevel, true );
-
+ _calculatePanBounds(_currZoomLevel, true);
+
// Start rendering
_stopDragUpdateLoop();
_dragUpdateLoop();
-
}
// init zoom
- if(!_isZooming && numPoints > 1 && !_mainScrollAnimating && !_mainScrollShifted) {
+ if (!_isZooming && numPoints > 1 && !_mainScrollAnimating && !_mainScrollShifted) {
_startZoomLevel = _currZoomLevel;
_zoomStarted = false; // true if zoom changed at least once
@@ -1748,55 +1707,52 @@ var _gestureStartTime,
_midZoomPoint.y = Math.abs(_currCenterPoint.y) - _panOffset.y;
_currPointsDistance = _startPointsDistance = _calculatePointsDistance(p, p2);
}
-
-
},
-
// Pointermove/touchmove/mousemove handler
- _onDragMove = function(e) {
+ _onDragMove = function (e) {
+ if (_options.preventSwiping) {
+ return;
+ }
e.preventDefault();
- if(_pointerEventEnabled) {
+ if (_pointerEventEnabled) {
var pointerIndex = framework.arraySearch(_currPointers, e.pointerId, 'id');
- if(pointerIndex > -1) {
+ if (pointerIndex > -1) {
var p = _currPointers[pointerIndex];
p.x = e.pageX;
- p.y = e.pageY;
+ p.y = e.pageY;
}
}
- if(_isDragging) {
+ if (_isDragging) {
var touchesList = _getTouchPoints(e);
- if(!_direction && !_moved && !_isZooming) {
-
- if(_mainScrollPos.x !== _slideSize.x * _currPositionIndex) {
+ if (!_direction && !_moved && !_isZooming) {
+ if (_mainScrollPos.x !== _slideSize.x * _currPositionIndex) {
// if main scroll position is shifted – direction is always horizontal
_direction = 'h';
} else {
var diff = Math.abs(touchesList[0].x - _currPoint.x) - Math.abs(touchesList[0].y - _currPoint.y);
// check the direction of movement
- if(Math.abs(diff) >= DIRECTION_CHECK_OFFSET) {
+ if (Math.abs(diff) >= DIRECTION_CHECK_OFFSET) {
_direction = diff > 0 ? 'h' : 'v';
_currentPoints = touchesList;
}
}
-
} else {
_currentPoints = touchesList;
}
- }
+ }
},
- //
- _renderMovement = function() {
-
- if(!_currentPoints) {
+ //
+ _renderMovement = function () {
+ if (!_currentPoints) {
return;
}
var numPoints = _currentPoints.length;
- if(numPoints === 0) {
+ if (numPoints === 0) {
return;
}
@@ -1805,32 +1761,31 @@ var _gestureStartTime,
delta.x = p.x - _currPoint.x;
delta.y = p.y - _currPoint.y;
- if(_isZooming && numPoints > 1) {
+ if (_isZooming && numPoints > 1) {
// Handle behaviour for more than 1 point
_currPoint.x = p.x;
_currPoint.y = p.y;
-
+
// check if one of two points changed
- if( !delta.x && !delta.y && _isEqualPoints(_currentPoints[1], p2) ) {
+ if (!delta.x && !delta.y && _isEqualPoints(_currentPoints[1], p2)) {
return;
}
_equalizePoints(p2, _currentPoints[1]);
-
- if(!_zoomStarted) {
+ if (!_zoomStarted) {
_zoomStarted = true;
_shout('zoomGestureStarted');
}
-
+
// Distance between two points
- var pointsDistance = _calculatePointsDistance(p,p2);
+ var pointsDistance = _calculatePointsDistance(p, p2);
var zoomLevel = _calculateZoomLevel(pointsDistance);
// slightly over the of initial zoom level
- if(zoomLevel > self.currItem.initialZoomLevel + self.currItem.initialZoomLevel / 15) {
+ if (zoomLevel > self.currItem.initialZoomLevel + self.currItem.initialZoomLevel / 15) {
_wasOverInitialZoom = true;
}
@@ -1839,9 +1794,8 @@ var _gestureStartTime,
minZoomLevel = _getMinZoomLevel(),
maxZoomLevel = _getMaxZoomLevel();
- if ( zoomLevel < minZoomLevel ) {
-
- if(_options.pinchToClose && !_wasOverInitialZoom && _startZoomLevel <= self.currItem.initialZoomLevel) {
+ if (zoomLevel < minZoomLevel) {
+ if (_options.pinchToClose && !_wasOverInitialZoom && _startZoomLevel <= self.currItem.initialZoomLevel) {
// fade out background if zooming out
var minusDiff = minZoomLevel - zoomLevel;
var percent = 1 - minusDiff / (minZoomLevel / 1.2);
@@ -1851,22 +1805,21 @@ var _gestureStartTime,
_opacityChanged = true;
} else {
zoomFriction = (minZoomLevel - zoomLevel) / minZoomLevel;
- if(zoomFriction > 1) {
+ if (zoomFriction > 1) {
zoomFriction = 1;
}
zoomLevel = minZoomLevel - zoomFriction * (minZoomLevel / 3);
}
-
- } else if ( zoomLevel > maxZoomLevel ) {
+ } else if (zoomLevel > maxZoomLevel) {
// 1.5 - extra zoom level above the max. E.g. if max is x6, real max 6 + 1.5 = 7.5
- zoomFriction = (zoomLevel - maxZoomLevel) / ( minZoomLevel * 6 );
- if(zoomFriction > 1) {
+ zoomFriction = (zoomLevel - maxZoomLevel) / (minZoomLevel * 6);
+ if (zoomFriction > 1) {
zoomFriction = 1;
}
zoomLevel = maxZoomLevel + zoomFriction * minZoomLevel;
}
- if(zoomFriction < 0) {
+ if (zoomFriction < 0) {
zoomFriction = 0;
}
@@ -1875,7 +1828,7 @@ var _gestureStartTime,
// _centerPoint - The point in the middle of two pointers
_findCenterOfPoints(p, p2, _centerPoint);
-
+
// paning with two pointers pressed
_currPanDist.x += _centerPoint.x - _currCenterPoint.x;
_currPanDist.y += _centerPoint.y - _currCenterPoint.y;
@@ -1887,25 +1840,23 @@ var _gestureStartTime,
_isZoomingIn = zoomLevel > _currZoomLevel;
_currZoomLevel = zoomLevel;
_applyCurrentZoomPan();
-
} else {
-
// handle behaviour for one point (dragging or panning)
- if(!_direction) {
+ if (!_direction) {
return;
}
- if(_isFirstMove) {
+ if (_isFirstMove) {
_isFirstMove = false;
- // subtract drag distance that was used during the detection direction
+ // subtract drag distance that was used during the detection direction
- if( Math.abs(delta.x) >= DIRECTION_CHECK_OFFSET) {
+ if (Math.abs(delta.x) >= DIRECTION_CHECK_OFFSET) {
delta.x -= _currentPoints[0].x - _startPoint.x;
}
-
- if( Math.abs(delta.y) >= DIRECTION_CHECK_OFFSET) {
+
+ if (Math.abs(delta.y) >= DIRECTION_CHECK_OFFSET) {
delta.y -= _currentPoints[0].y - _startPoint.y;
}
}
@@ -1914,12 +1865,12 @@ var _gestureStartTime,
_currPoint.y = p.y;
// do nothing if pointers position hasn't changed
- if(delta.x === 0 && delta.y === 0) {
+ if (delta.x === 0 && delta.y === 0) {
return;
}
- if(_direction === 'v' && _options.closeOnVerticalDrag) {
- if(!_canPan()) {
+ if (_direction === 'v' && _options.closeOnVerticalDrag) {
+ if (!_canPan()) {
_currPanDist.y += delta.y;
_panOffset.y += delta.y;
@@ -1930,7 +1881,7 @@ var _gestureStartTime,
_applyBgOpacity(opacityRatio);
_applyCurrentZoomPan();
- return ;
+ return;
}
}
@@ -1938,70 +1889,63 @@ var _gestureStartTime,
_moved = true;
_currPanBounds = self.currItem.bounds;
-
+
var mainScrollChanged = _panOrMoveMainScroll('x', delta);
- if(!mainScrollChanged) {
+ if (!mainScrollChanged) {
_panOrMoveMainScroll('y', delta);
_roundPoint(_panOffset);
_applyCurrentZoomPan();
}
-
}
-
},
-
// Pointerup/pointercancel/touchend/touchcancel/mouseup event handler
- _onDragRelease = function(e) {
-
- if(_features.isOldAndroid ) {
-
- if(_oldAndroidTouchEndTimeout && e.type === 'mouseup') {
+ _onDragRelease = function (e) {
+ if (_features.isOldAndroid) {
+ if (_oldAndroidTouchEndTimeout && e.type === 'mouseup') {
return;
}
- // on Android (v4.1, 4.2, 4.3 & possibly older)
+ // on Android (v4.1, 4.2, 4.3 & possibly older)
// ghost mousedown/up event isn't preventable via e.preventDefault,
// which causes fake mousedown event
// so we block mousedown/up for 600ms
- if( e.type.indexOf('touch') > -1 ) {
+ if (e.type.indexOf('touch') > -1) {
clearTimeout(_oldAndroidTouchEndTimeout);
- _oldAndroidTouchEndTimeout = setTimeout(function() {
+ _oldAndroidTouchEndTimeout = setTimeout(function () {
_oldAndroidTouchEndTimeout = 0;
}, 600);
}
-
}
_shout('pointerUp');
- if(_preventDefaultEventBehaviour(e, false)) {
+ if (_preventDefaultEventBehaviour(e, false)) {
e.preventDefault();
}
var releasePoint;
- if(_pointerEventEnabled) {
+ if (_pointerEventEnabled) {
var pointerIndex = framework.arraySearch(_currPointers, e.pointerId, 'id');
-
- if(pointerIndex > -1) {
+
+ if (pointerIndex > -1) {
releasePoint = _currPointers.splice(pointerIndex, 1)[0];
- if(navigator.msPointerEnabled) {
+ if (navigator.msPointerEnabled) {
var MSPOINTER_TYPES = {
4: 'mouse', // event.MSPOINTER_TYPE_MOUSE
- 2: 'touch', // event.MSPOINTER_TYPE_TOUCH
+ 2: 'touch', // event.MSPOINTER_TYPE_TOUCH
3: 'pen' // event.MSPOINTER_TYPE_PEN
};
releasePoint.type = MSPOINTER_TYPES[e.pointerType];
- if(!releasePoint.type) {
+ if (!releasePoint.type) {
releasePoint.type = e.pointerType || 'mouse';
}
} else {
releasePoint.type = e.pointerType || 'mouse';
}
-
}
}
@@ -2009,30 +1953,29 @@ var _gestureStartTime,
gestureType,
numPoints = touchList.length;
- if(e.type === 'mouseup') {
+ if (e.type === 'mouseup') {
numPoints = 0;
}
// Do nothing if there were 3 touch points or more
- if(numPoints === 2) {
+ if (numPoints === 2) {
_currentPoints = null;
return true;
}
// if second pointer released
- if(numPoints === 1) {
+ if (numPoints === 1) {
_equalizePoints(_startPoint, touchList[0]);
- }
-
+ }
// pointer hasn't moved, send "tap release" point
- if(numPoints === 0 && !_direction && !_mainScrollAnimating) {
- if(!releasePoint) {
- if(e.type === 'mouseup') {
- releasePoint = {x: e.pageX, y: e.pageY, type:'mouse'};
- } else if(e.changedTouches && e.changedTouches[0]) {
- releasePoint = {x: e.changedTouches[0].pageX, y: e.changedTouches[0].pageY, type:'touch'};
- }
+ if (numPoints === 0 && !_direction && !_mainScrollAnimating) {
+ if (!releasePoint) {
+ if (e.type === 'mouseup') {
+ releasePoint = {x: e.pageX, y: e.pageY, type: 'mouse'};
+ } else if (e.changedTouches && e.changedTouches[0]) {
+ releasePoint = {x: e.changedTouches[0].pageX, y: e.changedTouches[0].pageY, type: 'touch'};
+ }
}
_shout('touchRelease', e, releasePoint);
@@ -2042,68 +1985,64 @@ var _gestureStartTime,
var releaseTimeDiff = -1;
// Gesture completed, no pointers left
- if(numPoints === 0) {
+ if (numPoints === 0) {
_isDragging = false;
framework.unbind(window, _upMoveEvents, self);
_stopDragUpdateLoop();
- if(_isZooming) {
+ if (_isZooming) {
// Two points released at the same time
releaseTimeDiff = 0;
- } else if(_lastReleaseTime !== -1) {
+ } else if (_lastReleaseTime !== -1) {
releaseTimeDiff = _getCurrentTime() - _lastReleaseTime;
}
}
_lastReleaseTime = numPoints === 1 ? _getCurrentTime() : -1;
-
- if(releaseTimeDiff !== -1 && releaseTimeDiff < 150) {
+
+ if (releaseTimeDiff !== -1 && releaseTimeDiff < 150) {
gestureType = 'zoom';
} else {
gestureType = 'swipe';
}
- if(_isZooming && numPoints < 2) {
+ if (_isZooming && numPoints < 2) {
_isZooming = false;
// Only second point released
- if(numPoints === 1) {
+ if (numPoints === 1) {
gestureType = 'zoomPointerUp';
}
_shout('zoomGestureEnded');
}
_currentPoints = null;
- if(!_moved && !_zoomStarted && !_mainScrollAnimating && !_verticalDragInitiated) {
+ if (!_moved && !_zoomStarted && !_mainScrollAnimating && !_verticalDragInitiated) {
// nothing to animate
return;
}
-
+
_stopAllAnimations();
-
- if(!_releaseAnimData) {
+ if (!_releaseAnimData) {
_releaseAnimData = _initDragReleaseAnimationData();
}
-
+
_releaseAnimData.calculateSwipeSpeed('x');
-
- if(_verticalDragInitiated) {
-
+ if (_verticalDragInitiated) {
var opacityRatio = _calculateVerticalDragOpacityRatio();
- if(opacityRatio < _options.verticalDragRange) {
+ if (opacityRatio < _options.verticalDragRange) {
self.close();
} else {
var initalPanY = _panOffset.y,
initialBgOpacity = _bgOpacity;
- _animateProp('verticalDrag', 0, 1, 300, framework.easing.cubic.out, function(now) {
-
+ _animateProp('verticalDrag', 0, 1, 300, framework.easing.cubic.out, function (now) {
_panOffset.y = (self.currItem.initialPosition.y - initalPanY) * now + initalPanY;
- _applyBgOpacity( (1 - initialBgOpacity) * now + initialBgOpacity );
+ _applyBgOpacity((1 - initialBgOpacity) * now + initialBgOpacity);
_applyCurrentZoomPan();
});
@@ -2113,171 +2052,159 @@ var _gestureStartTime,
return;
}
-
- // main scroll
- if( (_mainScrollShifted || _mainScrollAnimating) && numPoints === 0) {
- var itemChanged = _finishSwipeMainScrollGesture(gestureType, _releaseAnimData);
- if(itemChanged) {
+ // main scroll
+ if ((_mainScrollShifted || _mainScrollAnimating) && numPoints === 0) {
+ var totalShiftDist = _currPoint.x - _startPoint.x,
+ itemChanged = _finishSwipeMainScrollGesture(gestureType, totalShiftDist, _releaseAnimData);
+ if (itemChanged) {
return;
}
gestureType = 'zoomPointerUp';
}
// prevent zoom/pan animation when main scroll animation runs
- if(_mainScrollAnimating) {
+ if (_mainScrollAnimating) {
return;
}
-
- // Complete simple zoom gesture (reset zoom level if it's out of the bounds)
- if(gestureType !== 'swipe') {
+
+ // Complete simple zoom gesture (reset zoom level if it's out of the bounds)
+ if (gestureType !== 'swipe') {
_completeZoomGesture();
return;
}
-
+
// Complete pan gesture if main scroll is not shifted, and it's possible to pan current image
- if(!_mainScrollShifted && _currZoomLevel > self.currItem.fitRatio) {
+ if (!_mainScrollShifted && _currZoomLevel > self.currItem.fitRatio) {
_completePanGesture(_releaseAnimData);
}
},
-
-
// Returns object with data about gesture
// It's created only once and then reused
- _initDragReleaseAnimationData = function() {
+ _initDragReleaseAnimationData = function () {
// temp local vars
- var lastFlickDuration,
- tempReleasePos;
+ var lastFlickDuration, tempReleasePos;
// s = this
var s = {
lastFlickOffset: {},
lastFlickDist: {},
lastFlickSpeed: {},
- slowDownRatio: {},
- slowDownRatioReverse: {},
- speedDecelerationRatio: {},
- speedDecelerationRatioAbs: {},
- distanceOffset: {},
+ slowDownRatio: {},
+ slowDownRatioReverse: {},
+ speedDecelerationRatio: {},
+ speedDecelerationRatioAbs: {},
+ distanceOffset: {},
backAnimDestination: {},
backAnimStarted: {},
- calculateSwipeSpeed: function(axis) {
-
-
- if( _posPoints.length > 1) {
+ calculateSwipeSpeed: function (axis) {
+ if (_posPoints.length > 1) {
lastFlickDuration = _getCurrentTime() - _gestureCheckSpeedTime + 50;
- tempReleasePos = _posPoints[_posPoints.length-2][axis];
+ tempReleasePos = _posPoints[_posPoints.length - 2][axis];
} else {
lastFlickDuration = _getCurrentTime() - _gestureStartTime; // total gesture duration
tempReleasePos = _startPoint[axis];
}
s.lastFlickOffset[axis] = _currPoint[axis] - tempReleasePos;
s.lastFlickDist[axis] = Math.abs(s.lastFlickOffset[axis]);
- if(s.lastFlickDist[axis] > 20) {
+ if (s.lastFlickDist[axis] > 20) {
s.lastFlickSpeed[axis] = s.lastFlickOffset[axis] / lastFlickDuration;
} else {
s.lastFlickSpeed[axis] = 0;
}
- if( Math.abs(s.lastFlickSpeed[axis]) < 0.1 ) {
+ if (Math.abs(s.lastFlickSpeed[axis]) < 0.1) {
s.lastFlickSpeed[axis] = 0;
}
-
+
s.slowDownRatio[axis] = 0.95;
s.slowDownRatioReverse[axis] = 1 - s.slowDownRatio[axis];
s.speedDecelerationRatio[axis] = 1;
},
- calculateOverBoundsAnimOffset: function(axis, speed) {
- if(!s.backAnimStarted[axis]) {
-
- if(_panOffset[axis] > _currPanBounds.min[axis]) {
+ calculateOverBoundsAnimOffset: function (axis, speed) {
+ if (!s.backAnimStarted[axis]) {
+ if (_panOffset[axis] > _currPanBounds.min[axis]) {
s.backAnimDestination[axis] = _currPanBounds.min[axis];
-
- } else if(_panOffset[axis] < _currPanBounds.max[axis]) {
+ } else if (_panOffset[axis] < _currPanBounds.max[axis]) {
s.backAnimDestination[axis] = _currPanBounds.max[axis];
}
- if(s.backAnimDestination[axis] !== undefined) {
+ if (s.backAnimDestination[axis] !== undefined) {
s.slowDownRatio[axis] = 0.7;
s.slowDownRatioReverse[axis] = 1 - s.slowDownRatio[axis];
- if(s.speedDecelerationRatioAbs[axis] < 0.05) {
-
+ if (s.speedDecelerationRatioAbs[axis] < 0.05) {
s.lastFlickSpeed[axis] = 0;
s.backAnimStarted[axis] = true;
- _animateProp('bounceZoomPan'+axis,_panOffset[axis],
- s.backAnimDestination[axis],
- speed || 300,
- framework.easing.sine.out,
- function(pos) {
+ _animateProp(
+ 'bounceZoomPan' + axis,
+ _panOffset[axis],
+ s.backAnimDestination[axis],
+ speed || 300,
+ framework.easing.sine.out,
+ function (pos) {
_panOffset[axis] = pos;
_applyCurrentZoomPan();
}
);
-
}
}
}
},
// Reduces the speed by slowDownRatio (per 10ms)
- calculateAnimOffset: function(axis) {
- if(!s.backAnimStarted[axis]) {
- s.speedDecelerationRatio[axis] = s.speedDecelerationRatio[axis] * (s.slowDownRatio[axis] +
- s.slowDownRatioReverse[axis] -
- s.slowDownRatioReverse[axis] * s.timeDiff / 10);
+ calculateAnimOffset: function (axis) {
+ if (!s.backAnimStarted[axis]) {
+ s.speedDecelerationRatio[axis] =
+ s.speedDecelerationRatio[axis] *
+ (s.slowDownRatio[axis] + s.slowDownRatioReverse[axis] - (s.slowDownRatioReverse[axis] * s.timeDiff) / 10);
s.speedDecelerationRatioAbs[axis] = Math.abs(s.lastFlickSpeed[axis] * s.speedDecelerationRatio[axis]);
s.distanceOffset[axis] = s.lastFlickSpeed[axis] * s.speedDecelerationRatio[axis] * s.timeDiff;
_panOffset[axis] += s.distanceOffset[axis];
-
}
},
- panAnimLoop: function() {
- if ( _animations.zoomPan ) {
+ panAnimLoop: function () {
+ if (_animations.zoomPan) {
_animations.zoomPan.raf = _requestAF(s.panAnimLoop);
s.now = _getCurrentTime();
s.timeDiff = s.now - s.lastNow;
s.lastNow = s.now;
-
+
s.calculateAnimOffset('x');
s.calculateAnimOffset('y');
_applyCurrentZoomPan();
-
+
s.calculateOverBoundsAnimOffset('x');
s.calculateOverBoundsAnimOffset('y');
-
if (s.speedDecelerationRatioAbs.x < 0.05 && s.speedDecelerationRatioAbs.y < 0.05) {
-
// round pan position
_panOffset.x = Math.round(_panOffset.x);
_panOffset.y = Math.round(_panOffset.y);
_applyCurrentZoomPan();
-
+
_stopAnimation('zoomPan');
return;
}
}
-
}
};
return s;
},
-
- _completePanGesture = function(animData) {
+ _completePanGesture = function (animData) {
// calculate swipe speed for Y axis (paanning)
animData.calculateSwipeSpeed('y');
_currPanBounds = self.currItem.bounds;
-
+
animData.backAnimDestination = {};
animData.backAnimStarted = {};
// Avoid acceleration animation if speed is too low
- if(Math.abs(animData.lastFlickSpeed.x) <= 0.05 && Math.abs(animData.lastFlickSpeed.y) <= 0.05 ) {
+ if (Math.abs(animData.lastFlickSpeed.x) <= 0.05 && Math.abs(animData.lastFlickSpeed.y) <= 0.05) {
animData.speedDecelerationRatioAbs.x = animData.speedDecelerationRatioAbs.y = 0;
// Run pan drag release animation. E.g. if you drag image and release finger without momentum.
@@ -2291,30 +2218,23 @@ var _gestureStartTime,
animData.lastNow = _getCurrentTime();
animData.panAnimLoop();
},
-
-
- _finishSwipeMainScrollGesture = function(gestureType, _releaseAnimData) {
+ _finishSwipeMainScrollGesture = function (gestureType, totalShiftDist, _releaseAnimData) {
var itemChanged;
- if(!_mainScrollAnimating) {
+ if (!_mainScrollAnimating) {
_currZoomedItemIndex = _currentItemIndex;
}
-
-
var itemsDiff;
- if(gestureType === 'swipe') {
- var totalShiftDist = _currPoint.x - _startPoint.x,
- isFastLastFlick = _releaseAnimData.lastFlickDist.x < 10;
+ if (gestureType === 'swipe') {
+ var isFastLastFlick = _releaseAnimData.lastFlickDist.x < 10;
- // if container is shifted for more than MIN_SWIPE_DISTANCE,
+ // if container is shifted for more than MIN_SWIPE_DISTANCE,
// and last flick gesture was in right direction
- if(totalShiftDist > MIN_SWIPE_DISTANCE &&
- (isFastLastFlick || _releaseAnimData.lastFlickOffset.x > 20) ) {
+ if (totalShiftDist > MIN_SWIPE_DISTANCE && (isFastLastFlick || _releaseAnimData.lastFlickOffset.x > 20)) {
// go to prev item
itemsDiff = -1;
- } else if(totalShiftDist < -MIN_SWIPE_DISTANCE &&
- (isFastLastFlick || _releaseAnimData.lastFlickOffset.x < -20) ) {
+ } else if (totalShiftDist < -MIN_SWIPE_DISTANCE && (isFastLastFlick || _releaseAnimData.lastFlickOffset.x < -20)) {
// go to next item
itemsDiff = 1;
}
@@ -2322,88 +2242,85 @@ var _gestureStartTime,
var nextCircle;
- if(itemsDiff) {
-
+ if (itemsDiff) {
_currentItemIndex += itemsDiff;
- if(_currentItemIndex < 0) {
- _currentItemIndex = _options.loop ? _getNumItems()-1 : 0;
+ if (_currentItemIndex < 0) {
+ _currentItemIndex = _options.loop ? _getNumItems() - 1 : 0;
nextCircle = true;
- } else if(_currentItemIndex >= _getNumItems()) {
- _currentItemIndex = _options.loop ? 0 : _getNumItems()-1;
+ } else if (_currentItemIndex >= _getNumItems()) {
+ _currentItemIndex = _options.loop ? 0 : _getNumItems() - 1;
nextCircle = true;
}
- if(!nextCircle || _options.loop) {
+ if (!nextCircle || _options.loop) {
_indexDiff += itemsDiff;
_currPositionIndex -= itemsDiff;
itemChanged = true;
}
-
-
-
}
var animateToX = _slideSize.x * _currPositionIndex;
- var animateToDist = Math.abs( animateToX - _mainScrollPos.x );
+ var animateToDist = Math.abs(animateToX - _mainScrollPos.x);
var finishAnimDuration;
-
- if(!itemChanged && animateToX > _mainScrollPos.x !== _releaseAnimData.lastFlickSpeed.x > 0) {
+ if (!itemChanged && animateToX > _mainScrollPos.x !== _releaseAnimData.lastFlickSpeed.x > 0) {
// "return to current" duration, e.g. when dragging from slide 0 to -1
- finishAnimDuration = 333;
+ finishAnimDuration = 333;
} else {
- finishAnimDuration = Math.abs(_releaseAnimData.lastFlickSpeed.x) > 0 ?
- animateToDist / Math.abs(_releaseAnimData.lastFlickSpeed.x) :
- 333;
+ finishAnimDuration =
+ Math.abs(_releaseAnimData.lastFlickSpeed.x) > 0 ? animateToDist / Math.abs(_releaseAnimData.lastFlickSpeed.x) : 333;
finishAnimDuration = Math.min(finishAnimDuration, 400);
finishAnimDuration = Math.max(finishAnimDuration, 250);
}
- if(_currZoomedItemIndex === _currentItemIndex) {
+ if (_currZoomedItemIndex === _currentItemIndex) {
itemChanged = false;
}
-
+
_mainScrollAnimating = true;
-
+
_shout('mainScrollAnimStart');
- _animateProp('mainScroll', _mainScrollPos.x, animateToX, finishAnimDuration, framework.easing.cubic.out,
+ _animateProp(
+ 'mainScroll',
+ _mainScrollPos.x,
+ animateToX,
+ finishAnimDuration,
+ framework.easing.cubic.out,
_moveMainScroll,
- function() {
+ function () {
_stopAllAnimations();
_mainScrollAnimating = false;
_currZoomedItemIndex = -1;
-
- if(itemChanged || _currZoomedItemIndex !== _currentItemIndex) {
+
+ if (itemChanged || _currZoomedItemIndex !== _currentItemIndex) {
self.updateCurrItem();
}
-
+
_shout('mainScrollAnimComplete');
}
);
- if(itemChanged) {
+ if (itemChanged) {
self.updateCurrItem(true);
}
return itemChanged;
},
-
- _calculateZoomLevel = function(touchesDistance) {
- return 1 / _startPointsDistance * touchesDistance * _startZoomLevel;
+ _calculateZoomLevel = function (touchesDistance) {
+ return (1 / _startPointsDistance) * touchesDistance * _startZoomLevel;
},
-
// Resets zoom if it's out of bounds
- _completeZoomGesture = function() {
+ _completeZoomGesture = function () {
var destZoomLevel = _currZoomLevel,
minZoomLevel = _getMinZoomLevel(),
maxZoomLevel = _getMaxZoomLevel();
- if ( _currZoomLevel < minZoomLevel ) {
+ if (_currZoomLevel < minZoomLevel) {
destZoomLevel = minZoomLevel;
- } else if ( _currZoomLevel > maxZoomLevel ) {
+ } else if (_currZoomLevel > maxZoomLevel) {
destZoomLevel = maxZoomLevel;
}
@@ -2411,34 +2328,31 @@ var _gestureStartTime,
onUpdate,
initialOpacity = _bgOpacity;
- if(_opacityChanged && !_isZoomingIn && !_wasOverInitialZoom && _currZoomLevel < minZoomLevel) {
+ if (_opacityChanged && !_isZoomingIn && !_wasOverInitialZoom && _currZoomLevel < minZoomLevel) {
//_closedByScroll = true;
self.close();
return true;
}
- if(_opacityChanged) {
- onUpdate = function(now) {
- _applyBgOpacity( (destOpacity - initialOpacity) * now + initialOpacity );
+ if (_opacityChanged) {
+ onUpdate = function (now) {
+ _applyBgOpacity((destOpacity - initialOpacity) * now + initialOpacity);
};
}
- self.zoomTo(destZoomLevel, 0, 200, framework.easing.cubic.out, onUpdate);
+ self.zoomTo(destZoomLevel, 0, 200, framework.easing.cubic.out, onUpdate);
return true;
};
-
_registerModule('Gestures', {
publicMethods: {
-
- initGestures: function() {
-
+ initGestures: function () {
// helper function that builds touch/pointer/mouse events
- var addEventNames = function(pref, down, move, up, cancel) {
+ var addEventNames = function (pref, down, move, up, cancel) {
_dragStartEvent = pref + down;
_dragMoveEvent = pref + move;
_dragEndEvent = pref + up;
- if(cancel) {
+ if (cancel) {
_dragCancelEvent = pref + cancel;
} else {
_dragCancelEvent = '';
@@ -2446,44 +2360,44 @@ _registerModule('Gestures', {
};
_pointerEventEnabled = _features.pointerEvent;
- if(_pointerEventEnabled && _features.touch) {
+ if (_pointerEventEnabled && _features.touch) {
// we don't need touch events, if browser supports pointer events
_features.touch = false;
}
- if(_pointerEventEnabled) {
- if(navigator.msPointerEnabled) {
+ if (_pointerEventEnabled) {
+ if (navigator.msPointerEnabled) {
// IE10 pointer events are case-sensitive
addEventNames('MSPointer', 'Down', 'Move', 'Up', 'Cancel');
} else {
addEventNames('pointer', 'down', 'move', 'up', 'cancel');
}
- } else if(_features.touch) {
+ } else if (_features.touch) {
addEventNames('touch', 'start', 'move', 'end', 'cancel');
_likelyTouchDevice = true;
} else {
- addEventNames('mouse', 'down', 'move', 'up');
+ addEventNames('mouse', 'down', 'move', 'up');
}
- _upMoveEvents = _dragMoveEvent + ' ' + _dragEndEvent + ' ' + _dragCancelEvent;
+ _upMoveEvents = _dragMoveEvent + ' ' + _dragEndEvent + ' ' + _dragCancelEvent;
_downEvents = _dragStartEvent;
- if(_pointerEventEnabled && !_likelyTouchDevice) {
- _likelyTouchDevice = (navigator.maxTouchPoints > 1) || (navigator.msMaxTouchPoints > 1);
+ if (_pointerEventEnabled && !_likelyTouchDevice) {
+ _likelyTouchDevice = navigator.maxTouchPoints > 1 || navigator.msMaxTouchPoints > 1;
}
// make variable public
- self.likelyTouchDevice = _likelyTouchDevice;
-
+ self.likelyTouchDevice = _likelyTouchDevice;
+
_globalEventHandlers[_dragStartEvent] = _onDragStart;
_globalEventHandlers[_dragMoveEvent] = _onDragMove;
_globalEventHandlers[_dragEndEvent] = _onDragRelease; // the Kraken
- if(_dragCancelEvent) {
+ if (_dragCancelEvent) {
_globalEventHandlers[_dragCancelEvent] = _globalEventHandlers[_dragEndEvent];
}
// Bind mouse events on device with detected hardware touch support, in case it supports multiple types of input.
- if(_features.touch) {
+ if (_features.touch) {
_downEvents += ' mousedown';
_upMoveEvents += ' mousemove mouseup';
_globalEventHandlers.mousedown = _globalEventHandlers[_dragStartEvent];
@@ -2491,12 +2405,11 @@ _registerModule('Gestures', {
_globalEventHandlers.mouseup = _globalEventHandlers[_dragEndEvent];
}
- if(!_likelyTouchDevice) {
+ if (!_likelyTouchDevice) {
// don't allow pan to next slide from zoomed state on Desktop
_options.allowPanToNext = false;
}
}
-
}
});
@@ -2512,24 +2425,22 @@ _registerModule('Gestures', {
* If you're not planning to use transition for gallery at all,
* you may set options hideAnimationDuration and showAnimationDuration to 0,
* and just delete startAnimation function.
- *
+ *
*/
-
var _showOrHideTimeout,
- _showOrHide = function(item, img, out, completeFn) {
-
- if(_showOrHideTimeout) {
+ _showOrHide = function (item, img, out, completeFn) {
+ if (_showOrHideTimeout) {
clearTimeout(_showOrHideTimeout);
}
_initialZoomRunning = true;
_initialContentSet = true;
-
+
// dimensions of small thumbnail {x:,y:,w:}.
// Height is optional, as calculated based on large image.
- var thumbBounds;
- if(item.initialLayout) {
+ var thumbBounds;
+ if (item.initialLayout) {
thumbBounds = item.initialLayout;
item.initialLayout = null;
} else {
@@ -2538,40 +2449,43 @@ var _showOrHideTimeout,
var duration = out ? _options.hideAnimationDuration : _options.showAnimationDuration;
- var onComplete = function() {
+ var onComplete = function () {
_stopAnimation('initialZoom');
- if(!out) {
+ if (!out) {
_applyBgOpacity(1);
- if(img) {
+ if (img) {
img.style.display = 'block';
}
framework.addClass(template, 'pswp--animated-in');
- _shout('initialZoom' + (out ? 'OutEnd' : 'InEnd'));
} else {
self.template.removeAttribute('style');
self.bg.removeAttribute('style');
}
+ _shout('initialZoom' + (out ? 'OutEnd' : 'InEnd'));
- if(completeFn) {
+ if (completeFn) {
completeFn();
}
_initialZoomRunning = false;
};
// if bounds aren't provided, just open gallery without animation
- if(!duration || !thumbBounds || thumbBounds.x === undefined) {
+ if (!duration || !thumbBounds || thumbBounds.x === undefined) {
+ _shout('initialZoom' + (out ? 'Out' : 'In'));
- _shout('initialZoom' + (out ? 'Out' : 'In') );
+ if (!out) {
+ _currZoomLevel = item.initialZoomLevel;
+ _equalizePoints(_panOffset, item.initialPosition);
+ _applyCurrentZoomPan();
- _currZoomLevel = item.initialZoomLevel;
- _equalizePoints(_panOffset, item.initialPosition );
- _applyCurrentZoomPan();
+ template.style.opacity = 1;
+ _applyBgOpacity(1);
+ } else {
+ template.style.opacity = 0;
+ }
- template.style.opacity = out ? 0 : 1;
- _applyBgOpacity(1);
-
- if(duration) {
- setTimeout(function() {
+ if (duration) {
+ setTimeout(function () {
onComplete();
}, duration);
} else {
@@ -2581,16 +2495,16 @@ var _showOrHideTimeout,
return;
}
- var startAnimation = function() {
+ var startAnimation = function () {
var closeWithRaf = _closedByScroll,
fadeEverything = !self.currItem.src || self.currItem.loadError || _options.showHideOpacity;
-
+
// apply hw-acceleration to image
- if(item.miniImg) {
+ if (item.miniImg) {
item.miniImg.style.webkitBackfaceVisibility = 'hidden';
}
- if(!out) {
+ if (!out) {
_currZoomLevel = thumbBounds.w / item.w;
_panOffset.x = thumbBounds.x;
_panOffset.y = thumbBounds.y - _initalWindowScrollY;
@@ -2600,100 +2514,96 @@ var _showOrHideTimeout,
}
_registerStartAnimation('initialZoom');
-
- if(out && !closeWithRaf) {
+
+ if (out && !closeWithRaf) {
framework.removeClass(template, 'pswp--animated-in');
}
- if(fadeEverything) {
- if(out) {
- framework[ (closeWithRaf ? 'remove' : 'add') + 'Class' ](template, 'pswp--animate_opacity');
+ if (fadeEverything) {
+ if (out) {
+ framework[(closeWithRaf ? 'remove' : 'add') + 'Class'](template, 'pswp--animate_opacity');
} else {
- setTimeout(function() {
+ setTimeout(function () {
framework.addClass(template, 'pswp--animate_opacity');
}, 30);
}
}
- _showOrHideTimeout = setTimeout(function() {
+ _showOrHideTimeout = setTimeout(
+ function () {
+ _shout('initialZoom' + (out ? 'Out' : 'In'));
- _shout('initialZoom' + (out ? 'Out' : 'In') );
-
+ if (!out) {
+ // "in" animation always uses CSS transitions (instead of rAF).
+ // CSS transition work faster here,
+ // as developer may also want to animate other things,
+ // like ui on top of sliding area, which can be animated just via CSS
- if(!out) {
-
- // "in" animation always uses CSS transitions (instead of rAF).
- // CSS transition work faster here,
- // as developer may also want to animate other things,
- // like ui on top of sliding area, which can be animated just via CSS
-
- _currZoomLevel = item.initialZoomLevel;
- _equalizePoints(_panOffset, item.initialPosition );
- _applyCurrentZoomPan();
- _applyBgOpacity(1);
-
- if(fadeEverything) {
- template.style.opacity = 1;
- } else {
+ _currZoomLevel = item.initialZoomLevel;
+ _equalizePoints(_panOffset, item.initialPosition);
+ _applyCurrentZoomPan();
_applyBgOpacity(1);
- }
- _showOrHideTimeout = setTimeout(onComplete, duration + 20);
- } else {
+ if (fadeEverything) {
+ template.style.opacity = 1;
+ } else {
+ _applyBgOpacity(1);
+ }
- // "out" animation uses rAF only when PhotoSwipe is closed by browser scroll, to recalculate position
- var destZoomLevel = thumbBounds.w / item.w,
- initialPanOffset = {
- x: _panOffset.x,
- y: _panOffset.y
- },
- initialZoomLevel = _currZoomLevel,
- initalBgOpacity = _bgOpacity,
- onUpdate = function(now) {
-
- if(now === 1) {
- _currZoomLevel = destZoomLevel;
- _panOffset.x = thumbBounds.x;
- _panOffset.y = thumbBounds.y - _currentWindowScrollY;
- } else {
- _currZoomLevel = (destZoomLevel - initialZoomLevel) * now + initialZoomLevel;
- _panOffset.x = (thumbBounds.x - initialPanOffset.x) * now + initialPanOffset.x;
- _panOffset.y = (thumbBounds.y - _currentWindowScrollY - initialPanOffset.y) * now + initialPanOffset.y;
- }
-
- _applyCurrentZoomPan();
- if(fadeEverything) {
- template.style.opacity = 1 - now;
- } else {
- _applyBgOpacity( initalBgOpacity - now * initalBgOpacity );
- }
- };
-
- if(closeWithRaf) {
- _animateProp('initialZoom', 0, 1, duration, framework.easing.cubic.out, onUpdate, onComplete);
- } else {
- onUpdate(1);
_showOrHideTimeout = setTimeout(onComplete, duration + 20);
+ } else {
+ // "out" animation uses rAF only when PhotoSwipe is closed by browser scroll, to recalculate position
+ var destZoomLevel = thumbBounds.w / item.w,
+ initialPanOffset = {
+ x: _panOffset.x,
+ y: _panOffset.y
+ },
+ initialZoomLevel = _currZoomLevel,
+ initalBgOpacity = _bgOpacity,
+ onUpdate = function (now) {
+ if (now === 1) {
+ _currZoomLevel = destZoomLevel;
+ _panOffset.x = thumbBounds.x;
+ _panOffset.y = thumbBounds.y - _currentWindowScrollY;
+ } else {
+ _currZoomLevel = (destZoomLevel - initialZoomLevel) * now + initialZoomLevel;
+ _panOffset.x = (thumbBounds.x - initialPanOffset.x) * now + initialPanOffset.x;
+ _panOffset.y = (thumbBounds.y - _currentWindowScrollY - initialPanOffset.y) * now + initialPanOffset.y;
+ }
+
+ _applyCurrentZoomPan();
+ if (fadeEverything) {
+ template.style.opacity = 1 - now;
+ } else {
+ _applyBgOpacity(initalBgOpacity - now * initalBgOpacity);
+ }
+ };
+
+ if (closeWithRaf) {
+ _animateProp('initialZoom', 0, 1, duration, framework.easing.cubic.out, onUpdate, onComplete);
+ } else {
+ onUpdate(1);
+ _showOrHideTimeout = setTimeout(onComplete, duration + 20);
+ }
}
- }
-
- }, out ? 25 : 90); // Main purpose of this delay is to give browser time to paint and
- // create composite layers of PhotoSwipe UI parts (background, controls, caption, arrows).
- // Which avoids lag at the beginning of scale transition.
+ },
+ out ? 25 : 90
+ ); // Main purpose of this delay is to give browser time to paint and
+ // create composite layers of PhotoSwipe UI parts (background, controls, caption, arrows).
+ // Which avoids lag at the beginning of scale transition.
};
startAnimation();
-
-
};
+
/*>>show-hide-transition*/
/*>>items-controller*/
/**
-*
-* Controller manages gallery items, their dimensions, and their content.
-*
-*/
+ *
+ * Controller manages gallery items, their dimensions, and their content.
+ *
+ */
var _items,
_tempPanAreaSize = {},
@@ -2704,24 +2614,23 @@ var _items,
index: 0,
errorMsg: '',
forceProgressiveLoading: false, // TODO
- preload: [1,1],
- getNumItemsFn: function() {
+ preload: [1, 1],
+ getNumItemsFn: function () {
return _items.length;
}
};
-
var _getItemAt,
_getNumItems,
_initialIsLoop,
- _getZeroBounds = function() {
+ _getZeroBounds = function () {
return {
- center:{x:0,y:0},
- max:{x:0,y:0},
- min:{x:0,y:0}
+ center: {x: 0, y: 0},
+ max: {x: 0, y: 0},
+ min: {x: 0, y: 0}
};
},
- _calculateSingleItemPanBounds = function(item, realPanElementW, realPanElementH ) {
+ _calculateSingleItemPanBounds = function (item, realPanElementW, realPanElementH) {
var bounds = item.bounds;
// position of element when it's centered
@@ -2729,32 +2638,27 @@ var _getItemAt,
bounds.center.y = Math.round((_tempPanAreaSize.y - realPanElementH) / 2) + item.vGap.top;
// maximum pan position
- bounds.max.x = (realPanElementW > _tempPanAreaSize.x) ?
- Math.round(_tempPanAreaSize.x - realPanElementW) :
- bounds.center.x;
-
- bounds.max.y = (realPanElementH > _tempPanAreaSize.y) ?
- Math.round(_tempPanAreaSize.y - realPanElementH) + item.vGap.top :
- bounds.center.y;
-
- // minimum pan position
- bounds.min.x = (realPanElementW > _tempPanAreaSize.x) ? 0 : bounds.center.x;
- bounds.min.y = (realPanElementH > _tempPanAreaSize.y) ? item.vGap.top : bounds.center.y;
- },
- _calculateItemSize = function(item, viewportSize, zoomLevel) {
+ bounds.max.x = realPanElementW > _tempPanAreaSize.x ? Math.round(_tempPanAreaSize.x - realPanElementW) : bounds.center.x;
+ bounds.max.y =
+ realPanElementH > _tempPanAreaSize.y ? Math.round(_tempPanAreaSize.y - realPanElementH) + item.vGap.top : bounds.center.y;
+
+ // minimum pan position
+ bounds.min.x = realPanElementW > _tempPanAreaSize.x ? 0 : bounds.center.x;
+ bounds.min.y = realPanElementH > _tempPanAreaSize.y ? item.vGap.top : bounds.center.y;
+ },
+ _calculateItemSize = function (item, viewportSize, zoomLevel) {
if (item.src && !item.loadError) {
var isInitial = !zoomLevel;
-
- if(isInitial) {
- if(!item.vGap) {
- item.vGap = {top:0,bottom:0};
+
+ if (isInitial) {
+ if (!item.vGap) {
+ item.vGap = {top: 0, bottom: 0};
}
// allows overriding vertical margin for individual items
_shout('parseVerticalMargin', item);
}
-
_tempPanAreaSize.x = viewportSize.x;
_tempPanAreaSize.y = viewportSize.y - item.vGap.top - item.vGap.bottom;
@@ -2778,14 +2682,14 @@ var _getItemAt,
}
item.initialZoomLevel = zoomLevel;
-
- if(!item.bounds) {
+
+ if (!item.bounds) {
// reuse bounds object
- item.bounds = _getZeroBounds();
+ item.bounds = _getZeroBounds();
}
}
- if(!zoomLevel) {
+ if (!zoomLevel) {
return;
}
@@ -2805,29 +2709,21 @@ var _getItemAt,
// if it's not image, we return zero bounds (content is not zoomable)
return item.bounds;
}
-
},
-
-
-
-
- _appendImage = function(index, item, baseDiv, img, preventAnimation, keepPlaceholder) {
-
-
- if(item.loadError) {
+ _appendImage = function (index, item, baseDiv, img, preventAnimation, keepPlaceholder) {
+ if (item.loadError) {
return;
}
- if(img) {
-
+ if (img) {
item.imageAppended = true;
- _setImageSize(item, img, (item === self.currItem && _renderMaxResolution) );
-
+ _setImageSize(item, img, item === self.currItem && _renderMaxResolution);
+
baseDiv.appendChild(img);
- if(keepPlaceholder) {
- setTimeout(function() {
- if(item && item.loaded && item.placeholder) {
+ if (keepPlaceholder) {
+ setTimeout(function () {
+ if (item && item.loaded && item.placeholder) {
item.placeholder.style.display = 'none';
item.placeholder = null;
}
@@ -2835,18 +2731,23 @@ var _getItemAt,
}
}
},
-
-
-
- _preloadImage = function(item) {
+ _preloadImage = function (item) {
item.loading = true;
item.loaded = false;
- var img = item.img = framework.createEl('pswp__img', 'img');
- var onComplete = function() {
+ var img = (item.img = framework.createEl('pswp__img', 'img'));
+ var onComplete = function () {
item.loading = false;
item.loaded = true;
- if(item.loadComplete) {
+ // set natural image size
+ if (item.autoSize) {
+ item.w = img.naturalWidth;
+ item.h = img.naturalHeight;
+ item.autoSize = false;
+ self.updateSize();
+ }
+
+ if (item.loadComplete) {
item.loadComplete(item);
} else {
item.img = null; // no need to store image object
@@ -2855,40 +2756,51 @@ var _getItemAt,
img = null;
};
img.onload = onComplete;
- img.onerror = function() {
+ img.onerror = function () {
item.loadError = true;
onComplete();
- };
+ };
- img.src = item.src;// + '?a=' + Math.random();
+ img.src = item.src; // + '?a=' + Math.random();
return img;
},
- _checkForError = function(item, cleanUp) {
- if(item.src && item.loadError && item.container) {
-
- if(cleanUp) {
- item.container.innerHTML = '';
+ _checkForError = function (item, cleanUp) {
+ if (item.src && item.loadError && item.container) {
+ if (cleanUp) {
+ framework.resetEl(item.container);
}
- item.container.innerHTML = _options.errorMsg.replace('%url%', item.src );
+ item.container.innerHTML = _options.errorMsg.replace('%url%', item.src);
return true;
-
}
},
- _setImageSize = function(item, img, maxRes) {
- if(!item.src) {
+ _setImageSize = function (item, img, maxRes) {
+ if (!item.src) {
return;
}
- if(!img) {
+ if (!img) {
img = item.container.lastChild;
}
var w = maxRes ? item.w : Math.round(item.w * item.fitRatio),
h = maxRes ? item.h : Math.round(item.h * item.fitRatio);
-
- if(item.placeholder && !item.loaded) {
+
+ // ensure correct aspect ratio
+ if (img.naturalHeight && img.naturalWidth) {
+ var newHeight = w * (img.naturalHeight / img.naturalWidth);
+ if (newHeight > h) {
+ var newWidth = h * (img.naturalWidth / img.naturalHeight);
+ img.style.marginLeft = (w - newWidth) / 2 + 'px';
+ w = newWidth;
+ } else {
+ img.style.marginTop = (h - newHeight) / 2 + 'px';
+ h = newHeight;
+ }
+ }
+
+ if (item.placeholder && !item.loaded) {
item.placeholder.style.width = w + 'px';
item.placeholder.style.height = h + 'px';
}
@@ -2896,32 +2808,27 @@ var _getItemAt,
img.style.width = w + 'px';
img.style.height = h + 'px';
},
- _appendImagesPool = function() {
-
- if(_imagesToAppendPool.length) {
+ _appendImagesPool = function () {
+ if (_imagesToAppendPool.length) {
var poolItem;
- for(var i = 0; i < _imagesToAppendPool.length; i++) {
+ for (var i = 0; i < _imagesToAppendPool.length; i++) {
poolItem = _imagesToAppendPool[i];
- if( poolItem.holder.index === poolItem.index ) {
+ if (poolItem.holder.index === poolItem.index) {
_appendImage(poolItem.index, poolItem.item, poolItem.baseDiv, poolItem.img, false, poolItem.clearPlaceholder);
}
}
_imagesToAppendPool = [];
}
};
-
-
_registerModule('Controller', {
-
publicMethods: {
-
- lazyLoadItem: function(index) {
+ lazyLoadItem: function (index) {
index = _getLoopedId(index);
var item = _getItemAt(index);
- if(!item || ((item.loaded || item.loading) && !_itemsNeedUpdate)) {
+ if (!item || ((item.loaded || item.loading) && !_itemsNeedUpdate)) {
return;
}
@@ -2933,63 +2840,57 @@ _registerModule('Controller', {
_preloadImage(item);
},
- initController: function() {
+ initController: function () {
framework.extend(_options, _controllerDefaultOptions, true);
self.items = _items = items;
_getItemAt = self.getItemAt;
_getNumItems = _options.getNumItemsFn; //self.getNumItems;
-
-
_initialIsLoop = _options.loop;
- if(_getNumItems() < 3) {
+ if (_getNumItems() < 3) {
_options.loop = false; // disable loop if less then 3 items
}
- _listen('beforeChange', function(diff) {
-
+ _listen('beforeChange', function (diff) {
var p = _options.preload,
- isNext = diff === null ? true : (diff >= 0),
- preloadBefore = Math.min(p[0], _getNumItems() ),
- preloadAfter = Math.min(p[1], _getNumItems() ),
+ isNext = diff === null ? true : diff >= 0,
+ preloadBefore = Math.min(p[0], _getNumItems()),
+ preloadAfter = Math.min(p[1], _getNumItems()),
i;
-
- for(i = 1; i <= (isNext ? preloadAfter : preloadBefore); i++) {
- self.lazyLoadItem(_currentItemIndex+i);
+ for (i = 1; i <= (isNext ? preloadAfter : preloadBefore); i++) {
+ self.lazyLoadItem(_currentItemIndex + i);
}
- for(i = 1; i <= (isNext ? preloadBefore : preloadAfter); i++) {
- self.lazyLoadItem(_currentItemIndex-i);
+ for (i = 1; i <= (isNext ? preloadBefore : preloadAfter); i++) {
+ self.lazyLoadItem(_currentItemIndex - i);
}
});
- _listen('initialLayout', function() {
+ _listen('initialLayout', function () {
self.currItem.initialLayout = _options.getThumbBoundsFn && _options.getThumbBoundsFn(_currentItemIndex);
});
_listen('mainScrollAnimComplete', _appendImagesPool);
_listen('initialZoomInEnd', _appendImagesPool);
-
-
- _listen('destroy', function() {
+ _listen('destroy', function () {
var item;
- for(var i = 0; i < _items.length; i++) {
+ for (var i = 0; i < _items.length; i++) {
item = _items[i];
// remove reference to DOM elements, for GC
- if(item.container) {
- item.container = null;
+ if (item.container) {
+ item.container = null;
}
- if(item.placeholder) {
+ if (item.placeholder) {
item.placeholder = null;
}
- if(item.img) {
+ if (item.img) {
item.img = null;
}
- if(item.preloader) {
+ if (item.preloader) {
item.preloader = null;
}
- if(item.loadError) {
+ if (item.loadError) {
item.loaded = item.loadError = false;
}
}
@@ -2997,45 +2898,52 @@ _registerModule('Controller', {
});
},
-
- getItemAt: function(index) {
+ getItemAt: function (index) {
if (index >= 0) {
- return _items[index] !== undefined ? _items[index] : false;
+ var item = _items[index] !== undefined ? _items[index] : false;
+ if (item && item.autoSize) {
+ if (item.w == null) {
+ item.w = 0;
+ }
+ if (item.h == null) {
+ item.h = 0;
+ }
+ }
+ return item;
}
return false;
},
- allowProgressiveImg: function() {
- // 1. Progressive image loading isn't working on webkit/blink
+ allowProgressiveImg: function () {
+ // 1. Progressive image loading isn't working on webkit/blink
// when hw-acceleration (e.g. translateZ) is applied to IMG element.
// That's why in PhotoSwipe parent element gets zoom transform, not image itself.
- //
+ //
// 2. Progressive image loading sometimes blinks in webkit/blink when applying animation to parent element.
// That's why it's disabled on touch devices (mainly because of swipe transition)
- //
+ //
// 3. Progressive image loading sometimes doesn't work in IE (up to 11).
// Don't allow progressive loading on non-large touch devices
- return _options.forceProgressiveLoading || !_likelyTouchDevice || _options.mouseUsed || screen.width > 1200;
+ return _options.forceProgressiveLoading || !_likelyTouchDevice || _options.mouseUsed || screen.width > 1200;
// 1200 - to eliminate touch devices with large screen (like Chromebook Pixel)
},
- setContent: function(holder, index) {
-
- if(_options.loop) {
+ setContent: function (holder, index) {
+ if (_options.loop) {
index = _getLoopedId(index);
}
var prevItem = self.getItemAt(holder.index);
- if(prevItem) {
+ if (prevItem) {
prevItem.container = null;
}
-
+
var item = self.getItemAt(index),
img;
-
- if(!item) {
- holder.el.innerHTML = '';
+
+ if (!item) {
+ framework.resetEl(holder.el);
return;
}
@@ -3046,12 +2954,10 @@ _registerModule('Controller', {
holder.item = item;
// base container DIV is created only once for each of 3 holders
- var baseDiv = item.container = framework.createEl('pswp__zoom-wrap');
+ var baseDiv = (item.container = framework.createEl('pswp__zoom-wrap'));
-
-
- if(!item.src && item.html) {
- if(item.html.tagName) {
+ if (!item.src && item.html) {
+ if (item.html.tagName) {
baseDiv.appendChild(item.html);
} else {
baseDiv.innerHTML = item.html;
@@ -3061,45 +2967,43 @@ _registerModule('Controller', {
_checkForError(item);
_calculateItemSize(item, _viewportSize);
-
- if(item.src && !item.loadError && !item.loaded) {
-
- item.loadComplete = function(item) {
+ if (item.src && !item.loadError && !item.loaded) {
+ item.loadComplete = function (item) {
// gallery closed before image finished loading
- if(!_isOpen) {
+ if (!_isOpen) {
return;
}
// check if holder hasn't changed while image was loading
- if(holder && holder.index === index ) {
- if( _checkForError(item, true) ) {
+ if (holder && holder.index === index) {
+ if (_checkForError(item, true)) {
item.loadComplete = item.img = null;
_calculateItemSize(item, _viewportSize);
_applyZoomPanToItem(item);
- if(holder.index === _currentItemIndex) {
+ if (holder.index === _currentItemIndex) {
// recalculate dimensions
self.updateCurrZoomItem();
}
return;
}
- if( !item.imageAppended ) {
- if(_features.transform && (_mainScrollAnimating || _initialZoomRunning) ) {
+ if (!item.imageAppended) {
+ if (_features.transform && (_mainScrollAnimating || _initialZoomRunning)) {
_imagesToAppendPool.push({
- item:item,
- baseDiv:baseDiv,
- img:item.img,
- index:index,
- holder:holder,
- clearPlaceholder:true
+ item: item,
+ baseDiv: baseDiv,
+ img: item.img,
+ index: index,
+ holder: holder,
+ clearPlaceholder: true
});
} else {
_appendImage(index, item, baseDiv, item.img, _mainScrollAnimating || _initialZoomRunning, true);
}
} else {
// remove preloader & mini-img
- if(!_initialZoomRunning && item.placeholder) {
+ if (!_initialZoomRunning && item.placeholder) {
item.placeholder.style.display = 'none';
item.placeholder = null;
}
@@ -3112,47 +3016,40 @@ _registerModule('Controller', {
_shout('imageLoadComplete', index, item);
};
- if(framework.features.transform) {
-
- var placeholderClassName = 'pswp__img pswp__img--placeholder';
- placeholderClassName += (item.msrc ? '' : ' pswp__img--placeholder--blank');
+ if (framework.features.transform) {
+ var placeholderClassName = 'pswp__img pswp__img--placeholder';
+ placeholderClassName += item.msrc ? '' : ' pswp__img--placeholder--blank';
var placeholder = framework.createEl(placeholderClassName, item.msrc ? 'img' : '');
- if(item.msrc) {
+ if (item.msrc) {
placeholder.src = item.msrc;
}
-
+
_setImageSize(item, placeholder);
baseDiv.appendChild(placeholder);
item.placeholder = placeholder;
-
}
-
-
-
- if(!item.loading) {
+ if (!item.loading) {
_preloadImage(item);
}
-
- if( self.allowProgressiveImg() ) {
+ if (self.allowProgressiveImg()) {
// just append image
- if(!_initialContentSet && _features.transform) {
+ if (!_initialContentSet && _features.transform) {
_imagesToAppendPool.push({
- item:item,
- baseDiv:baseDiv,
- img:item.img,
- index:index,
- holder:holder
+ item: item,
+ baseDiv: baseDiv,
+ img: item.img,
+ index: index,
+ holder: holder
});
} else {
_appendImage(index, item, baseDiv, item.img, true, true);
}
}
-
- } else if(item.src && !item.loadError) {
+ } else if (item.src && !item.loadError) {
// image object is created every time, due to bugs of image loading & delay when switching images
img = framework.createEl('pswp__img', 'img');
img.style.opacity = 1;
@@ -3160,29 +3057,28 @@ _registerModule('Controller', {
_setImageSize(item, img);
_appendImage(index, item, baseDiv, img, true);
}
-
- if(!_initialContentSet && index === _currentItemIndex) {
+ if (!_initialContentSet && index === _currentItemIndex) {
_currZoomElementStyle = baseDiv.style;
- _showOrHide(item, (img ||item.img) );
+ _showOrHide(item, img || item.img);
} else {
_applyZoomPanToItem(item);
}
- holder.el.innerHTML = '';
+ framework.resetEl(holder.el);
holder.el.appendChild(baseDiv);
},
- cleanSlide: function( item ) {
- if(item.img ) {
+ cleanSlide: function (item) {
+ if (item.img) {
item.img.onload = item.img.onerror = null;
}
item.loaded = item.loading = item.img = item.imageAppended = false;
}
-
}
});
+
/*>>items-controller*/
/*>>tap*/
@@ -3190,73 +3086,80 @@ _registerModule('Controller', {
* tap.js:
*
* Displatches tap and double-tap events.
- *
+ *
*/
var tapTimer,
tapReleasePoint = {},
- _dispatchTapEvent = function(origEvent, releasePoint, pointerType) {
- var e = document.createEvent( 'CustomEvent' ),
+ _dispatchTapEvent = function (origEvent, releasePoint, pointerType) {
+ var e = document.createEvent('CustomEvent'),
eDetail = {
- origEvent:origEvent,
- target:origEvent.target,
- releasePoint: releasePoint,
- pointerType:pointerType || 'touch'
+ origEvent: origEvent,
+ pointerType: pointerType || 'touch',
+ releasePoint: releasePoint,
+ target: origEvent.target,
+ rightClick: pointerType === 'mouse' && origEvent.which === 3
};
- e.initCustomEvent( 'pswpTap', true, true, eDetail );
+ e.initCustomEvent('pswpTap', true, true, eDetail);
origEvent.target.dispatchEvent(e);
};
_registerModule('Tap', {
publicMethods: {
- initTap: function() {
+ initTap: function () {
_listen('firstTouchStart', self.onTapStart);
_listen('touchRelease', self.onTapRelease);
- _listen('destroy', function() {
+ _listen('destroy', function () {
tapReleasePoint = {};
tapTimer = null;
});
},
- onTapStart: function(touchList) {
- if(touchList.length > 1) {
+ onTapStart: function (touchList) {
+ if (touchList.length > 1) {
clearTimeout(tapTimer);
tapTimer = null;
}
},
- onTapRelease: function(e, releasePoint) {
- if(!releasePoint) {
+ onTapRelease: function (e, releasePoint) {
+ if (!releasePoint) {
return;
}
- if(!_moved && !_isMultitouch && !_numAnimations) {
+ if (!_moved && !_isMultitouch && !_numAnimations && self.container.contains(e.target)) {
var p0 = releasePoint;
- if(tapTimer) {
+ if (tapTimer) {
clearTimeout(tapTimer);
tapTimer = null;
// Check if taped on the same place
- if ( _isNearbyPoints(p0, tapReleasePoint) ) {
+ if (_isNearbyPoints(p0, tapReleasePoint)) {
_shout('doubleTap', p0);
return;
}
}
- if(releasePoint.type === 'mouse') {
+ if (releasePoint.type === 'mouse') {
_dispatchTapEvent(e, releasePoint, 'mouse');
return;
}
+ // Fix for share buttons zooming image.
+ // @see https://github.com/dimsemenov/PhotoSwipe/issues/1198
var clickedTagName = e.target.tagName.toUpperCase();
+ if (clickedTagName === 'A') {
+ return;
+ }
+
// avoid double tap delay on buttons and elements that have class pswp__single-tap
- if(clickedTagName === 'BUTTON' || framework.hasClass(e.target, 'pswp__single-tap') ) {
+ if (clickedTagName === 'BUTTON' || framework.hasClass(e.target, 'pswp__single-tap')) {
_dispatchTapEvent(e, releasePoint);
return;
}
_equalizePoints(tapReleasePoint, p0);
- tapTimer = setTimeout(function() {
+ tapTimer = setTimeout(function () {
_dispatchTapEvent(e, releasePoint);
tapTimer = null;
}, 300);
@@ -3265,6 +3168,7 @@ _registerModule('Tap', {
}
});
+
/*>>tap*/
/*>>desktop-zoom*/
@@ -3276,46 +3180,41 @@ _registerModule('Tap', {
* - Manages "dragging", "zoomed-in", "zoom-out" classes.
* (which are used for cursors and zoom icon)
* - Adds toggleDesktopZoom function.
- *
+ *
*/
var _wheelDelta;
-
+
_registerModule('DesktopZoom', {
-
publicMethods: {
-
- initDesktopZoom: function() {
-
- if(_oldIE) {
+ initDesktopZoom: function () {
+ if (_oldIE) {
// no zoom for old IE (<=8)
return;
}
- if(_likelyTouchDevice) {
+ if (_likelyTouchDevice) {
// if detected hardware touch support, we wait until mouse is used,
// and only then apply desktop-zoom features
- _listen('mouseUsed', function() {
+ _listen('mouseUsed', function () {
self.setupDesktopZoom();
});
} else {
self.setupDesktopZoom(true);
}
-
},
- setupDesktopZoom: function(onInit) {
-
+ setupDesktopZoom: function (onInit) {
_wheelDelta = {};
var events = 'wheel mousewheel DOMMouseScroll';
-
- _listen('bindEvents', function() {
- framework.bind(template, events, self.handleMouseWheel);
+
+ _listen('bindEvents', function () {
+ framework.bind(template, events, self.handleMouseWheel);
});
- _listen('unbindEvents', function() {
- if(_wheelDelta) {
+ _listen('unbindEvents', function () {
+ if (_wheelDelta) {
framework.unbind(template, events, self.handleMouseWheel);
}
});
@@ -3323,55 +3222,51 @@ _registerModule('DesktopZoom', {
self.mouseZoomedIn = false;
var hasDraggingClass,
- updateZoomable = function() {
- if(self.mouseZoomedIn) {
+ updateZoomable = function () {
+ if (self.mouseZoomedIn) {
framework.removeClass(template, 'pswp--zoomed-in');
self.mouseZoomedIn = false;
}
- if(_currZoomLevel < 1) {
+ if (_currZoomLevel < 1) {
framework.addClass(template, 'pswp--zoom-allowed');
} else {
framework.removeClass(template, 'pswp--zoom-allowed');
}
removeDraggingClass();
},
- removeDraggingClass = function() {
- if(hasDraggingClass) {
+ removeDraggingClass = function () {
+ if (hasDraggingClass) {
framework.removeClass(template, 'pswp--dragging');
hasDraggingClass = false;
}
};
- _listen('resize' , updateZoomable);
- _listen('afterChange' , updateZoomable);
- _listen('pointerDown', function() {
- if(self.mouseZoomedIn) {
+ _listen('resize', updateZoomable);
+ _listen('afterChange', updateZoomable);
+ _listen('pointerDown', function () {
+ if (self.mouseZoomedIn) {
hasDraggingClass = true;
framework.addClass(template, 'pswp--dragging');
}
});
_listen('pointerUp', removeDraggingClass);
- if(!onInit) {
+ if (!onInit) {
updateZoomable();
}
-
},
- handleMouseWheel: function(e) {
-
- if(_currZoomLevel <= self.currItem.fitRatio) {
- if( _options.modal ) {
-
+ handleMouseWheel: function (e) {
+ if (_currZoomLevel <= self.currItem.fitRatio) {
+ if (_options.modal) {
if (!_options.closeOnScroll || _numAnimations || _isDragging) {
e.preventDefault();
- } else if(_transformKey && Math.abs(e.deltaY) > 2) {
+ } else if (_transformKey && Math.abs(e.deltaY) > 2) {
// close PhotoSwipe
// if browser supports transforms & scroll changed enough
_closedByScroll = true;
self.close();
}
-
}
return true;
}
@@ -3382,8 +3277,8 @@ _registerModule('DesktopZoom', {
// https://developer.mozilla.org/en-US/docs/Web/Events/wheel
_wheelDelta.x = 0;
- if('deltaX' in e) {
- if(e.deltaMode === 1 /* DOM_DELTA_LINE */) {
+ if ('deltaX' in e) {
+ if (e.deltaMode === 1 /* DOM_DELTA_LINE */) {
// 18 - average line height
_wheelDelta.x = e.deltaX * 18;
_wheelDelta.y = e.deltaY * 18;
@@ -3391,16 +3286,16 @@ _registerModule('DesktopZoom', {
_wheelDelta.x = e.deltaX;
_wheelDelta.y = e.deltaY;
}
- } else if('wheelDelta' in e) {
- if(e.wheelDeltaX) {
+ } else if ('wheelDelta' in e) {
+ if (e.wheelDeltaX) {
_wheelDelta.x = -0.16 * e.wheelDeltaX;
}
- if(e.wheelDeltaY) {
+ if (e.wheelDeltaY) {
_wheelDelta.y = -0.16 * e.wheelDeltaY;
} else {
_wheelDelta.y = -0.16 * e.wheelDelta;
}
- } else if('detail' in e) {
+ } else if ('detail' in e) {
_wheelDelta.y = e.detail;
} else {
return;
@@ -3412,11 +3307,13 @@ _registerModule('DesktopZoom', {
newPanY = _panOffset.y - _wheelDelta.y;
// only prevent scrolling in nonmodal mode when not at edges
- if (_options.modal ||
- (
- newPanX <= _currPanBounds.min.x && newPanX >= _currPanBounds.max.x &&
- newPanY <= _currPanBounds.min.y && newPanY >= _currPanBounds.max.y
- ) ) {
+ if (
+ _options.modal ||
+ (newPanX <= _currPanBounds.min.x &&
+ newPanX >= _currPanBounds.max.x &&
+ newPanY <= _currPanBounds.min.y &&
+ newPanY >= _currPanBounds.max.y)
+ ) {
e.preventDefault();
}
@@ -3424,18 +3321,17 @@ _registerModule('DesktopZoom', {
self.panTo(newPanX, newPanY);
},
- toggleDesktopZoom: function(centerPoint) {
- centerPoint = centerPoint || {x:_viewportSize.x/2 + _offset.x, y:_viewportSize.y/2 + _offset.y };
+ toggleDesktopZoom: function (centerPoint) {
+ centerPoint = centerPoint || {x: _viewportSize.x / 2 + _offset.x, y: _viewportSize.y / 2 + _offset.y};
var doubleTapZoomLevel = _options.getDoubleTapZoom(true, self.currItem);
var zoomOut = _currZoomLevel === doubleTapZoomLevel;
-
+
self.mouseZoomedIn = !zoomOut;
self.zoomTo(zoomOut ? self.currItem.initialZoomLevel : doubleTapZoomLevel, centerPoint, 333);
- framework[ (!zoomOut ? 'add' : 'remove') + 'Class'](template, 'pswp--zoomed-in');
+ framework[(!zoomOut ? 'add' : 'remove') + 'Class'](template, 'pswp--zoomed-in');
}
-
}
});
@@ -3448,15 +3344,14 @@ _registerModule('DesktopZoom', {
* history.js:
*
* - Back button to close gallery.
- *
+ *
* - Unique URL for each slide: example.com/&pid=1&gid=3
* (where PID is picture index, and GID and gallery index)
- *
+ *
* - Switch URL when slides change.
- *
+ *
*/
-
var _historyDefaultOptions = {
history: true,
galleryUID: 1
@@ -3473,257 +3368,220 @@ var _historyUpdateTimeout,
_closedFromURL,
_urlChangedOnce,
_windowLoc,
-
_supportsPushState,
-
- _getHash = function() {
+ _getHash = function () {
return _windowLoc.hash.substring(1);
},
- _cleanHistoryTimeouts = function() {
-
- if(_historyUpdateTimeout) {
+ _cleanHistoryTimeouts = function () {
+ if (_historyUpdateTimeout) {
clearTimeout(_historyUpdateTimeout);
}
- if(_hashAnimCheckTimeout) {
+ if (_hashAnimCheckTimeout) {
clearTimeout(_hashAnimCheckTimeout);
}
},
-
// pid - Picture index
// gid - Gallery index
- _parseItemIndexFromURL = function() {
+ _parseItemIndexFromURL = function () {
var hash = _getHash(),
params = {};
- if(hash.length < 5) { // pid=1
+ if (hash.length < 5) {
+ // pid=1
return params;
}
- var i, vars = hash.split('&');
+ var i,
+ vars = hash.split('&');
for (i = 0; i < vars.length; i++) {
- if(!vars[i]) {
+ if (!vars[i]) {
continue;
}
- var pair = vars[i].split('=');
- if(pair.length < 2) {
+ var pair = vars[i].split('=');
+ if (pair.length < 2) {
continue;
}
params[pair[0]] = pair[1];
}
- if(_options.galleryPIDs) {
+ if (_options.galleryPIDs) {
// detect custom pid in hash and search for it among the items collection
var searchfor = params.pid;
params.pid = 0; // if custom pid cannot be found, fallback to the first item
- for(i = 0; i < _items.length; i++) {
- if(_items[i].pid === searchfor) {
+ for (i = 0; i < _items.length; i++) {
+ if (_items[i].pid === searchfor) {
params.pid = i;
break;
}
}
} else {
- params.pid = parseInt(params.pid,10)-1;
+ params.pid = parseInt(params.pid, 10) - 1;
}
- if( params.pid < 0 ) {
+ if (params.pid < 0) {
params.pid = 0;
}
return params;
},
- _updateHash = function() {
-
- if(_hashAnimCheckTimeout) {
+ _updateHash = function () {
+ if (_hashAnimCheckTimeout) {
clearTimeout(_hashAnimCheckTimeout);
}
-
- if(_numAnimations || _isDragging) {
+ if (_numAnimations || _isDragging) {
// changing browser URL forces layout/paint in some browsers, which causes noticable lag during animation
// that's why we update hash only when no animations running
_hashAnimCheckTimeout = setTimeout(_updateHash, 500);
return;
}
-
- if(_hashChangedByScript) {
+
+ if (_hashChangedByScript) {
clearTimeout(_hashChangeTimeout);
} else {
_hashChangedByScript = true;
}
-
- var pid = (_currentItemIndex + 1);
- var item = _getItemAt( _currentItemIndex );
- if(item.hasOwnProperty('pid')) {
+ var pid = _currentItemIndex + 1;
+ var item = _getItemAt(_currentItemIndex);
+ if (item.hasOwnProperty('pid')) {
// carry forward any custom pid assigned to the item
pid = item.pid;
}
- var newHash = _initialHash + '&' + 'gid=' + _options.galleryUID + '&' + 'pid=' + pid;
+ var newHash = _initialHash + '&' + 'gid=' + _options.galleryUID + '&' + 'pid=' + pid;
- if(!_historyChanged) {
- if(_windowLoc.hash.indexOf(newHash) === -1) {
+ if (!_historyChanged) {
+ if (_windowLoc.hash.indexOf(newHash) === -1) {
_urlChangedOnce = true;
}
// first time - add new hisory record, then just replace
}
- var newURL = _windowLoc.href.split('#')[0] + '#' + newHash;
+ var newURL = _windowLoc.href.split('#')[0] + '#' + newHash;
- if( _supportsPushState ) {
-
- if('#' + newHash !== window.location.hash) {
+ if (_supportsPushState) {
+ if ('#' + newHash !== window.location.hash) {
history[_historyChanged ? 'replaceState' : 'pushState']('', document.title, newURL);
}
-
} else {
- if(_historyChanged) {
- _windowLoc.replace( newURL );
+ if (_historyChanged) {
+ _windowLoc.replace(newURL);
} else {
_windowLoc.hash = newHash;
}
}
-
-
_historyChanged = true;
- _hashChangeTimeout = setTimeout(function() {
+ _hashChangeTimeout = setTimeout(function () {
_hashChangedByScript = false;
}, 60);
};
-
-
-
-
_registerModule('History', {
-
-
-
publicMethods: {
- initHistory: function() {
-
+ initHistory: function () {
framework.extend(_options, _historyDefaultOptions, true);
- if( !_options.history ) {
+ if (!_options.history) {
return;
}
-
_windowLoc = window.location;
_urlChangedOnce = false;
_closedFromURL = false;
_historyChanged = false;
_initialHash = _getHash();
- _supportsPushState = ('pushState' in history);
+ _supportsPushState = 'pushState' in history;
-
- if(_initialHash.indexOf('gid=') > -1) {
+ if (_initialHash.indexOf('gid=') > -1) {
_initialHash = _initialHash.split('&gid=')[0];
_initialHash = _initialHash.split('?gid=')[0];
}
-
_listen('afterChange', self.updateURL);
- _listen('unbindEvents', function() {
+ _listen('unbindEvents', function () {
framework.unbind(window, 'hashchange', self.onHashChange);
});
-
- var returnToOriginal = function() {
+ var returnToOriginal = function () {
_hashReseted = true;
- if(!_closedFromURL) {
-
- if(_urlChangedOnce) {
+ if (!_closedFromURL) {
+ if (_urlChangedOnce) {
history.back();
} else {
-
- if(_initialHash) {
+ if (_initialHash) {
_windowLoc.hash = _initialHash;
} else {
if (_supportsPushState) {
-
// remove hash from url without refreshing it or scrolling to top
- history.pushState('', document.title, _windowLoc.pathname + _windowLoc.search );
+ history.pushState('', document.title, _windowLoc.pathname + _windowLoc.search);
} else {
_windowLoc.hash = '';
}
}
}
-
}
_cleanHistoryTimeouts();
};
-
- _listen('unbindEvents', function() {
- if(_closedByScroll) {
+ _listen('unbindEvents', function () {
+ if (_closedByScroll) {
// if PhotoSwipe is closed by scroll, we go "back" before the closing animation starts
// this is done to keep the scroll position
returnToOriginal();
}
});
- _listen('destroy', function() {
- if(!_hashReseted) {
+ _listen('destroy', function () {
+ if (!_hashReseted) {
returnToOriginal();
}
});
- _listen('firstUpdate', function() {
+ _listen('firstUpdate', function () {
_currentItemIndex = _parseItemIndexFromURL().pid;
});
-
-
-
var index = _initialHash.indexOf('pid=');
- if(index > -1) {
+ if (index > -1) {
_initialHash = _initialHash.substring(0, index);
- if(_initialHash.slice(-1) === '&') {
+ if (_initialHash.slice(-1) === '&') {
_initialHash = _initialHash.slice(0, -1);
}
}
-
- setTimeout(function() {
- if(_isOpen) { // hasn't destroyed yet
+ setTimeout(function () {
+ if (_isOpen) {
+ // hasn't destroyed yet
framework.bind(window, 'hashchange', self.onHashChange);
}
}, 40);
-
},
- onHashChange: function() {
-
- if(_getHash() === _initialHash) {
-
+ onHashChange: function () {
+ if (_getHash() === _initialHash) {
_closedFromURL = true;
self.close();
return;
}
- if(!_hashChangedByScript) {
-
+ if (!_hashChangedByScript) {
_hashChangedByHistory = true;
- self.goTo( _parseItemIndexFromURL().pid );
+ self.goTo(_parseItemIndexFromURL().pid);
_hashChangedByHistory = false;
}
-
},
- updateURL: function() {
-
- // Delay the update of URL, to avoid lag during transition,
+ updateURL: function () {
+ // Delay the update of URL, to avoid lag during transition,
// and to not to trigger actions like "refresh page sound" or "blinking favicon" to often
-
- _cleanHistoryTimeouts();
-
- if(_hashChangedByHistory) {
+ _cleanHistoryTimeouts();
+
+ if (_hashChangedByHistory) {
return;
}
- if(!_historyChanged) {
+ if (!_historyChanged) {
_updateHash(); // first time
} else {
_historyUpdateTimeout = setTimeout(_updateHash, 800);
}
}
-
}
});
diff --git a/sigal/themes/photoswipe/static/photoswipe.min.js b/sigal/themes/photoswipe/static/photoswipe.min.js
index 0370861..0e6d560 100644
--- a/sigal/themes/photoswipe/static/photoswipe.min.js
+++ b/sigal/themes/photoswipe/static/photoswipe.min.js
@@ -1,4 +1 @@
-/*! PhotoSwipe - v4.1.3 - 2019-01-08
-* http://photoswipe.com
-* Copyright (c) 2019 Dmitry Semenov; */
-!function(a,b){"function"==typeof define&&define.amd?define(b):"object"==typeof exports?module.exports=b():a.PhotoSwipe=b()}(this,function(){"use strict";var a=function(a,b,c,d){var e={features:null,bind:function(a,b,c,d){var e=(d?"remove":"add")+"EventListener";b=b.split(" ");for(var f=0;f0&&(g=parseInt(g[1],10),g>=1&&g<8&&(d.isOldIOSPhone=!0))}var h=f.match(/Android\s([0-9\.]*)/),i=h?h[1]:0;i=parseFloat(i),i>=1&&(i<4.4&&(d.isOldAndroid=!0),d.androidVersion=i),d.isMobileOpera=/opera mini|opera mobi/i.test(f)}for(var j,k,l=["transform","perspective","animationName"],m=["","webkit","Moz","ms","O"],n=0;n<4;n++){c=m[n];for(var o=0;o<3;o++)j=l[o],k=c+(c?j.charAt(0).toUpperCase()+j.slice(1):j),!d[j]&&k in b&&(d[j]=k);c&&!d.raf&&(c=c.toLowerCase(),d.raf=window[c+"RequestAnimationFrame"],d.raf&&(d.caf=window[c+"CancelAnimationFrame"]||window[c+"CancelRequestAnimationFrame"]))}if(!d.raf){var p=0;d.raf=function(a){var b=(new Date).getTime(),c=Math.max(0,16-(b-p)),d=window.setTimeout(function(){a(b+c)},c);return p=b+c,d},d.caf=function(a){clearTimeout(a)}}return d.svg=!!document.createElementNS&&!!document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect,e.features=d,d}};e.detectFeatures(),e.features.oldIE&&(e.bind=function(a,b,c,d){b=b.split(" ");for(var e,f=(d?"detach":"attach")+"Event",g=function(){c.handleEvent.call(c)},h=0;hb-1?a-b:a<0?b+a:a},Ba={},Ca=function(a,b){return Ba[a]||(Ba[a]=[]),Ba[a].push(b)},Da=function(a){var b=Ba[a];if(b){var c=Array.prototype.slice.call(arguments);c.shift();for(var d=0;df.currItem.fitRatio?ya||(mc(f.currItem,!1,!0),ya=!0):ya&&(mc(f.currItem),ya=!1)),Ga(ea,pa.x,pa.y,s))},Ia=function(a){a.container&&Ga(a.container.style,a.initialPosition.x,a.initialPosition.y,a.initialZoomLevel,a)},Ja=function(a,b){b[E]=u+a+"px, 0px"+v},Ka=function(a,b){if(!i.loop&&b){var c=m+(ta.x*ra-a)/ta.x,d=Math.round(a-tb.x);(c<0&&d>0||c>=ac()-1&&d<0)&&(a=tb.x+d*i.mainScrollEndFriction)}tb.x=a,Ja(a,n)},La=function(a,b){var c=ub[a]-sa[a];return oa[a]+na[a]+c-c*(b/t)},Ma=function(a,b){a.x=b.x,a.y=b.y,b.id&&(a.id=b.id)},Na=function(a){a.x=Math.round(a.x),a.y=Math.round(a.y)},Oa=null,Pa=function(){Oa&&(e.unbind(document,"mousemove",Pa),e.addClass(a,"pswp--has_mouse"),i.mouseUsed=!0,Da("mouseUsed")),Oa=setTimeout(function(){Oa=null},100)},Qa=function(){e.bind(document,"keydown",f),N.transform&&e.bind(f.scrollWrap,"click",f),i.mouseUsed||e.bind(document,"mousemove",Pa),e.bind(window,"resize scroll orientationchange",f),Da("bindEvents")},Ra=function(){e.unbind(window,"resize scroll orientationchange",f),e.unbind(window,"scroll",r.scroll),e.unbind(document,"keydown",f),e.unbind(document,"mousemove",Pa),N.transform&&e.unbind(f.scrollWrap,"click",f),V&&e.unbind(window,p,f),clearTimeout(O),Da("unbindEvents")},Sa=function(a,b){var c=ic(f.currItem,qa,a);return b&&(da=c),c},Ta=function(a){return a||(a=f.currItem),a.initialZoomLevel},Ua=function(a){return a||(a=f.currItem),a.w>0?i.maxSpreadZoom:1},Va=function(a,b,c,d){return d===f.currItem.initialZoomLevel?(c[a]=f.currItem.initialPosition[a],!0):(c[a]=La(a,d),c[a]>b.min[a]?(c[a]=b.min[a],!0):c[a]1?1:a.fitRatio,c=a.container.style,d=b*a.w,e=b*a.h;c.width=d+"px",c.height=e+"px",c.left=a.initialPosition.x+"px",c.top=a.initialPosition.y+"px"},Ha=function(){if(ea){var a=ea,b=f.currItem,c=b.fitRatio>1?1:b.fitRatio,d=c*b.w,e=c*b.h;a.width=d+"px",a.height=e+"px",a.left=pa.x+"px",a.top=pa.y+"px"}}},Xa=function(a){var b="";i.escKey&&27===a.keyCode?b="close":i.arrowKeys&&(37===a.keyCode?b="prev":39===a.keyCode&&(b="next")),b&&(a.ctrlKey||a.altKey||a.shiftKey||a.metaKey||(a.preventDefault?a.preventDefault():a.returnValue=!1,f[b]()))},Ya=function(a){a&&(Y||X||fa||T)&&(a.preventDefault(),a.stopPropagation())},Za=function(){f.setScrollOffset(0,e.getScrollY())},$a={},_a=0,ab=function(a){$a[a]&&($a[a].raf&&I($a[a].raf),_a--,delete $a[a])},bb=function(a){$a[a]&&ab(a),$a[a]||(_a++,$a[a]={})},cb=function(){for(var a in $a)$a.hasOwnProperty(a)&&ab(a)},db=function(a,b,c,d,e,f,g){var h,i=Ea();bb(a);var j=function(){if($a[a]){if(h=Ea()-i,h>=d)return ab(a),f(c),void(g&&g());f((c-b)*e(h/d)+b),$a[a].raf=H(j)}};j()},eb={shout:Da,listen:Ca,viewportSize:qa,options:i,isMainScrollAnimating:function(){return fa},getZoomLevel:function(){return s},getCurrentIndex:function(){return m},isDragging:function(){return V},isZooming:function(){return aa},setScrollOffset:function(a,b){sa.x=a,M=sa.y=b,Da("updateScrollOffset",sa)},applyZoomPan:function(a,b,c,d){pa.x=b,pa.y=c,s=a,Ha(d)},init:function(){if(!j&&!k){var c;f.framework=e,f.template=a,f.bg=e.getChildByClass(a,"pswp__bg"),J=a.className,j=!0,N=e.detectFeatures(),H=N.raf,I=N.caf,E=N.transform,L=N.oldIE,f.scrollWrap=e.getChildByClass(a,"pswp__scroll-wrap"),f.container=e.getChildByClass(f.scrollWrap,"pswp__container"),n=f.container.style,f.itemHolders=y=[{el:f.container.children[0],wrap:0,index:-1},{el:f.container.children[1],wrap:0,index:-1},{el:f.container.children[2],wrap:0,index:-1}],y[0].el.style.display=y[2].el.style.display="none",Wa(),r={resize:f.updateSize,orientationchange:function(){clearTimeout(O),O=setTimeout(function(){qa.x!==f.scrollWrap.clientWidth&&f.updateSize()},500)},scroll:Za,keydown:Xa,click:Ya};var d=N.isOldIOSPhone||N.isOldAndroid||N.isMobileOpera;for(N.animationName&&N.transform&&!d||(i.showAnimationDuration=i.hideAnimationDuration=0),c=0;c=ac())&&(m=0),f.currItem=_b(m),(N.isOldIOSPhone||N.isOldAndroid)&&(va=!1),a.setAttribute("aria-hidden","false"),i.modal&&(va?a.style.position="fixed":(a.style.position="absolute",a.style.top=e.getScrollY()+"px")),void 0===M&&(Da("initialLayout"),M=K=e.getScrollY());var l="pswp--open ";for(i.mainClass&&(l+=i.mainClass+" "),i.showHideOpacity&&(l+="pswp--animate_opacity "),l+=G?"pswp--touch":"pswp--notouch",l+=N.animationName?" pswp--css_animation":"",l+=N.svg?" pswp--svg":"",e.addClass(a,l),f.updateSize(),o=-1,ua=null,c=0;cda.min.x?a=da.min.x:ada.min.y?b=da.min.y:b=h&&(o+=ua+(ua>0?-h:h),c=h);for(var d=0;d0?(b=y.shift(),y[h-1]=b,o++,Ja((o+2)*ta.x,b.el.style),f.setContent(b,m-c+d+1+1)):(b=y.pop(),y.unshift(b),o--,Ja(o*ta.x,b.el.style),f.setContent(b,m+c-d-1-1));if(ea&&1===Math.abs(ua)){var e=_b(z);e.initialZoomLevel!==s&&(ic(e,qa),mc(e),Ia(e))}ua=0,f.updateCurrZoomItem(),z=m,Da("afterChange")}}},updateSize:function(b){if(!va&&i.modal){var c=e.getScrollY();if(M!==c&&(a.style.top=c+"px",M=c),!b&&xa.x===window.innerWidth&&xa.y===window.innerHeight)return;xa.x=window.innerWidth,xa.y=window.innerHeight,a.style.height=xa.y+"px"}if(qa.x=f.scrollWrap.clientWidth,qa.y=f.scrollWrap.clientHeight,Za(),ta.x=qa.x+Math.round(qa.x*i.spacing),ta.y=qa.y,Ka(ta.x*ra),Da("beforeResize"),void 0!==o){for(var d,g,j,k=0;k2&&(j=Aa(j)),g=_b(j),g&&(x||g.needsUpdate||!g.bounds)?(f.cleanSlide(g),f.setContent(d,j),1===k&&(f.currItem=g,f.updateCurrZoomItem(!0)),g.needsUpdate=!1):d.index===-1&&j>=0&&f.setContent(d,j),g&&g.container&&(ic(g,qa),mc(g),Ia(g));x=!1}t=s=f.currItem.initialZoomLevel,da=f.currItem.bounds,da&&(pa.x=da.center.x,pa.y=da.center.y,Ha(!0)),Da("resize")},zoomTo:function(a,b,c,d,f){b&&(t=s,ub.x=Math.abs(b.x)-pa.x,ub.y=Math.abs(b.y)-pa.y,Ma(oa,pa));var g=Sa(a,!1),h={};Va("x",g,h,a),Va("y",g,h,a);var i=s,j={x:pa.x,y:pa.y};Na(h);var k=function(b){1===b?(s=a,pa.x=h.x,pa.y=h.y):(s=(a-i)*b+i,pa.x=(h.x-j.x)*b+j.x,pa.y=(h.y-j.y)*b+j.y),f&&f(b),Ha(1===b)};c?db("customZoomTo",0,1,c,d||e.easing.sine.inOut,k):k(1)}},fb=30,gb=10,hb={},ib={},jb={},kb={},lb={},mb=[],nb={},ob=[],pb={},qb=0,rb=ma(),sb=0,tb=ma(),ub=ma(),vb=ma(),wb=function(a,b){return a.x===b.x&&a.y===b.y},xb=function(a,b){return Math.abs(a.x-b.x)-1)&&(b(a)?a:Cb(a.parentNode,b)))},Db={},Eb=function(a,b){return Db.prevent=!Cb(a.target,i.isClickableElement),Da("preventDragEvent",a,b,Db),Db.prevent},Fb=function(a,b){return b.x=a.pageX,b.y=a.pageY,b.id=a.identifier,b},Gb=function(a,b,c){c.x=.5*(a.x+b.x),c.y=.5*(a.y+b.y)},Hb=function(a,b,c){if(a-Q>50){var d=ob.length>2?ob.shift():{};d.x=b,d.y=c,ob.push(d),Q=a}},Ib=function(){var a=pa.y-f.currItem.initialPosition.y;return 1-Math.abs(a/(qa.y/2))},Jb={},Kb={},Lb=[],Mb=function(a){for(;Lb.length>0;)Lb.pop();return F?(la=0,mb.forEach(function(a){0===la?Lb[0]=a:1===la&&(Lb[1]=a),la++})):a.type.indexOf("touch")>-1?a.touches&&a.touches.length>0&&(Lb[0]=Fb(a.touches[0],Jb),a.touches.length>1&&(Lb[1]=Fb(a.touches[1],Kb))):(Jb.x=a.pageX,Jb.y=a.pageY,Jb.id="",Lb[0]=Jb),Lb},Nb=function(a,b){var c,d,e,g,h=0,j=pa[a]+b[a],k=b[a]>0,l=tb.x+b.x,m=tb.x-nb.x;return c=j>da.min[a]||jda.min[a]&&(c=i.panEndFriction,h=da.min[a]-j,d=da.min[a]-oa[a]),(d<=0||m<0)&&ac()>1?(g=l,m<0&&l>nb.x&&(g=nb.x)):da.min.x!==da.max.x&&(e=j)):(j0)&&ac()>1?(g=l,m>0&&lf.currItem.fitRatio&&(pa[a]+=b[a]*c)):(void 0!==g&&(Ka(g,!0),$=g!==nb.x),da.min.x!==da.max.x&&(void 0!==e?pa.x=e:$||(pa.x+=b.x*c)),void 0!==g)},Ob=function(a){if(!("mousedown"===a.type&&a.button>0)){if($b)return void a.preventDefault();if(!U||"mousedown"!==a.type){if(Eb(a,!0)&&a.preventDefault(),Da("pointerDown"),F){var b=e.arraySearch(mb,a.pointerId,"id");b<0&&(b=mb.length),mb[b]={x:a.pageX,y:a.pageY,id:a.pointerId}}var c=Mb(a),d=c.length;_=null,cb(),V&&1!==d||(V=ha=!0,e.bind(window,p,f),S=ka=ia=T=$=Y=W=X=!1,ga=null,Da("firstTouchStart",c),Ma(oa,pa),na.x=na.y=0,Ma(kb,c[0]),Ma(lb,kb),nb.x=ta.x*ra,ob=[{x:kb.x,y:kb.y}],Q=P=Ea(),Sa(s,!0),zb(),Ab()),!aa&&d>1&&!fa&&!$&&(t=s,X=!1,aa=W=!0,na.y=na.x=0,Ma(oa,pa),Ma(hb,c[0]),Ma(ib,c[1]),Gb(hb,ib,vb),ub.x=Math.abs(vb.x)-pa.x,ub.y=Math.abs(vb.y)-pa.y,ba=ca=yb(hb,ib))}}},Pb=function(a){if(a.preventDefault(),F){var b=e.arraySearch(mb,a.pointerId,"id");if(b>-1){var c=mb[b];c.x=a.pageX,c.y=a.pageY}}if(V){var d=Mb(a);if(ga||Y||aa)_=d;else if(tb.x!==ta.x*ra)ga="h";else{var f=Math.abs(d[0].x-kb.x)-Math.abs(d[0].y-kb.y);Math.abs(f)>=gb&&(ga=f>0?"h":"v",_=d)}}},Qb=function(){if(_){var a=_.length;if(0!==a)if(Ma(hb,_[0]),jb.x=hb.x-kb.x,jb.y=hb.y-kb.y,aa&&a>1){if(kb.x=hb.x,kb.y=hb.y,!jb.x&&!jb.y&&wb(_[1],ib))return;Ma(ib,_[1]),X||(X=!0,Da("zoomGestureStarted"));var b=yb(hb,ib),c=Vb(b);c>f.currItem.initialZoomLevel+f.currItem.initialZoomLevel/15&&(ka=!0);var d=1,e=Ta(),g=Ua();if(c1&&(d=1),c=e-d*(e/3);else c>g&&(d=(c-g)/(6*e),d>1&&(d=1),c=g+d*e);d<0&&(d=0),ba=b,Gb(hb,ib,rb),na.x+=rb.x-vb.x,na.y+=rb.y-vb.y,Ma(vb,rb),pa.x=La("x",c),pa.y=La("y",c),S=c>s,s=c,Ha()}else{if(!ga)return;if(ha&&(ha=!1,Math.abs(jb.x)>=gb&&(jb.x-=_[0].x-lb.x),Math.abs(jb.y)>=gb&&(jb.y-=_[0].y-lb.y)),kb.x=hb.x,kb.y=hb.y,0===jb.x&&0===jb.y)return;if("v"===ga&&i.closeOnVerticalDrag&&!Bb()){na.y+=jb.y,pa.y+=jb.y;var k=Ib();return T=!0,Da("onVerticalDrag",k),Fa(k),void Ha()}Hb(Ea(),hb.x,hb.y),Y=!0,da=f.currItem.bounds;var l=Nb("x",jb);l||(Nb("y",jb),Na(pa),Ha())}}},Rb=function(a){if(N.isOldAndroid){if(U&&"mouseup"===a.type)return;a.type.indexOf("touch")>-1&&(clearTimeout(U),U=setTimeout(function(){U=0},600))}Da("pointerUp"),Eb(a,!1)&&a.preventDefault();var b;if(F){var c=e.arraySearch(mb,a.pointerId,"id");if(c>-1)if(b=mb.splice(c,1)[0],navigator.msPointerEnabled){var d={4:"mouse",2:"touch",3:"pen"};b.type=d[a.pointerType],b.type||(b.type=a.pointerType||"mouse")}else b.type=a.pointerType||"mouse"}var g,h=Mb(a),j=h.length;if("mouseup"===a.type&&(j=0),2===j)return _=null,!0;1===j&&Ma(lb,h[0]),0!==j||ga||fa||(b||("mouseup"===a.type?b={x:a.pageX,y:a.pageY,type:"mouse"}:a.changedTouches&&a.changedTouches[0]&&(b={x:a.changedTouches[0].pageX,y:a.changedTouches[0].pageY,type:"touch"})),Da("touchRelease",a,b));var k=-1;if(0===j&&(V=!1,e.unbind(window,p,f),zb(),aa?k=0:sb!==-1&&(k=Ea()-sb)),sb=1===j?Ea():-1,g=k!==-1&&k<150?"zoom":"swipe",aa&&j<2&&(aa=!1,1===j&&(g="zoomPointerUp"),Da("zoomGestureEnded")),_=null,Y||X||fa||T)if(cb(),R||(R=Sb()),R.calculateSwipeSpeed("x"),T){var l=Ib();if(lf.currItem.fitRatio&&Tb(R))}},Sb=function(){var a,b,c={lastFlickOffset:{},lastFlickDist:{},lastFlickSpeed:{},slowDownRatio:{},slowDownRatioReverse:{},speedDecelerationRatio:{},speedDecelerationRatioAbs:{},distanceOffset:{},backAnimDestination:{},backAnimStarted:{},calculateSwipeSpeed:function(d){ob.length>1?(a=Ea()-Q+50,b=ob[ob.length-2][d]):(a=Ea()-P,b=lb[d]),c.lastFlickOffset[d]=kb[d]-b,c.lastFlickDist[d]=Math.abs(c.lastFlickOffset[d]),c.lastFlickDist[d]>20?c.lastFlickSpeed[d]=c.lastFlickOffset[d]/a:c.lastFlickSpeed[d]=0,Math.abs(c.lastFlickSpeed[d])<.1&&(c.lastFlickSpeed[d]=0),c.slowDownRatio[d]=.95,c.slowDownRatioReverse[d]=1-c.slowDownRatio[d],c.speedDecelerationRatio[d]=1},calculateOverBoundsAnimOffset:function(a,b){c.backAnimStarted[a]||(pa[a]>da.min[a]?c.backAnimDestination[a]=da.min[a]:pa[a]fb&&(h||b.lastFlickOffset.x>20)?d=-1:g<-fb&&(h||b.lastFlickOffset.x<-20)&&(d=1)}var j;d&&(m+=d,m<0?(m=i.loop?ac()-1:0,j=!0):m>=ac()&&(m=i.loop?0:ac()-1,j=!0),j&&!i.loop||(ua+=d,ra-=d,c=!0));var k,l=ta.x*ra,n=Math.abs(l-tb.x);return c||l>tb.x==b.lastFlickSpeed.x>0?(k=Math.abs(b.lastFlickSpeed.x)>0?n/Math.abs(b.lastFlickSpeed.x):333,k=Math.min(k,400),k=Math.max(k,250)):k=333,qb===m&&(c=!1),fa=!0,Da("mainScrollAnimStart"),db("mainScroll",tb.x,l,k,e.easing.cubic.out,Ka,function(){cb(),fa=!1,qb=-1,(c||qb!==m)&&f.updateCurrItem(),Da("mainScrollAnimComplete")}),c&&f.updateCurrItem(!0),c},Vb=function(a){return 1/ca*a*t},Wb=function(){var a=s,b=Ta(),c=Ua();sc&&(a=c);var d,g=1,h=ja;return ia&&!S&&!ka&&s1||navigator.msMaxTouchPoints>1),f.likelyTouchDevice=G,r[A]=Ob,r[B]=Pb,r[C]=Rb,D&&(r[D]=r[C]),N.touch&&(q+=" mousedown",p+=" mousemove mouseup",r.mousedown=r[A],r.mousemove=r[B],r.mouseup=r[C]),G||(i.allowPanToNext=!1)}}});var Xb,Yb,Zb,$b,_b,ac,bc,cc=function(b,c,d,g){Xb&&clearTimeout(Xb),$b=!0,Zb=!0;var h;b.initialLayout?(h=b.initialLayout,b.initialLayout=null):h=i.getThumbBoundsFn&&i.getThumbBoundsFn(m);var j=d?i.hideAnimationDuration:i.showAnimationDuration,k=function(){ab("initialZoom"),d?(f.template.removeAttribute("style"),f.bg.removeAttribute("style")):(Fa(1),c&&(c.style.display="block"),e.addClass(a,"pswp--animated-in"),Da("initialZoom"+(d?"OutEnd":"InEnd"))),g&&g(),$b=!1};if(!j||!h||void 0===h.x)return Da("initialZoom"+(d?"Out":"In")),s=b.initialZoomLevel,Ma(pa,b.initialPosition),Ha(),a.style.opacity=d?0:1,Fa(1),void(j?setTimeout(function(){k()},j):k());var n=function(){var c=l,g=!f.currItem.src||f.currItem.loadError||i.showHideOpacity;b.miniImg&&(b.miniImg.style.webkitBackfaceVisibility="hidden"),d||(s=h.w/b.w,pa.x=h.x,pa.y=h.y-K,f[g?"template":"bg"].style.opacity=.001,Ha()),bb("initialZoom"),d&&!c&&e.removeClass(a,"pswp--animated-in"),g&&(d?e[(c?"remove":"add")+"Class"](a,"pswp--animate_opacity"):setTimeout(function(){e.addClass(a,"pswp--animate_opacity")},30)),Xb=setTimeout(function(){if(Da("initialZoom"+(d?"Out":"In")),d){var f=h.w/b.w,i={x:pa.x,y:pa.y},l=s,m=ja,n=function(b){1===b?(s=f,pa.x=h.x,pa.y=h.y-M):(s=(f-l)*b+l,pa.x=(h.x-i.x)*b+i.x,pa.y=(h.y-M-i.y)*b+i.y),Ha(),g?a.style.opacity=1-b:Fa(m-b*m)};c?db("initialZoom",0,1,j,e.easing.cubic.out,n,k):(n(1),Xb=setTimeout(k,j+20))}else s=b.initialZoomLevel,Ma(pa,b.initialPosition),Ha(),Fa(1),g?a.style.opacity=1:Fa(1),Xb=setTimeout(k,j+20)},d?25:90)};n()},dc={},ec=[],fc={index:0,errorMsg:'',forceProgressiveLoading:!1,preload:[1,1],getNumItemsFn:function(){return Yb.length}},gc=function(){return{center:{x:0,y:0},max:{x:0,y:0},min:{x:0,y:0}}},hc=function(a,b,c){var d=a.bounds;d.center.x=Math.round((dc.x-b)/2),d.center.y=Math.round((dc.y-c)/2)+a.vGap.top,d.max.x=b>dc.x?Math.round(dc.x-b):d.center.x,d.max.y=c>dc.y?Math.round(dc.y-c)+a.vGap.top:d.center.y,d.min.x=b>dc.x?0:d.center.x,d.min.y=c>dc.y?a.vGap.top:d.center.y},ic=function(a,b,c){if(a.src&&!a.loadError){var d=!c;if(d&&(a.vGap||(a.vGap={top:0,bottom:0}),Da("parseVerticalMargin",a)),dc.x=b.x,dc.y=b.y-a.vGap.top-a.vGap.bottom,d){var e=dc.x/a.w,f=dc.y/a.h;a.fitRatio=e1&&(c=1),a.initialZoomLevel=c,a.bounds||(a.bounds=gc())}if(!c)return;return hc(a,a.w*c,a.h*c),d&&c===a.initialZoomLevel&&(a.initialPosition=a.bounds.center),a.bounds}return a.w=a.h=0,a.initialZoomLevel=a.fitRatio=1,a.bounds=gc(),a.initialPosition=a.bounds.center,a.bounds},jc=function(a,b,c,d,e,g){b.loadError||d&&(b.imageAppended=!0,mc(b,d,b===f.currItem&&ya),c.appendChild(d),g&&setTimeout(function(){b&&b.loaded&&b.placeholder&&(b.placeholder.style.display="none",b.placeholder=null)},500))},kc=function(a){a.loading=!0,a.loaded=!1;var b=a.img=e.createEl("pswp__img","img"),c=function(){a.loading=!1,a.loaded=!0,a.loadComplete?a.loadComplete(a):a.img=null,b.onload=b.onerror=null,b=null};return b.onload=c,b.onerror=function(){a.loadError=!0,c()},b.src=a.src,b},lc=function(a,b){if(a.src&&a.loadError&&a.container)return b&&(a.container.innerHTML=""),a.container.innerHTML=i.errorMsg.replace("%url%",a.src),!0},mc=function(a,b,c){if(a.src){b||(b=a.container.lastChild);var d=c?a.w:Math.round(a.w*a.fitRatio),e=c?a.h:Math.round(a.h*a.fitRatio);a.placeholder&&!a.loaded&&(a.placeholder.style.width=d+"px",a.placeholder.style.height=e+"px"),b.style.width=d+"px",b.style.height=e+"px"}},nc=function(){if(ec.length){for(var a,b=0;b=0,e=Math.min(c[0],ac()),g=Math.min(c[1],ac());for(b=1;b<=(d?g:e);b++)f.lazyLoadItem(m+b);for(b=1;b<=(d?e:g);b++)f.lazyLoadItem(m-b)}),Ca("initialLayout",function(){f.currItem.initialLayout=i.getThumbBoundsFn&&i.getThumbBoundsFn(m)}),Ca("mainScrollAnimComplete",nc),Ca("initialZoomInEnd",nc),Ca("destroy",function(){for(var a,b=0;b=0&&(void 0!==Yb[a]&&Yb[a])},allowProgressiveImg:function(){return i.forceProgressiveLoading||!G||i.mouseUsed||screen.width>1200},setContent:function(a,b){i.loop&&(b=Aa(b));var c=f.getItemAt(a.index);c&&(c.container=null);var d,g=f.getItemAt(b);if(!g)return void(a.el.innerHTML="");Da("gettingData",b,g),a.index=b,a.item=g;var h=g.container=e.createEl("pswp__zoom-wrap");if(!g.src&&g.html&&(g.html.tagName?h.appendChild(g.html):h.innerHTML=g.html),lc(g),ic(g,qa),!g.src||g.loadError||g.loaded)g.src&&!g.loadError&&(d=e.createEl("pswp__img","img"),d.style.opacity=1,d.src=g.src,mc(g,d),jc(b,g,h,d,!0));else{if(g.loadComplete=function(c){if(j){if(a&&a.index===b){if(lc(c,!0))return c.loadComplete=c.img=null,ic(c,qa),Ia(c),void(a.index===m&&f.updateCurrZoomItem());c.imageAppended?!$b&&c.placeholder&&(c.placeholder.style.display="none",c.placeholder=null):N.transform&&(fa||$b)?ec.push({item:c,baseDiv:h,img:c.img,index:b,holder:a,clearPlaceholder:!0}):jc(b,c,h,c.img,fa||$b,!0)}c.loadComplete=null,c.img=null,Da("imageLoadComplete",b,c)}},e.features.transform){var k="pswp__img pswp__img--placeholder";k+=g.msrc?"":" pswp__img--placeholder--blank";var l=e.createEl(k,g.msrc?"img":"");g.msrc&&(l.src=g.msrc),mc(g,l),h.appendChild(l),g.placeholder=l}g.loading||kc(g),f.allowProgressiveImg()&&(!Zb&&N.transform?ec.push({item:g,baseDiv:h,img:g.img,index:b,holder:a}):jc(b,g,h,g.img,!0,!0))}Zb||b!==m?Ia(g):(ea=h.style,cc(g,d||g.img)),a.el.innerHTML="",a.el.appendChild(h)},cleanSlide:function(a){a.img&&(a.img.onload=a.img.onerror=null),a.loaded=a.loading=a.img=a.imageAppended=!1}}});var oc,pc={},qc=function(a,b,c){var d=document.createEvent("CustomEvent"),e={origEvent:a,target:a.target,releasePoint:b,pointerType:c||"touch"};d.initCustomEvent("pswpTap",!0,!0,e),a.target.dispatchEvent(d)};za("Tap",{publicMethods:{initTap:function(){Ca("firstTouchStart",f.onTapStart),Ca("touchRelease",f.onTapRelease),Ca("destroy",function(){pc={},oc=null})},onTapStart:function(a){a.length>1&&(clearTimeout(oc),oc=null)},onTapRelease:function(a,b){if(b&&!Y&&!W&&!_a){var c=b;if(oc&&(clearTimeout(oc),oc=null,xb(c,pc)))return void Da("doubleTap",c);if("mouse"===b.type)return void qc(a,b,"mouse");var d=a.target.tagName.toUpperCase();if("BUTTON"===d||e.hasClass(a.target,"pswp__single-tap"))return void qc(a,b);Ma(pc,c),oc=setTimeout(function(){qc(a,b),oc=null},300)}}}});var rc;za("DesktopZoom",{publicMethods:{initDesktopZoom:function(){L||(G?Ca("mouseUsed",function(){f.setupDesktopZoom()}):f.setupDesktopZoom(!0))},setupDesktopZoom:function(b){rc={};var c="wheel mousewheel DOMMouseScroll";Ca("bindEvents",function(){e.bind(a,c,f.handleMouseWheel)}),Ca("unbindEvents",function(){rc&&e.unbind(a,c,f.handleMouseWheel)}),f.mouseZoomedIn=!1;var d,g=function(){f.mouseZoomedIn&&(e.removeClass(a,"pswp--zoomed-in"),f.mouseZoomedIn=!1),s<1?e.addClass(a,"pswp--zoom-allowed"):e.removeClass(a,"pswp--zoom-allowed"),h()},h=function(){d&&(e.removeClass(a,"pswp--dragging"),d=!1)};Ca("resize",g),Ca("afterChange",g),Ca("pointerDown",function(){f.mouseZoomedIn&&(d=!0,e.addClass(a,"pswp--dragging"))}),Ca("pointerUp",h),b||g()},handleMouseWheel:function(a){if(s<=f.currItem.fitRatio)return i.modal&&(!i.closeOnScroll||_a||V?a.preventDefault():E&&Math.abs(a.deltaY)>2&&(l=!0,f.close())),!0;if(a.stopPropagation(),rc.x=0,"deltaX"in a)1===a.deltaMode?(rc.x=18*a.deltaX,rc.y=18*a.deltaY):(rc.x=a.deltaX,rc.y=a.deltaY);else if("wheelDelta"in a)a.wheelDeltaX&&(rc.x=-.16*a.wheelDeltaX),a.wheelDeltaY?rc.y=-.16*a.wheelDeltaY:rc.y=-.16*a.wheelDelta;else{if(!("detail"in a))return;rc.y=a.detail}Sa(s,!0);var b=pa.x-rc.x,c=pa.y-rc.y;(i.modal||b<=da.min.x&&b>=da.max.x&&c<=da.min.y&&c>=da.max.y)&&a.preventDefault(),f.panTo(b,c)},toggleDesktopZoom:function(b){b=b||{x:qa.x/2+sa.x,y:qa.y/2+sa.y};var c=i.getDoubleTapZoom(!0,f.currItem),d=s===c;f.mouseZoomedIn=!d,f.zoomTo(d?f.currItem.initialZoomLevel:c,b,333),e[(d?"remove":"add")+"Class"](a,"pswp--zoomed-in")}}});var sc,tc,uc,vc,wc,xc,yc,zc,Ac,Bc,Cc,Dc,Ec={history:!0,galleryUID:1},Fc=function(){return Cc.hash.substring(1)},Gc=function(){sc&&clearTimeout(sc),uc&&clearTimeout(uc)},Hc=function(){var a=Fc(),b={};if(a.length<5)return b;var c,d=a.split("&");for(c=0;c-1&&(yc=yc.split("&gid=")[0],yc=yc.split("?gid=")[0]),Ca("afterChange",f.updateURL),Ca("unbindEvents",function(){e.unbind(window,"hashchange",f.onHashChange)});var a=function(){xc=!0,Ac||(Bc?history.back():yc?Cc.hash=yc:Dc?history.pushState("",document.title,Cc.pathname+Cc.search):Cc.hash=""),Gc()};Ca("unbindEvents",function(){l&&a()}),Ca("destroy",function(){xc||a()}),Ca("firstUpdate",function(){m=Hc().pid});var b=yc.indexOf("pid=");b>-1&&(yc=yc.substring(0,b),"&"===yc.slice(-1)&&(yc=yc.slice(0,-1))),setTimeout(function(){j&&e.bind(window,"hashchange",f.onHashChange)},40)}},onHashChange:function(){return Fc()===yc?(Ac=!0,void f.close()):void(vc||(wc=!0,f.goTo(Hc().pid),wc=!1))},updateURL:function(){Gc(),wc||(zc?sc=setTimeout(Ic,800):Ic())}}}),e.extend(f,eb)};return a});
\ No newline at end of file
+!function(e,t){void 0===e&&void 0!==window&&(e=window),"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.PhotoSwipe=t()}(this,function(){"use strict";return function(m,i,e,t){var f={features:null,bind:function(e,t,n,i){var o=(i?"remove":"add")+"EventListener";t=t.split(" ");for(var a=0;a=Vt()-1&&i<0)&&(e=bt.x+i*y.mainScrollEndFriction)),bt.x=e,it(e,B)}function w(e,t){var n=It[e]-Ve[e];return Ye[e]+He[e]+n-t/$*n}function b(e,t){e.x=t.x,e.y=t.y,t.id&&(e.id=t.id)}function I(e){e.x=Math.round(e.x),e.y=Math.round(e.y)}function d(e,t){var n=Jt(h.currItem,Ge,e);return t&&(Pe=n),n}function C(e){return(e=e||h.currItem).initialZoomLevel}function D(e){return 0<(e=e||h.currItem).w?y.maxSpreadZoom:1}function p(e,t,n,i){return i===h.currItem.initialZoomLevel?(n[e]=h.currItem.initialPosition[e],!0):(n[e]=w(e,i),n[e]>t.min[e]?(n[e]=t.min[e],!0):n[e]Pe.min[e]||aPe.min[e]&&(u=y.panEndFriction,Pe.min[e],n=Pe.min[e]-Ye[e]),(n<=0||s<0)&&1ht.x&&(o=ht.x)):Pe.min.x!==Pe.max.x&&(i=a)):(ah.currItem.fitRatio&&(Be[e]+=t[e]*u)}function z(e){var t,n,i;"mousedown"===e.type&&(0h.currItem.fitRatio&&Pt(we):Lt())}}var U,W,H,Y,B,G,X,V,K,q,$,j,J,Q,ee,te,ne,ie,oe,ae,re,le,se,ue,ce,de,pe,me,fe,he,ye,xe,ge,ve,we,be,Ie,Ce,De,Se,Te,Me,Ee,Ae,Oe,ke,Re,Pe,Ze,Fe,Le,ze,_e,Ne,Ue,We,He=n(),Ye=n(),Be=n(),Ge={},Xe=0,Ve={},Ke=n(),qe=0,$e=!0,je=[],Je={},Qe=!1,et={},tt=function(e){Ze&&!h.currItem.loadError&&(e&&(q>h.currItem.fitRatio?Qe||(Qt(h.currItem,!1,!0),Qe=!0):Qe&&(Qt(h.currItem),Qe=!1)),r(Ze,Be.x,Be.y,q))},nt=function(e){e.container&&r(e.container.style,e.initialPosition.x,e.initialPosition.y,e.initialZoomLevel,e)},it=function(e,t){t[le]=j+e+"px, 0px"+J},ot=null,at=function(){ot&&(f.unbind(document,"mousemove",at),f.addClass(m,"pswp--has_mouse"),y.mouseUsed=!0,x("mouseUsed")),ot=setTimeout(function(){ot=null},100)},rt={},lt=0,st={shout:x,listen:a,viewportSize:Ge,options:y,isMainScrollAnimating:function(){return Fe},getZoomLevel:function(){return q},getCurrentIndex:function(){return Y},isDragging:function(){return De},isZooming:function(){return ke},setScrollOffset:function(e,t){Ve.x=e,he=Ve.y=t,x("updateScrollOffset",Ve)},applyZoomPan:function(e,t,n,i){Be.x=t,Be.y=n,q=e,tt(i)},init:function(){if(!U&&!W){var e;h.framework=f,h.template=m,h.bg=f.getChildByClass(m,"pswp__bg"),pe=m.className,U=!0,ye=f.detectFeatures(),ce=ye.raf,de=ye.caf,le=ye.transform,fe=ye.oldIE,h.scrollWrap=f.getChildByClass(m,"pswp__scroll-wrap"),h.container=f.getChildByClass(h.scrollWrap,"pswp__container"),B=h.container.style,h.itemHolders=te=[{el:h.container.children[0],wrap:0,index:-1},{el:h.container.children[1],wrap:0,index:-1},{el:h.container.children[2],wrap:0,index:-1}],te[0].el.style.display=te[2].el.style.display="none",function(){if(le){var e=ye.perspective&&!ue;return j="translate"+(e?"3d(":"("),J=ye.perspective?", 0px)":")"}le="left",f.addClass(m,"pswp--ie"),it=function(e,t){t.left=e+"px"},nt=function(e){var t=1=Vt())&&(Y=0),h.currItem=Xt(Y),(ye.isOldIOSPhone||ye.isOldAndroid)&&($e=!1),m.setAttribute("aria-hidden","false"),y.modal&&($e?m.style.position="fixed":(m.style.position="absolute",m.style.top=f.getScrollY()+"px")),void 0===he&&(x("initialLayout"),he=me=f.getScrollY());var n="pswp--open ";for(y.mainClass&&(n+=y.mainClass+" "),y.showHideOpacity&&(n+="pswp--animate_opacity "),n+=ue?"pswp--touch":"pswp--notouch",n+=y.preventSwiping?" pswp--preventswipe":"",n+=ye.animationName?" pswp--css_animation":"",n+=ye.svg?" pswp--svg":"",f.addClass(m,n),h.updateSize(),G=-1,qe=null,e=0;e<3;e++)it((e+G)*Ke.x,te[e].el.style);fe||f.bind(h.scrollWrap,V,h),a("initialZoomInEnd",function(){h.setContent(te[0],Y-1),h.setContent(te[2],Y+1),te[0].el.style.display=te[2].el.style.display="block",y.focus&&m.focus(),f.bind(document,"keydown",h),ye.transform&&f.bind(h.scrollWrap,"click",h),y.mouseUsed||f.bind(document,"mousemove",at),f.bind(window,"resize scroll orientationchange",h),x("bindEvents")}),h.setContent(te[1],Y),h.updateCurrItem(),x("afterInit"),$e||(Q=setInterval(function(){lt||De||ke||q!==h.currItem.initialZoomLevel||h.updateSize()},1e3)),f.addClass(m,"pswp--visible")}},close:function(){U&&(W=!(U=!1),x("close"),setTimeout(function(){f.unbind(window,"resize scroll orientationchange",h)},400),f.unbind(window,"scroll",K.scroll),f.unbind(document,"keydown",h),f.unbind(document,"mousemove",at),ye.transform&&f.unbind(h.scrollWrap,"click",h),De&&f.unbind(window,X,h),clearTimeout(xe),x("unbindEvents"),Kt(h.currItem,null,!0,h.destroy))},destroy:function(){x("destroy"),Ht&&clearTimeout(Ht),m.setAttribute("aria-hidden","true"),m.className=pe,Q&&clearInterval(Q),f.unbind(h.scrollWrap,V,h),f.unbind(window,"scroll",h),Dt(),E(),et={}},panTo:function(e,t,n){n||(e>Pe.min.x?e=Pe.min.x:ePe.min.y?t=Pe.min.y:th.currItem.initialZoomLevel+h.currItem.initialZoomLevel/15&&(Ue=!0);var u,c=1,d=C(),p=D();sPe.min[t]?i.backAnimDestination[t]=Pe.min[t]:Be[t]=Vt()&&(Y=y.loop?0:Vt()-1,r=!0),r&&!y.loop||(qe+=o,Xe-=o,i=!0));var l=Ke.x*Xe,s=Math.abs(l-bt.x),u=i||l>bt.x==0The image could not be loaded.',forceProgressiveLoading:!1,preload:[1,1],getNumItemsFn:function(){return Yt.length}},Jt=function(e,t,n){if(!e.src||e.loadError)return e.w=e.h=0,e.initialZoomLevel=e.fitRatio=1,e.bounds=zt(),e.initialPosition=e.bounds.center,e.bounds;var i,o,a,r,l,s,u,c=!n;return c&&(e.vGap||(e.vGap={top:0,bottom:0}),x("parseVerticalMargin",e)),qt.x=t.x,qt.y=t.y-e.vGap.top-e.vGap.bottom,c&&(i=qt.x/e.w,o=qt.y/e.h,e.fitRatio=iqt.x?Math.round(qt.x-l):u.center.x,u.max.y=s>qt.y?Math.round(qt.y-s)+r.vGap.top:u.center.y,u.min.x=l>qt.x?0:u.center.x,u.min.y=s>qt.y?r.vGap.top:u.center.y,c&&n===e.initialZoomLevel&&(e.initialPosition=e.bounds.center),e.bounds):void 0},Qt=function(e,t,n){var i,o,a,r;e.src&&(t=t||e.container.lastChild,i=n?e.w:Math.round(e.w*e.fitRatio),o=n?e.h:Math.round(e.h*e.fitRatio),t.naturalHeight&&t.naturalWidth&&(o<(a=i*(t.naturalHeight/t.naturalWidth))?(r=o*(t.naturalWidth/t.naturalHeight),t.style.marginLeft=(i-r)/2+"px",i=r):(t.style.marginTop=(o-a)/2+"px",o=a)),e.placeholder&&!e.loaded&&(e.placeholder.style.width=i+"px",e.placeholder.style.height=o+"px"),t.style.width=i+"px",t.style.height=o+"px")};o("Controller",{publicMethods:{lazyLoadItem:function(e){e=s(e);var t=Xt(e);t&&(!t.loaded&&!t.loading||ee)&&(x("gettingData",e,t),t.src&&Nt(t))},initController:function(){f.extend(y,jt,!0),h.items=Yt=e,Xt=h.getItemAt,Vt=y.getNumItemsFn,y.loop,Vt()<3&&(y.loop=!1),a("beforeChange",function(e){for(var t=y.preload,n=null===e||0<=e,i=Math.min(t[0],Vt()),o=Math.min(t[1],Vt()),a=1;a<=(n?o:i);a++)h.lazyLoadItem(Y+a);for(a=1;a<=(n?i:o);a++)h.lazyLoadItem(Y-a)}),a("initialLayout",function(){h.currItem.initialLayout=y.getThumbBoundsFn&&y.getThumbBoundsFn(Y)}),a("mainScrollAnimComplete",Wt),a("initialZoomInEnd",Wt),a("destroy",function(){for(var e,t=0;t=Pe.max.x&&n<=Pe.min.y&&n>=Pe.max.y)&&e.preventDefault(),h.panTo(t,n)},toggleDesktopZoom:function(e){e=e||{x:Ge.x/2+Ve.x,y:Ge.y/2+Ve.y};var t=y.getDoubleTapZoom(!0,h.currItem),n=q===t;h.mouseZoomedIn=!n,h.zoomTo(n?h.currItem.initialZoomLevel:t,e,333),f[(n?"remove":"add")+"Class"](m,"pswp--zoomed-in")}}});function an(){return gn.hash.substring(1)}function rn(){sn&&clearTimeout(sn),cn&&clearTimeout(cn)}function ln(){var e=an(),t={};if(e.length<5)return t;var n,i=e.split("&");for(a=0;a