var scr = document.getElementsByTagName('script');
var zoombox_path = scr[scr.length - 1].getAttribute("src").replace('zoombox.js', '');
(function ($) {
var options = {
theme: 'zoombox', //available themes : zoombox,lightbox, prettyphoto, darkprettyphoto, simple
opacity: 0.8, // Black overlay opacity
duration: 800, // Animation duration
animation: true, // Do we have to animate the box ?
width: 600, // Default width
height: 400, // Default height
gallery: true, // Allow gallery thumb view
autoplay: false, // Autoplay for video
overflow: false // Allow images bigger than screen ?
}
var images; // Gallery Array [gallery name][link]
var elem; // HTML element currently used to display box
var isOpen = false; // Zoombox already opened ?
var link; // Shortcut for the link
var width;
var height;
var timer; // Timing for img loading
var i = 0; // iteration variable
var content; // The content of the box
var type = 'multimedia'; // Content type
var position = false;
var imageset = false;
var state = 'closed';
/**
* You can edit the html code generated by zoombox for specific reasons.
* */
var html = '
\
\
\
\
\
\
\
\
\
\
';
// Regular expressions needed for the content
var filtreImg = /(\.jpg)|(\.jpeg)|(\.bmp)|(\.gif)|(\.png)/i;
var filtreMP3 = /(\.mp3)/i;
var filtreFLV = /(\.flv)/i;
var filtreSWF = /(\.swf)/i;
var filtreQuicktime = /(\.mov)|(\.mp4)/i;
var filtreWMV = /(\.wmv)|(\.avi)/i;
var filtreDailymotion = /(http:\/\/www.dailymotion)|(http:\/\/dailymotion)/i;
var filtreVimeo = /(http:\/\/www.vimeo)|(http:\/\/vimeo)/i;
var filtreYoutube = /(youtube\.)/i;
var filtreKoreus = /(http:\/\/www\.koreus)|(http:\/\/koreus)/i;
var galleryLoaded = 0;
$.zoombox = function (el, options) {
}
$.zoombox.options = options;
$.zoombox.close = function () {
close();
}
$.zoombox.open = function (tmplink, opts) {
elem = null;
link = tmplink;
options = $.extend({}, $.zoombox.options, opts);
load();
}
$.zoombox.html = function (cont, opts) {
content = cont;
options = $.extend({}, $.zoombox.options, opts);
width = options.width;
height = options.height;
elem = null;
open();
}
$.fn.zoombox = function (opts) {
images = new Array(); // allow multiple call on one page, for content loaded from ajax
/**
* Bind the behaviour on every Elements
*/
return this.each(function () {
// No zoombox for IE6
if ($.browser && $.browser.msie && $.browser.version < 7 && !window.XMLHttpRequest) {
return false;
}
var obj = this;
var galleryRegExp = /zgallery([0-9]+)/;
var skipRegExp = /zskip/;
var gallery = galleryRegExp.exec($(this).attr("class"));
var skip = skipRegExp.exec($(this).attr("class"));
var tmpimageset = false;
if (gallery != null) {
if (!images[gallery[1]]) {
images[gallery[1]] = new Array();
}
if (skip == null) {
images[gallery[1]].push($(this));
}
var pos = images[gallery[1]].length - 1;
tmpimageset = images[gallery[1]];
}
$(this).unbind('click').click(function () {
options = $.extend({}, $.zoombox.options, opts);
if (state != 'closed')
return false;
if (skip != null) {
if (pos < images[gallery[1]].length - 1) {
elem = images[gallery[1]][pos + 1];
}
} else {
elem = $(obj);
}
imageset = tmpimageset;
link = elem.attr('href');
position = pos;
load();
return false;
});
});
}
/**
* Load the content (with or without loader) and call open()
* */
function load() {
if (state == 'closed')
isOpen = false;
state = 'load';
setDim();
if (filtreImg.test(link)) {
img = new Image();
img.src = link;
$("body").append('');
$("#zoombox_loader").css("marginTop", scrollY());
timer = window.setInterval(function () {
loadImg(img);
}, 100);
} else {
setContent();
open();
}
}
/**
* Build the HTML Structure of the box
* */
function build() {
// We add the HTML Code on our page
$('body').append(html);
$(window).keydown(function (event) {
shortcut(event.which);
});
$(window).resize(function () {
resize();
});
$('#zoombox .zoombox_mask').hide();
// We add a specific class to define the box theme
$('#zoombox').addClass(options.theme);
// We bind the close behaviour (click on the mask / click on the close button)
$('#zoombox .zoombox_mask,.zoombox_close').click(function () {
close();
return false;
});
// Next/Prev button
if (imageset == false) {
$('#zoombox .zoombox_next,#zoombox .zoombox_prev').remove();
} else {
$('#zoombox .zoombox_next').click(function () {
next();
});
$('#zoombox .zoombox_prev').click(function () {
prev();
});
}
}
/**
* Gallery System (with slider if too much images)
*/
function gallery() {
var loaded = 0;
var width = 0;
var contentWidth = 0;
if (options.gallery) {
if (imageset === false) {
$('#zoombox .zoombox_gallery').remove();
return false;
}
for (var i in imageset) {
var imgSrc = zoombox_path + 'img/video.png';
var img = $('');
if (filtreImg.test(imageset[i].attr('href'))) {
imgSrc = imageset[i].attr('href')
img = $('');
}
img.data('id', i).appendTo('#zoombox .zoombox_gallery')
img.click(function () {
gotoSlide($(this).data('id'));
$('#zoombox .zoombox_gallery img').removeClass('current');
$(this).addClass('current');
});
if (i == position) {
img.addClass('current');
}
// Listen the loading of Images
$("").data('img', img).attr("src", imgSrc).load(function () {
loaded++;
var img = $(this).data('img');
img.width(Math.round(img.height() * this.width / this.height));
if (loaded == $('#zoombox .zoombox_gallery img').length) {
var width = 0;
$('#zoombox .zoombox_gallery img').each(function () {
width += $(this).outerWidth();
$(this).data('left', width);
});
var div = $('
').css({
position: 'absolute',
top: 0,
left: 0,
width: width
});
$('#zoombox .zoombox_gallery').wrapInner(div);
contentWidth = $('#zoombox .zoombox_gallery').width();
$('#zoombox').trigger('change');
}
});
}
$('#zoombox .zoombox_gallery').show().animate({bottom: 0}, options.duration);
}
$('#zoombox').bind('change', function (e, css) {
if ($('#zoombox .zoombox_gallery div').width() < $('#zoombox .zoombox_gallery').width) {
return true;
}
var d = 0;
var center = 0;
if (css != null) {
d = options.duration;
center = css.width / 2;
} else {
center = $('#zoombox .zoombox_gallery').width() / 2;
}
var decal = -$('#zoombox .zoombox_gallery img.current').data('left') + $('#zoombox .zoombox_gallery img.current').width() / 2;
var left = decal + center;
if (left < center * 2 - $('#zoombox .zoombox_gallery div').width()) {
left = center * 2 - $('#zoombox .zoombox_gallery div').width();
}
if (left > 0) {
left = 0;
}
$('#zoombox .zoombox_gallery div').animate({left: left}, d);
});
}
/**
* Open the box
**/
function open() {
if (isOpen == false)
build();
else
$('#zoombox .zoombox_title').empty();
$('#zoombox .close').hide();
$('#zoombox .zoombox_container').removeClass('multimedia').removeClass('img').addClass(type);
// We add a title if we find one on the link
if (elem != null && elem.attr('title')) {
$('#zoombox .zoombox_title').append(elem.attr('title'));
}
// And after... Animation or not depending of preferences
// We empty the content
$('#zoombox .zoombox_content').empty();
// If it's an image we load the content now (to get a good animation)
if (type == 'img' && isOpen == false && options.animation == true) {
$('#zoombox .zoombox_content').append(content);
}
// Default position/size of the box to make the "zoom effect"
if (elem != null && elem.find('img').length != 0 && isOpen == false) {
var min = elem.find('img');
$('#zoombox .zoombox_container').css({
width: min.width(),
height: min.height(),
top: min.offset().top,
left: min.offset().left,
opacity: 0,
marginTop: min.css('marginTop')
});
} else if (elem != null && isOpen == false) {
$('#zoombox .zoombox_container').css({
width: elem.width(),
height: elem.height(),
top: elem.offset().top,
left: elem.offset().left
});
} else if (isOpen == false) {
$('#zoombox .zoombox_container').css({
width: 100,
height: 100,
top: windowH() / 2 - 50,
left: windowW() / 2 - 50
})
}
// Final position/size of the box after the animation
var css = {
width: width,
height: height,
left: (windowW() - width) / 2,
top: (windowH() - height) / 2,
marginTop: scrollY(),
opacity: 1
};
// Trigger the change event
$('#zoombox').trigger('change', css);
// Do we animate or not ?
if (options.animation == true) {
$('#zoombox .zoombox_title').hide();
$('#zoombox .zoombox_close').hide();
$('#zoombox .zoombox_container').animate(css, options.duration, function () {
if (type == 'multimedia' || isOpen == true) {
$('#zoombox .zoombox_content').append(content);
}
if (type == 'image' || isOpen == true) {
$('#zoombox .zoombox_content img').css('opacity', 0).fadeTo(300, 1);
}
$('#zoombox .zoombox_title').fadeIn(300);
$('#zoombox .zoombox_close').fadeIn(300);
state = 'opened';
if (!isOpen) {
gallery();
}
isOpen = true;
});
$('#zoombox .zoombox_mask').fadeTo(200, options.opacity);
} else {
$('#zoombox .zoombox_content').append(content);
$('#zoombox .zoombox_close').show();
$('#zoombox .zoombox_gallery').show();
$('#zoombox .zoombox_container').css(css);
$('#zoombox .zoombox_mask').show();
$('#zoombox .zoombox_mask').css('opacity', options.opacity);
if (!isOpen) {
gallery();
}
isOpen = true;
state = 'opened';
}
}
/**
* Close the box
* **/
function close() {
state = 'closing';
window.clearInterval(timer);
$(window).unbind('keydown');
$(window).unbind('resize');
if (type == 'multimedia') {
$('#zoombox .zoombox_container').empty();
}
var css = {};
if (elem != null && elem.find('img').length > 0) {
var min = elem.find('img');
css = {
width: min.width(),
height: min.height(),
top: min.offset().top,
left: min.offset().left,
opacity: 0,
marginTop: min.css('marginTop')
};
} else if (elem != null) {
css = {
width: elem.width(),
height: elem.height(),
top: elem.offset().top,
left: elem.offset().left,
marginTop: 0,
opacity: 0
};
} else {
css = {
width: 100,
height: 100,
top: windowH() / 2 - 50,
left: windowW() / 2 - 50,
opacity: 0
};
}
if (options.animation == true) {
$('#zoombox .zoombox_mask').fadeOut(200);
$('#zoombox .zoombox_gallery').animate({bottom: -$('#zoombox .zoombox_gallery').innerHeight()}, options.duration);
$('#zoombox .zoombox_container').animate(css, options.duration, function () {
$('#zoombox').remove();
state = 'closed';
isOpen = false;
});
} else {
$('#zoombox').remove();
state = 'closed';
isOpen = false;
}
}
/**
* Set the HTML Content of the box
* */
function setContent() {
// Overtflow
if (options.overflow == false) {
if (width * 1 + 50 > windowW()) {
height = (windowW() - 50) * height / width;
width = windowW() - 50;
}
if (height * 1 + 50 > windowH()) {
width = (windowH() - 50) * width / height;
height = windowH() - 50;
}
}
var url = link;
type = 'multimedia';
if (filtreImg.test(url)) {
type = 'img';
content = '';
} else if (filtreMP3.test(url)) {
width = 300;
height = 40;
content = '';
} else if (filtreFLV.test(url)) {
var autostart = 0;
if (options.autoplay == true) {
autostart = 1;
}
content = '';
} else if (filtreSWF.test(url)) {
content = '';
} else if (filtreQuicktime.test(url)) {
content = '';
// HTML5 Code
//content=''
} else if (filtreWMV.test(url)) {
content = '';
} else if (filtreDailymotion.test(url)) {
var id = url.split('_');
id = id[0].split('/');
id = id[id.length - 1] + '?';
if (options.autoplay == true) {
id = id + 'autoPlay=1&';
}
content = '';
} else if (filtreVimeo.test(url)) {
var id = url.split('/');
id = id[3] + '?';
if (options.autoplay == true) {
id = id + 'autoplay=1&';
}
content = ''
} else if (filtreYoutube.test(url)) {
var id = url.split('watch?v=');
id = id[1].split('&');
id = id[0] + '?';
if (options.autoplay == true) {
id = id + 'autoplay=1&';
}
content = '';
} else if (filtreKoreus.test(url)) {
url = url.split('.html');
url = url[0];
content = '';
} else {
content = '';
}
return content;
}
/**
* Handle Image loading
**/
function loadImg(img) {
if (img.complete) {
i = 0;
window.clearInterval(timer);
width = img.width;
height = img.height;
$('#zoombox_loader').remove();
setContent();
open();
}
// On anim le loader
$('#zoombox_loader').css({'background-position': "0px " + i + "px"});
i = i - 40;
if (i < (-440)) {
i = 0;
}
}
function gotoSlide(i) {
if (state != 'opened') {
return false;
}
if (imageset) {
position = i;
elem = imageset[position];
link = elem.attr('href');
if ($('#zoombox .zoombox_gallery img').length > 0) {
$('#zoombox .zoombox_gallery img').removeClass('current');
$('#zoombox .zoombox_gallery img:eq(' + i + ')').addClass('current');
}
load();
}
return false;
}
function next() {
i = position + 1;
if (i > imageset.length - 1) {
i = 0;
}
gotoSlide(i);
}
function prev() {
i = position - 1;
if (i < 0) {
i = imageset.length - 1;
}
gotoSlide(i);
}
/**
* GENERAL FUNCTIONS
* */
/**
* Resize
**/
function resize() {
$('#zoombox .zoombox_container').css({
top: (windowH() - $('#zoombox .zoombox_container').outerHeight(true)) / 2,
left: (windowW() - $('#zoombox .zoombox_container').outerWidth(true)) / 2
});
}
/**
* Keyboard Shortcut
**/
function shortcut(key) {
if (key == 37) {
prev();
}
if (key == 39) {
next();
}
if (key == 27) {
close();
}
}
/**
* Parse Width/Height of a link and insert it in the width and height variables
* */
function setDim() {
width = options.width;
height = options.height;
if (elem != null) {
var widthReg = /w([0-9]+)/;
var w = widthReg.exec(elem.attr("class"));
if (w != null) {
if (w[1]) {
width = w[1];
}
}
var heightReg = /h([0-9]+)/;
var h = heightReg.exec(elem.attr("class"));
if (h != null) {
if (h[1]) {
height = h[1];
}
}
}
return false;
}
/**
* Return the window height
* */
function windowH() {
if (window.innerHeight)
return window.innerHeight;
else {
return $(window).height();
}
}
/**
* Return the window width
* */
function windowW() {
if (window.innerWidth)
return window.innerWidth;
else {
return $(window).width();
}
}
/**
* Return the position of the top
* */
function scrollY() {
scrOfY = 0;
if (typeof (window.pageYOffset) == 'number') {
//Netscape compliant
scrOfY = window.pageYOffset;
} else if (document.body && (document.body.scrollTop)) {
//DOM compliant
scrOfY = document.body.scrollTop;
} else if (document.documentElement && (document.documentElement.scrollTop)) {
//IE6 standards compliant mode
scrOfY = document.documentElement.scrollTop;
}
return scrOfY;
}
/**
* Return the position of the left scroll
* */
function scrollX() {
scrOfX = 0;
if (typeof (window.pageXOffset) == 'number') {
//Netscape compliant
scrOfX = window.pageXOffset;
} else if (document.body && (document.body.scrollLeft)) {
//DOM compliant
scrOfX = document.body.scrollLeft;
} else if (document.documentElement && (document.documentElement.scrollLeft)) {
//IE6 standards compliant mode
scrOfX = document.documentElement.scrollLeft;
}
return scrOfX;
}
})(jQuery);