/*
Inspired by the lightbox plugin adapted to jquery by Leandro Vieira Pinho (http://leandrovieira.com)
@author : Nicolas Turlais : nicolas-at-insipi.de
@version : V0.3.1 - June 2012
@license : Licensed under CCAttribution-ShareAlike
@website : http://chocolat.insipi.de
*/
(function ($) {
images = [];
var calls = 0;
$.fn.Chocolat = function (settings) {
settings = $.extend({
container: $('body'),
displayAsALink: false,
linkImages: true,
linksContainer: 'Choco_links_container',
overlayOpacity: 0.9,
overlayColor: '#fff',
fadeInOverlayduration: 500,
fadeInImageduration: 500,
fadeOutImageduration: 500,
vache: true,
separator1: ' | ',
separator2: '/',
leftImg: 'images/left.gif',
rightImg: 'images/right.gif',
closeImg: 'images/close.gif',
loadingImg: 'images/loading.gif',
currentImage: 0,
setIndex: 0,
setTitle: '',
lastImage: 0
}, settings);
calls++;
settings.setIndex = calls;
images[settings.setIndex] = [];
//images:
this.each(function (index) {
if (index == 0 && settings.linkImages && settings.setTitle == '') {
settings.setTitle = isSet($(this).attr('rel'), ' ');
}
$(this).each(function () {
images[settings.setIndex]['displayAsALink'] = settings.displayAsALink;
images[settings.setIndex][index] = [];
images[settings.setIndex][index]['adress'] = isSet($(this).attr('href'), ' ');
images[settings.setIndex][index]['caption'] = isSet($(this).attr('title'), ' ');
if (!settings.displayAsALink) {
$(this).unbind('click').bind('click', {
id: settings.setIndex,
nom: settings.setTitle,
i: index
}, _initialise);
}
})
});
//setIndex:
for (var i = 0; i < images[settings.setIndex].length; i++) {
if (images[settings.setIndex]['displayAsALink']) {
if ($('#' + settings.linksContainer).size() == 0) {
this.filter(":first").before('
');
}
$('#' + settings.linksContainer).append('' + settings.setTitle + '');
e = this.parent();
$(this).remove();
if ($.trim(e.html()) == "") {//If parent empty : remove it
e.remove();
}
return $('#Choco_numsetIndex_' + settings.setIndex).unbind('click').bind('click', {
id: settings.setIndex,
nom: settings.setTitle,
i: settings.currentImage
}, _initialise);
}
}
function _initialise(event) {
settings.currentImage = event.data.i;
settings.setIndex = event.data.id;
settings.setTitle = event.data.nom;
settings.lastImage = images[settings.setIndex].length - 1;
showChocolat();
return false;
}
function _interface() {
//html
clear();
settings.container.append('');
$('#Choco_left_arrow').css('background-image', 'url(' + settings.leftImg + ')');
$('#Choco_right_arrow').css('background-image', 'url(' + settings.rightImg + ')');
$('#Choco_close').css('background-image', 'url(' + settings.closeImg + ')');
$('#Choco_loading').css('background-image', 'url(' + settings.loadingImg + ')');
if (settings.container.get(0).nodeName.toLowerCase() !== 'body') {
settings.container.css({'position': 'relative', 'overflow': 'hidden', 'line-height': 'normal'});//yes, yes
$('#Choco_content').css('position', 'relative');
$('#Choco_overlay').css('position', 'absolute');
}
//events
$(document).unbind('keydown').bind('keydown', function (e) {
switch (e.keyCode) {
case 37:
changePageChocolat(-1);
break;
case 39:
changePageChocolat(1);
break;
case 27:
close();
break;
}
;
});
if (settings.vache) {
$('#Choco_overlay').click(function () {
close();
return false;
});
}
$('#Choco_left_arrow').unbind().bind('click', function () {
changePageChocolat(-1);
return false;
});
$('#Choco_right_arrow').unbind().bind('click', function () {
changePageChocolat(1);
return false;
});
$('#Choco_close').unbind().bind('click', function () {
close();
return false;
});
$(window).resize(function () {
load(settings.currentImage, true);
});
}
function showChocolat() {
_interface();
load(settings.currentImage, false);
$('#Choco_overlay')
.css({
'background-color': settings.overlayColor,
'opacity': settings.overlayOpacity
})
.fadeIn(settings.fadeInOverlayduration);
$('#Choco_content').fadeIn(settings.fadeInImageduration, function () {
});
}
function load(image, resize) {
settings.currentImage = image;
$('#Choco_loading').fadeIn(settings.fadeInImageduration);
var imgPreloader = new Image();
imgPreloader.onload = function () {
$('#Choco_bigImage').attr('src', images[settings.setIndex][settings.currentImage]['adress']);
var ajustees = iWantThePerfectImageSize(imgPreloader.height, imgPreloader.width);
ChoColat(ajustees['hauteur'], ajustees['largeur'], resize);
$('#Choco_loading').stop().fadeOut(settings.fadeOutImageduration);
};
imgPreloader.src = images[settings.setIndex][settings.currentImage]['adress'];
preload();
upadteDescription();
}
function changePageChocolat(signe) {
if (!settings.linkImages || (settings.currentImage == 0 && signe == -1) || (settings.currentImage == settings.lastImage && signe == 1)) {
return false;
} else {
//$('#Choco_container_description').fadeTo(settings.fadeOutImageduration,0); making a weird bug with firefox 17
$('#Choco_container_description').css('visibility', 'hidden');
$('#Choco_bigImage').fadeTo(settings.fadeOutImageduration, 0, function () {
load(settings.currentImage + parseInt(signe), false);
});
}
}
function ChoColat(hauteur_image, largeur_image, resize) {
if (resize) {
$('#Choco_container_photo, #Choco_content, #Choco_bigImage').stop(true, false).css({'overflow': 'visible'});
$('#Choco_bigImage').animate({
'height': hauteur_image + 'px',
'width': largeur_image + 'px'
}, settings.fadeInImageduration);
}
$('#Choco_container_photo').animate({
'height': hauteur_image,
'width': largeur_image
}, settings.fadeInImageduration);
$('#Choco_content').animate({
'height': hauteur_image,
'width': largeur_image,
'marginLeft': -largeur_image / 2,
'marginTop': -(hauteur_image) / 2
}, settings.fadeInImageduration, 'swing', function () {
$('#Choco_bigImage').fadeTo(settings.fadeInImageduration, 1).height(hauteur_image).width(largeur_image);
if (!resize) {
arrowsManaging();
//$('#Choco_container_description').fadeTo(settings.fadeInImageduration,1); making a weird bug with firefox 17
$('#Choco_container_description').css('visibility', 'visible');
$('#Choco_close').fadeIn(settings.fadeInImageduration);
}
}).css('overflow', 'visible');
}
function arrowsManaging() {
if (settings.linkImages) {
var what = ['Choco_right_arrow', 'Choco_left_arrow'];
for (var i = 0; i < what.length; i++) {
hide = false;
if (what[i] == 'Choco_right_arrow' && settings.currentImage == settings.lastImage) {
hide = true;
$('#' + what[i]).fadeOut(300);
} else if (what[i] == 'Choco_left_arrow' && settings.currentImage == 0) {
hide = true;
$('#' + what[i]).fadeOut(300);
}
if (!hide) {
$('#' + what[i]).fadeIn(settings.fadeOutImageduration);
}
}
}
}
function preload() {
if (settings.currentImage !== settings.lastImage) {
i = new Image;
z = settings.currentImage + 1;
i.src = images[settings.setIndex][z]['adress'];
}
}
function upadteDescription() {
var current = settings.currentImage + 1;
var last = settings.lastImage + 1;
$('#Choco_container_title').html(images[settings.setIndex][settings.currentImage]['caption']);
$('#Choco_container_via').html(settings.setTitle + settings.separator1 + current + settings.separator2 + last);
}
function isSet(variable, defaultValue) {
// return variable === undefined ? defaultValue : variable; ?
if (variable === undefined) {
return defaultValue;
} else {
return variable;
}
}
function iWantThePerfectImageSize(himg, limg) {
//28% = 14% + 14% margin
var lblock = limg + (limg * 28 / 100);
var heightDescAndClose = $('#Choco_container_description').height() + $('#Choco_close').height();
var hblock = himg + heightDescAndClose;
var k = limg / himg;
var kk = himg / limg;
if (settings.container.get(0).nodeName.toLowerCase() == 'body') {
windowHeight = $(window).height();
windowWidth = $(window).width();
} else {
windowHeight = settings.container.height();
windowWidth = settings.container.width();
}
notFitting = true;
while (notFitting) {
var lblock = limg + (limg * 28 / 100);
var hblock = himg + heightDescAndClose;
if (lblock > windowWidth) {
limg = windowWidth * 100 / 128;
himg = kk * limg;
} else if (hblock > windowHeight) {
himg = (windowHeight - heightDescAndClose);
limg = k * himg;
} else {
notFitting = false;
}
;
}
;
return {
largeur: limg,
hauteur: himg
};
}
function clear() {
$('#Choco_overlay').remove();
$('#Choco_content').remove();
}
function close() {
$('#Choco_overlay').fadeOut(900, function () {
$('#Choco_overlay').remove()
});
$('#Choco_content').fadeOut(500, function () {
$('#Choco_content').remove()
});
settings.currentImage = 0;
}
};
})(jQuery);