/*
|
* 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 = '<div class="vbox-overlay ' + extraCss + '" style="background:'+ overlayColor +'"><div class="vbox-preloader">Loading...</div><div class="vbox-container"><div class="vbox-content"></div></div><div class="vbox-title"></div><div class="vbox-num">0/0</div><div class="vbox-close">X</div><div class="vbox-next">next</div><div class="vbox-prev">prev</div></div>';
|
|
$('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('<img src="'+dest+'">');
|
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('<img src="'+dest+'">');
|
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('<img src="'+dest+'">');
|
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('<div class="vbox-inline">'+ msg +'</div>');
|
updateoverlay(true);
|
|
}).fail(function() {
|
content.html('<div class="vbox-inline"><p>Error retrieving contents, please retry</div>');
|
updateoverlay(true);
|
})
|
}
|
|
/* -------- LOAD IFRAME -------- */
|
function loadIframe(){
|
content.html('<iframe class="venoframe" src="'+dest+'"></iframe>');
|
// $('.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('<iframe class="venoframe" webkitallowfullscreen mozallowfullscreen allowfullscreen frameborder="0" src="//player.vimeo.com/video/'+videoid+stringAutoplay+'"></iframe>');
|
updateoverlay();
|
}
|
|
/* -------- LOAD YOUTUBE -------- */
|
function loadYoutube(autoplay){
|
var pezzi = dest.split('/');
|
var videoid = pezzi[pezzi.length-1];
|
var stringAutoplay = autoplay ? "?autoplay=1" : "";
|
content.html('<iframe class="venoframe" webkitallowfullscreen mozallowfullscreen allowfullscreen src="//www.youtube.com/embed/'+videoid+stringAutoplay+'"></iframe>');
|
updateoverlay();
|
}
|
|
/* -------- LOAD INLINE -------- */
|
function loadInline(){
|
content.html('<div class="vbox-inline">'+$(dest).html()+'</div>');
|
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);
|