/*
* VenoBox - jQuery Plugin
* version: 1.6.0
* @requires jQuery
*
* Examples at http://lab.veno.it/venobox/
* License: MIT License
* License URI: https://github.com/nicolafranchini/VenoBox/blob/master/LICENSE
* Copyright 2013-2015 Nicola Franchini - @nicolafranchini
*
*/
(function($){
var autoplay, bgcolor, blocknum, blocktitle, border, core, container, content, dest,
evitacontent, evitanext, evitaprev, extraCss, figliall, framewidth, frameheight,
infinigall, items, keyNavigationDisabled, margine, numeratio, overlayColor, overlay,
prima, title, thisgall, thenext, theprev, type,
finH, sonH, nextok, prevok;
$.fn.extend({
//plugin name - venobox
venobox: function(options) {
// default option
var defaults = {
framewidth: '',
frameheight: '',
border: '0',
bgcolor: '#fff',
titleattr: 'title', // specific attribute to get a title (e.g. [data-title]) - thanx @mendezcode
numeratio: false,
infinigall: false,
overlayclose: true // disable overlay click-close - thanx @martybalandis
};
var option = $.extend(defaults, options);
return this.each(function() {
var obj = $(this);
// Prevent double initialization - thanx @matthistuff
if(obj.data('venobox')) {
return true;
}
obj.addClass('vbox-item');
obj.data('framewidth', option.framewidth);
obj.data('frameheight', option.frameheight);
obj.data('border', option.border);
obj.data('bgcolor', option.bgcolor);
obj.data('numeratio', option.numeratio);
obj.data('infinigall', option.infinigall);
obj.data('overlayclose', option.overlayclose);
obj.data('venobox', true);
obj.click(function(e){
e.stopPropagation();
e.preventDefault();
obj = $(this);
overlayColor = obj.data('overlay');
framewidth = obj.data('framewidth');
frameheight = obj.data('frameheight');
// set data-autoplay="true" for vimeo and youtube videos - thanx @zehfernandes
autoplay = obj.data('autoplay') || false;
border = obj.data('border');
bgcolor = obj.data('bgcolor');
nextok = false;
prevok = false;
keyNavigationDisabled = false;
// set a different url to be loaded via ajax using data-href="" - thanx @pixeline
dest = obj.data('href') || obj.attr('href');
extraCss = obj.data( 'css' ) || "";
$('body').addClass('vbox-open');
core = '
';
$('body').append(core);
overlay = $('.vbox-overlay');
container = $('.vbox-container');
content = $('.vbox-content');
blocknum = $('.vbox-num');
blocktitle = $('.vbox-title');
content.html('');
content.css('opacity', '0');
checknav();
overlay.css('min-height', $(window).outerHeight());
// fade in overlay
overlay.animate({opacity:1}, 250, function(){
if(obj.data('type') == 'iframe'){
loadIframe();
}else if (obj.data('type') == 'inline'){
loadInline();
}else if (obj.data('type') == 'ajax'){
loadAjax();
}else if (obj.data('type') == 'vimeo'){
loadVimeo(autoplay);
}else if (obj.data('type') == 'youtube'){
loadYoutube(autoplay);
} else {
content.html('
');
preloadFirst();
}
});
/* -------- CHECK NEXT / PREV -------- */
function checknav(){
thisgall = obj.data('gall');
numeratio = obj.data('numeratio');
infinigall = obj.data('infinigall');
items = $('.vbox-item[data-gall="' + thisgall + '"]');
if(items.length > 1 && numeratio === true){
blocknum.html(items.index(obj)+1 + ' / ' + items.length);
blocknum.show();
}else{
blocknum.hide();
}
thenext = items.eq( items.index(obj) + 1 );
theprev = items.eq( items.index(obj) - 1 );
if(obj.attr(option.titleattr)){
title = obj.attr(option.titleattr);
blocktitle.show();
}else{
title = '';
blocktitle.hide();
}
if (items.length > 1 && infinigall === true) {
nextok = true;
prevok = true;
if(thenext.length < 1 ){
thenext = items.eq(0);
}
if(items.index(obj) < 1 ){
theprev = items.eq( items.index(items.length) );
}
} else {
if(thenext.length > 0 ){
$('.vbox-next').css('display', 'block');
nextok = true;
}else{
$('.vbox-next').css('display', 'none');
nextok = false;
}
if(items.index(obj) > 0 ){
$('.vbox-prev').css('display', 'block');
prevok = true;
}else{
$('.vbox-prev').css('display', 'none');
prevok = false;
}
}
}
/* -------- NAVIGATION CODE -------- */
var gallnav = {
prev: function() {
if (keyNavigationDisabled) {
return;
} else {
keyNavigationDisabled = true;
}
overlayColor = theprev.data('overlay');
framewidth = theprev.data('framewidth');
frameheight = theprev.data('frameheight');
border = theprev.data('border');
bgcolor = theprev.data('bgcolor');
dest = theprev.data('href') || theprev.attr('href');
autoplay = theprev.data('autoplay');
if(theprev.attr(option.titleattr)){
title = theprev.attr(option.titleattr);
}else{
title = '';
}
if (overlayColor === undefined ) {
overlayColor = "";
}
content.animate({ opacity:0}, 500, function(){
overlay.css('background',overlayColor);
if (theprev.data('type') == 'iframe') {
loadIframe();
} else if (theprev.data('type') == 'inline'){
loadInline();
} else if (theprev.data('type') == 'ajax'){
loadAjax();
} else if (theprev.data('type') == 'youtube'){
loadYoutube(autoplay);
} else if (theprev.data('type') == 'vimeo'){
loadVimeo(autoplay);
}else{
content.html('
');
preloadFirst();
}
obj = theprev;
checknav();
keyNavigationDisabled = false;
});
},
next: function() {
if (keyNavigationDisabled) {
return;
} else {
keyNavigationDisabled = true;
}
overlayColor = thenext.data('overlay');
framewidth = thenext.data('framewidth');
frameheight = thenext.data('frameheight');
border = thenext.data('border');
bgcolor = thenext.data('bgcolor');
dest = thenext.data('href') || thenext.attr('href');
autoplay = thenext.data('autoplay');
if(thenext.attr(option.titleattr)){
title = thenext.attr(option.titleattr);
}else{
title = '';
}
if (overlayColor === undefined ) {
overlayColor = "";
}
content.animate({ opacity:0}, 500, function(){
overlay.css('background',overlayColor);
if (thenext.data('type') == 'iframe') {
loadIframe();
} else if (thenext.data('type') == 'inline'){
loadInline();
} else if (thenext.data('type') == 'ajax'){
loadAjax();
} else if (thenext.data('type') == 'youtube'){
loadYoutube(autoplay);
} else if (thenext.data('type') == 'vimeo'){
loadVimeo(autoplay);
}else{
content.html('
');
preloadFirst();
}
obj = thenext;
checknav();
keyNavigationDisabled = false;
});
}
};
/* -------- NAVIGATE WITH ARROW KEYS -------- */
$('body').keydown(function(e) {
if(e.keyCode == 37 && prevok == true) { // left
gallnav.prev();
}
if(e.keyCode == 39 && nextok == true) { // right
gallnav.next();
}
});
/* -------- PREVGALL -------- */
$('.vbox-prev').click(function(){
gallnav.prev();
});
/* -------- NEXTGALL -------- */
$('.vbox-next').click(function(){
gallnav.next();
});
/* -------- ESCAPE HANDLER -------- */
function escapeHandler(e) {
if(e.keyCode === 27) {
closeVbox();
}
}
/* -------- CLOSE VBOX -------- */
function closeVbox(){
$('body').removeClass('vbox-open');
$('body').unbind('keydown', escapeHandler);
overlay.animate({opacity:0}, 500, function(){
overlay.remove();
keyNavigationDisabled = false;
obj.focus();
});
}
/* -------- CLOSE CLICK -------- */
var closeclickclass = '.vbox-close, .vbox-overlay';
if(!obj.data('overlayclose')){
closeclickclass = '.vbox-close'; // close only on X
}
$(closeclickclass).click(function(e){
evitacontent = '.figlio';
evitaprev = '.vbox-prev';
evitanext = '.vbox-next';
figliall = '.figlio *';
if(!$(e.target).is(evitacontent) && !$(e.target).is(evitanext) && !$(e.target).is(evitaprev)&& !$(e.target).is(figliall)){
closeVbox();
}
});
$('body').keydown(escapeHandler);
return false;
});
});
}
});
/* -------- LOAD AJAX -------- */
function loadAjax(){
$.ajax({
url: dest,
cache: false
}).done(function( msg ) {
content.html(''+ msg +'
');
updateoverlay(true);
}).fail(function() {
content.html('Error retrieving contents, please retry
');
updateoverlay(true);
})
}
/* -------- LOAD IFRAME -------- */
function loadIframe(){
content.html('');
// $('.venoframe').load(function(){ // valid only for iFrames in same domain
updateoverlay();
// });
}
/* -------- LOAD VIMEO -------- */
function loadVimeo(autoplay){
var pezzi = dest.split('/');
var videoid = pezzi[pezzi.length-1];
var stringAutoplay = autoplay ? "?autoplay=1" : "";
content.html('');
updateoverlay();
}
/* -------- LOAD YOUTUBE -------- */
function loadYoutube(autoplay){
var pezzi = dest.split('/');
var videoid = pezzi[pezzi.length-1];
var stringAutoplay = autoplay ? "?autoplay=1" : "";
content.html('');
updateoverlay();
}
/* -------- LOAD INLINE -------- */
function loadInline(){
content.html(''+$(dest).html()+'
');
updateoverlay();
}
/* -------- PRELOAD IMAGE -------- */
function preloadFirst(){
prima = $('.vbox-content').find('img');
prima.one('load', function() {
updateoverlay();
}).each(function() {
if(this.complete) $(this).load();
});
}
/* -------- CENTER ON LOAD -------- */
function updateoverlay(){
blocktitle.html(title);
content.find(">:first-child").addClass('figlio');
$('.figlio').css('width', framewidth).css('height', frameheight).css('padding', border).css('background', bgcolor);
sonH = content.outerHeight();
finH = $(window).height();
if(sonH+80 < finH){
margine = (finH - sonH)/2;
content.css('margin-top', margine);
content.css('margin-bottom', margine);
}else{
content.css('margin-top', '40px');
content.css('margin-bottom', '40px');
}
content.animate({
'opacity': '1'
},'slow');
}
/* -------- CENTER ON RESIZE -------- */
function updateoverlayresize(){
if($('.vbox-content').length){
sonH = content.height();
finH = $(window).height();
if(sonH+80 < finH){
margine = (finH - sonH)/2;
content.css('margin-top', margine);
content.css('margin-bottom', margine);
}else{
content.css('margin-top', '40px');
content.css('margin-bottom', '40px');
}
}
}
$(window).resize(function(){
updateoverlayresize();
});
})(jQuery);