// Classe d'effets en Javascript
// (IE, Firefox, Opera)
// Eric Quillévéré 2008


var agent = navigator.userAgent.toLowerCase();
var major = parseInt(navigator.appVersion);
var minor = parseFloat(navigator.appVersion);

var opera = (agent.indexOf("opera") != -1);
var ffox = (agent.indexOf("firefox") != -1);
var netscape = ((navigator.appName).indexOf("Netscape") != -1);

var ie = ((agent.indexOf("msie") != -1) &&	(agent.indexOf("opera") == -1));
var ie3 = (ie && (major < 4));
var ie4 = (ie && (major == 4) &&	(agent.indexOf("msie 4") != -1));
var ie5 = (ie && (major == 4) &&	(agent.indexOf("msie 5.") != -1) &&
	(agent.indexOf("msie 5.5") == -1) &&
	(agent.indexOf("mac") == -1));
var ie55 = (ie && (major == 4) &&	(agent.indexOf("msie 5.5") != -1));
var ie6 = (ie && (major == 4) &&	(agent.indexOf("msie 6.") != -1));
var ie7 = (ie && (major == 4) &&	(agent.indexOf("msie 7.") != -1));



var Effets = {}; // On crée une variable globale du nom du projet 
Effets.listeInstances = new Array(); // Liste des instances


// Fonction permettant de rester compatible avec l'ancienne version
// --> Utiliser la propriété visible pour savoir si l'objet est visible au demarrage de l'effet (pour faire un focus par exemple).
function Effet (p_nomObjet, nomEffetALancer, listeParametres, delaiAvantDemarrage, OPT_fonctionApresFin) 
	{
	new Effets.instance(p_nomObjet, nomEffetALancer, listeParametres, delaiAvantDemarrage, OPT_fonctionApresFin) ;
	}

Effets.instance = function(p_nomObjet, nomEffetALancer, 
	listeParametres, delaiAvantDemarrage, OPT_fonctionApresFin)  
	{  
	/** Instance **/
	this.id = Effets.listeInstances.length; // Numero d'instance actuel (pour setTimeout)
	Effets.listeInstances[this.id]=this; // Affecte l'objet a l'instance
	if (typeof delaiAvantDemarrage==="undefined" || delaiAvantDemarrage===null)
		this.delaiAvantDemarrage=0;
	else
		this.delaiAvantDemarrage=delaiAvantDemarrage;
		
	this.nomEffet=nomEffetALancer;
	this.parametres=listeParametres;
	this.fonctionApresFin=OPT_fonctionApresFin;
	
	// Récupère l'objet en paramètre, selon le navigateur
	if (document.getElementById) 
		this.Objet= document.getElementById(p_nomObjet);
	else if (document.all)  
		this.Objet=document.all[p_nomObjet];

	// Recherche si l'objet est visible
	if (this.Objet)
		{
		if (this.Objet.style.visibility!='visible' || this.Objet.style.display=='none') 
			this.estVisible=false; 
		else
			this.estVisible=true; 

		// Memorise la taille actuelle
		this.largeur=	this.Objet.offsetWidth;		
		this.hauteur=	this.Objet.offsetHeight;		
		this.posGauche= this.Objet.style.left;		
		this.posHaut= 	this.Objet.offsetTop;		
		
		//Permet d'appeler la méthode de fin depuis l'extérieur de l'objet
		this.Objet.fonctionApresFin=OPT_fonctionApresFin;
		}
	else
		this.estVisible=false; 
	this.Demarrage();  
	};

