/* ----- ----- ----- Free software Foundation - Affero Licence ----- ----- -----

diapo.js - Slideshow with fading
    Copyright (C) 2008  Thibault Garcia (thibault.garcia@revaweb.com)

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as
    published by the Free Software Foundation, either version 3 of the
    License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

----- ----- ----- Free software Foundation - Affero Licence ----- ----- ----- */

function nodePurify(item) {
	item.style.margin=0;
	item.style.padding=0;
	item.style.border=0;
	item.style.cssFloat='none';
	item.style.display='inline-block';
}

/* ----- ----- diapoInit ----- -----
Initialise le diaporama (à mettre dans <body onload="diapoInit( ... );"> avec les paramètres suivants :
id    : conteneur (div, a ou autre)
mini  : liste des identifiant de liens vers les images ['id1','id2'...]
delay : temps entre chaque changement de diapo (ms)
width : largeur
height: hauteur
color : couleur de fond
attribut: pour miniatures avec fade
Over1 : couleur pour miniature over
Out1  : couleur pour miniature out
Over2 : couleur pour miniature over si affiché
Out2  : couleur pour miniature out si affiché
*/
function diapoInit(id,mini,delay,width,height,color,focus,unfocus){
	var item=document.getElementById(id);

	item.diapoNb=mini.length;
	if(item.diapoNb==0) return;

	item.diapoOpacityDelay=25;
	item.diapoOpacityStep=0.1;
	item.diapoOpacityValue=0;
	item.diapoTimer=null;
	item.diapoNum=0;
	item.diapoMini=mini;
	item.diapoDelay=delay;
	item.diapoSetDelay=3*delay;
	item.diapoFocus=focus;
	item.diapoUnfocus=unfocus;

	item.Ok=true;

	/* ----- Gestion du fondu via une div ----- */
	var devant_node=document.createElement('div');
	nodePurify(devant_node);
	devant_node.style.width=width+'px';
	devant_node.style.height=height+'px';
	devant_node.style.background='url('+document.getElementById(item.diapoMini[item.diapoNum]).href+') no-repeat center center #'+color;

	/* ----- Garder l'intérieur ----- */
	var it;
	while((it=item.lastChild)!=null) {
		item.removeChild(it)
		devant_node.appendChild(it);
	}

	/* ----- Gestion du fondu via une div (bis) ----- */
	var derriere_node=document.createElement('div');
	nodePurify(derriere_node);

	derriere_node.style.width=width+'px';
	derriere_node.style.height=height+'px';
	derriere_node.style.background='url() no-repeat center center #'+color;
	derriere_node.appendChild(devant_node);

	item.appendChild(derriere_node);

	item.diapoDevant=devant_node;
	item.diapoDiv=derriere_node;

	/* ----- Initialisation des classes des miniatures ----- */
	for(var i=0;i<item.diapoNb;i++) {
		document.getElementById(item.diapoMini[i]).diapoNum=i;

		/* ----- Préchargement ---- */
		var img = document.createElement('img');
		img.src=document.getElementById(item.diapoMini[i]).href;
		img.style.display='none';
		document.getElementsByTagName('body')[0].appendChild(img);
	}

	if(item.diapoFocus) eval(item.diapoFocus+"('"+item.diapoMini[item.diapoNum]+"')");
}

/* ----- ----- diapoDebutIf ----- -----
temps : temps avant le prochain changement de diapo (ms)
*/
function diapoDebutIf(id,temps) {
	var item=document.getElementById(id);

	if(item.Ok) diapoDebut(id,temps);
}


/* ----- ----- diapoFinIf ----- -----
Termine le diaporama en assurant que diapoDebutIf n'aura pas d'effet
*/
function diapoFinIf(id) {
	var item=document.getElementById(id);

	item.Ok=false;
	diapoFin(id);
}

/* ----- ----- diapoDebut ----- -----
temps : temps avant le prochain changement de diapo (ms)
*/
function diapoDebut(id,temps) {
	var item=document.getElementById(id);

	if(item.diapoTimer) clearTimeout(item.diapoTimer);
	if(item.diapoNb==0) return;
	item.diapoTimer=setTimeout('diapoSuiv("'+id+'")',temps);
}
/* ----- ----- diapoFin ----- -----
*/
function diapoFin(id) {
	var item=document.getElementById(id);

	if(item.diapoTimer) clearTimeout(item.diapoTimer);
	item.diapoOpacityValue=0;
	item.diapoDevant.style.opacity=1;
	item.diapoDevant.style.filter='alpha(opacity=100)';
}

/* ----- ----- diapoOpacity ----- -----
temps : temps pour diapoChange
*/
function diapoOpacity(id,temps) {
	var item=document.getElementById(id);

	if(item.diapoTimer) clearTimeout(item.diapoTimer);

	if(item.diapoOpacityValue+item.diapoOpacityStep<1) {
		item.diapoOpacityValue+=item.diapoOpacityStep;
		item.diapoDevant.style.opacity=item.diapoOpacityValue;
		item.diapoDevant.style.filter='alpha(opacity='+(100*item.diapoOpacityValue)+')';

		item.diapoTimer=setTimeout('diapoOpacity("'+id+'",'+temps+')',item.diapoOpacityDelay);
	} else {
		item.diapoOpacityValue=0;
		item.diapoDevant.style.opacity=1;
		item.diapoDevant.style.filter='alpha(opacity=100)';

		item.diapoTimer=setTimeout('diapoSuiv("'+id+'")',temps);
	}
}

/* ----- ----- diapoChange ----- -----
Changement de diapositive
n : numéro de la prochaine diapo à afficher
temps : temps avant de passer à la suivante
*/
function diapoChange(id,n,temps) {
	var item=document.getElementById(id);

	if(item.diapoTimer) clearTimeout(item.diapoTimer);

	item.diapoDiv.style.backgroundImage='url('+document.getElementById(item.diapoMini[item.diapoNum]).href+')';

	item.diapoOpacityValue=0;
	item.diapoDevant.style.opacity=item.diapoOpacityValue;
	item.diapoDevant.style.filter='alpha(opacity='+(100*item.diapoOpacityValue)+')';

	if(item.diapoUnfocus) eval(item.diapoUnfocus+"('"+item.diapoMini[item.diapoNum]+"')");

	item.diapoNum=n;

	item.diapoDevant.style.backgroundImage='url('+document.getElementById(item.diapoMini[item.diapoNum]).href+')';

	if(item.diapoFocus) eval(item.diapoFocus+"('"+item.diapoMini[item.diapoNum]+"')");

	item.diapoTimer=setTimeout('diapoOpacity("'+id+'",'+temps+')',item.diapoOpacityDelay);
}

/* ----- ----- diapoSuiv ----- -----
passe à la diapo suivante
*/
function diapoSuiv(id){
	var item=document.getElementById(id);

	diapoChange(id,(item.diapoNum+1)%item.diapoNb,item.diapoDelay);
	return false;
}

/* ----- ----- diapoPrec ----- -----
passe à la diapo précédente
*/
function diapoPrec(id){
	var item=document.getElementById(id);

	diapoChange(id,(item.diapoNum+item.diapoNb-1)%item.diapoNb,item.diapoDelay);
	return false;
}

/* ----- ----- diapoSet ----- -----
Fixe le numéro de la diapo affichée :
n : numéro de diapo à afficher (de 0 à nb de diapos -1)
*/
function diapoSet(id,n){
	var item=document.getElementById(id);

	diapoChange(id,n,item.diapoSetDelay);
	return false;
}
