diff --git a/README.md b/README.md index c484bb5..6605970 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,8 @@ var lightbox = $('.gallery a').simpleLightbox(options); | additionalHtml | false | string | Additional HTML showing inside every image. Usefull for watermark etc. If false nothing is added | | history | true | bool | enable history back closes lightbox instead of reloading the page | | throttleInterval | 0 | int | time to wait between slides | - +| doubleTapZoom | 2 | int | zoom level if double tapping on image +| maxZoom | 10 | int | maximum zoom level on pinching ### Events | Name | Description | | ---- | ----------- | @@ -162,6 +163,7 @@ $add-vendor-prefixes: true !default; ### Changelog +**1.16.0 - Pinch to Zoom feature for touch devices with new options doubleTapZoom and maxZoom #79** **1.15.1 - Merged pull request #113,#114,#115 - Thanks to RaphaelHaettich and celsius-jochen** **1.15.0 - Merged pull request #111, fixed #101 and added possibility to close lightbox on load #74** **1.14.0 - Merged pull request #107 and #108. Thanks to RaphaelHaettich** diff --git a/bower.json b/bower.json index f202d18..21b2c59 100644 --- a/bower.json +++ b/bower.json @@ -1,9 +1,9 @@ { "name": "simplelightbox", - "version": "1.15.1", - "homepage": "http://andreknieriem.de/simple-lightbox", + "version": "1.16.0", + "homepage": "http://simplelightbox.com/", "authors": [ - "André Rinas (http://andrerinas.de)" + "André Rinas (https://www.andrerinas.de)" ], "description": "Touch-friendly image lightbox for mobile and desktop with jQuery", "main": [ @@ -19,6 +19,7 @@ "swipe", "touch", "jquery", + "pinch", "popup" ], "repository": { diff --git a/dist/simple-lightbox.js b/dist/simple-lightbox.js index 77c1515..0bdf329 100644 --- a/dist/simple-lightbox.js +++ b/dist/simple-lightbox.js @@ -1,7 +1,8 @@ /* By André Rinas, www.andrerinas.de + Documentation, www.simplelightbox.de Available for use under the MIT License - 1.15.1 + 1.16.0 */ ;( function( $, window, document, undefined ) { @@ -46,7 +47,9 @@ $.fn.simpleLightbox = function( options ) alertErrorMessage: 'Image not found, next image will be loaded', additionalHtml: false, history: true, - throttleInterval: 0 + throttleInterval: 0, + doubleTapZoom: 2, + maxZoom: 10 }, options); // global variables @@ -180,7 +183,10 @@ $.fn.simpleLightbox = function( options ) index = objects.index(elem); curImg = $( '' ) .hide() - .attr('src', elem.attr(options.sourceAttr)); + .attr('src', elem.attr(options.sourceAttr)) + .attr('data-scale', 1) + .attr('data-translate-x', 0) + .attr('data-translate-y', 0); if(loaded.indexOf(elem.attr(options.sourceAttr)) == -1){ loaded.push(elem.attr(options.sourceAttr)); } @@ -203,7 +209,10 @@ $.fn.simpleLightbox = function( options ) windowWidth = window.innerWidth * options.widthRatio, windowHeight = window.innerHeight * options.heightRatio; tmpImage.src = curImg.attr( 'src' ); - + curImg.data('scale',1); + curImg.data('translate-x',0); + curImg.data('translate-y',0); + zoomPanElement(0,0,1); $(tmpImage).on('error',function(ev){ //no image was found objects.eq(index).trigger($.Event('error.simplelightbox')); @@ -253,14 +262,12 @@ $.fn.simpleLightbox = function( options ) $('.sl-image').css({ 'top': ( window.innerHeight - imageHeight ) / 2 + 'px', - 'left': ( window.innerWidth - imageWidth - globalScrollbarwidth)/ 2 + 'px' + 'left': ( window.innerWidth - imageWidth - globalScrollbarwidth)/ 2 + 'px', + 'width': imageWidth + 'px', + 'height': imageHeight + 'px' }); spinner.hide(); curImg - .css({ - 'width': imageWidth + 'px', - 'height': imageHeight + 'px' - }) .fadeIn('fast'); opened = true; var cSel = (options.captionSelector == 'self') ? objects.eq(index) : objects.eq(index).find(options.captionSelector); @@ -318,6 +325,19 @@ $.fn.simpleLightbox = function( options ) styles[transPrefix + 'transition'] = transPrefix + 'transform ' + speed + 's linear'; $('.sl-image').css(styles); }, + zoomPanElement = function(targetOffsetX, targetOffsetY, targetScale) { + var styles = {}; + styles[transPrefix + 'transform'] = 'translate(' + targetOffsetX + ',' + targetOffsetY+ ') scale('+targetScale+')'; + curImg.css(styles); + }, + minMax = function(value, min, max) { + return (value < min) ? min : (value > max) ? max : value; + }, + setZoomData = function(initialScale,targetOffsetX,targetOffsetY) { + curImg.data('scale',initialScale); + curImg.data('translate-x',targetOffsetX); + curImg.data('translate-y',targetOffsetY); + }, addEvents = function(){ // resize/responsive $( window ).on( 'resize.'+prefix, adjustImage ); @@ -348,41 +368,210 @@ $.fn.simpleLightbox = function( options ) loadImage( $(this).hasClass('sl-next') ? 1 : -1 ); }, options.throttleInterval)); - // touchcontrols + // touch helpers var swipeStart = 0, swipeEnd = 0, swipeYStart = 0, swipeYEnd = 0, + zoomed = false, mousedown = false, - imageLeft = 0; + imageLeft = 0, + containerHeight, + containerWidth, + containerOffsetX, + containerOffsetY, + imgHeight, + imgWidth, + capture = false, + initialOffsetX, + initialOffsetY, + initialPointerOffsetX, + initialPointerOffsetY, + initialPointerOffsetX2, + initialPointerOffsetY2, + initialScale = minMax(1, 1, options.maxZoom), + initialPinchDistance, + pointerOffsetX, + pointerOffsetY, + pointerOffsetX2, + pointerOffsetY2, + targetOffsetX, + targetOffsetY, + targetScale, + pinchOffsetX, + pinchOffsetY, + limitOffsetX, + limitOffsetY, + scaleDifference, + targetPinchDistance, + touchCount, + doubleTapped = false, + touchmoveCount = 0; image .on( 'touchstart.'+prefix+' mousedown.'+prefix, function(e) { + e = e.originalEvent; + if(e.type == 'mousedown') { + + } else { + touchCount = e.touches.length; + initialPointerOffsetX = e.touches[0].clientX; + initialPointerOffsetY = e.touches[0].clientY; + containerHeight = image.height(); + containerWidth = image.width(); + imgHeight = curImg.height(); + imgWidth = curImg.width(); + containerOffsetX = image.offset().left; + containerOffsetY = image.offset().top; + + if (touchCount === 1) /* Single touch */ { + if(!doubleTapped) { + doubleTapped = true; + setTimeout(function(){ + doubleTapped = false; + }, 300); + } else { + curImg.addClass('sl-transition'); + if(!zoomed) { + initialScale = options.doubleTapZoom; + setZoomData(0,0, initialScale); + zoomPanElement(0 + "px", 0 + "px", initialScale); + $('.sl-caption').fadeOut(200); + zoomed = true; + } else { + initialScale = 1; + setZoomData(0,0,initialScale); + zoomPanElement(0 + "px", 0 + "px", initialScale); + zoomed = false; + } + + setTimeout(function(){ + curImg.removeClass('sl-transition'); + }, 200); + return false; + } + + initialOffsetX = parseFloat(curImg.data('translate-x')); + initialOffsetY = parseFloat(curImg.data('translate-y')); + } + else if (touchCount === 2) /* Pinch */ { + initialPointerOffsetX2 = e.touches[1].clientX; + initialPointerOffsetY2 = e.touches[1].clientY; + initialOffsetX = parseFloat(curImg.data('translate-x')); + initialOffsetY = parseFloat(curImg.data('translate-y')); + pinchOffsetX = (initialPointerOffsetX + initialPointerOffsetX2) / 2; + pinchOffsetY = (initialPointerOffsetY + initialPointerOffsetY2) / 2; + initialPinchDistance = Math.sqrt(((initialPointerOffsetX - initialPointerOffsetX2) * (initialPointerOffsetX - initialPointerOffsetX2)) + ((initialPointerOffsetY - initialPointerOffsetY2) * (initialPointerOffsetY - initialPointerOffsetY2))); + } + capture = true; + } + if(mousedown) return true; if( canTransisions ) imageLeft = parseInt( image.css( 'left' ) ); mousedown = true; swipeDiff = 0; swipeYDiff = 0; - swipeStart = e.originalEvent.pageX || e.originalEvent.touches[ 0 ].pageX; - swipeYStart = e.originalEvent.pageY || e.originalEvent.touches[ 0 ].pageY; + swipeStart = e.pageX || e.touches[ 0 ].pageX; + swipeYStart = e.pageY || e.touches[ 0 ].pageY; return false; }) - .on( 'touchmove.'+prefix+' mousemove.'+prefix+' pointermove MSPointerMove', function(e) + .on( 'touchmove.'+prefix+' mousemove.'+prefix+' MSPointerMove', function(e) { if(!mousedown) return true; e.preventDefault(); - swipeEnd = e.originalEvent.pageX || e.originalEvent.touches[ 0 ].pageX; - swipeYEnd = e.originalEvent.pageY || e.originalEvent.touches[ 0 ].pageY; - swipeDiff = swipeStart - swipeEnd; - swipeYDiff = swipeYStart - swipeYEnd; - if( options.animationSlide ) { - if( canTransisions ) slide( 0, -swipeDiff + 'px' ); - else image.css( 'left', imageLeft - swipeDiff + 'px' ); + e = e.originalEvent; + /* Initialize helpers */ + if(e.type == 'touchmove') { + if(capture === false) return false; + pointerOffsetX = e.touches[0].clientX; + pointerOffsetY = e.touches[0].clientY; + touchCount = e.touches.length; + touchmoveCount++; + + if (touchCount > 1) /* Pinch */ { + pointerOffsetX2 = e.touches[1].clientX; + pointerOffsetY2 = e.touches[1].clientY; + targetPinchDistance = Math.sqrt(((pointerOffsetX - pointerOffsetX2) * (pointerOffsetX - pointerOffsetX2)) + ((pointerOffsetY - pointerOffsetY2) * (pointerOffsetY - pointerOffsetY2))); + if (initialPinchDistance === null) { + initialPinchDistance = targetPinchDistance; + } + + if (Math.abs(initialPinchDistance - targetPinchDistance) >= 1) { + /* Initialize helpers */ + targetScale = minMax(targetPinchDistance / initialPinchDistance * initialScale, 1, options.maxZoom); + limitOffsetX = ((imgWidth * targetScale) - containerWidth) / 2; + limitOffsetY = ((imgHeight * targetScale) - containerHeight) / 2; + scaleDifference = targetScale - initialScale; + targetOffsetX = (imgWidth * targetScale) <= containerWidth ? 0: minMax(initialOffsetX - ((((((pinchOffsetX - containerOffsetX) - (containerWidth / 2)) - initialOffsetX) / (targetScale - scaleDifference))) * scaleDifference), limitOffsetX * (-1), limitOffsetX); + targetOffsetY = (imgHeight * targetScale) <= containerHeight ? 0 : minMax(initialOffsetY - ((((((pinchOffsetY - containerOffsetY) - (containerHeight / 2)) - initialOffsetY) / (targetScale - scaleDifference))) * scaleDifference), limitOffsetY * (-1), limitOffsetY); + + zoomPanElement(targetOffsetX + "px", targetOffsetY + "px", targetScale); + + if (targetScale > 1) { + zoomed = true; + $('.sl-caption').fadeOut(200); + } + + initialPinchDistance = targetPinchDistance; + initialScale = targetScale; + initialOffsetX = targetOffsetX; + initialOffsetY = targetOffsetY; + } + } else { + targetScale = initialScale; + limitOffsetX = ((imgWidth * targetScale) - containerWidth) / 2; + limitOffsetY = ((imgHeight * targetScale) - containerHeight) / 2; + targetOffsetX = (imgWidth * targetScale) <= containerWidth ? 0 : minMax(pointerOffsetX - (initialPointerOffsetX - initialOffsetX), limitOffsetX * (-1), limitOffsetX); + targetOffsetY = (imgHeight * targetScale) <= containerHeight ? 0 : minMax(pointerOffsetY - (initialPointerOffsetY - initialOffsetY), limitOffsetY * (-1), limitOffsetY); + + if (Math.abs(targetOffsetX) === Math.abs(limitOffsetX)) { + initialOffsetX = targetOffsetX; + initialPointerOffsetX = pointerOffsetX; + } + + if (Math.abs(targetOffsetY) === Math.abs(limitOffsetY)) { + initialOffsetY = targetOffsetY; + initialPointerOffsetY = pointerOffsetY; + } + + setZoomData(initialScale,targetOffsetX,targetOffsetY); + zoomPanElement(targetOffsetX + "px", targetOffsetY + "px", targetScale); + } + } + if(!zoomed) { + swipeEnd = e.pageX || e.touches[ 0 ].pageX; + swipeYEnd = e.pageY || e.touches[ 0 ].pageY; + swipeDiff = swipeStart - swipeEnd; + swipeYDiff = swipeYStart - swipeYEnd; + if( options.animationSlide ) { + if( canTransisions ) slide( 0, -swipeDiff + 'px' ); + else image.css( 'left', imageLeft - swipeDiff + 'px' ); + } } }) .on( 'touchend.'+prefix+' mouseup.'+prefix+' touchcancel.'+prefix+' mouseleave.'+prefix+' pointerup pointercancel MSPointerUp MSPointerCancel',function(e) { + e = e.originalEvent; + if(touchDevice && e.type =='touchend') { + touchCount = e.touches.length; + if (touchCount === 0) /* No touch */ { + /* Set attributes */ + setZoomData(initialScale,targetOffsetX,targetOffsetY); + if(initialScale == 1) { + zoomed = false; + $('.sl-caption').fadeIn(200); + } + initialPinchDistance = null; + capture = false; + } else if (touchCount === 1) /* Single touch */ { + initialPointerOffsetX = e.touches[0].clientX; + initialPointerOffsetY = e.touches[0].clientY; + } else if (touchCount > 1) /* Pinch */ { + initialPinchDistance = null; + } + } + if(mousedown){ mousedown = false; var possibleDir = true; @@ -449,6 +638,7 @@ $.fn.simpleLightbox = function( options ) var elem = objects.eq(index); curImg .attr('src', elem.attr(options.sourceAttr)); + if(loaded.indexOf(elem.attr(options.sourceAttr)) == -1){ spinner.show(); } diff --git a/dist/simple-lightbox.min.js b/dist/simple-lightbox.min.js index 25629d1..6cf5611 100644 --- a/dist/simple-lightbox.min.js +++ b/dist/simple-lightbox.min.js @@ -1,6 +1,7 @@ /* By André Rinas, www.andrerinas.de + Documentation, www.simplelightbox.de Available for use under the MIT License - 1.15.1 + 1.16.0 */ -!function(N,Y,j,t){"use strict";N.fn.simpleLightbox=function(d){d=N.extend({sourceAttr:"href",overlay:!0,spinner:!0,nav:!0,navText:["‹","›"],captions:!0,captionDelay:0,captionSelector:"img",captionType:"attr",captionsData:"title",captionPosition:"bottom",captionClass:"",close:!0,closeText:"×",swipeClose:!0,showCounter:!0,fileExt:"png|jpg|jpeg|gif",animationSlide:!0,animationSpeed:250,preloading:!0,enableKeyboard:!0,loop:!0,rel:!1,docClose:!0,swipeTolerance:50,className:"simple-lightbox",widthRatio:.8,heightRatio:.9,scaleImageToRatio:!1,disableRightClick:!1,disableScroll:!0,alertError:!0,alertErrorMessage:"Image not found, next image will be loaded",additionalHtml:!1,history:!0,throttleInterval:0},d),Y.navigator.pointerEnabled||Y.navigator.msPointerEnabled;var p,t,r=0,l=0,h=N(),i=function(){var t=j.body||j.documentElement;return""===(t=t.style).WebkitTransition?"-webkit-":""===t.MozTransition?"-moz-":""===t.OTransition?"-o-":""===t.transition&&""},g=!1,u=[],f=d.rel&&!1!==d.rel?(t=d.rel,N(this).filter(function(){return N(this).attr("rel")===t})):this,m=(i=i(),0),v=!1!==i,n="pushState"in history,x=!1,a=Y.location,c=function(){return a.hash.substring(1)},b=c(),y=function(){c();var t="pid="+(I+1),e=a.href.split("#")[0]+"#"+t;n?history[x?"replaceState":"pushState"]("",j.title,e):x?a.replace(e):a.hash=t,x=!0},w=function(e,n){var i;return function(){var t=arguments;i||(e.apply(this,t),i=!0,setTimeout(function(){return i=!1},n))}},T="simplelb",e=N("
").addClass("sl-overlay"),o=N(""),s=N("
").addClass("sl-counter").html('/'),S=!1,I=0,k=0,q=N("
").addClass("sl-caption "+d.captionClass+" pos-"+d.captionPosition),D=N("
").addClass("sl-image"),M=N("
").addClass("sl-wrapper").addClass(d.className),R=function(t){t.trigger(N.Event("show.simplelightbox")),d.disableScroll&&(m=X("hide")),M.appendTo("body"),D.appendTo(M),d.overlay&&e.appendTo(N("body")),S=!0,I=f.index(t),h=N("").hide().attr("src",t.attr(d.sourceAttr)),-1==u.indexOf(t.attr(d.sourceAttr))&&u.push(t.attr(d.sourceAttr)),D.html("").attr("style",""),h.appendTo(D),P(),e.fadeIn("fast"),N(".sl-close").fadeIn("fast"),E.show(),C.fadeIn("fast"),N(".sl-wrapper .sl-counter .sl-current").text(I+1),s.fadeIn("fast"),A(),d.preloading&&z(),setTimeout(function(){t.trigger(N.Event("shown.simplelightbox"))},d.animationSpeed)},A=function(s){if(h.length){var r=new Image,l=Y.innerWidth*d.widthRatio,c=Y.innerHeight*d.heightRatio;r.src=h.attr("src"),N(r).on("error",function(t){f.eq(I).trigger(N.Event("error.simplelightbox")),g=!(S=!1),E.hide();var e=1==s||-1==s;k===I&&e?L():(d.alertError&&alert(d.alertErrorMessage),H(e?s:1))}),r.onload=function(){void 0!==s&&f.eq(I).trigger(N.Event("changed.simplelightbox")).trigger(N.Event((1===s?"nextDone":"prevDone")+".simplelightbox")),d.history&&(x?p=setTimeout(y,800):y()),-1==u.indexOf(h.attr("src"))&&u.push(h.attr("src"));var t=r.width,e=r.height;if(d.scaleImageToRatio||l=f.length-1&&N(".sl-next").hide(),0").html(d.additionalHtml).addClass("sl-additional-html").appendTo(N(".sl-image"))}}},O=function(t,e){""!==t&&void 0!==t&&d.captions&&q.html(t).css({width:e+"px"}).hide().appendTo(N(".sl-image")).delay(d.captionDelay).fadeIn("fast")},W=function(t,e){var n={};n[i+"transform"]="translateX("+e+")",n[i+"transition"]=i+"transform "+t+"s linear",N(".sl-image").css(n)},P=function(){N(Y).on("resize."+T,A),N(j).on("click."+T+" touchstart."+T,".sl-close",function(t){t.preventDefault(),g&&L()}),d.history&&setTimeout(function(){N(Y).on("hashchange."+T,function(){g&&c()===b&&L()})},40),C.on("click."+T,"button",w(function(t){t.preventDefault(),r=0,H(N(this).hasClass("sl-next")?1:-1)},d.throttleInterval));var e=0,n=0,i=0,a=0,o=!1,s=0;D.on("touchstart."+T+" mousedown."+T,function(t){return!!o||(v&&(s=parseInt(D.css("left"))),o=!0,l=r=0,e=t.originalEvent.pageX||t.originalEvent.touches[0].pageX,i=t.originalEvent.pageY||t.originalEvent.touches[0].pageY,!1)}).on("touchmove."+T+" mousemove."+T+" pointermove MSPointerMove",function(t){if(!o)return!0;t.preventDefault(),n=t.originalEvent.pageX||t.originalEvent.touches[0].pageX,a=t.originalEvent.pageY||t.originalEvent.touches[0].pageY,r=e-n,l=i-a,d.animationSlide&&(v?W(0,-r+"px"):D.css("left",s-r+"px"))}).on("touchend."+T+" mouseup."+T+" touchcancel."+T+" mouseleave."+T+" pointerup pointercancel MSPointerUp MSPointerCancel",function(t){if(o){var e=!(o=!1);d.loop||(0===I&&r<0&&(e=!1),I>=f.length-1&&0d.swipeTolerance&&e?H(0=f.length-1?0:I+1,e=I-1<0?f.length-1:I-1>=f.length-1?0:I-1;N("").attr("src",f.eq(t).attr(d.sourceAttr)).on("load",function(){-1==u.indexOf(N(this).attr("src"))&&u.push(N(this).attr("src")),f.eq(I).trigger(N.Event("nextImageLoaded.simplelightbox"))}),N("").attr("src",f.eq(e).attr(d.sourceAttr)).on("load",function(){-1==u.indexOf(N(this).attr("src"))&&u.push(N(this).attr("src")),f.eq(I).trigger(N.Event("prevImageLoaded.simplelightbox"))})},H=function(e){f.eq(I).trigger(N.Event("change.simplelightbox")).trigger(N.Event((1===e?"next":"prev")+".simplelightbox"));var t=I+e;if(!(S||(t<0||t>=f.length)&&!1===d.loop)){I=t<0?f.length-1:t>f.length-1?0:t,N(".sl-wrapper .sl-counter .sl-current").text(I+1);var n={opacity:0};d.animationSlide&&(v?W(d.animationSpeed/1e3,-100*e-r+"px"):n.left=parseInt(N(".sl-image").css("left"))+-100*e+"px"),N(".sl-image").animate(n,d.animationSpeed,function(){setTimeout(function(){var t=f.eq(I);h.attr("src",t.attr(d.sourceAttr)),-1==u.indexOf(t.attr(d.sourceAttr))&&E.show(),N(".sl-caption").remove(),A(e),d.preloading&&z()},100)})}},L=function(){if(!S){var t=f.eq(I),e=!1;t.trigger(N.Event("close.simplelightbox")),d.history&&(n?history.pushState("",j.title,a.pathname+a.search):a.hash="",clearTimeout(p)),N(".sl-image img, .sl-overlay, .sl-close, .sl-navigation, .sl-image .sl-caption, .sl-counter").fadeOut("fast",function(){d.disableScroll&&X("show"),N(".sl-wrapper, .sl-overlay").remove(),C.off("click","button"),N(j).off("click."+T,".sl-close"),N(Y).off("resize."+T),N(Y).off("hashchange."+T),e||t.trigger(N.Event("closed.simplelightbox")),e=!0}),h=N(),S=g=!1}},X=function(t){var e=0;if("hide"==t){var n=Y.innerWidth;if(!n){var i=j.documentElement.getBoundingClientRect();n=i.right-Math.abs(i.left)}if(j.body.clientWidth").addClass("sl-overlay"),o=st(""),s=st("
").addClass("sl-counter").html('/'),m=!1,J=0,v=0,l=st("
").addClass("sl-caption "+z.captionClass+" pos-"+z.captionPosition),V=st("
").addClass("sl-image"),r=st("
").addClass("sl-wrapper").addClass(z.className),c=function(t){t.trigger(st.Event("show.simplelightbox")),z.disableScroll&&(h=T("hide")),r.appendTo("body"),V.appendTo(r),z.overlay&&e.appendTo(st("body")),m=!0,J=j.index(t),F=st("").hide().attr("src",t.attr(z.sourceAttr)).attr("data-scale",1).attr("data-translate-x",0).attr("data-translate-y",0),-1==p.indexOf(t.attr(z.sourceAttr))&&p.push(t.attr(z.sourceAttr)),V.html("").attr("style",""),F.appendTo(V),b(),e.fadeIn("fast"),st(".sl-close").fadeIn("fast"),g.show(),G.fadeIn("fast"),st(".sl-wrapper .sl-counter .sl-current").text(J+1),s.fadeIn("fast"),_(),z.preloading&&y(),setTimeout(function(){t.trigger(st.Event("shown.simplelightbox"))},z.animationSpeed)},_=function(s){if(F.length){var l=new Image,r=lt.innerWidth*z.widthRatio,c=lt.innerHeight*z.heightRatio;l.src=F.attr("src"),F.data("scale",1),F.data("translate-x",0),F.data("translate-y",0),et(0,0,1),st(l).on("error",function(t){j.eq(J).trigger(st.Event("error.simplelightbox")),N=!(m=!1),g.hide();var e=1==s||-1==s;v===J&&e?ot():(z.alertError&&alert(z.alertErrorMessage),it(e?s:1))}),l.onload=function(){void 0!==s&&j.eq(J).trigger(st.Event("changed.simplelightbox")).trigger(st.Event((1===s?"nextDone":"prevDone")+".simplelightbox")),z.history&&(u?d=setTimeout(f,800):f()),-1==p.indexOf(F.attr("src"))&&p.push(F.attr("src"));var t=l.width,e=l.height;if(z.scaleImageToRatio||r=j.length-1&&st(".sl-next").hide(),0").html(z.additionalHtml).addClass("sl-additional-html").appendTo(st(".sl-image"))}}},x=function(t,e){""!==t&&void 0!==t&&z.captions&&l.html(t).css({width:e+"px"}).hide().appendTo(st(".sl-image")).delay(z.captionDelay).fadeIn("fast")},tt=function(t,e){var a={};a[i+"transform"]="translateX("+e+")",a[i+"transition"]=i+"transform "+t+"s linear",st(".sl-image").css(a)},et=function(t,e,a){var n={};n[i+"transform"]="translate("+t+","+e+") scale("+a+")",F.css(n)},at=function(t,e,a){return t=j.length-1&&0z.swipeTolerance&&e?it(0=j.length-1?0:J+1,e=J-1<0?j.length-1:J-1>=j.length-1?0:J-1;st("").attr("src",j.eq(t).attr(z.sourceAttr)).on("load",function(){-1==p.indexOf(st(this).attr("src"))&&p.push(st(this).attr("src")),j.eq(J).trigger(st.Event("nextImageLoaded.simplelightbox"))}),st("").attr("src",j.eq(e).attr(z.sourceAttr)).on("load",function(){-1==p.indexOf(st(this).attr("src"))&&p.push(st(this).attr("src")),j.eq(J).trigger(st.Event("prevImageLoaded.simplelightbox"))})},it=function(e){j.eq(J).trigger(st.Event("change.simplelightbox")).trigger(st.Event((1===e?"next":"prev")+".simplelightbox"));var t=J+e;if(!(m||(t<0||t>=j.length)&&!1===z.loop)){J=t<0?j.length-1:t>j.length-1?0:t,st(".sl-wrapper .sl-counter .sl-current").text(J+1);var a={opacity:0};z.animationSlide&&(K?tt(z.animationSpeed/1e3,-100*e-L+"px"):a.left=parseInt(st(".sl-image").css("left"))+-100*e+"px"),st(".sl-image").animate(a,z.animationSpeed,function(){setTimeout(function(){var t=j.eq(J);F.attr("src",t.attr(z.sourceAttr)),-1==p.indexOf(t.attr(z.sourceAttr))&&g.show(),st(".sl-caption").remove(),_(e),z.preloading&&y()},100)})}},ot=function(){if(!m){var t=j.eq(J),e=!1;t.trigger(st.Event("close.simplelightbox")),z.history&&(a?history.pushState("",rt.title,n.pathname+n.search):n.hash="",clearTimeout(d)),st(".sl-image img, .sl-overlay, .sl-close, .sl-navigation, .sl-image .sl-caption, .sl-counter").fadeOut("fast",function(){z.disableScroll&&T("show"),st(".sl-wrapper, .sl-overlay").remove(),G.off("click","button"),st(rt).off("click."+U,".sl-close"),st(lt).off("resize."+U),st(lt).off("hashchange."+U),e||t.trigger(st.Event("closed.simplelightbox")),e=!0}),F=st(),m=N=!1}},T=function(t){var e=0;if("hide"==t){var a=lt.innerWidth;if(!a){var n=rt.documentElement.getBoundingClientRect();a=n.right-Math.abs(n.left)}if(rt.body.clientWidth