// Methodes publiques de maClasse  
Effets.instance.prototype = 
	{  
	//Initialisation, methode apellee a l'instanciation de l'objet 
	Demarrage: function()  
		{  
		
		if (this.delaiAvantDemarrage===0)
			this.Effet_BranchementFonction(); // Demarrage immediat
		else
			// Demarrage retarde
			setTimeout('Effets.listeInstances['+ this.id + '].Effet_BranchementFonction();', this.delaiAvantDemarrage);
		},
		
	Effet_Fin:function()
		{
		// Fin de l'effet : appelle une procedure si demandée
		if (typeof this.fonctionApresFin !== 'undefined' && this.fonctionApresFin!==null)
			{
			if (this.Objet) this.Objet.fonctionApresFin=null;
			this.fonctionApresFin();
			this.fonctionApresFin=null;
			
			}
		} ,

	Effet_BranchementFonction:function()
		{
		if (this.Objet)
			{
			switch(this.nomEffet)
				{
				case 'Progressif':
					this.Effet_AffichageProgressif (this.parametres[0], 
						this.parametres[1],
						this.parametres[2], this.parametres[3]);
					break;
					
				case 'Deroulant':
					this.Effet_AffichageDeroulant (this.parametres[0], 
						this.parametres[1], 
						this.parametres[2], 
						null,
						this.parametres[3],
						this.parametres[4],
						this.parametres[5]);
					break;					
					
 				case 'DeroulantHL':
					this.Effet_AffichageDeroulant (this.parametres[0], 
						this.parametres[1], 
						this.parametres[2], 
						this.parametres[3],
						this.parametres[4],
						this.parametres[5],
						this.parametres[6]);
					break;					
					
 				case 'DeplaceZoom':
					this.Effet_AffichageDeplaceZoom (
						this.parametres[0], this.parametres[1], 
						this.parametres[2], this.parametres[3] ,
						this.parametres[4], this.parametres[5] ,
						this.parametres[6], this.parametres[7] 	);
					break;				
					
				case 'Deplace':
					var vitesseVariable=false;
					if (this.parametres.length>2)
						vitesseVariable=this.parametres[3];
						
					this.Effet_Deplace (this.parametres[0], 
						this.parametres[1], 
						this.parametres[2], vitesseVariable);
					break;		

				case 'Opacite':
					this.Effet_AffichageOpacite (this.parametres[0]);
					break;						
					
				default:
					alert('Nom d\'effet inconnu : ' + this.nomEffet);
					break;
				}
			}
		},


	// Affiche un objet en le déroulant

	// typeAffichage :
	//	0 :  du haut vers le bas
	//	1 : du bas vers le haut
	// vitesse : delai entre deux evolutions de la taille
	// 	
	Effet_AffichageDeroulant:function(typeAffichage, vitesse, limiteH, limiteL, padding, cacherApres, OPT_Intervalle)
		{

		// Paramètres affichage deroulant
		if (typeof this.OPT_Intervalle === 'undefined' || this.OPT_Intervalle===null)
			OPT_Intervalle=40;
			
		this.demandeDeroulant=typeAffichage;  // Demande-t-on la reduction ou l'agrandissement ?
		this.intervalle=OPT_Intervalle; // Intervalle de rappel
		this.evolutionTaille=vitesse; // Increment de taille
		this.limiteHauteur=limiteH; // Limite hauteur (maxi/mini)
		
		if (limiteL===null)	
			this.limiteLargeur=0;
		else
			this.limiteLargeur=limiteL; // Limite hauteur (maxi/mini)
		
		this.paddingElement=padding; //taille du padding (border+padding haut/bas)
		this.cacherApres=cacherApres; //cacher après l'effet
		this.AfficheElement();

		this.Effet_AffichageDeroulant_Appels (); // Demarrage immediat
		},	

			
	Effet_AffichageDeroulant_Appels:function()
		{
		var hauteurActuelle=this.Objet.offsetHeight;
		var largeurActuelle=this.Objet.offsetWidth;
		var finAppel=false;
		
		if (this.demandeDeroulant===0)
			{
			if (hauteurActuelle<this.limiteHauteur) hauteurActuelle+=this.evolutionTaille;
			if (largeurActuelle<this.limiteLargeur) largeurActuelle+=this.evolutionTaille;
			
			if (hauteurActuelle>this.limiteHauteur)	hauteurActuelle=this.limiteHauteur;
			if (largeurActuelle>this.limiteLargeur) largeurActuelle=this.limiteLargeur;
			
			}
			
		else if (this.demandeDeroulant==1)
			{
			if (hauteurActuelle>this.limiteHauteur) hauteurActuelle-=this.evolutionTaille;
			if (largeurActuelle>this.limiteLargeur) largeurActuelle-=this.evolutionTaille;
			
			if (hauteurActuelle<this.limiteHauteur)	hauteurActuelle=this.limiteHauteur;
			if (largeurActuelle<this.limiteLargeur) largeurActuelle=this.limiteLargeur;
			}

		if 	((this.limiteHauteur===0 || (this.limiteHauteur!==0 && hauteurActuelle==this.limiteHauteur)) &&
			(this.limiteLargeur===0 || (this.limiteLargeur!==0 && largeurActuelle==this.limiteLargeur)))
			finAppel=true;

		
		if (this.Objet)
			{
			this.Objet.style.height=(hauteurActuelle-this.paddingElement) + 'px';
			if (this.limiteLargeur!==0) this.Objet.style.width=(largeurActuelle-this.paddingElement) + 'px';
			}

		if (this.Objet && !finAppel)
			{
			// Permet d'appeler la presente routine après n millisec
			this.Objet.timeoutEffet=setTimeout('Effets.listeInstances['+ this.id + '].Effet_AffichageDeroulant_Appels();', this.intervalle);
			}
		else
			{
			if (this.cacherApres) this.Objet.style.display='none';
			this.Effet_Fin();
			}
		},
			
	// Affiche un objet en le déroulant

	// typeAffichage :
	//	0 :  du haut vers le bas
	//	1 : du bas vers le haut
	// vitesse : delai entre deux evolutions de la taille
	// 	
	Effet_AffichageDeplaceZoom:function(posGaucheDeb, posHautDeb, largeurDeb, hauteurDeb,
		posGaucheFin, posHautFin, largeurFin, hauteurFin)
		{

		// Paramètres affichage déroulant
		this.posGaucheFin=posGaucheFin;  
		this.posHautFin=posHautFin; 
		this.largeurFin=largeurFin; 
		this.hauteurFin=hauteurFin; 
		
		this.posGaucheDeb=posGaucheDeb;
		this.posHautDeb=posHautDeb;
		this.largeurDeb=largeurDeb;
		this.hauteurDeb=hauteurDeb;
		
		this.Objet.style.position = 'absolute';
		this.Objet.style.zIndex=100;
		
		this.nbEtapes=10;
		this.agrandX=(largeurFin-largeurDeb)/this.nbEtapes;
		this.agrandY=(hauteurFin-hauteurDeb)/this.nbEtapes;
		this.deplX=(posGaucheFin-posGaucheDeb)/this.nbEtapes;
		this.deplY=(posHautFin-posHautDeb)/this.nbEtapes;

		this.Effet_AffichageDeplaceZoom_Appels (); // Demarrage immediat
		},	

			
	Effet_AffichageDeplaceZoom_Appels:function()
		{
		// Fixe la position et la taille d'origine
		this.Objet.style.left=this.posGaucheDeb + 'px';
		this.Objet.style.top=this.posHautDeb + 'px';
		this.Objet.style.height=this.hauteurDeb + 'px';
		this.Objet.style.width=this.largeurDeb + 'px';

		this.nbEtapes--;
		if (this.nbEtapes>=0)
			{
			this.largeurDeb+=this.agrandX;
			this.hauteurDeb+=this.agrandY;
			this.posGaucheDeb+=this.deplX;
			this.posHautDeb+=this.deplY;
			
			// Permet d'appeler la présente routine après n millisec
			setTimeout('Effets.listeInstances['+ this.id + '].Effet_AffichageDeplaceZoom_Appels();', 20);
			
			
			}
		else
			{
			this.Objet.style.left=this.posGaucheFin + 'px';
			this.Objet.style.top=this.posHautFin + 'px';
			this.Objet.style.height=this.hauteurFin + 'px';
			this.Objet.style.width=this.largeurFin + 'px';			
			this.Effet_Fin();
			}
		},			
			
	// Affiche/cache un objet progressivement
	Effet_AffichageProgressif:function(typeAffichage, vitesse, OPT_valeurMini, OPT_valeurMaxi)
		{
		if (typeof OPT_valeurMini=="undefined" || OPT_valeurMini===null) OPT_valeurMini=0;
		if (typeof OPT_valeurMaxi=="undefined" || OPT_valeurMaxi===null) OPT_valeurMaxi=100;
		
		// Paramètres affichage progressif
		this.OpaciteActuelle=0; // Opacite actuelle
		this.OpaciteIncrement=0; // Increment/decrement de l'opacite
		this.demandeAffichage=true; // Demande-t-on l'affichage ou le masquage ?
		var continuer=true;
		
		switch (typeAffichage)
			{
			case 0:
				// Si cache, ne sert a rien de faire un effet
				if (this.estVisible===false)
					continuer=false;
				else
					this.demandeAffichage=false;
				break;					
				
			case 1:
				this.demandeAffichage=true;
				break;
			
			case 2: // Inverser
				if (this.estVisible===false)
					{
					this.Effet_Opacite_Fixe (30); // Opacite au demarrage
					this.demandeAffichage=true;
					}
				else 
					{
					this.demandeAffichage=false;
					}
				break;
				
			default: break;
			}

		if (continuer)
			{
			this.AfficheElement();
			this.valeurMini=OPT_valeurMini; // Valeur mini
			this.valeurMaxi=OPT_valeurMaxi; // Valeur maxi
			
			this.estVisible=this.demandeAffichage;
			
			if (!this.demandeAffichage)
				{
				this.OpaciteActuelle=100; 
				this.OpaciteIncrement=-vitesse;
				}
			else
				{
				this.OpaciteActuelle=0;
				this.OpaciteIncrement=vitesse;
				}
			
			this.Effet_AffichageProgressif_Appels (); // Demarrage immediat
			}
				
		},
			
			
	Effet_AffichageProgressif_Appels:function()
		{
		if (this.Objet)
			{
			if (this.Objet.style.visibility!='hidden')
				{
				if (this.Effet_Opacite_Modif(this.OpaciteIncrement, this.valeurMini, this.valeurMaxi))
					{
					// Permet d'appeler la présente routine après n millisec
					setTimeout('Effets.listeInstances['+ this.id + '].Effet_AffichageProgressif_Appels();', 100);
					}
				else
					this.Effet_AffichageProgressif_Fin(this.demandeAffichage);
				}
			}
		else
			this.Effet_AffichageProgressif_Fin(this.demandeAffichage);
		}	,	
			
	Effet_AffichageProgressif_Fin:function(afficherObjet) 
		{
		if (this.Objet)
			{
			if (!afficherObjet)
				{
				// Cache définivement
				this.Objet.style.display = "none"; // invisible;
				this.Objet.style.visibility='hidden';
				}
			else
				{
				// Affiche definitivement
				this.Effet_Opacite_Fixe (this.valeurMaxi);
				}
			this.Effet_Fin();				
			}
			
		},			
			

	// Opacité
	Effet_AffichageOpacite:function(valOpacite)
		{
		if (this.Objet)
			this.Effet_Opacite_Fixe (valOpacite);

		this.Effet_Fin();		
		}	, 		
			
	Effet_Opacite_Fixe:function(Valeur)
		{
		//Internet Explorer gère la transparence dans 2 cas seulements : 
		// l'élément a une position absolue (position:absolute) ou l'élément a une hauteur fixe
		
		if (ie) 
			this.Objet.style.filter="alpha(opacity="+Valeur.toString()+")";
		else if (ffox)
			{
			this.Objet.style.setProperty("-moz-opacity", Valeur/100, "");			
			this.Objet.style.setProperty("opacity", Valeur/100, "");			
			}
		else if (opera)
			this.Objet.style.opacity=Valeur/100;
		else
			this.Objet.style.filter="opacity="+ (Valeur/100).toString()+")";
		this.AfficheElement();
		}	,	
			



			
			
	// Enlève l'opcacité de la bulle en plusieurs etapes
	Effet_Opacite_Modif:function(Increment, valeurMini, valeurMaxi)
		{
		if (ie5 || ie6 || ie7 || ffox || opera )
			{
			var autreIncrementPossible=true;
			this.OpaciteActuelle+=Increment;
			
			if(this.OpaciteActuelle<valeurMini) // 0
				{
				this.OpaciteActuelle=valeurMini;
				autreIncrementPossible=false;
				}
			else if (this.OpaciteActuelle>valeurMaxi) // 100
				{
				this.OpaciteActuelle=valeurMaxi;
				autreIncrementPossible=false;
				
				}

			if (this.Objet)	
				{
				this.Effet_Opacite_Fixe (this.OpaciteActuelle);
				return autreIncrementPossible;
				}
			else
				return false; // Objet non trouve
			}
		else
			return false; // Navigateur non gere
		}   ,
		
		
		
	// Déplace un objet
	Effet_Deplace:function(posX, posY, vitesse, vitesseVariable)
		{
		this.evolutionDeplace=vitesse;
		this.vitesseVariable=vitesseVariable;
		this.posXFinale=posX;
		this.posYFinale=posY;
		
		// Détermine le sens du déplacement
		var posXActuelle=this.Objet.offsetLeft;
		var posYActuelle=this.Objet.offsetTop;		
		
		if (this.posXFinale===null) this.gereX=false; else this.gereX=true;
		if (this.posYFinale===null) this.gereY=false; else this.gereY=true;
		
		if (posXActuelle<this.posXFinale && gereX) this.sensX=1; else this.sensX=-1;
		if (posYActuelle<this.posYFinale && gereY) this.sensY=1; else this.sensY=-1;
		this.Effet_Deplace_Appels (); // Demarrage immediat
		},
		
		
	Effet_Deplace_Appels:function()
		{
	
		var posXActuelle=this.Objet.offsetLeft;
		var posYActuelle=this.Objet.offsetTop;
		
		if (this.vitesseVariable)
			{
			var distance=Math.max(Math.abs(posXActuelle-this.posXFinale), Math.abs(posYActuelle-this.posYFinale));
			var ContinueCalcul=true;
			var LimiteDeptUn=12; // Limite pour le deplacement de 1 pixel
			while (ContinueCalcul && this.evolutionDeplace>1)
				{
				if ((distance>Math.pow(this.evolutionDeplace-1,2)+LimiteDeptUn) && (distance<Math.pow(this.evolutionDeplace,2)+LimiteDeptUn) ||
					distance<Math.pow(this.evolutionDeplace-1,2)+LimiteDeptUn) 
					this.evolutionDeplace--;
				else
					ContinueCalcul=false;
				}
			}
		
		if (this.gereX) posXActuelle=posXActuelle+ (this.evolutionDeplace*this.sensX);
		if (this.gereY) posYActuelle=posYActuelle+ (this.evolutionDeplace*this.sensY);
		
		var finAppelX=false;
		var finAppelY=false;
		
		if (this.gereX)
			{
			if ((posXActuelle>=this.posXFinale && this.sensX==1) || (posXActuelle<=this.posXFinale && this.sensX==-1))
				{
				posXActuelle=this.posXFinale;
				finAppelX=true;
				}
			}
		else
			finAppelX=true;

		if (this.gereY)
			{
			if ((posYActuelle>=this.posYFinale && this.sensY==1) || (posYActuelle<=this.posYFinale && this.sensY==-1))
				{
				posYActuelle=this.posYFinale;
				finAppelY=true;
				}
			}
		else
			finAppelY=true;
			
		if (this.Objet)
			{
			if (this.gereX) this.Objet.style.left=posXActuelle + 'px';
			if (this.gereY) this.Objet.style.top =posYActuelle+ 'px';
			}
			
		if (this.Objet && ((!finAppelX || !finAppelY)))
			{
			// Permet d'appeler la routine après n millisec
			setTimeout('Effets.listeInstances['+ this.id + '].Effet_Deplace_Appels();', 10);
			}
		else
			this.Effet_Fin();
		}		,	
			
	AfficheElement:function()	
		{
		this.Objet.style.visibility='visible';
		if (this.Objet.style.display==='none' || this.Objet.style.display==='')
			this.Objet.style.display = 'block'; // visible		
		}			

	}; 
