/*
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);