jQuery(function($){
if(typeof wc_add_to_cart_params==='undefined'){
return false;
}
var AddToCartHandler=function(){
this.requests=[];
this.addRequest=this.addRequest.bind(this);
this.run=this.run.bind(this);
this.$liveRegion=this.createLiveRegion();
$(document.body)
.on('click', '.add_to_cart_button:not(.wc-interactive)', { addToCartHandler: this }, this.onAddToCart)
.on('keydown', '.add_to_cart_button:not(.wc-interactive)', { addToCartHandler: this },
(e)=> { if(e.key===' '){ e.preventDefault(); e.target.click(); }}
)
.on('click', '.remove_from_cart_button', { addToCartHandler: this }, this.onRemoveFromCart)
.on('keydown', '.remove_from_cart_button', this.onKeydownRemoveFromCart)
.on('added_to_cart', { addToCartHandler: this }, this.onAddedToCart)
.on('removed_from_cart', { addToCartHandler: this }, this.onRemovedFromCart)
.on('ajax_request_not_sent.adding_to_cart', this.updateButton);
};
AddToCartHandler.prototype.addRequest=function(request){
this.requests.push(request);
if(1===this.requests.length){
this.run();
}};
AddToCartHandler.prototype.run=function(){
var requestManager=this,
originalCallback=requestManager.requests[0].complete;
requestManager.requests[0].complete=function(){
if(typeof originalCallback==='function'){
originalCallback();
}
requestManager.requests.shift();
if(requestManager.requests.length > 0){
requestManager.run();
}};
$.ajax(this.requests[0]);
};
AddToCartHandler.prototype.onAddToCart=function(e){
var $thisbutton=$(this);
if($thisbutton.is('.ajax_add_to_cart') ){
if(! $thisbutton.attr('data-product_id') ){
return true;
}
e.data.addToCartHandler.$liveRegion
.text('')
.removeAttr('aria-relevant');
e.preventDefault();
$thisbutton.removeClass('added');
$thisbutton.addClass('loading');
if(false===$(document.body).triggerHandler('should_send_ajax_request.adding_to_cart', [ $thisbutton ]) ){
$(document.body).trigger('ajax_request_not_sent.adding_to_cart', [ false, false, $thisbutton ]);
return true;
}
var data={};
$.each($thisbutton.data(), function(key, value){
data[ key ]=value;
});
$.each($thisbutton[0].dataset, function(key, value){
data[ key ]=value;
});
$(document.body).trigger('adding_to_cart', [ $thisbutton, data ]);
e.data.addToCartHandler.addRequest({
type: 'POST',
url: wc_add_to_cart_params.wc_ajax_url.toString().replace('%%endpoint%%', 'add_to_cart'),
data: data,
success: function(response){
if(! response){
return;
}
if(response.error&&response.product_url){
window.location=response.product_url;
return;
}
if(wc_add_to_cart_params.cart_redirect_after_add==='yes'){
window.location=wc_add_to_cart_params.cart_url;
return;
}
$(document.body).trigger('added_to_cart', [ response.fragments, response.cart_hash, $thisbutton ]);
},
dataType: 'json'
});
}};
AddToCartHandler.prototype.onRemoveFromCart=function(e){
var $thisbutton=$(this),
$row=$thisbutton.closest('.woocommerce-mini-cart-item');
e.data.addToCartHandler.$liveRegion
.text('')
.removeAttr('aria-relevant');
e.preventDefault();
$row.block({
message: null,
overlayCSS: {
opacity: 0.6
}});
e.data.addToCartHandler.addRequest({
type: 'POST',
url: wc_add_to_cart_params.wc_ajax_url.toString().replace('%%endpoint%%', 'remove_from_cart'),
data: {
cart_item_key:$thisbutton.data('cart_item_key')
},
success: function(response){
if(! response||! response.fragments){
window.location=$thisbutton.attr('href');
return;
}
$(document.body).trigger('removed_from_cart', [ response.fragments, response.cart_hash, $thisbutton ]);
},
error: function(){
window.location=$thisbutton.attr('href');
return;
},
dataType: 'json'
});
};
AddToCartHandler.prototype.onKeydownRemoveFromCart=function(event){
if(event.key===' '){
event.preventDefault();
$(this).trigger('click');
}};
AddToCartHandler.prototype.updateButton=function(e, fragments, cart_hash, $button){
$button=typeof $button==='undefined' ? false:$button;
if($button){
$button.removeClass('loading');
if(fragments){
$button.addClass('added');
}
if(fragments&&! wc_add_to_cart_params.is_cart&&$button.parent().find('.added_to_cart').length===0){
var anchor=document.createElement('a');
anchor.href=wc_add_to_cart_params.cart_url;
anchor.className='added_to_cart wc-forward';
anchor.title=wc_add_to_cart_params.i18n_view_cart;
anchor.textContent=wc_add_to_cart_params.i18n_view_cart;
$button.after(anchor);
}
$(document.body).trigger('wc_cart_button_updated', [ $button ]);
}};
AddToCartHandler.prototype.updateFragments=function(e, fragments){
if(fragments){
$.each(fragments, function(key){
$(key)
.addClass('updating')
.fadeTo('400', '0.6')
.block({
message: null,
overlayCSS: {
opacity: 0.6
}});
});
$.each(fragments, function(key, value){
$(key).replaceWith(value);
$(key).stop(true).css('opacity', '1').unblock();
});
$(document.body).trigger('wc_fragments_loaded');
}};
AddToCartHandler.prototype.alertCartUpdated=function(e, fragments, cart_hash, $button){
$button=typeof $button==='undefined' ? false:$button;
if($button){
var message=$button.data('success_message');
if(!message){
return;
}
e.data.addToCartHandler.$liveRegion
.delay(1000)
.text(message)
.attr('aria-relevant', 'all');
}};
AddToCartHandler.prototype.createLiveRegion=function(){
var existingLiveRegion=$('.widget_shopping_cart_live_region');
if(existingLiveRegion.length){
return existingLiveRegion;
}
return $('<div class="widget_shopping_cart_live_region screen-reader-text" role="status"></div>').appendTo('body');
};
AddToCartHandler.prototype.onAddedToCart=function(e, fragments, cart_hash, $button){
e.data.addToCartHandler.updateButton(e, fragments, cart_hash, $button);
e.data.addToCartHandler.updateFragments(e, fragments);
e.data.addToCartHandler.alertCartUpdated(e, fragments, cart_hash, $button);
};
AddToCartHandler.prototype.onRemovedFromCart=function(e, fragments, cart_hash, $button){
e.data.addToCartHandler.updateFragments(e, fragments);
e.data.addToCartHandler.alertCartUpdated(e, fragments, cart_hash, $button);
};
new AddToCartHandler();
});
(function ($){
var defaults={
url: false,
callback: false,
target: false,
duration: 120,
on: 'mouseover',
touch: true,
onZoomIn: false,
onZoomOut: false,
magnify: 1
};
$.zoom=function(target, source, img, magnify){
var targetHeight,
targetWidth,
sourceHeight,
sourceWidth,
xRatio,
yRatio,
offset,
$target=$(target),
position=$target.css('position'),
$source=$(source);
target.style.position=/(absolute|fixed)/.test(position) ? position:'relative';
target.style.overflow='hidden';
img.style.width=img.style.height='';
$(img)
.addClass('zoomImg')
.css({
position: 'absolute',
top: 0,
left: 0,
opacity: 0,
width: img.width * magnify,
height: img.height * magnify,
border: 'none',
maxWidth: 'none',
maxHeight: 'none'
})
.appendTo(target);
return {
init: function(){
targetWidth=$target.outerWidth();
targetHeight=$target.outerHeight();
if(source===target){
sourceWidth=targetWidth;
sourceHeight=targetHeight;
}else{
sourceWidth=$source.outerWidth();
sourceHeight=$source.outerHeight();
}
xRatio=(img.width - targetWidth) / sourceWidth;
yRatio=(img.height - targetHeight) / sourceHeight;
offset=$source.offset();
},
move: function (e){
var left=(e.pageX - offset.left),
top=(e.pageY - offset.top);
top=Math.max(Math.min(top, sourceHeight), 0);
left=Math.max(Math.min(left, sourceWidth), 0);
img.style.left=(left * -xRatio) + 'px';
img.style.top=(top * -yRatio) + 'px';
}};};
$.fn.zoom=function (options){
return this.each(function (){
var
settings=$.extend({}, defaults, options||{}),
target=settings.target&&$(settings.target)[0]||this,
source=this,
$source=$(source),
img=document.createElement('img'),
$img=$(img),
mousemove='mousemove.zoom',
clicked=false,
touched=false;
if(!settings.url){
var srcElement=source.querySelector('img');
if(srcElement){
settings.url=srcElement.getAttribute('data-src')||srcElement.currentSrc||srcElement.src;
settings.alt=srcElement.getAttribute('data-alt')||srcElement.alt;
}
if(!settings.url){
return;
}}
$source.one('zoom.destroy', function(position, overflow){
$source.off(".zoom");
target.style.position=position;
target.style.overflow=overflow;
img.onload=null;
$img.remove();
}.bind(this, target.style.position, target.style.overflow));
img.onload=function (){
var zoom=$.zoom(target, source, img, settings.magnify);
function start(e){
zoom.init();
zoom.move(e);
$img.stop()
.fadeTo($.support.opacity ? settings.duration:0, 1, 'function'===typeof settings.onZoomIn ? settings.onZoomIn.call(img):false);
}
function stop(){
$img.stop()
.fadeTo(settings.duration, 0, 'function'===typeof settings.onZoomOut ? settings.onZoomOut.call(img):false);
}
if(settings.on==='grab'){
$source
.on('mousedown.zoom',
function (e){
if(e.which===1){
$(document).one('mouseup.zoom',
function (){
stop();
$(document).off(mousemove, zoom.move);
}
);
start(e);
$(document).on(mousemove, zoom.move);
e.preventDefault();
}}
);
}else if(settings.on==='click'){
$source.on('click.zoom',
function (e){
if(clicked){
return;
}else{
clicked=true;
start(e);
$(document).on(mousemove, zoom.move);
$(document).one('click.zoom',
function (){
stop();
clicked=false;
$(document).off(mousemove, zoom.move);
}
);
return false;
}}
);
}else if(settings.on==='toggle'){
$source.on('click.zoom',
function (e){
if(clicked){
stop();
}else{
start(e);
}
clicked = !clicked;
}
);
}else if(settings.on==='mouseover'){
zoom.init();
$source
.on('mouseenter.zoom', start)
.on('mouseleave.zoom', stop)
.on(mousemove, zoom.move);
}
if(settings.touch){
$source
.on('touchstart.zoom', function (e){
e.preventDefault();
if(touched){
touched=false;
stop();
}else{
touched=true;
start(e.originalEvent.touches[0]||e.originalEvent.changedTouches[0]);
}})
.on('touchmove.zoom', function (e){
e.preventDefault();
zoom.move(e.originalEvent.touches[0]||e.originalEvent.changedTouches[0]);
})
.on('touchend.zoom', function (e){
e.preventDefault();
if(touched){
touched=false;
stop();
}});
}
if('function'===typeof settings.callback){
settings.callback.call(img);
}};
img.setAttribute('role', 'presentation');
img.alt=settings.alt||'';
img.src=settings.url;
});
};
$.fn.zoom.defaults=defaults;
}(window.jQuery));
;
(function ($){
var focused=true;
var easings={
swing:  'cubic-bezier(.02, .01, .47, 1)', // https://stackoverflow.com/a/9245729
linear: 'linear',
easeInQuad:     'cubic-bezier(0.11, 0, 0.5, 0)',  // https://easings.net/#easeInQuad
easeOutQuad:    'cubic-bezier(0.5, 1, 0.89, 1)',  // https://easings.net/#easeOutQuad
easeInOutQuad:  'cubic-bezier(0.45, 0, 0.55, 1)', // https://easings.net/#easeInOutQuad
easeInCubic:    'cubic-bezier(0.32, 0, 0.67, 0)', // https://easings.net/#easeInCubic
easeOutCubic:   'cubic-bezier(0.33, 1, 0.68, 1)', // https://easings.net/#easeOutCubic
easeInOutCubic: 'cubic-bezier(0.65, 0, 0.35, 1)', // https://easings.net/#easeInOutCubic
easeInQuart:    'cubic-bezier(0.5, 0, 0.75, 0)',  // https://easings.net/#easeInQuart
easeOutQuart:   'cubic-bezier(0.25, 1, 0.5, 1)',  // https://easings.net/#easeOutQuart
easeInOutQuart: 'cubic-bezier(0.76, 0, 0.24, 1)', // https://easings.net/#easeInOutQuart
easeInQuint:    'cubic-bezier(0.64, 0, 0.78, 0)', // https://easings.net/#easeInQuint
easeOutQuint:   'cubic-bezier(0.22, 1, 0.36, 1)', // https://easings.net/#easeOutQuint
easeInOutQuint: 'cubic-bezier(0.83, 0, 0.17, 1)', // https://easings.net/#easeInOutQuint
easeInSine:     'cubic-bezier(0.12, 0, 0.39, 0)', // https://easings.net/#easeInSine
easeOutSine:    'cubic-bezier(0.61, 1, 0.88, 1)', // https://easings.net/#easeOutSine
easeInOutSine:  'cubic-bezier(0.37, 0, 0.63, 1)', // https://easings.net/#easeInOutSine
easeInExpo:     'cubic-bezier(0.7, 0, 0.84, 0)',  // https://easings.net/#easeInExpo
easeOutExpo:    'cubic-bezier(0.16, 1, 0.3, 1)',  // https://easings.net/#easeOutExpo
easeInOutExpo:  'cubic-bezier(0.87, 0, 0.13, 1)', // https://easings.net/#easeInOutExpo
easeInCirc:     'cubic-bezier(0.55, 0, 1, 0.45)', // https://easings.net/#easeInCirc
easeOutCirc:    'cubic-bezier(0, 0.55, 0.45, 1)', // https://easings.net/#easeOutCirc
easeInOutCirc:  'cubic-bezier(0.85, 0, 0.15, 1)', // https://easings.net/#easeInOutCirc
easeInBack:     'cubic-bezier(0.36, 0, 0.66, -0.56)', // https://easings.net/#easeInBack
easeOutBack:    'cubic-bezier(0.34, 1.56, 0.64, 1)',  // https://easings.net/#easeOutBack
easeInOutBack:  'cubic-bezier(0.68, -0.6, 0.32, 1.6)' // https://easings.net/#easeInOutBack
};
easings['jswing']=easings['swing'];
$.flexslider=function(el, options){
var slider=$(el);
if(typeof options.rtl=='undefined'&&$('html').attr('dir')=='rtl'){
options.rtl=true;
}
slider.vars=$.extend({}, $.flexslider.defaults, options);
var namespace=slider.vars.namespace,
touch=(("ontouchstart" in window)||window.DocumentTouch&&document instanceof DocumentTouch)&&slider.vars.touch,
eventType="click touchend keyup flexslider-click",
watchedEvent="",
watchedEventClearTimer,
easing=easings[slider.vars.easing]||"ease",
vertical=slider.vars.direction==="vertical",
reverse=slider.vars.reverse,
carousel=(slider.vars.itemWidth > 0),
fade=slider.vars.animation==="fade",
asNav=slider.vars.asNavFor!=="",
methods={};
$.data(el, "flexslider", slider);
methods={
init: function(){
slider.animating=false;
slider.currentSlide=parseInt(( slider.vars.startAt ? slider.vars.startAt:0), 10);
if(isNaN(slider.currentSlide) ){ slider.currentSlide=0; }
slider.animatingTo=slider.currentSlide;
slider.atEnd=(slider.currentSlide===0||slider.currentSlide===slider.last);
slider.containerSelector=slider.vars.selector.substr(0,slider.vars.selector.search(' '));
slider.slides=$(slider.vars.selector, slider);
slider.container=$(slider.containerSelector, slider);
slider.count=slider.slides.length;
slider.syncExists=$(slider.vars.sync).length > 0;
if(slider.vars.animation==="slide"){ slider.vars.animation="swing"; }
slider.prop=(vertical) ? "top":(slider.vars.rtl ? "marginRight":"marginLeft");
slider.args={};
slider.manualPause=false;
slider.stopped=false;
slider.started=false;
slider.startTimeout=null;
slider.transforms=slider.transitions = !slider.vars.video&&!fade&&slider.vars.useCSS;
if(slider.transforms) slider.prop="transform";
slider.isFirefox=navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
slider.ensureAnimationEnd='';
if(slider.vars.controlsContainer!=="") slider.controlsContainer=$(slider.vars.controlsContainer).length > 0&&$(slider.vars.controlsContainer);
if(slider.vars.manualControls!=="") slider.manualControls=$(slider.vars.manualControls).length > 0&&$(slider.vars.manualControls);
if(slider.vars.customDirectionNav!=="") slider.customDirectionNav=$(slider.vars.customDirectionNav).length===2&&$(slider.vars.customDirectionNav);
if(slider.vars.randomize){
slider.slides.sort(function(){ return (Math.round(Math.random())-0.5); });
slider.container.empty().append(slider.slides);
}
slider.doMath();
slider.setup("init");
if(slider.vars.controlNav){ methods.controlNav.setup(); }
if(slider.vars.directionNav){ methods.directionNav.setup(); }
if(slider.vars.keyboard&&($(slider.containerSelector).length===1||slider.vars.multipleKeyboard)){
$(document).on('keyup', function(event){
var keycode=event.keyCode;
if(!slider.animating&&(keycode===39||keycode===37)){
var target=(slider.vars.rtl?
((keycode===37) ? slider.getTarget('next') :
(keycode===39) ? slider.getTarget('prev'):false)
:
((keycode===39) ? slider.getTarget('next') :
(keycode===37) ? slider.getTarget('prev'):false)
)
;
slider.flexAnimate(target, slider.vars.pauseOnAction);
}});
}
if(slider.vars.mousewheel){
slider.on('mousewheel', function(event, delta, deltaX, deltaY){
event.preventDefault();
var target=(delta < 0) ? slider.getTarget('next'):slider.getTarget('prev');
slider.flexAnimate(target, slider.vars.pauseOnAction);
});
}
if(slider.vars.pausePlay){ methods.pausePlay.setup(); }
if(slider.vars.slideshow&&slider.vars.pauseInvisible){ methods.pauseInvisible(); }
if(slider.vars.slideshow){
if(slider.vars.pauseOnHover){
slider.on('mouseenter', function(){
if(!slider.manualPlay&&!slider.manualPause){ slider.pause(); }}).on('mouseleave', function(){
if(!slider.manualPause&&!slider.manualPlay&&!slider.stopped){ slider.play(); }});
}
if(!slider.vars.pauseInvisible||document.visibilityState==='visible'){
(slider.vars.initDelay > 0) ? slider.startTimeout=setTimeout(slider.play, slider.vars.initDelay):slider.play();
}}
if(asNav){ methods.asNav.setup(); }
if(touch&&slider.vars.touch){ methods.touch(); }
if(!fade||(fade&&slider.vars.smoothHeight)){ $(window).on("resize orientationchange focus", methods.resize); }
slider.find("img").attr("draggable", "false");
setTimeout(function(){
slider.vars.start(slider);
}, 200);
},
asNav: {
setup: function(){
slider.asNav=true;
slider.animatingTo=Math.floor(slider.currentSlide/slider.move);
slider.currentItem=slider.currentSlide;
slider.slides.removeClass(namespace + "active-slide").eq(slider.currentItem).addClass(namespace + "active-slide");
slider.slides.on(eventType, function(e){
e.preventDefault();
var $slide=$(this),
target=$slide.index();
var posFromX;
if(slider.vars.rtl){
posFromX=-1*($slide.offset().right - $(slider).scrollLeft());
}else{
posFromX=$slide.offset().left - $(slider).scrollLeft();
}
if(posFromX <=0&&$slide.hasClass(namespace + 'active-slide') ){
slider.flexAnimate(slider.getTarget("prev"), true);
}else if(!$(slider.vars.asNavFor).data('flexslider').animating&&!$slide.hasClass(namespace + "active-slide")){
slider.direction=(slider.currentItem < target) ? "next":"prev";
slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true);
}});
}},
controlNav: {
setup: function(){
if(!slider.manualControls){
methods.controlNav.setupPaging();
}else{
methods.controlNav.setupManual();
}},
setupPaging: function(){
var type=(slider.vars.controlNav==="thumbnails") ? 'control-thumbs':'control-paging',
j=1,
item,
slide;
slider.controlNavScaffold=$('<ol class="'+ namespace + 'control-nav ' + namespace + type + '"></ol>');
if(slider.pagingCount > 1){
for (var i=0; i < slider.pagingCount; i++){
slide=slider.slides.eq(i);
if(undefined===slide.attr('data-thumb-alt') ){
slide.attr('data-thumb-alt', '');
}
item=$('<a></a>').attr('href', '#').text(j);
if(slider.vars.controlNav==="thumbnails"){
item=$('<img/>', {
onload: 'this.width=this.naturalWidth; this.height=this.naturalHeight',
src: slide.attr('data-thumb'),
srcset: slide.attr('data-thumb-srcset'),
sizes: slide.attr('data-thumb-sizes'),
alt: slide.attr('alt')
})
}
if(''!==slide.attr('data-thumb-alt') ){
item.attr('alt', slide.attr('data-thumb-alt') );
}
if('thumbnails'===slider.vars.controlNav&&true===slider.vars.thumbCaptions){
var captn=slide.attr('data-thumbcaption');
if(''!==captn&&undefined!==captn){
var caption=$('<span></span>').addClass(namespace + 'caption').text(captn);
item.append(caption);
}}
var liElement=$('<li>');
item.appendTo(liElement);
liElement.append('</li>');
slider.controlNavScaffold.append(liElement);
j++;
}}
(slider.controlsContainer) ? $(slider.controlsContainer).append(slider.controlNavScaffold):slider.append(slider.controlNavScaffold);
methods.controlNav.set();
methods.controlNav.active();
slider.controlNavScaffold.on(eventType, 'a, img', function(event){
event.preventDefault();
if(watchedEvent===""||watchedEvent===event.type||event.type==="flexslider-click"){
var $this=$(this),
target=slider.controlNav.index($this);
if(!$this.hasClass(namespace + 'active')){
slider.direction=(target > slider.currentSlide) ? "next":"prev";
slider.flexAnimate(target, slider.vars.pauseOnAction);
}}
if(watchedEvent===""&&event.type!=="flexslider-click"){
watchedEvent=event.type;
}
methods.setToClearWatchedEvent();
});
},
setupManual: function(){
slider.controlNav=slider.manualControls;
methods.controlNav.active();
slider.controlNav.on(eventType, function(event){
event.preventDefault();
if(watchedEvent===""||watchedEvent===event.type||event.type==="flexslider-click"){
var $this=$(this),
target=slider.controlNav.index($this);
if(!$this.hasClass(namespace + 'active')){
(target > slider.currentSlide) ? slider.direction="next":slider.direction="prev";
slider.flexAnimate(target, slider.vars.pauseOnAction);
}}
if(watchedEvent===""&&event.type!=="flexslider-click"){
watchedEvent=event.type;
}
methods.setToClearWatchedEvent();
});
},
set: function(){
var selector=(slider.vars.controlNav==="thumbnails") ? 'img':'a';
slider.controlNav=$('.' + namespace + 'control-nav li ' + selector, (slider.controlsContainer) ? slider.controlsContainer:slider);
},
active: function(){
slider.controlNav.removeClass(namespace + "active").eq(slider.animatingTo).addClass(namespace + "active");
},
update: function(action, pos){
if(slider.pagingCount > 1&&action==="add"){
slider.controlNavScaffold.append($('<li><a href="#">' + slider.count + '</a></li>'));
}else if(slider.pagingCount===1){
slider.controlNavScaffold.find('li').remove();
}else{
slider.controlNav.eq(pos).closest('li').remove();
}
methods.controlNav.set();
(slider.pagingCount > 1&&slider.pagingCount!==slider.controlNav.length) ? slider.update(pos, action):methods.controlNav.active();
}},
directionNav: {
setup: function(){
var directionNavScaffold=$('<ul class="' + namespace + 'direction-nav"><li class="' + namespace + 'nav-prev"><a class="' + namespace + 'prev" href="#">' + slider.vars.prevText + '</a></li><li class="' + namespace + 'nav-next"><a class="' + namespace + 'next" href="#">' + slider.vars.nextText + '</a></li></ul>');
if(slider.customDirectionNav){
slider.directionNav=slider.customDirectionNav;
}else if(slider.controlsContainer){
$(slider.controlsContainer).append(directionNavScaffold);
slider.directionNav=$('.' + namespace + 'direction-nav li a', slider.controlsContainer);
}else{
slider.append(directionNavScaffold);
slider.directionNav=$('.' + namespace + 'direction-nav li a', slider);
}
methods.directionNav.update();
slider.directionNav.on(eventType, function(event){
event.preventDefault();
var target;
if(watchedEvent===""||watchedEvent===event.type||event.type==="flexslider-click"){
target=($(this).hasClass(namespace + 'next')) ? slider.getTarget('next'):slider.getTarget('prev');
slider.flexAnimate(target, slider.vars.pauseOnAction);
}
if(watchedEvent===""&&event.type!=="flexslider-click"){
watchedEvent=event.type;
}
methods.setToClearWatchedEvent();
});
},
update: function(){
var disabledClass=namespace + 'disabled';
if(slider.pagingCount===1){
slider.directionNav.addClass(disabledClass).attr('tabindex', '-1');
}else if(!slider.vars.animationLoop){
if(slider.animatingTo===0){
slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "prev").addClass(disabledClass).attr('tabindex', '-1');
}else if(slider.animatingTo===slider.last){
slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "next").addClass(disabledClass).attr('tabindex', '-1');
}else{
slider.directionNav.removeClass(disabledClass).prop('tabindex', '-1');
}}else{
slider.directionNav.removeClass(disabledClass).prop('tabindex', '-1');
}}
},
pausePlay: {
setup: function(){
var pausePlayScaffold=$('<div class="' + namespace + 'pauseplay"><a href="#"></a></div>');
if(slider.controlsContainer){
slider.controlsContainer.append(pausePlayScaffold);
slider.pausePlay=$('.' + namespace + 'pauseplay a', slider.controlsContainer);
}else{
slider.append(pausePlayScaffold);
slider.pausePlay=$('.' + namespace + 'pauseplay a', slider);
}
methods.pausePlay.update((slider.vars.slideshow) ? namespace + 'pause':namespace + 'play');
slider.pausePlay.on(eventType, function(event){
event.preventDefault();
if(watchedEvent===""||watchedEvent===event.type||event.type==="flexslider-click"){
if($(this).hasClass(namespace + 'pause')){
slider.manualPause=true;
slider.manualPlay=false;
slider.pause();
}else{
slider.manualPause=false;
slider.manualPlay=true;
slider.play();
}}
if(watchedEvent===""&&event.type!=="flexslider-click"){
watchedEvent=event.type;
}
methods.setToClearWatchedEvent();
});
},
update: function(state){
(state==="play") ? slider.pausePlay.removeClass(namespace + 'pause').addClass(namespace + 'play').html(slider.vars.playText):slider.pausePlay.removeClass(namespace + 'play').addClass(namespace + 'pause').html(slider.vars.pauseText);
}},
touch: function(){
var startX,
startY,
offset,
cwidth,
dx,
startT,
onTouchStart,
onTouchMove,
onTouchEnd,
scrolling=false,
localX=0,
localY=0,
accDx=0;
onTouchStart=function(e){
if(slider.animating){
e.preventDefault();
}else if(e.touches.length===1){
slider.pause();
cwidth=(vertical) ? slider.h:slider. w;
startT=Number(new Date());
localX=e.touches[0].pageX;
localY=e.touches[0].pageY;
offset=(carousel&&reverse&&slider.animatingTo===slider.last) ? 0 :
(carousel&&reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
(carousel&&slider.currentSlide===slider.last) ? slider.limit :
(carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide :
(reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth:(slider.currentSlide + slider.cloneOffset) * cwidth;
startX=(vertical) ? localY:localX;
startY=(vertical) ? localX:localY;
el.addEventListener('touchmove', onTouchMove, false);
el.addEventListener('touchend', onTouchEnd, false);
}};
onTouchMove=function(e){
localX=e.touches[0].pageX;
localY=e.touches[0].pageY;
dx=(vertical) ? startX - localY:(slider.vars.rtl?-1:1)*(startX - localX);
scrolling=(vertical) ? (Math.abs(dx) < Math.abs(localX - startY)):(Math.abs(dx) < Math.abs(localY - startY));
var fxms=500;
if(! scrolling||Number(new Date()) - startT > fxms){
e.preventDefault();
if(!fade){
if(!slider.vars.animationLoop){
dx=dx/((slider.currentSlide===0&&dx < 0||slider.currentSlide===slider.last&&dx > 0) ? (Math.abs(dx)/cwidth+2):1);
}
slider.setProps(offset + dx, "setTouch");
}}
};
onTouchEnd=function(e){
el.removeEventListener('touchmove', onTouchMove, false);
if(slider.animatingTo===slider.currentSlide&&!scrolling&&!(dx===null)){
var updateDx=(reverse) ? -dx:dx,
target=(updateDx > 0) ? slider.getTarget('next'):slider.getTarget('prev');
if(slider.canAdvance(target)&&(Number(new Date()) - startT < 550&&Math.abs(updateDx) > 50||Math.abs(updateDx) > cwidth/2)){
slider.flexAnimate(target, slider.vars.pauseOnAction);
}else{
if(!fade){ slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true); }}
}
el.removeEventListener('touchend', onTouchEnd, false);
startX=null;
startY=null;
dx=null;
offset=null;
};
el.addEventListener('touchstart', onTouchStart, false);
},
resize: function(){
if(!slider.animating&&slider.is(':visible')){
if(!carousel){ slider.doMath(); }
if(fade){
methods.smoothHeight();
}else if(carousel){
slider.slides.width(slider.computedW);
slider.update(slider.pagingCount);
slider.setProps();
}
else if(vertical){
slider.viewport.height(slider.h);
slider.setProps(slider.h, "setTotal");
}else{
slider.setProps(slider.computedW, "setTotal");
slider.newSlides.width(slider.computedW);
if(slider.vars.smoothHeight){ methods.smoothHeight(); }}
}},
smoothHeight: function(dur){
if(!vertical||fade){
var $obj=(fade) ? slider:slider.viewport;
$obj.css({"height": slider.slides.eq(slider.animatingTo).innerHeight(), "transition": dur ? ("height " + dur + "ms"):"none"});
}},
sync: function(action){
var $obj=$(slider.vars.sync).data("flexslider"),
target=slider.animatingTo;
switch (action){
case "animate": $obj.flexAnimate(target, slider.vars.pauseOnAction, false, true); break;
case "play": if(!$obj.playing&&!$obj.asNav){ $obj.play(); } break;
case "pause": $obj.pause(); break;
}},
uniqueID: function($clone){
$clone.filter('[id]').add($clone.find('[id]')).each(function(){
var $this=$(this);
$this.attr('id', $this.attr('id') + '_clone');
});
return $clone;
},
pauseInvisible: function(){
document.addEventListener('visibilitychange', function(){
if(document.visibilityState==='hidden'){
if(slider.startTimeout){
clearTimeout(slider.startTimeout);
}else{
slider.pause();
}}else{
if(slider.started){
slider.play();
}else{
if(slider.vars.initDelay > 0){
setTimeout(slider.play, slider.vars.initDelay);
}else{
slider.play();
}}
}});
},
setToClearWatchedEvent: function(){
clearTimeout(watchedEventClearTimer);
watchedEventClearTimer=setTimeout(function(){
watchedEvent="";
}, 3000);
}};
slider.flexAnimate=function(target, pause, override, withSync, fromNav){
if(!slider.vars.animationLoop&&target!==slider.currentSlide){
slider.direction=(target > slider.currentSlide) ? "next":"prev";
}
if(asNav&&slider.pagingCount===1) slider.direction=(slider.currentItem < target) ? "next":"prev";
if(!slider.animating&&(slider.canAdvance(target, fromNav)||override)&&slider.is(":visible")){
if(asNav&&withSync){
var master=$(slider.vars.asNavFor).data('flexslider');
slider.atEnd=target===0||target===slider.count - 1;
master.flexAnimate(target, true, false, true, fromNav);
slider.direction=(slider.currentItem < target) ? "next":"prev";
master.direction=slider.direction;
if(Math.ceil((target + 1)/slider.visible) - 1!==slider.currentSlide&&target!==0){
slider.currentItem=target;
slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");
target=Math.floor(target/slider.visible);
}else{
slider.currentItem=target;
slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");
return false;
}}
slider.animating=true;
slider.animatingTo=target;
if(pause){ slider.pause(); }
slider.vars.before(slider);
if(slider.syncExists&&!fromNav){ methods.sync("animate"); }
if(slider.vars.controlNav){ methods.controlNav.active(); }
if(!carousel){ slider.slides.removeClass(namespace + 'active-slide').eq(target).addClass(namespace + 'active-slide'); }
slider.atEnd=target===0||target===slider.last;
if(slider.vars.directionNav){ methods.directionNav.update(); }
if(target===slider.last){
slider.vars.end(slider);
if(!slider.vars.animationLoop){ slider.pause(); }}
if(!fade){
var dimension=(vertical) ? slider.slides.filter(':first').height():slider.computedW,
margin, slideString, calcNext;
if(carousel){
margin=slider.vars.itemMargin;
calcNext=((slider.itemW + margin) * slider.move) * slider.animatingTo;
slideString=(calcNext > slider.limit&&slider.visible!==1) ? slider.limit:calcNext;
}else if(slider.currentSlide===0&&target===slider.count - 1&&slider.vars.animationLoop&&slider.direction!=="next"){
slideString=(reverse) ? (slider.count + slider.cloneOffset) * dimension:0;
}else if(slider.currentSlide===slider.last&&target===0&&slider.vars.animationLoop&&slider.direction!=="prev"){
slideString=(reverse) ? 0:(slider.count + 1) * dimension;
}else{
slideString=(reverse) ? ((slider.count - 1) - target + slider.cloneOffset) * dimension:(target + slider.cloneOffset) * dimension;
}
slider.setProps(slideString, "", slider.vars.animationSpeed);
if(!slider.vars.animationLoop||!slider.atEnd){
slider.animating=false;
slider.currentSlide=slider.animatingTo;
}
slider.container.off("transitionend");
slider.container.on("transitionend", function(){
clearTimeout(slider.ensureAnimationEnd);
slider.wrapup(dimension);
});
clearTimeout(slider.ensureAnimationEnd);
slider.ensureAnimationEnd=setTimeout(function(){
slider.wrapup(dimension);
}, slider.vars.animationSpeed + 100);
}else{
if(!touch){
slider.slides.eq(slider.currentSlide).off("transitionend");
slider.slides.eq(target).off("transitionend").on("transitionend", slider.wrapup);
}
slider.slides.eq(slider.currentSlide).css({ "opacity": 0, "zIndex": 1 });
slider.slides.eq(target).css({ "opacity": 1, "zIndex": 2 });
if(touch){
slider.wrapup(dimension);
}}
if(slider.vars.smoothHeight){ methods.smoothHeight(slider.vars.animationSpeed); }}
};
slider.wrapup=function(dimension){
if(!fade&&!carousel){
if(slider.currentSlide===0&&slider.animatingTo===slider.last&&slider.vars.animationLoop){
slider.setProps(dimension, "jumpEnd");
}else if(slider.currentSlide===slider.last&&slider.animatingTo===0&&slider.vars.animationLoop){
slider.setProps(dimension, "jumpStart");
}}
slider.animating=false;
slider.currentSlide=slider.animatingTo;
slider.vars.after(slider);
};
slider.animateSlides=function(){
if(!slider.animating&&focused){ slider.flexAnimate(slider.getTarget("next")); }};
slider.pause=function(){
clearInterval(slider.animatedSlides);
slider.animatedSlides=null;
slider.playing=false;
if(slider.vars.pausePlay){ methods.pausePlay.update("play"); }
if(slider.syncExists){ methods.sync("pause"); }};
slider.play=function(){
if(slider.playing){ clearInterval(slider.animatedSlides); }
slider.animatedSlides=slider.animatedSlides||setInterval(slider.animateSlides, slider.vars.slideshowSpeed);
slider.started=slider.playing=true;
if(slider.vars.pausePlay){ methods.pausePlay.update("pause"); }
if(slider.syncExists){ methods.sync("play"); }};
slider.stop=function (){
slider.pause();
slider.stopped=true;
};
slider.canAdvance=function(target, fromNav){
var last=(asNav) ? slider.pagingCount - 1:slider.last;
return (fromNav) ? true :
(asNav&&slider.currentItem===slider.count - 1&&target===0&&slider.direction==="prev") ? true :
(asNav&&slider.currentItem===0&&target===slider.pagingCount - 1&&slider.direction!=="next") ? false :
(target===slider.currentSlide&&!asNav) ? false :
(slider.vars.animationLoop) ? true :
(slider.atEnd&&slider.currentSlide===0&&target===last&&slider.direction!=="next") ? false :
(slider.atEnd&&slider.currentSlide===last&&target===0&&slider.direction==="next") ? false :
true;
};
slider.getTarget=function(dir){
slider.direction=dir;
if(dir==="next"){
return (slider.currentSlide===slider.last) ? 0:slider.currentSlide + 1;
}else{
return (slider.currentSlide===0) ? slider.last:slider.currentSlide - 1;
}};
slider.setProps=function(pos, special, dur){
var target=(function(){
var posCheck=(pos) ? pos:((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo,
posCalc=(function(){
if(carousel){
return (special==="setTouch") ? pos :
(reverse&&slider.animatingTo===slider.last) ? 0 :
(reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
(slider.animatingTo===slider.last) ? slider.limit:posCheck;
}else{
switch (special){
case "setTotal": return (reverse) ? ((slider.count - 1) - slider.currentSlide + slider.cloneOffset) * pos:(slider.currentSlide + slider.cloneOffset) * pos;
case "setTouch": return (reverse) ? pos:pos;
case "jumpEnd": return (reverse) ? pos:slider.count * pos;
case "jumpStart": return (reverse) ? slider.count * pos:pos;
default: return pos;
}}
}());
return (posCalc * ((slider.vars.rtl)?1:-1)) + "px";
}());
dur=(dur!==undefined) ? (dur/1000) + "s":"0s";
slider.container.css("transition-duration", dur);
if(slider.transforms){
target=(vertical) ? "translate3d(0," + target + ",0)":"translate3d(" + (parseInt(target)+'px') + ",0,0)";
}else{
slider.container.css("transition-timing-function", easing);
}
slider.args[slider.prop]=target;
slider.container.css(slider.args);
};
slider.setup=function(type){
if(!fade){
var sliderOffset, arr;
if(type==="init"){
slider.viewport=$('<div class="' + namespace + 'viewport"></div>').css({"overflow": "hidden", "position": "relative"}).appendTo(slider).append(slider.container);
slider.cloneCount=0;
slider.cloneOffset=0;
if(reverse){
arr=$.makeArray(slider.slides).reverse();
slider.slides=$(arr);
slider.container.empty().append(slider.slides);
}}
if(slider.vars.animationLoop&&!carousel){
slider.cloneCount=2;
slider.cloneOffset=1;
if(type!=="init"){ slider.container.find('.clone').remove(); }
slider.container.append(methods.uniqueID(slider.slides.first().clone().addClass('clone')).attr('aria-hidden', 'true'))
.prepend(methods.uniqueID(slider.slides.last().clone().addClass('clone')).attr('aria-hidden', 'true'));
}
slider.newSlides=$(slider.vars.selector, slider);
sliderOffset=(reverse) ? slider.count - 1 - slider.currentSlide + slider.cloneOffset:slider.currentSlide + slider.cloneOffset;
if(vertical&&!carousel){
slider.container.height((slider.count + slider.cloneCount) * 200 + "%").css("position", "absolute").width("100%");
setTimeout(function(){
slider.newSlides.css({"display": "block"});
slider.doMath();
slider.viewport.height(slider.h);
slider.setProps(sliderOffset * slider.h, "init");
}, (type==="init") ? 100:0);
}else{
slider.container.width((slider.count + slider.cloneCount) * 200 + "%");
slider.setProps(sliderOffset * slider.computedW, "init");
setTimeout(function(){
slider.doMath();
if(slider.vars.rtl){
slider.newSlides.css({"width": slider.computedW, "marginRight":slider.computedM, "float": "right", "display": "block"});
}else{
slider.newSlides.css({"width": slider.computedW, "marginRight":slider.computedM, "float": "left", "display": "block"});
}
if(slider.vars.smoothHeight){ methods.smoothHeight(); }}, (type==="init") ? 100:0);
}}else{
if(slider.vars.rtl){
slider.slides.css({"width": "100%", "float": 'right', "marginLeft": "-100%", "position": "relative"});
}else{
slider.slides.css({"width": "100%", "float": 'left', "marginRight": "-100%", "position": "relative"});
}
if(type==="init"){
if(!touch){
if(slider.vars.fadeFirstSlide==false){
slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({ "opacity": 1, "zIndex": 2 });
slider.slides.outerWidth();
}else{
slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).outerWidth();
slider.slides.eq(slider.currentSlide).css({ "opacity": 1, "zIndex": 2 });
}
slider.slides.css({ "transition": "opacity " + slider.vars.animationSpeed / 1000 + "s " + easing });
}else{
slider.slides.css({ "opacity": 0, "display": "block", "transition": "opacity " + slider.vars.animationSpeed / 1000 + "s ease", "zIndex": 1 }).eq(slider.currentSlide).css({ "opacity": 1, "zIndex": 2 });
}}
if(slider.vars.smoothHeight){ methods.smoothHeight(); }}
if(!carousel){ slider.slides.removeClass(namespace + "active-slide").eq(slider.currentSlide).addClass(namespace + "active-slide"); }
slider.vars.init(slider);
};
slider.doMath=function(){
var slide=slider.slides.first(),
slideMargin=slider.vars.itemMargin,
minItems=slider.vars.minItems,
maxItems=slider.vars.maxItems;
slider.w=(slider.viewport===undefined) ? slider.width():slider.viewport.width();
if(slider.isFirefox){ slider.w=slider.width(); }
slider.h=slide.height();
slider.boxPadding=slide.outerWidth() - slide.width();
if(carousel){
slider.itemT=slider.vars.itemWidth + slideMargin;
slider.itemM=slideMargin;
slider.minW=(minItems) ? minItems * slider.itemT:slider.w;
slider.maxW=(maxItems) ? (maxItems * slider.itemT) - slideMargin:slider.w;
slider.itemW=(slider.minW > slider.w) ? (slider.w - (slideMargin * (minItems - 1)))/minItems :
(slider.maxW < slider.w) ? (slider.w - (slideMargin * (maxItems - 1)))/maxItems :
(slider.vars.itemWidth > slider.w) ? slider.w:slider.vars.itemWidth;
slider.visible=Math.floor(slider.w/(slider.itemW));
slider.move=(slider.vars.move > 0&&slider.vars.move < slider.visible) ? slider.vars.move:slider.visible;
slider.pagingCount=Math.ceil(((slider.count - slider.visible)/slider.move) + 1);
slider.last=slider.pagingCount - 1;
slider.limit=(slider.pagingCount===1) ? 0 :
(slider.vars.itemWidth > slider.w) ? (slider.itemW * (slider.count - 1)) + (slideMargin * (slider.count - 1)):((slider.itemW + slideMargin) * slider.count) - slider.w - slideMargin;
}else{
slider.itemW=slider.w;
slider.itemM=slideMargin;
slider.pagingCount=slider.count;
slider.last=slider.count - 1;
}
slider.computedW=slider.itemW - slider.boxPadding;
slider.computedM=slider.itemM;
};
slider.update=function(pos, action){
slider.doMath();
if(!carousel){
if(pos < slider.currentSlide){
slider.currentSlide +=1;
}else if(pos <=slider.currentSlide&&pos!==0){
slider.currentSlide -=1;
}
slider.animatingTo=slider.currentSlide;
}
if(slider.vars.controlNav&&!slider.manualControls){
if((action==="add"&&!carousel)||slider.pagingCount > slider.controlNav.length){
methods.controlNav.update("add");
}else if((action==="remove"&&!carousel)||slider.pagingCount < slider.controlNav.length){
if(carousel&&slider.currentSlide > slider.last){
slider.currentSlide -=1;
slider.animatingTo -=1;
}
methods.controlNav.update("remove", slider.last);
}}
if(slider.vars.directionNav){ methods.directionNav.update(); }};
slider.addSlide=function(obj, pos){
var $obj=$(obj);
slider.count +=1;
slider.last=slider.count - 1;
if(vertical&&reverse){
(pos!==undefined) ? slider.slides.eq(slider.count - pos).after($obj):slider.container.prepend($obj);
}else{
(pos!==undefined) ? slider.slides.eq(pos).before($obj):slider.container.append($obj);
}
slider.update(pos, "add");
slider.slides=$(slider.vars.selector + ':not(.clone)', slider);
slider.setup();
slider.vars.added(slider);
};
slider.removeSlide=function(obj){
var pos=(isNaN(obj)) ? slider.slides.index($(obj)):obj;
slider.count -=1;
slider.last=slider.count - 1;
if(isNaN(obj)){
$(obj, slider.slides).remove();
}else{
(vertical&&reverse) ? slider.slides.eq(slider.last).remove():slider.slides.eq(obj).remove();
}
slider.doMath();
slider.update(pos, "remove");
slider.slides=$(slider.vars.selector + ':not(.clone)', slider);
slider.setup();
slider.vars.removed(slider);
};
methods.init();
};
$(window).on('blur', function(e){
focused=false;
}).on('focus', function(e){
focused=true;
});
$.flexslider.defaults={
namespace: "flex-",
selector: ".slides > li",
animation: "fade",
easing: "swing",
direction: "horizontal",
reverse: false,
animationLoop: true,
smoothHeight: false,
startAt: 0,
slideshow: true,
slideshowSpeed: 7000,
animationSpeed: 600,
initDelay: 0,
randomize: false,
fadeFirstSlide: true,
thumbCaptions: false,
pauseOnAction: true,
pauseOnHover: false,
pauseInvisible: true,
useCSS: true,
touch: true,
video: false,
controlNav: true,
directionNav: true,
prevText: "Previous",
nextText: "Next",
keyboard: true,
multipleKeyboard: false,
mousewheel: false,              //{UPDATED} Boolean: Requires jquery.mousewheel.js (https://github.com/brandonaaron/jquery-mousewheel) - Allows slider navigating via mousewheel
pausePlay: false,
pauseText: "Pause",
playText: "Play",
controlsContainer: "",
manualControls: "",
customDirectionNav: "",
sync: "",
asNavFor: "",
itemWidth: 0,
itemMargin: 0,
minItems: 1,
maxItems: 0,
move: 0,
allowOneSlide: true,
isFirefox: false,
start: function(){},
before: function(){},
after: function(){},
end: function(){},
added: function(){},
removed: function(){},
init: function(){},
rtl: false
};
$.fn.flexslider=function(options){
if(options===undefined){ options={};}
if(typeof options==="object"){
return this.each(function(){
var $this=$(this),
selector=(options.selector) ? options.selector:".slides > li",
$slides=$this.find(selector);
if(( $slides.length===1&&options.allowOneSlide===false)||$slides.length===0){
var fadeIn=[{ opacity: 0 }, { opacity: 1 }];
if($slides.length){ $slides[0].animate(fadeIn, 400); }
if(options.start){ options.start($this); }}else if($this.data('flexslider')===undefined){
new $.flexslider(this, options);
}});
}else{
var $slider=$(this).data('flexslider');
switch (options){
case "play": $slider.play(); break;
case "pause": $slider.pause(); break;
case "stop": $slider.stop(); break;
case "next": $slider.flexAnimate($slider.getTarget("next"), true); break;
case "prev":
case "previous": $slider.flexAnimate($slider.getTarget("prev"), true); break;
default: if(typeof options==="number"){ $slider.flexAnimate(options, true); }}
}};})(jQuery);
(function (root, factory){
if(typeof define==='function'&&define.amd){
define(factory);
}else if(typeof exports==='object'){
module.exports=factory();
}else{
root.PhotoSwipe=factory();
}})(this, function (){
'use strict';
var PhotoSwipe=function(template, UiClass, items, options){
var framework={
features: null,
bind: function(target, type, listener, unbind){
var methodName=(unbind ? 'remove':'add') + 'EventListener';
type=type.split(' ');
for(var i=0; i < type.length; i++){
if(type[i]){
target[methodName](type[i], listener, false);
}}
},
isArray: function(obj){
return (obj instanceof Array);
},
createEl: function(classes, tag){
var el=document.createElement(tag||'div');
if(classes){
el.className=classes;
}
return el;
},
getScrollY: function(){
var yOffset=window.pageYOffset;
return yOffset!==undefined ? yOffset:document.documentElement.scrollTop;
},
unbind: function(target, type, listener){
framework.bind(target,type,listener,true);
},
removeClass: function(el, className){
var reg=new RegExp('(\\s|^)' + className + '(\\s|$)');
el.className=el.className.replace(reg, ' ').replace(/^\s\s*/, '').replace(/\s\s*$/, '');
},
addClass: function(el, className){
if(!framework.hasClass(el,className)){
el.className +=(el.className ? ' ':'') + className;
}},
hasClass: function(el, className){
return el.className&&new RegExp('(^|\\s)' + className + '(\\s|$)').test(el.className);
},
getChildByClass: function(parentEl, childClassName){
var node=parentEl.firstChild;
while(node){
if(framework.hasClass(node, childClassName)){
return node;
}
node=node.nextSibling;
}},
arraySearch: function(array, value, key){
var i=array.length;
while(i--){
if(array[i][key]===value){
return i;
}}
return -1;
},
extend: function(o1, o2, preventOverwrite){
for (var prop in o2){
if(o2.hasOwnProperty(prop)){
if(preventOverwrite&&o1.hasOwnProperty(prop)){
continue;
}
o1[prop]=o2[prop];
}}
},
easing: {
sine: {
out: function(k){
return Math.sin(k * (Math.PI / 2));
},
inOut: function(k){
return - (Math.cos(Math.PI * k) - 1) / 2;
}},
cubic: {
out: function(k){
return --k * k * k + 1;
}}
/*
elastic: {
out: function(k){
var s, a=0.1, p=0.4;
if(k===0) return 0;
if(k===1) return 1;
if(!a||a < 1){ a=1; s=p / 4; }
else s=p * Math.asin(1 / a) /(2 * Math.PI);
return(a * Math.pow(2, - 10 * k) * Math.sin(( k - s) *(2 * Math.PI) / p) + 1);
},
},
back: {
out: function(k){
var s=1.70158;
return --k * k *(( s + 1) * k + s) + 1;
}}
*/
},
detectFeatures: function(){
if(framework.features){
return framework.features;
}
var helperEl=framework.createEl(),
helperStyle=helperEl.style,
vendor='',
features={};
features.oldIE=document.all&&!document.addEventListener;
features.touch='ontouchstart' in window;
if(window.requestAnimationFrame){
features.raf=window.requestAnimationFrame;
features.caf=window.cancelAnimationFrame;
}
features.pointerEvent = !!(window.PointerEvent)||navigator.msPointerEnabled;
if(!features.pointerEvent){
var ua=navigator.userAgent;
if(/iP(hone|od)/.test(navigator.platform)){
var v=(navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);
if(v&&v.length > 0){
v=parseInt(v[1], 10);
if(v >=1&&v < 8){
features.isOldIOSPhone=true;
}}
}
var match=ua.match(/Android\s([0-9\.]*)/);
var androidversion=match ? match[1]:0;
androidversion=parseFloat(androidversion);
if(androidversion >=1){
if(androidversion < 4.4){
features.isOldAndroid=true;
}
features.androidVersion=androidversion;
}
features.isMobileOpera=/opera mini|opera mobi/i.test(ua);
}
var styleChecks=['transform', 'perspective', 'animationName'],
vendors=['', 'webkit','Moz','ms','O'],
styleCheckItem,
styleName;
for(var i=0; i < 4; i++){
vendor=vendors[i];
for(var a=0; a < 3; a++){
styleCheckItem=styleChecks[a];
styleName=vendor + (vendor ?
styleCheckItem.charAt(0).toUpperCase() + styleCheckItem.slice(1) :
styleCheckItem);
if(!features[styleCheckItem]&&styleName in helperStyle){
features[styleCheckItem]=styleName;
}}
if(vendor&&!features.raf){
vendor=vendor.toLowerCase();
features.raf=window[vendor+'RequestAnimationFrame'];
if(features.raf){
features.caf=window[vendor+'CancelAnimationFrame'] ||
window[vendor+'CancelRequestAnimationFrame'];
}}
}
if(!features.raf){
var lastTime=0;
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);
lastTime=currTime + timeToCall;
return id;
};
features.caf=function(id){ clearTimeout(id); };}
features.svg = !!document.createElementNS &&
!!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect;
framework.features=features;
return features;
}};
framework.detectFeatures();
if(framework.features.oldIE){
framework.bind=function(target, type, listener, unbind){
type=type.split(' ');
var methodName=(unbind ? 'detach':'attach') + 'Event',
evName,
_handleEv=function(){
listener.handleEvent.call(listener);
};
for(var i=0; i < type.length; i++){
evName=type[i];
if(evName){
if(typeof listener==='object'&&listener.handleEvent){
if(!unbind){
listener['oldIE' + evName]=_handleEv;
}else{
if(!listener['oldIE' + evName]){
return false;
}}
target[methodName]('on' + evName, listener['oldIE' + evName]);
}else{
target[methodName]('on' + evName, listener);
}}
}};}
var self=this;
var DOUBLE_TAP_RADIUS=25,
NUM_HOLDERS=3;
var _options={
allowPanToNext:true,
spacing: 0.12,
bgOpacity: 1,
mouseUsed: false,
loop: true,
pinchToClose: true,
closeOnScroll: true,
closeOnVerticalDrag: true,
verticalDragRange: 0.75,
hideAnimationDuration: 333,
showAnimationDuration: 333,
showHideOpacity: false,
focus: true,
escKey: true,
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,
modal: true,
scaleMode: 'fit'
};
framework.extend(_options, options);
var _getEmptyPoint=function(){
return {x:0,y:0};};
var _isOpen,
_isDestroying,
_closedByScroll,
_currentItemIndex,
_containerStyle,
_containerShiftIndex,
_currPanDist=_getEmptyPoint(),
_startPanOffset=_getEmptyPoint(),
_panOffset=_getEmptyPoint(),
_upMoveEvents,
_downEvents,
_globalEventHandlers,
_viewportSize={},
_currZoomLevel,
_startZoomLevel,
_translatePrefix,
_translateSufix,
_updateSizeInterval,
_itemsNeedUpdate,
_currPositionIndex=0,
_offset={},
_slideSize=_getEmptyPoint(),
_itemHolders,
_prevItemIndex,
_indexDiff=0,
_dragStartEvent,
_dragMoveEvent,
_dragEndEvent,
_dragCancelEvent,
_transformKey,
_pointerEventEnabled,
_isFixedPosition=true,
_likelyTouchDevice,
_modules=[],
_requestAF,
_cancelAF,
_initalClassName,
_initalWindowScrollY,
_oldIE,
_currentWindowScrollY,
_features,
_windowVisibleSize={},
_renderMaxResolution=false,
_orientationChangeTimeout,
_registerModule=function(name, module){
framework.extend(self, module.publicMethods);
_modules.push(name);
},
_getLoopedId=function(index){
var numSlides=_getNumItems();
if(index > numSlides - 1){
return index - numSlides;
}else if(index < 0){
return numSlides + index;
}
return index;
},
_listeners={},
_listen=function(name, fn){
if(!_listeners[name]){
_listeners[name]=[];
}
return _listeners[name].push(fn);
},
_shout=function(name){
var listeners=_listeners[name];
if(listeners){
var args=Array.prototype.slice.call(arguments);
args.shift();
for(var i=0; i < listeners.length; i++){
listeners[i].apply(self, args);
}}
},
_getCurrentTime=function(){
return new Date().getTime();
},
_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);
}
styleObj[_transformKey]=_translatePrefix + x + 'px, ' + y + 'px' + _translateSufix + ' scale(' + zoom + ')';
},
_applyCurrentZoomPan=function(allowRenderResolution){
if(_currZoomElementStyle){
if(allowRenderResolution){
if(_currZoomLevel > self.currItem.fitRatio){
if(!_renderMaxResolution){
_setImageSize(self.currItem, false, true);
_renderMaxResolution=true;
}}else{
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);
}},
_setTranslateX=function(x, elStyle){
elStyle[_transformKey]=_translatePrefix + x + 'px, 0px' + _translateSufix;
},
_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)){
x=_mainScrollPos.x + delta * _options.mainScrollEndFriction;
}}
_mainScrollPos.x=x;
_setTranslateX(x, _containerStyle);
},
_calculatePanOffset=function(axis, zoomLevel){
var m=_midZoomPoint[axis] - _offset[axis];
return _startPanOffset[axis] + _currPanDist[axis] + m - m *(zoomLevel / _startZoomLevel);
},
_equalizePoints=function(p1, p2){
p1.x=p2.x;
p1.y=p2.y;
if(p2.id){
p1.id=p2.id;
}},
_roundPoint=function(p){
p.x=Math.round(p.x);
p.y=Math.round(p.y);
},
_mouseMoveTimeout=null,
_onFirstMouseMove=function(){
if(_mouseMoveTimeout){
framework.unbind(document, 'mousemove', _onFirstMouseMove);
framework.addClass(template, 'pswp--has_mouse');
_options.mouseUsed=true;
_shout('mouseUsed');
}
_mouseMoveTimeout=setTimeout(function(){
_mouseMoveTimeout=null;
}, 100);
},
_bindEvents=function(){
framework.bind(document, 'keydown', self);
if(_features.transform){
framework.bind(self.scrollWrap, 'click', self);
}
if(!_options.mouseUsed){
framework.bind(document, 'mousemove', _onFirstMouseMove);
}
framework.bind(window, 'resize scroll orientationchange', self);
_shout('bindEvents');
},
_unbindEvents=function(){
framework.unbind(window, 'resize scroll orientationchange', self);
framework.unbind(window, 'scroll', _globalEventHandlers.scroll);
framework.unbind(document, 'keydown', self);
framework.unbind(document, 'mousemove', _onFirstMouseMove);
if(_features.transform){
framework.unbind(self.scrollWrap, 'click', self);
}
if(_isDragging){
framework.unbind(window, _upMoveEvents, self);
}
clearTimeout(_orientationChangeTimeout);
_shout('unbindEvents');
},
_calculatePanBounds=function(zoomLevel, update){
var bounds=_calculateItemSize(self.currItem, _viewportSize, zoomLevel);
if(update){
_currPanBounds=bounds;
}
return bounds;
},
_getMinZoomLevel=function(item){
if(!item){
item=self.currItem;
}
return item.initialZoomLevel;
},
_getMaxZoomLevel=function(item){
if(!item){
item=self.currItem;
}
return item.w > 0 ? _options.maxSpreadZoom:1;
},
_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);
if(destPanOffset[axis] > destPanBounds.min[axis]){
destPanOffset[axis]=destPanBounds.min[axis];
return true;
}else if(destPanOffset[axis] < destPanBounds.max[axis]){
destPanOffset[axis]=destPanBounds.max[axis];
return true;
}}
return false;
},
_setupTransforms=function(){
if(_transformKey){
var allow3dTransform=_features.perspective&&!_likelyTouchDevice;
_translatePrefix='translate' + (allow3dTransform ? '3d(':'(');
_translateSufix=_features.perspective ? ', 0px)':')';
return;
}
_transformKey='left';
framework.addClass(template, 'pswp--ie');
_setTranslateX=function(x, elStyle){
elStyle.left=x + 'px';
};
_applyZoomPanToItem=function(item){
var zoomRatio=item.fitRatio > 1 ? 1:item.fitRatio,
s=item.container.style,
w=zoomRatio * item.w,
h=zoomRatio * item.h;
s.width=w + 'px';
s.height=h + 'px';
s.left=item.initialPosition.x + 'px';
s.top=item.initialPosition.y + 'px';
};
_applyCurrentZoomPan=function(){
if(_currZoomElementStyle){
var s=_currZoomElementStyle,
item=self.currItem,
zoomRatio=item.fitRatio > 1 ? 1:item.fitRatio,
w=zoomRatio * item.w,
h=zoomRatio * item.h;
s.width=w + 'px';
s.height=h + 'px';
s.left=_panOffset.x + 'px';
s.top=_panOffset.y + 'px';
}};},
_onKeyDown=function(e){
var keydownAction='';
if(_options.escKey&&e.keyCode===27){
keydownAction='close';
}else if(_options.arrowKeys){
if(e.keyCode===37){
keydownAction='prev';
}else if(e.keyCode===39){
keydownAction='next';
}}
if(keydownAction){
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){
return;
}
if(_moved||_zoomStarted||_mainScrollAnimating||_verticalDragInitiated){
e.preventDefault();
e.stopPropagation();
}},
_updatePageScrollOffset=function(){
self.setScrollOffset(0, framework.getScrollY());
};
var _animations={},
_numAnimations=0,
_stopAnimation=function(name){
if(_animations[name]){
if(_animations[name].raf){
_cancelAF(_animations[name].raf);
}
_numAnimations--;
delete _animations[name];
}},
_registerStartAnimation=function(name){
if(_animations[name]){
_stopAnimation(name);
}
if(!_animations[name]){
_numAnimations++;
_animations[name]={};}},
_stopAllAnimations=function(){
for (var prop in _animations){
if(_animations.hasOwnProperty(prop) ){
_stopAnimation(prop);
}}
},
_animateProp=function(name, b, endProp, d, easingFn, onUpdate, onComplete){
var startAnimTime=_getCurrentTime(), t;
_registerStartAnimation(name);
var animloop=function(){
if(_animations[name]){
t=_getCurrentTime() - startAnimTime;
if(t >=d){
_stopAnimation(name);
onUpdate(endProp);
if(onComplete){
onComplete();
}
return;
}
onUpdate((endProp - b) * easingFn(t/d) + b);
_animations[name].raf=_requestAF(animloop);
}};
animloop();
};
var publicMethods={
shout: _shout,
listen: _listen,
viewportSize: _viewportSize,
options: _options,
isMainScrollAnimating: function(){
return _mainScrollAnimating;
},
getZoomLevel: function(){
return _currZoomLevel;
},
getCurrentIndex: function(){
return _currentItemIndex;
},
isDragging: function(){
return _isDragging;
},
isZooming: function(){
return _isZooming;
},
setScrollOffset: function(x,y){
_offset.x=x;
_currentWindowScrollY=_offset.y=y;
_shout('updateScrollOffset', _offset);
},
applyZoomPan: function(zoomLevel,panX,panY,allowRenderResolution){
_panOffset.x=panX;
_panOffset.y=panY;
_currZoomLevel=zoomLevel;
_applyCurrentZoomPan(allowRenderResolution);
},
init: function(){
if(_isOpen||_isDestroying){
return;
}
var i;
self.framework=framework;
self.template=template;
self.bg=framework.getChildByClass(template, 'pswp__bg');
_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');
_containerStyle=self.container.style;
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}
];
_itemHolders[0].el.style.display=_itemHolders[2].el.style.display='none';
_setupTransforms();
_globalEventHandlers={
resize: self.updateSize,
orientationchange: function(){
clearTimeout(_orientationChangeTimeout);
_orientationChangeTimeout=setTimeout(function(){
if(_viewportSize.x!==self.scrollWrap.clientWidth){
self.updateSize();
}}, 500);
},
scroll: _updatePageScrollOffset,
keydown: _onKeyDown,
click: _onGlobalClick
};
var oldPhone=_features.isOldIOSPhone||_features.isOldAndroid||_features.isMobileOpera;
if(!_features.animationName||!_features.transform||oldPhone){
_options.showAnimationDuration=_options.hideAnimationDuration=0;
}
for(i=0; i < _modules.length; i++){
self['init' + _modules[i]]();
}
if(UiClass){
var ui=self.ui=new UiClass(self, framework);
ui.init();
}
_shout('firstUpdate');
_currentItemIndex=_currentItemIndex||_options.index||0;
if(isNaN(_currentItemIndex)||_currentItemIndex < 0||_currentItemIndex >=_getNumItems()){
_currentItemIndex=0;
}
self.currItem=_getItemAt(_currentItemIndex);
if(_features.isOldIOSPhone||_features.isOldAndroid){
_isFixedPosition=false;
}
template.setAttribute('aria-hidden', 'false');
if(_options.modal){
if(!_isFixedPosition){
template.style.position='absolute';
template.style.top=framework.getScrollY() + 'px';
}else{
template.style.position='fixed';
}}
if(_currentWindowScrollY===undefined){
_shout('initialLayout');
_currentWindowScrollY=_initalWindowScrollY=framework.getScrollY();
}
var rootClasses='pswp--open ';
if(_options.mainClass){
rootClasses +=_options.mainClass + ' ';
}
if(_options.showHideOpacity){
rootClasses +='pswp--animate_opacity ';
}
rootClasses +=_likelyTouchDevice ? 'pswp--touch':'pswp--notouch';
rootClasses +=_features.animationName ? ' pswp--css_animation':'';
rootClasses +=_features.svg ? ' pswp--svg':'';
framework.addClass(template, rootClasses);
self.updateSize();
_containerShiftIndex=-1;
_indexDiff=null;
for(i=0; i < NUM_HOLDERS; i++){
_setTranslateX((i+_containerShiftIndex) * _slideSize.x, _itemHolders[i].el.style);
}
if(!_oldIE){
framework.bind(self.scrollWrap, _downEvents, self);
}
_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){
template.focus();
}
_bindEvents();
});
self.setContent(_itemHolders[1], _currentItemIndex);
self.updateCurrItem();
_shout('afterInit');
if(!_isFixedPosition){
_updateSizeInterval=setInterval(function(){
if(!_numAnimations&&!_isDragging&&!_isZooming&&(_currZoomLevel===self.currItem.initialZoomLevel)){
self.updateSize();
}}, 1000);
}
framework.addClass(template, 'pswp--visible');
},
close: function(){
if(!_isOpen){
return;
}
_isOpen=false;
_isDestroying=true;
_shout('close');
_unbindEvents();
_showOrHide(self.currItem, null, true, self.destroy);
},
destroy: function(){
_shout('destroy');
if(_showOrHideTimeout){
clearTimeout(_showOrHideTimeout);
}
template.setAttribute('aria-hidden', 'true');
template.className=_initalClassName;
if(_updateSizeInterval){
clearInterval(_updateSizeInterval);
}
framework.unbind(self.scrollWrap, _downEvents, self);
framework.unbind(window, 'scroll', self);
_stopDragUpdateLoop();
_stopAllAnimations();
_listeners=null;
},
panTo: function(x,y,force){
if(!force){
if(x > _currPanBounds.min.x){
x=_currPanBounds.min.x;
}else if(x < _currPanBounds.max.x){
x=_currPanBounds.max.x;
}
if(y > _currPanBounds.min.y){
y=_currPanBounds.min.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]){
_globalEventHandlers[e.type](e);
}},
goTo: function(index){
index=_getLoopedId(index);
var diff=index - _currentItemIndex;
_indexDiff=diff;
_currentItemIndex=index;
self.currItem=_getItemAt(_currentItemIndex);
_currPositionIndex -=diff;
_moveMainScroll(_slideSize.x * _currPositionIndex);
_stopAllAnimations();
_mainScrollAnimating=false;
self.updateCurrItem();
},
next: function(){
self.goTo(_currentItemIndex + 1);
},
prev: function(){
self.goTo(_currentItemIndex - 1);
},
updateCurrZoomItem: function(emulateSetContent){
if(emulateSetContent){
_shout('beforeChange', 0);
}
if(_itemHolders[1].el.children.length){
var zoomElement=_itemHolders[1].el.children[0];
if(framework.hasClass(zoomElement, 'pswp__zoom-wrap')){
_currZoomElementStyle=zoomElement.style;
}else{
_currZoomElementStyle=null;
}}else{
_currZoomElementStyle=null;
}
_currPanBounds=self.currItem.bounds;
_startZoomLevel=_currZoomLevel=self.currItem.initialZoomLevel;
_panOffset.x=_currPanBounds.center.x;
_panOffset.y=_currPanBounds.center.y;
if(emulateSetContent){
_shout('afterChange');
}},
invalidateCurrItems: function(){
_itemsNeedUpdate=true;
for(var i=0; i < NUM_HOLDERS; i++){
if(_itemHolders[i].item){
_itemHolders[i].item.needsUpdate=true;
}}
},
updateCurrItem: function(beforeAnimation){
if(_indexDiff===0){
return;
}
var diffAbs=Math.abs(_indexDiff),
tempHolder;
if(beforeAnimation&&diffAbs < 2){
return;
}
self.currItem=_getItemAt(_currentItemIndex);
_renderMaxResolution=false;
_shout('beforeChange', _indexDiff);
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){
tempHolder=_itemHolders.shift();
_itemHolders[NUM_HOLDERS-1]=tempHolder;
_containerShiftIndex++;
_setTranslateX((_containerShiftIndex+2) * _slideSize.x, tempHolder.el.style);
self.setContent(tempHolder, _currentItemIndex - diffAbs + i + 1 + 1);
}else{
tempHolder=_itemHolders.pop();
_itemHolders.unshift(tempHolder);
_containerShiftIndex--;
_setTranslateX(_containerShiftIndex * _slideSize.x, tempHolder.el.style);
self.setContent(tempHolder, _currentItemIndex + diffAbs - i - 1 - 1);
}}
if(_currZoomElementStyle&&Math.abs(_indexDiff)===1){
var prevItem=_getItemAt(_prevItemIndex);
if(prevItem.initialZoomLevel!==_currZoomLevel){
_calculateItemSize(prevItem , _viewportSize);
_setImageSize(prevItem);
_applyZoomPanToItem(prevItem);
}}
_indexDiff=0;
self.updateCurrZoomItem();
_prevItemIndex=_currentItemIndex;
_shout('afterChange');
},
updateSize: function(force){
if(!_isFixedPosition&&_options.modal){
var windowScrollY=framework.getScrollY();
if(_currentWindowScrollY!==windowScrollY){
template.style.top=windowScrollY + 'px';
_currentWindowScrollY=windowScrollY;
}
if(!force&&_windowVisibleSize.x===window.innerWidth&&_windowVisibleSize.y===window.innerHeight){
return;
}
_windowVisibleSize.x=window.innerWidth;
_windowVisibleSize.y=window.innerHeight;
template.style.height=_windowVisibleSize.y + 'px';
}
_viewportSize.x=self.scrollWrap.clientWidth;
_viewportSize.y=self.scrollWrap.clientHeight;
_updatePageScrollOffset();
_slideSize.x=_viewportSize.x + Math.round(_viewportSize.x * _options.spacing);
_slideSize.y=_viewportSize.y;
_moveMainScroll(_slideSize.x * _currPositionIndex);
_shout('beforeResize');
if(_containerShiftIndex!==undefined){
var holder,
item,
hIndex;
for(var i=0; i < NUM_HOLDERS; i++){
holder=_itemHolders[i];
_setTranslateX((i+_containerShiftIndex) * _slideSize.x, holder.el.style);
hIndex=_currentItemIndex+i-1;
if(_options.loop&&_getNumItems() > 2){
hIndex=_getLoopedId(hIndex);
}
item=_getItemAt(hIndex);
if(item&&(_itemsNeedUpdate||item.needsUpdate||!item.bounds)){
self.cleanSlide(item);
self.setContent(holder, hIndex);
if(i===1){
self.currItem=item;
self.updateCurrZoomItem(true);
}
item.needsUpdate=false;
}else if(holder.index===-1&&hIndex >=0){
self.setContent(holder, hIndex);
}
if(item&&item.container){
_calculateItemSize(item, _viewportSize);
_setImageSize(item);
_applyZoomPanToItem(item);
}}
_itemsNeedUpdate=false;
}
_startZoomLevel=_currZoomLevel=self.currItem.initialZoomLevel;
_currPanBounds=self.currItem.bounds;
if(_currPanBounds){
_panOffset.x=_currPanBounds.center.x;
_panOffset.y=_currPanBounds.center.y;
_applyCurrentZoomPan(true);
}
_shout('resize');
},
zoomTo: function(destZoomLevel, centerPoint, speed, easingFn, updateFn){
if(centerPoint){
_startZoomLevel=_currZoomLevel;
_midZoomPoint.x=Math.abs(centerPoint.x) - _panOffset.x ;
_midZoomPoint.y=Math.abs(centerPoint.y) - _panOffset.y ;
_equalizePoints(_startPanOffset, _panOffset);
}
var destPanBounds=_calculatePanBounds(destZoomLevel, false),
destPanOffset={};
_modifyDestPanOffset('x', destPanBounds, destPanOffset, destZoomLevel);
_modifyDestPanOffset('y', destPanBounds, destPanOffset, destZoomLevel);
var initialZoomLevel=_currZoomLevel;
var initialPanOffset={
x: _panOffset.x,
y: _panOffset.y
};
_roundPoint(destPanOffset);
var onUpdate=function(now){
if(now===1){
_currZoomLevel=destZoomLevel;
_panOffset.x=destPanOffset.x;
_panOffset.y=destPanOffset.y;
}else{
_currZoomLevel=(destZoomLevel - initialZoomLevel) * now + initialZoomLevel;
_panOffset.x=(destPanOffset.x - initialPanOffset.x) * now + initialPanOffset.x;
_panOffset.y=(destPanOffset.y - initialPanOffset.y) * now + initialPanOffset.y;
}
if(updateFn){
updateFn(now);
}
_applyCurrentZoomPan(now===1);
};
if(speed){
_animateProp('customZoomTo', 0, 1, speed, easingFn||framework.easing.sine.inOut, onUpdate);
}else{
onUpdate(1);
}}
};
var MIN_SWIPE_DISTANCE=30,
DIRECTION_CHECK_OFFSET=10;
var _gestureStartTime,
_gestureCheckSpeedTime,
p={},
p2={},
delta={},
_currPoint={},
_startPoint={},
_currPointers=[],
_startMainScrollPos={},
_releaseAnimData,
_posPoints=[],
_tempPoint={},
_isZoomingIn,
_verticalDragInitiated,
_oldAndroidTouchEndTimeout,
_currZoomedItemIndex=0,
_centerPoint=_getEmptyPoint(),
_lastReleaseTime=0,
_isDragging,
_isMultitouch,
_zoomStarted,
_moved,
_dragAnimFrame,
_mainScrollShifted,
_currentPoints,
_isZooming,
_currPointsDistance,
_startPointsDistance,
_currPanBounds,
_mainScrollPos=_getEmptyPoint(),
_currZoomElementStyle,
_mainScrollAnimating,
_midZoomPoint=_getEmptyPoint(),
_currCenterPoint=_getEmptyPoint(),
_direction,
_isFirstMove,
_opacityChanged,
_bgOpacity,
_wasOverInitialZoom,
_isEqualPoints=function(p1, p2){
return p1.x===p2.x&&p1.y===p2.y;
},
_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);
return Math.sqrt(_tempPoint.x * _tempPoint.x + _tempPoint.y * _tempPoint.y);
},
_stopDragUpdateLoop=function(){
if(_dragAnimFrame){
_cancelAF(_dragAnimFrame);
_dragAnimFrame=null;
}},
_dragUpdateLoop=function(){
if(_isDragging){
_dragAnimFrame=_requestAF(_dragUpdateLoop);
_renderMovement();
}},
_canPan=function(){
return !(_options.scaleMode==='fit'&&_currZoomLevel===self.currItem.initialZoomLevel);
},
_closestElement=function(el, fn){
if(!el||el===document){
return false;
}
if(el.getAttribute('class')&&el.getAttribute('class').indexOf('pswp__scroll-wrap') > -1){
return false;
}
if(fn(el)){
return el;
}
return _closestElement(el.parentNode, fn);
},
_preventObj={},
_preventDefaultEventBehaviour=function(e, isDown){
_preventObj.prevent = !_closestElement(e.target, _options.isClickableElement);
_shout('preventDragEvent', e, isDown, _preventObj);
return _preventObj.prevent;
},
_convertTouchToPoint=function(touch, p){
p.x=touch.pageX;
p.y=touch.pageY;
p.id=touch.identifier;
return p;
},
_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){
var o=_posPoints.length > 2 ? _posPoints.shift():{};
o.x=x;
o.y=y;
_posPoints.push(o);
_gestureCheckSpeedTime=time;
}},
_calculateVerticalDragOpacityRatio=function(){
var yOffset=_panOffset.y - self.currItem.initialPosition.y;
return 1 -  Math.abs(yOffset / (_viewportSize.y / 2));
},
_ePoint1={},
_ePoint2={},
_tempPointsArr=[],
_tempCounter,
_getTouchPoints=function(e){
while(_tempPointsArr.length > 0){
_tempPointsArr.pop();
}
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){
_tempPointsArr[1]=_convertTouchToPoint(e.touches[1], _ePoint2);
}}
}else{
_ePoint1.x=e.pageX;
_ePoint1.y=e.pageY;
_ePoint1.id='';
_tempPointsArr[0]=_ePoint1;
}}else{
_tempCounter=0;
_currPointers.forEach(function(p){
if(_tempCounter===0){
_tempPointsArr[0]=p;
}else if(_tempCounter===1){
_tempPointsArr[1]=p;
}
_tempCounter++;
});
}
return _tempPointsArr;
},
_panOrMoveMainScroll=function(axis, delta){
var panFriction,
overDiff=0,
newOffset=_panOffset[axis] + delta[axis],
startOverDiff,
dir=delta[axis] > 0,
newMainScrollPosition=_mainScrollPos.x + delta.x,
mainScrollDiff=_mainScrollPos.x - _startMainScrollPos.x,
newPanPos,
newMainScrollPos;
if(newOffset > _currPanBounds.min[axis]||newOffset < _currPanBounds.max[axis]){
panFriction=_options.panEndFriction;
}else{
panFriction=1;
}
newOffset=_panOffset[axis] + delta[axis] * panFriction;
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]){
panFriction=_options.panEndFriction;
overDiff=_currPanBounds.min[axis] - newOffset;
startOverDiff=_currPanBounds.min[axis] - _startPanOffset[axis];
}
if((startOverDiff <=0||mainScrollDiff < 0)&&_getNumItems() > 1){
newMainScrollPos=newMainScrollPosition;
if(mainScrollDiff < 0&&newMainScrollPosition > _startMainScrollPos.x){
newMainScrollPos=_startMainScrollPos.x;
}}else{
if(_currPanBounds.min.x!==_currPanBounds.max.x){
newPanPos=newOffset;
}}
}else{
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){
newMainScrollPos=newMainScrollPosition;
if(mainScrollDiff > 0&&newMainScrollPosition < _startMainScrollPos.x){
newMainScrollPos=_startMainScrollPos.x;
}}else{
if(_currPanBounds.min.x!==_currPanBounds.max.x){
newPanPos=newOffset;
}}
}}
if(axis==='x'){
if(newMainScrollPos!==undefined){
_moveMainScroll(newMainScrollPos, true);
if(newMainScrollPos===_startMainScrollPos.x){
_mainScrollShifted=false;
}else{
_mainScrollShifted=true;
}}
if(_currPanBounds.min.x!==_currPanBounds.max.x){
if(newPanPos!==undefined){
_panOffset.x=newPanPos;
}else if(!_mainScrollShifted){
_panOffset.x +=delta.x * panFriction;
}}
return newMainScrollPos!==undefined;
}}
if(!_mainScrollAnimating){
if(!_mainScrollShifted){
if(_currZoomLevel > self.currItem.fitRatio){
_panOffset[axis] +=delta[axis] * panFriction;
}}
}},
_onDragStart=function(e){
if(e.type==='mousedown'&&e.button > 0){
return;
}
if(_initialZoomRunning){
e.preventDefault();
return;
}
if(_oldAndroidTouchEndTimeout&&e.type==='mousedown'){
return;
}
if(_preventDefaultEventBehaviour(e, true)){
e.preventDefault();
}
_shout('pointerDown');
if(_pointerEventEnabled){
var pointerIndex=framework.arraySearch(_currPointers, e.pointerId, 'id');
if(pointerIndex < 0){
pointerIndex=_currPointers.length;
}
_currPointers[pointerIndex]={x:e.pageX, y:e.pageY, id: e.pointerId};}
var startPointsList=_getTouchPoints(e),
numPoints=startPointsList.length;
_currentPoints=null;
_stopAllAnimations();
if(!_isDragging||numPoints===1){
_isDragging=_isFirstMove=true;
framework.bind(window, _upMoveEvents, self);
_isZoomingIn =
_wasOverInitialZoom =
_opacityChanged =
_verticalDragInitiated =
_mainScrollShifted =
_moved =
_isMultitouch =
_zoomStarted=false;
_direction=null;
_shout('firstTouchStart', startPointsList);
_equalizePoints(_startPanOffset, _panOffset);
_currPanDist.x=_currPanDist.y=0;
_equalizePoints(_currPoint, startPointsList[0]);
_equalizePoints(_startPoint, _currPoint);
_startMainScrollPos.x=_slideSize.x * _currPositionIndex;
_posPoints=[{
x: _currPoint.x,
y: _currPoint.y
}];
_gestureCheckSpeedTime=_gestureStartTime=_getCurrentTime();
_calculatePanBounds(_currZoomLevel, true);
_stopDragUpdateLoop();
_dragUpdateLoop();
}
if(!_isZooming&&numPoints > 1&&!_mainScrollAnimating&&!_mainScrollShifted){
_startZoomLevel=_currZoomLevel;
_zoomStarted=false;
_isZooming=_isMultitouch=true;
_currPanDist.y=_currPanDist.x=0;
_equalizePoints(_startPanOffset, _panOffset);
_equalizePoints(p, startPointsList[0]);
_equalizePoints(p2, startPointsList[1]);
_findCenterOfPoints(p, p2, _currCenterPoint);
_midZoomPoint.x=Math.abs(_currCenterPoint.x) - _panOffset.x;
_midZoomPoint.y=Math.abs(_currCenterPoint.y) - _panOffset.y;
_currPointsDistance=_startPointsDistance=_calculatePointsDistance(p, p2);
}},
_onDragMove=function(e){
e.preventDefault();
if(_pointerEventEnabled){
var pointerIndex=framework.arraySearch(_currPointers, e.pointerId, 'id');
if(pointerIndex > -1){
var p=_currPointers[pointerIndex];
p.x=e.pageX;
p.y=e.pageY;
}}
if(_isDragging){
var touchesList=_getTouchPoints(e);
if(!_direction&&!_moved&&!_isZooming){
if(_mainScrollPos.x!==_slideSize.x * _currPositionIndex){
_direction='h';
}else{
var diff=Math.abs(touchesList[0].x - _currPoint.x) - Math.abs(touchesList[0].y - _currPoint.y);
if(Math.abs(diff) >=DIRECTION_CHECK_OFFSET){
_direction=diff > 0 ? 'h':'v';
_currentPoints=touchesList;
}}
}else{
_currentPoints=touchesList;
}}
},
_renderMovement=function(){
if(!_currentPoints){
return;
}
var numPoints=_currentPoints.length;
if(numPoints===0){
return;
}
_equalizePoints(p, _currentPoints[0]);
delta.x=p.x - _currPoint.x;
delta.y=p.y - _currPoint.y;
if(_isZooming&&numPoints > 1){
_currPoint.x=p.x;
_currPoint.y=p.y;
if(!delta.x&&!delta.y&&_isEqualPoints(_currentPoints[1], p2)){
return;
}
_equalizePoints(p2, _currentPoints[1]);
if(!_zoomStarted){
_zoomStarted=true;
_shout('zoomGestureStarted');
}
var pointsDistance=_calculatePointsDistance(p,p2);
var zoomLevel=_calculateZoomLevel(pointsDistance);
if(zoomLevel > self.currItem.initialZoomLevel + self.currItem.initialZoomLevel / 15){
_wasOverInitialZoom=true;
}
var zoomFriction=1,
minZoomLevel=_getMinZoomLevel(),
maxZoomLevel=_getMaxZoomLevel();
if(zoomLevel < minZoomLevel){
if(_options.pinchToClose&&!_wasOverInitialZoom&&_startZoomLevel <=self.currItem.initialZoomLevel){
var minusDiff=minZoomLevel - zoomLevel;
var percent=1 - minusDiff / (minZoomLevel / 1.2);
_applyBgOpacity(percent);
_shout('onPinchClose', percent);
_opacityChanged=true;
}else{
zoomFriction=(minZoomLevel - zoomLevel) / minZoomLevel;
if(zoomFriction > 1){
zoomFriction=1;
}
zoomLevel=minZoomLevel - zoomFriction * (minZoomLevel / 3);
}}else if(zoomLevel > maxZoomLevel){
zoomFriction=(zoomLevel - maxZoomLevel) /(minZoomLevel * 6);
if(zoomFriction > 1){
zoomFriction=1;
}
zoomLevel=maxZoomLevel + zoomFriction * minZoomLevel;
}
if(zoomFriction < 0){
zoomFriction=0;
}
_currPointsDistance=pointsDistance;
_findCenterOfPoints(p, p2, _centerPoint);
_currPanDist.x +=_centerPoint.x - _currCenterPoint.x;
_currPanDist.y +=_centerPoint.y - _currCenterPoint.y;
_equalizePoints(_currCenterPoint, _centerPoint);
_panOffset.x=_calculatePanOffset('x', zoomLevel);
_panOffset.y=_calculatePanOffset('y', zoomLevel);
_isZoomingIn=zoomLevel > _currZoomLevel;
_currZoomLevel=zoomLevel;
_applyCurrentZoomPan();
}else{
if(!_direction){
return;
}
if(_isFirstMove){
_isFirstMove=false;
if(Math.abs(delta.x) >=DIRECTION_CHECK_OFFSET){
delta.x -=_currentPoints[0].x - _startPoint.x;
}
if(Math.abs(delta.y) >=DIRECTION_CHECK_OFFSET){
delta.y -=_currentPoints[0].y - _startPoint.y;
}}
_currPoint.x=p.x;
_currPoint.y=p.y;
if(delta.x===0&&delta.y===0){
return;
}
if(_direction==='v'&&_options.closeOnVerticalDrag){
if(!_canPan()){
_currPanDist.y +=delta.y;
_panOffset.y +=delta.y;
var opacityRatio=_calculateVerticalDragOpacityRatio();
_verticalDragInitiated=true;
_shout('onVerticalDrag', opacityRatio);
_applyBgOpacity(opacityRatio);
_applyCurrentZoomPan();
return ;
}}
_pushPosPoint(_getCurrentTime(), p.x, p.y);
_moved=true;
_currPanBounds=self.currItem.bounds;
var mainScrollChanged=_panOrMoveMainScroll('x', delta);
if(!mainScrollChanged){
_panOrMoveMainScroll('y', delta);
_roundPoint(_panOffset);
_applyCurrentZoomPan();
}}
},
_onDragRelease=function(e){
if(_features.isOldAndroid){
if(_oldAndroidTouchEndTimeout&&e.type==='mouseup'){
return;
}
if(e.type.indexOf('touch') > -1){
clearTimeout(_oldAndroidTouchEndTimeout);
_oldAndroidTouchEndTimeout=setTimeout(function(){
_oldAndroidTouchEndTimeout=0;
}, 600);
}}
_shout('pointerUp');
if(_preventDefaultEventBehaviour(e, false)){
e.preventDefault();
}
var releasePoint;
if(_pointerEventEnabled){
var pointerIndex=framework.arraySearch(_currPointers, e.pointerId, 'id');
if(pointerIndex > -1){
releasePoint=_currPointers.splice(pointerIndex, 1)[0];
if(navigator.msPointerEnabled){
var MSPOINTER_TYPES={
4: 'mouse',
2: 'touch',
3: 'pen'
};
releasePoint.type=MSPOINTER_TYPES[e.pointerType];
if(!releasePoint.type){
releasePoint.type=e.pointerType||'mouse';
}}else{
releasePoint.type=e.pointerType||'mouse';
}}
}
var touchList=_getTouchPoints(e),
gestureType,
numPoints=touchList.length;
if(e.type==='mouseup'){
numPoints=0;
}
if(numPoints===2){
_currentPoints=null;
return true;
}
if(numPoints===1){
_equalizePoints(_startPoint, touchList[0]);
}
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);
}
var releaseTimeDiff=-1;
if(numPoints===0){
_isDragging=false;
framework.unbind(window, _upMoveEvents, self);
_stopDragUpdateLoop();
if(_isZooming){
releaseTimeDiff=0;
}else if(_lastReleaseTime!==-1){
releaseTimeDiff=_getCurrentTime() - _lastReleaseTime;
}}
_lastReleaseTime=numPoints===1 ? _getCurrentTime():-1;
if(releaseTimeDiff!==-1&&releaseTimeDiff < 150){
gestureType='zoom';
}else{
gestureType='swipe';
}
if(_isZooming&&numPoints < 2){
_isZooming=false;
if(numPoints===1){
gestureType='zoomPointerUp';
}
_shout('zoomGestureEnded');
}
_currentPoints=null;
if(!_moved&&!_zoomStarted&&!_mainScrollAnimating&&!_verticalDragInitiated){
return;
}
_stopAllAnimations();
if(!_releaseAnimData){
_releaseAnimData=_initDragReleaseAnimationData();
}
_releaseAnimData.calculateSwipeSpeed('x');
if(_verticalDragInitiated){
var opacityRatio=_calculateVerticalDragOpacityRatio();
if(opacityRatio < _options.verticalDragRange){
self.close();
}else{
var initalPanY=_panOffset.y,
initialBgOpacity=_bgOpacity;
_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);
_applyCurrentZoomPan();
});
_shout('onVerticalDrag', 1);
}
return;
}
if((_mainScrollShifted||_mainScrollAnimating)&&numPoints===0){
var itemChanged=_finishSwipeMainScrollGesture(gestureType, _releaseAnimData);
if(itemChanged){
return;
}
gestureType='zoomPointerUp';
}
if(_mainScrollAnimating){
return;
}
if(gestureType!=='swipe'){
_completeZoomGesture();
return;
}
if(!_mainScrollShifted&&_currZoomLevel > self.currItem.fitRatio){
_completePanGesture(_releaseAnimData);
}},
_initDragReleaseAnimationData=function(){
var lastFlickDuration,
tempReleasePos;
var s={
lastFlickOffset: {},
lastFlickDist: {},
lastFlickSpeed: {},
slowDownRatio:  {},
slowDownRatioReverse:  {},
speedDecelerationRatio:  {},
speedDecelerationRatioAbs:  {},
distanceOffset:  {},
backAnimDestination: {},
backAnimStarted: {},
calculateSwipeSpeed: function(axis){
if(_posPoints.length > 1){
lastFlickDuration=_getCurrentTime() - _gestureCheckSpeedTime + 50;
tempReleasePos=_posPoints[_posPoints.length-2][axis];
}else{
lastFlickDuration=_getCurrentTime() - _gestureStartTime;
tempReleasePos=_startPoint[axis];
}
s.lastFlickOffset[axis]=_currPoint[axis] - tempReleasePos;
s.lastFlickDist[axis]=Math.abs(s.lastFlickOffset[axis]);
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){
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]){
s.backAnimDestination[axis]=_currPanBounds.min[axis];
}else if(_panOffset[axis] < _currPanBounds.max[axis]){
s.backAnimDestination[axis]=_currPanBounds.max[axis];
}
if(s.backAnimDestination[axis]!==undefined){
s.slowDownRatio[axis]=0.7;
s.slowDownRatioReverse[axis]=1 - s.slowDownRatio[axis];
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){
_panOffset[axis]=pos;
_applyCurrentZoomPan();
}
);
}}
}},
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){
_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){
_panOffset.x=Math.round(_panOffset.x);
_panOffset.y=Math.round(_panOffset.y);
_applyCurrentZoomPan();
_stopAnimation('zoomPan');
return;
}}
}};
return s;
},
_completePanGesture=function(animData){
animData.calculateSwipeSpeed('y');
_currPanBounds=self.currItem.bounds;
animData.backAnimDestination={};
animData.backAnimStarted={};
if(Math.abs(animData.lastFlickSpeed.x) <=0.05&&Math.abs(animData.lastFlickSpeed.y) <=0.05){
animData.speedDecelerationRatioAbs.x=animData.speedDecelerationRatioAbs.y=0;
animData.calculateOverBoundsAnimOffset('x');
animData.calculateOverBoundsAnimOffset('y');
return true;
}
_registerStartAnimation('zoomPan');
animData.lastNow=_getCurrentTime();
animData.panAnimLoop();
},
_finishSwipeMainScrollGesture=function(gestureType, _releaseAnimData){
var itemChanged;
if(!_mainScrollAnimating){
_currZoomedItemIndex=_currentItemIndex;
}
var itemsDiff;
if(gestureType==='swipe'){
var totalShiftDist=_currPoint.x - _startPoint.x,
isFastLastFlick=_releaseAnimData.lastFlickDist.x < 10;
if(totalShiftDist > MIN_SWIPE_DISTANCE &&
(isFastLastFlick||_releaseAnimData.lastFlickOffset.x > 20)){
itemsDiff=-1;
}else if(totalShiftDist < -MIN_SWIPE_DISTANCE &&
(isFastLastFlick||_releaseAnimData.lastFlickOffset.x < -20)){
itemsDiff=1;
}}
var nextCircle;
if(itemsDiff){
_currentItemIndex +=itemsDiff;
if(_currentItemIndex < 0){
_currentItemIndex=_options.loop ? _getNumItems()-1:0;
nextCircle=true;
}else if(_currentItemIndex >=_getNumItems()){
_currentItemIndex=_options.loop ? 0:_getNumItems()-1;
nextCircle=true;
}
if(!nextCircle||_options.loop){
_indexDiff +=itemsDiff;
_currPositionIndex -=itemsDiff;
itemChanged=true;
}}
var animateToX=_slideSize.x * _currPositionIndex;
var animateToDist=Math.abs(animateToX - _mainScrollPos.x);
var finishAnimDuration;
if(!itemChanged&&animateToX > _mainScrollPos.x!==_releaseAnimData.lastFlickSpeed.x > 0){
finishAnimDuration=333;
}else{
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){
itemChanged=false;
}
_mainScrollAnimating=true;
_shout('mainScrollAnimStart');
_animateProp('mainScroll', _mainScrollPos.x, animateToX, finishAnimDuration, framework.easing.cubic.out,
_moveMainScroll,
function(){
_stopAllAnimations();
_mainScrollAnimating=false;
_currZoomedItemIndex=-1;
if(itemChanged||_currZoomedItemIndex!==_currentItemIndex){
self.updateCurrItem();
}
_shout('mainScrollAnimComplete');
}
);
if(itemChanged){
self.updateCurrItem(true);
}
return itemChanged;
},
_calculateZoomLevel=function(touchesDistance){
return  1 / _startPointsDistance * touchesDistance * _startZoomLevel;
},
_completeZoomGesture=function(){
var destZoomLevel=_currZoomLevel,
minZoomLevel=_getMinZoomLevel(),
maxZoomLevel=_getMaxZoomLevel();
if(_currZoomLevel < minZoomLevel){
destZoomLevel=minZoomLevel;
}else if(_currZoomLevel > maxZoomLevel){
destZoomLevel=maxZoomLevel;
}
var destOpacity=1,
onUpdate,
initialOpacity=_bgOpacity;
if(_opacityChanged&&!_isZoomingIn&&!_wasOverInitialZoom&&_currZoomLevel < minZoomLevel){
self.close();
return true;
}
if(_opacityChanged){
onUpdate=function(now){
_applyBgOpacity((destOpacity - initialOpacity) * now + initialOpacity);
};}
self.zoomTo(destZoomLevel, 0, 200,  framework.easing.cubic.out, onUpdate);
return true;
};
_registerModule('Gestures', {
publicMethods: {
initGestures: function(){
var addEventNames=function(pref, down, move, up, cancel){
_dragStartEvent=pref + down;
_dragMoveEvent=pref + move;
_dragEndEvent=pref + up;
if(cancel){
_dragCancelEvent=pref + cancel;
}else{
_dragCancelEvent='';
}};
_pointerEventEnabled=_features.pointerEvent;
if(_pointerEventEnabled&&_features.touch){
_features.touch=false;
}
if(_pointerEventEnabled){
if(navigator.msPointerEnabled){
addEventNames('MSPointer', 'Down', 'Move', 'Up', 'Cancel');
}else{
addEventNames('pointer', 'down', 'move', 'up', 'cancel');
}}else if(_features.touch){
addEventNames('touch', 'start', 'move', 'end', 'cancel');
_likelyTouchDevice=true;
}else{
addEventNames('mouse', 'down', 'move', 'up');
}
_upMoveEvents=_dragMoveEvent + ' ' + _dragEndEvent  + ' ' +  _dragCancelEvent;
_downEvents=_dragStartEvent;
if(_pointerEventEnabled&&!_likelyTouchDevice){
_likelyTouchDevice=(navigator.maxTouchPoints > 1)||(navigator.msMaxTouchPoints > 1);
}
self.likelyTouchDevice=_likelyTouchDevice;
_globalEventHandlers[_dragStartEvent]=_onDragStart;
_globalEventHandlers[_dragMoveEvent]=_onDragMove;
_globalEventHandlers[_dragEndEvent]=_onDragRelease;
if(_dragCancelEvent){
_globalEventHandlers[_dragCancelEvent]=_globalEventHandlers[_dragEndEvent];
}
if(_features.touch){
_downEvents +=' mousedown';
_upMoveEvents +=' mousemove mouseup';
_globalEventHandlers.mousedown=_globalEventHandlers[_dragStartEvent];
_globalEventHandlers.mousemove=_globalEventHandlers[_dragMoveEvent];
_globalEventHandlers.mouseup=_globalEventHandlers[_dragEndEvent];
}
if(!_likelyTouchDevice){
_options.allowPanToNext=false;
}}
}});
var _showOrHideTimeout,
_showOrHide=function(item, img, out, completeFn){
if(_showOrHideTimeout){
clearTimeout(_showOrHideTimeout);
}
_initialZoomRunning=true;
_initialContentSet=true;
var thumbBounds;
if(item.initialLayout){
thumbBounds=item.initialLayout;
item.initialLayout=null;
}else{
thumbBounds=_options.getThumbBoundsFn&&_options.getThumbBoundsFn(_currentItemIndex);
}
var duration=out ? _options.hideAnimationDuration:_options.showAnimationDuration;
var onComplete=function(){
_stopAnimation('initialZoom');
if(!out){
_applyBgOpacity(1);
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');
}
if(completeFn){
completeFn();
}
_initialZoomRunning=false;
};
if(!duration||!thumbBounds||thumbBounds.x===undefined){
_shout('initialZoom' + (out ? 'Out':'In'));
_currZoomLevel=item.initialZoomLevel;
_equalizePoints(_panOffset,  item.initialPosition);
_applyCurrentZoomPan();
template.style.opacity=out ? 0:1;
_applyBgOpacity(1);
if(duration){
setTimeout(function(){
onComplete();
}, duration);
}else{
onComplete();
}
return;
}
var startAnimation=function(){
var closeWithRaf=_closedByScroll,
fadeEverything = !self.currItem.src||self.currItem.loadError||_options.showHideOpacity;
if(item.miniImg){
item.miniImg.style.webkitBackfaceVisibility='hidden';
}
if(!out){
_currZoomLevel=thumbBounds.w / item.w;
_panOffset.x=thumbBounds.x;
_panOffset.y=thumbBounds.y - _initalWindowScrollY;
self[fadeEverything ? 'template':'bg'].style.opacity=0.001;
_applyCurrentZoomPan();
}
_registerStartAnimation('initialZoom');
if(out&&!closeWithRaf){
framework.removeClass(template, 'pswp--animated-in');
}
if(fadeEverything){
if(out){
framework[ (closeWithRaf ? 'remove':'add') + 'Class' ](template, 'pswp--animate_opacity');
}else{
setTimeout(function(){
framework.addClass(template, 'pswp--animate_opacity');
}, 30);
}}
_showOrHideTimeout=setTimeout(function(){
_shout('initialZoom' + (out ? 'Out':'In'));
if(!out){
_currZoomLevel=item.initialZoomLevel;
_equalizePoints(_panOffset,  item.initialPosition);
_applyCurrentZoomPan();
_applyBgOpacity(1);
if(fadeEverything){
template.style.opacity=1;
}else{
_applyBgOpacity(1);
}
_showOrHideTimeout=setTimeout(onComplete, duration + 20);
}else{
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);
};
startAnimation();
};
var _items,
_tempPanAreaSize={},
_imagesToAppendPool=[],
_initialContentSet,
_initialZoomRunning,
_controllerDefaultOptions={
index: 0,
errorMsg: '<div class="pswp__error-msg"><a href="%url%" target="_blank">The image</a> could not be loaded.</div>',
forceProgressiveLoading: false,
preload: [1,1],
getNumItemsFn: function(){
return _items.length;
}};
var _getItemAt,
_getNumItems,
_initialIsLoop,
_getZeroBounds=function(){
return {
center:{x:0,y:0},
max:{x:0,y:0},
min:{x:0,y:0}};},
_calculateSingleItemPanBounds=function(item, realPanElementW, realPanElementH){
var bounds=item.bounds;
bounds.center.x=Math.round((_tempPanAreaSize.x - realPanElementW) / 2);
bounds.center.y=Math.round((_tempPanAreaSize.y - realPanElementH) / 2) + item.vGap.top;
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;
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};}
_shout('parseVerticalMargin', item);
}
_tempPanAreaSize.x=viewportSize.x;
_tempPanAreaSize.y=viewportSize.y - item.vGap.top - item.vGap.bottom;
if(isInitial){
var hRatio=_tempPanAreaSize.x / item.w;
var vRatio=_tempPanAreaSize.y / item.h;
item.fitRatio=hRatio < vRatio ? hRatio:vRatio;
var scaleMode=_options.scaleMode;
if(scaleMode==='orig'){
zoomLevel=1;
}else if(scaleMode==='fit'){
zoomLevel=item.fitRatio;
}
if(zoomLevel > 1){
zoomLevel=1;
}
item.initialZoomLevel=zoomLevel;
if(!item.bounds){
item.bounds=_getZeroBounds();
}}
if(!zoomLevel){
return;
}
_calculateSingleItemPanBounds(item, item.w * zoomLevel, item.h * zoomLevel);
if(isInitial&&zoomLevel===item.initialZoomLevel){
item.initialPosition=item.bounds.center;
}
return item.bounds;
}else{
item.w=item.h=0;
item.initialZoomLevel=item.fitRatio=1;
item.bounds=_getZeroBounds();
item.initialPosition=item.bounds.center;
return item.bounds;
}},
_appendImage=function(index, item, baseDiv, img, preventAnimation, keepPlaceholder){
if(item.loadError){
return;
}
if(img){
item.imageAppended=true;
_setImageSize(item, img, (item===self.currItem&&_renderMaxResolution));
baseDiv.appendChild(img);
if(keepPlaceholder){
setTimeout(function(){
if(item&&item.loaded&&item.placeholder){
item.placeholder.style.display='none';
item.placeholder=null;
}}, 500);
}}
},
_preloadImage=function(item){
item.loading=true;
item.loaded=false;
var img=item.img=framework.createEl('pswp__img', 'img');
var onComplete=function(){
item.loading=false;
item.loaded=true;
if(item.loadComplete){
item.loadComplete(item);
}else{
item.img=null;
}
img.onload=img.onerror=null;
img=null;
};
img.onload=onComplete;
img.onerror=function(){
item.loadError=true;
onComplete();
};
img.src=item.src;
img.alt=item.alt||'';
return img;
},
_checkForError=function(item, cleanUp){
if(item.src&&item.loadError&&item.container){
if(cleanUp){
item.container.innerHTML='';
}
item.container.innerHTML=_options.errorMsg.replace('%url%',  item.src);
return true;
}},
_setImageSize=function(item, img, maxRes){
if(!item.src){
return;
}
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){
item.placeholder.style.width=w + 'px';
item.placeholder.style.height=h + 'px';
}
img.style.width=w + 'px';
img.style.height=h + 'px';
},
_appendImagesPool=function(){
if(_imagesToAppendPool.length){
var poolItem;
for(var i=0; i < _imagesToAppendPool.length; i++){
poolItem=_imagesToAppendPool[i];
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){
index=_getLoopedId(index);
var item=_getItemAt(index);
if(!item||((item.loaded||item.loading)&&!_itemsNeedUpdate)){
return;
}
_shout('gettingData', index, item);
if(!item.src){
return;
}
_preloadImage(item);
},
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){
_options.loop=false;
}
_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()),
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);
}});
_listen('initialLayout', function(){
self.currItem.initialLayout=_options.getThumbBoundsFn&&_options.getThumbBoundsFn(_currentItemIndex);
});
_listen('mainScrollAnimComplete', _appendImagesPool);
_listen('initialZoomInEnd', _appendImagesPool);
_listen('destroy', function(){
var item;
for(var i=0; i < _items.length; i++){
item=_items[i];
if(item.container){
item.container=null;
}
if(item.placeholder){
item.placeholder=null;
}
if(item.img){
item.img=null;
}
if(item.preloader){
item.preloader=null;
}
if(item.loadError){
item.loaded=item.loadError=false;
}}
_imagesToAppendPool=null;
});
},
getItemAt: function(index){
if(index >=0){
return _items[index]!==undefined ? _items[index]:false;
}
return false;
},
allowProgressiveImg: function(){
return _options.forceProgressiveLoading||!_likelyTouchDevice||_options.mouseUsed||screen.width > 1200;
},
setContent: function(holder, index){
if(_options.loop){
index=_getLoopedId(index);
}
var prevItem=self.getItemAt(holder.index);
if(prevItem){
prevItem.container=null;
}
var item=self.getItemAt(index),
img;
if(!item){
holder.el.innerHTML='';
return;
}
_shout('gettingData', index, item);
holder.index=index;
holder.item=item;
var baseDiv=item.container=framework.createEl('pswp__zoom-wrap');
if(!item.src&&item.html){
if(item.html.tagName){
baseDiv.appendChild(item.html);
}else{
baseDiv.innerHTML=item.html;
}}
_checkForError(item);
_calculateItemSize(item, _viewportSize);
if(item.src&&!item.loadError&&!item.loaded){
item.loadComplete=function(item){
if(!_isOpen){
return;
}
if(holder&&holder.index===index){
if(_checkForError(item, true)){
item.loadComplete=item.img=null;
_calculateItemSize(item, _viewportSize);
_applyZoomPanToItem(item);
if(holder.index===_currentItemIndex){
self.updateCurrZoomItem();
}
return;
}
if(!item.imageAppended){
if(_features.transform&&(_mainScrollAnimating||_initialZoomRunning)){
_imagesToAppendPool.push({
item:item,
baseDiv:baseDiv,
img:item.img,
index:index,
holder:holder,
clearPlaceholder:true
});
}else{
_appendImage(index, item, baseDiv, item.img, _mainScrollAnimating||_initialZoomRunning, true);
}}else{
if(!_initialZoomRunning&&item.placeholder){
item.placeholder.style.display='none';
item.placeholder=null;
}}
}
item.loadComplete=null;
item.img=null;
_shout('imageLoadComplete', index, item);
};
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){
placeholder.src=item.msrc;
}
_setImageSize(item, placeholder);
baseDiv.appendChild(placeholder);
item.placeholder=placeholder;
}
if(!item.loading){
_preloadImage(item);
}
if(self.allowProgressiveImg()){
if(!_initialContentSet&&_features.transform){
_imagesToAppendPool.push({
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){
img=framework.createEl('pswp__img', 'img');
img.style.opacity=1;
img.src=item.src;
_setImageSize(item, img);
_appendImage(index, item, baseDiv, img, true);
}
if(!_initialContentSet&&index===_currentItemIndex){
_currZoomElementStyle=baseDiv.style;
_showOrHide(item, (img||item.img));
}else{
_applyZoomPanToItem(item);
}
holder.el.innerHTML='';
holder.el.appendChild(baseDiv);
},
cleanSlide: function(item){
if(item.img){
item.img.onload=item.img.onerror=null;
}
item.loaded=item.loading=item.img=item.imageAppended=false;
}}
});
var tapTimer,
tapReleasePoint={},
_dispatchTapEvent=function(origEvent, releasePoint, pointerType){
var e=document.createEvent('CustomEvent'),
eDetail={
origEvent:origEvent,
target:origEvent.target,
releasePoint: releasePoint,
pointerType:pointerType||'touch'
};
e.initCustomEvent('pswpTap', true, true, eDetail);
origEvent.target.dispatchEvent(e);
};
_registerModule('Tap', {
publicMethods: {
initTap: function(){
_listen('firstTouchStart', self.onTapStart);
_listen('touchRelease', self.onTapRelease);
_listen('destroy', function(){
tapReleasePoint={};
tapTimer=null;
});
},
onTapStart: function(touchList){
if(touchList.length > 1){
clearTimeout(tapTimer);
tapTimer=null;
}},
onTapRelease: function(e, releasePoint){
if(!releasePoint){
return;
}
if(!_moved&&!_isMultitouch&&!_numAnimations&&self.container.contains(e.target)){
var p0=releasePoint;
if(tapTimer){
clearTimeout(tapTimer);
tapTimer=null;
if(_isNearbyPoints(p0, tapReleasePoint)){
_shout('doubleTap', p0);
return;
}}
if(releasePoint.type==='mouse'){
_dispatchTapEvent(e, releasePoint, 'mouse');
return;
}
var clickedTagName=e.target.tagName.toUpperCase();
if(clickedTagName==='BUTTON'||framework.hasClass(e.target, 'pswp__single-tap')){
_dispatchTapEvent(e, releasePoint);
return;
}
_equalizePoints(tapReleasePoint, p0);
tapTimer=setTimeout(function(){
_dispatchTapEvent(e, releasePoint);
tapTimer=null;
}, 300);
}}
}});
var _wheelDelta;
_registerModule('DesktopZoom', {
publicMethods: {
initDesktopZoom: function(){
if(_oldIE){
return;
}
if(_likelyTouchDevice){
_listen('mouseUsed', function(){
self.setupDesktopZoom();
});
}else{
self.setupDesktopZoom(true);
}},
setupDesktopZoom: function(onInit){
_wheelDelta={};
var events='wheel mousewheel DOMMouseScroll';
_listen('bindEvents', function(){
framework.bind(template, events,  self.handleMouseWheel);
});
_listen('unbindEvents', function(){
if(_wheelDelta){
framework.unbind(template, events, self.handleMouseWheel);
}});
self.mouseZoomedIn=false;
var hasDraggingClass,
updateZoomable=function(){
if(self.mouseZoomedIn){
framework.removeClass(template, 'pswp--zoomed-in');
self.mouseZoomedIn=false;
}
if(_currZoomLevel < 1){
framework.addClass(template, 'pswp--zoom-allowed');
}else{
framework.removeClass(template, 'pswp--zoom-allowed');
}
removeDraggingClass();
},
removeDraggingClass=function(){
if(hasDraggingClass){
framework.removeClass(template, 'pswp--dragging');
hasDraggingClass=false;
}};
_listen('resize' , updateZoomable);
_listen('afterChange' , updateZoomable);
_listen('pointerDown', function(){
if(self.mouseZoomedIn){
hasDraggingClass=true;
framework.addClass(template, 'pswp--dragging');
}});
_listen('pointerUp', removeDraggingClass);
if(!onInit){
updateZoomable();
}},
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){
_closedByScroll=true;
self.close();
}}
return true;
}
e.stopPropagation();
_wheelDelta.x=0;
if('deltaX' in e){
if(e.deltaMode===1 ){
_wheelDelta.x=e.deltaX * 18;
_wheelDelta.y=e.deltaY * 18;
}else{
_wheelDelta.x=e.deltaX;
_wheelDelta.y=e.deltaY;
}}else if('wheelDelta' in e){
if(e.wheelDeltaX){
_wheelDelta.x=-0.16 * e.wheelDeltaX;
}
if(e.wheelDeltaY){
_wheelDelta.y=-0.16 * e.wheelDeltaY;
}else{
_wheelDelta.y=-0.16 * e.wheelDelta;
}}else if('detail' in e){
_wheelDelta.y=e.detail;
}else{
return;
}
_calculatePanBounds(_currZoomLevel, true);
var newPanX=_panOffset.x - _wheelDelta.x,
newPanY=_panOffset.y - _wheelDelta.y;
if(_options.modal ||
(
newPanX <=_currPanBounds.min.x&&newPanX >=_currPanBounds.max.x &&
newPanY <=_currPanBounds.min.y&&newPanY >=_currPanBounds.max.y
)){
e.preventDefault();
}
self.panTo(newPanX, newPanY);
},
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');
}}
});
var _historyDefaultOptions={
history: true,
galleryUID: 1
};
var _historyUpdateTimeout,
_hashChangeTimeout,
_hashAnimCheckTimeout,
_hashChangedByScript,
_hashChangedByHistory,
_hashReseted,
_initialHash,
_historyChanged,
_closedFromURL,
_urlChangedOnce,
_windowLoc,
_supportsPushState,
_getHash=function(){
return _windowLoc.hash.substring(1);
},
_cleanHistoryTimeouts=function(){
if(_historyUpdateTimeout){
clearTimeout(_historyUpdateTimeout);
}
if(_hashAnimCheckTimeout){
clearTimeout(_hashAnimCheckTimeout);
}},
_parseItemIndexFromURL=function(){
var hash=_getHash(),
params={};
if(hash.length < 5){
return params;
}
var i, vars=hash.split('&');
for (i=0; i < vars.length; i++){
if(!vars[i]){
continue;
}
var pair=vars[i].split('=');
if(pair.length < 2){
continue;
}
params[pair[0]]=pair[1];
}
if(_options.galleryPIDs){
var searchfor=params.pid;
params.pid=0;
for(i=0; i < _items.length; i++){
if(_items[i].pid===searchfor){
params.pid=i;
break;
}}
}else{
params.pid=parseInt(params.pid,10)-1;
}
if(params.pid < 0){
params.pid=0;
}
return params;
},
_updateHash=function(){
if(_hashAnimCheckTimeout){
clearTimeout(_hashAnimCheckTimeout);
}
if(_numAnimations||_isDragging){
_hashAnimCheckTimeout=setTimeout(_updateHash, 500);
return;
}
if(_hashChangedByScript){
clearTimeout(_hashChangeTimeout);
}else{
_hashChangedByScript=true;
}
var pid=(_currentItemIndex + 1);
var item=_getItemAt(_currentItemIndex);
if(item.hasOwnProperty('pid')){
pid=item.pid;
}
var newHash=_initialHash + '&'  +  'gid=' + _options.galleryUID + '&' + 'pid=' + pid;
if(!_historyChanged){
if(_windowLoc.hash.indexOf(newHash)===-1){
_urlChangedOnce=true;
}}
var newURL=_windowLoc.href.split('#')[0] + '#' +  newHash;
if(_supportsPushState){
if('#' + newHash!==window.location.hash){
history[_historyChanged ? 'replaceState':'pushState']('', document.title, newURL);
}}else{
if(_historyChanged){
_windowLoc.replace(newURL);
}else{
_windowLoc.hash=newHash;
}}
_historyChanged=true;
_hashChangeTimeout=setTimeout(function(){
_hashChangedByScript=false;
}, 60);
};
_registerModule('History', {
publicMethods: {
initHistory: function(){
framework.extend(_options, _historyDefaultOptions, true);
if(!_options.history){
return;
}
_windowLoc=window.location;
_urlChangedOnce=false;
_closedFromURL=false;
_historyChanged=false;
_initialHash=_getHash();
_supportsPushState=('pushState' in history);
if(_initialHash.indexOf('gid=') > -1){
_initialHash=_initialHash.split('&gid=')[0];
_initialHash=_initialHash.split('?gid=')[0];
}
_listen('afterChange', self.updateURL);
_listen('unbindEvents', function(){
framework.unbind(window, 'hashchange', self.onHashChange);
});
var returnToOriginal=function(){
_hashReseted=true;
if(!_closedFromURL){
if(_urlChangedOnce){
history.back();
}else{
if(_initialHash){
_windowLoc.hash=_initialHash;
}else{
if(_supportsPushState){
history.pushState('', document.title,  _windowLoc.pathname + _windowLoc.search);
}else{
_windowLoc.hash='';
}}
}}
_cleanHistoryTimeouts();
};
_listen('unbindEvents', function(){
if(_closedByScroll){
returnToOriginal();
}});
_listen('destroy', function(){
if(!_hashReseted){
returnToOriginal();
}});
_listen('firstUpdate', function(){
_currentItemIndex=_parseItemIndexFromURL().pid;
});
var index=_initialHash.indexOf('pid=');
if(index > -1){
_initialHash=_initialHash.substring(0, index);
if(_initialHash.slice(-1)==='&'){
_initialHash=_initialHash.slice(0, -1);
}}
setTimeout(function(){
if(_isOpen){
framework.bind(window, 'hashchange', self.onHashChange);
}}, 40);
},
onHashChange: function(){
if(_getHash()===_initialHash){
_closedFromURL=true;
self.close();
return;
}
if(!_hashChangedByScript){
_hashChangedByHistory=true;
self.goTo(_parseItemIndexFromURL().pid);
_hashChangedByHistory=false;
}},
updateURL: function(){
_cleanHistoryTimeouts();
if(_hashChangedByHistory){
return;
}
if(!_historyChanged){
_updateHash();
}else{
_historyUpdateTimeout=setTimeout(_updateHash, 800);
}}
}});
framework.extend(self, publicMethods); };
return PhotoSwipe;
});
(function (root, factory){
if(typeof define==='function'&&define.amd){
define(factory);
}else if(typeof exports==='object'){
module.exports=factory();
}else{
root.PhotoSwipeUI_Default=factory();
}})(this, function (){
'use strict';
var PhotoSwipeUI_Default =
function(pswp, framework){
var ui=this;
var _overlayUIUpdated=false,
_controlsVisible=true,
_fullscrenAPI,
_controls,
_captionContainer,
_fakeCaptionContainer,
_indexIndicator,
_shareButton,
_shareModal,
_shareModalHidden=true,
_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,
addCaptionHTMLFn: function(item, captionEl ){
if(!item.title){
captionEl.children[0].innerHTML='';
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(){
return pswp.currItem.src||'';
},
getPageURLForShare: function(){
return window.location.href;
},
getTextForShare: function(){
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){
_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;
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);
},
_countNumItems=function(){
var hasOneSlide=(_options.getNumItemsFn()===1);
if(hasOneSlide!==_galleryHasOneSlide){
_togglePswpClass(_controls, 'ui--one-slide', hasOneSlide);
_galleryHasOneSlide=hasOneSlide;
}},
_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;
}
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 +='<a href="' + shareURL + '" target="_blank" '+
'class="pswp__share--' + shareButtonData.id + '"' +
(shareButtonData.download ? 'download':'') + '>' +
shareButtonData.label + '</a>';
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(){
if(_options.preloaderEl){
_toggleLoadingIndicator(true);
_listen('beforeChange', function(){
clearTimeout(_loadingIndicatorTimeout);
_loadingIndicatorTimeout=setTimeout(function(){
if(pswp.currItem&&pswp.currItem.loading){
if(!pswp.allowProgressiveImg()||(pswp.currItem.img&&!pswp.currItem.img.naturalWidth)){
_toggleLoadingIndicator(false);
}}else{
_toggleLoadingIndicator(true);
}}, _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;
}}else{
gap.bottom=bars.bottom==='auto' ? 0:bars.bottom;
}
gap.top=bars.top;
}else{
gap.top=gap.bottom=0;
}},
_setupIdle=function(){
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(){
_listen('onVerticalDrag', function(now){
if(_controlsVisible&&now < 0.95){
ui.hideControls();
}else if(!_controlsVisible&&now >=0.95){
ui.showControls();
}});
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){
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]){
framework.removeClass(item, 'pswp__element--disabled');
if(uiElement.onInit){
uiElement.onInit(item);
}}else{
framework.addClass(item, 'pswp__element--disabled');
}}
}}
};
loopThroughChildElements(_controls.children);
var topBar=framework.getChildByClass(_controls, 'pswp__top-bar');
if(topBar){
loopThroughChildElements(topBar.children);
}};
ui.init=function(){
framework.extend(pswp.options, _defaultUIOptions, true);
_options=pswp.options;
_controls=framework.getChildByClass(pswp.scrollWrap, 'pswp__ui');
_listen=pswp.listen;
_setupHidingControlsDuringGestures();
_listen('beforeChange', ui.update);
_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);
}});
_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;
}});
_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);
}});
_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;
}});
_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(){
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){
setTimeout(function(){
pswp.setScrollOffset(0, framework.getScrollY());
}, 50);
}
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'){
if(_hasCloseClass(target)){
pswp.close();
return;
}
if(framework.hasClass(target, 'pswp__img')){
if(pswp.getZoomLevel()===1&&pswp.getZoomLevel() <=pswp.currItem.fitRatio){
if(_options.clickToCloseNonZoomable){
pswp.close();
}}else{
pswp.toggleDesktopZoom(e.detail.releasePoint);
}}
}else{
if(_options.tapToToggleControls){
if(_controlsVisible){
ui.hideControls();
}else{
ui.showControls();
}}
if(_options.tapToClose&&(framework.hasClass(target, 'pswp__img')||_hasCloseClass(target))){
pswp.close();
return;
}}
};
ui.onMouseOver=function(e){
e=e||window.event;
var target=e.target||e.srcElement;
_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(){
_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;
});