/*
* Nivo Lightbox v1.2.0
* http://dev7studios.com/nivo-lightbox
*
* Copyright 2013, Dev7studios
* Free to use and abuse under the MIT license.
* http://www.opensource.org/licenses/mit-license.php
*/
;(function($, window, document, undefined){
var pluginName = 'nivoLightbox',
defaults = {
effect: 'fade',
theme: 'default',
keyboardNav: true,
clickOverlayToClose: true,
onInit: function(){},
beforeShowLightbox: function(){},
afterShowLightbox: function(lightbox){},
beforeHideLightbox: function(){},
afterHideLightbox: function(){},
onPrev: function(element){},
onNext: function(element){},
errorMessage: 'The requested content cannot be loaded. Please try again later.'
};
function NivoLightbox(element, options){
this.el = element;
this.$el = $(this.el);
this.options = $.extend({}, defaults, options);
this._defaults = defaults;
this._name = pluginName;
this.init();
}
NivoLightbox.prototype = {
init: function(){
var $this = this;
// Need this so we don't use CSS transitions in mobile
if(!$('html').hasClass('nivo-lightbox-notouch')) $('html').addClass('nivo-lightbox-notouch');
if('ontouchstart' in document) $('html').removeClass('nivo-lightbox-notouch');
// Setup the click
this.$el.on('click', function(e){
$this.showLightbox(e);
});
// keyboardNav
if(this.options.keyboardNav){
$('body').off('keyup').on('keyup', function(e){
var code = (e.keyCode ? e.keyCode : e.which);
// Escape
if(code == 27) $this.destructLightbox();
// Left
if(code == 37) $('.nivo-lightbox-prev').trigger('click');
// Right
if(code == 39) $('.nivo-lightbox-next').trigger('click');
});
}
this.options.onInit.call(this);
},
showLightbox: function(e){
var $this = this,
currentLink = this.$el;
// Check content
var check = this.checkContent(currentLink);
if(!check) return;
e.preventDefault();
this.options.beforeShowLightbox.call(this);
var lightbox = this.constructLightbox();
if(!lightbox) return;
var content = lightbox.find('.nivo-lightbox-content');
if(!content) return;
$('body').addClass('nivo-lightbox-body-effect-'+ this.options.effect);
this.processContent( content, currentLink );
// Nav
if(this.$el.attr('data-lightbox-gallery')){
var galleryItems = $('[data-lightbox-gallery="'+ this.$el.attr('data-lightbox-gallery') +'"]');
$('.nivo-lightbox-nav').show();
// Prev
$('.nivo-lightbox-prev').off('click').on('click', function(e){
e.preventDefault();
var index = galleryItems.index(currentLink);
currentLink = galleryItems.eq(index - 1);
if(!$(currentLink).length) currentLink = galleryItems.last();
$this.processContent(content, currentLink);
$this.options.onPrev.call(this, [ currentLink ]);
});
// Next
$('.nivo-lightbox-next').off('click').on('click', function(e){
e.preventDefault();
var index = galleryItems.index(currentLink);
currentLink = galleryItems.eq(index + 1);
if(!$(currentLink).length) currentLink = galleryItems.first();
$this.processContent(content, currentLink);
$this.options.onNext.call(this, [ currentLink ]);
});
}
setTimeout(function(){
lightbox.addClass('nivo-lightbox-open');
$this.options.afterShowLightbox.call(this, [ lightbox ]);
}, 1); // For CSS transitions
},
checkContent: function( link ) {
var $this = this,
href = link.attr('href'),
video = href.match(/(youtube|youtu|vimeo)\.(com|be)\/(watch\?v=([\w-]+)|([\w-]+))/);
if(href.match(/\.(jpeg|jpg|gif|png)$/i) !== null){
return true;
}
// Video (Youtube/Vimeo)
else if(video){
return true;
}
// AJAX
else if(link.attr('data-lightbox-type') == 'ajax'){
return true;
}
// Inline HTML
else if(href.substring(0, 1) == '#' && link.attr('data-lightbox-type') == 'inline'){
return true;
}
// iFrame (default)
else if(link.attr('data-lightbox-type') == 'iframe'){
return true;
}
return false;
},
processContent: function(content, link){
var $this = this,
href = link.attr('href'),
video = href.match(/(youtube|youtu|vimeo)\.(com|be)\/(watch\?v=([\w-]+)|([\w-]+))/);
content.html('').addClass('nivo-lightbox-loading');
// Is HiDPI?
if(this.isHidpi() && link.attr('data-lightbox-hidpi')){
href = link.attr('data-lightbox-hidpi');
}
// Image
if(href.match(/\.(jpeg|jpg|gif|png)$/i) !== null){
var img = $('', { src: href });
img.one('load', function() {
var wrap = $('
'+ $this.options.errorMessage +'