//Teste si le layer existe et ouvre une fenetre alerte sinon
function test_layer(layer)
{
 var retour=true;
 if (( is_gecko || is_ie5_5up) && (document.getElementById(layer) == null) ) retour=false;
 else if ( (is_nav4) && (document.layers[layer] == null) ) retour=false;
 else if (( is_ie) && (document.all[layer] == null) ) retour=false;
 if (!retour) alert('Le layer '+layer+' est inexistant ou votre navigateur ne supporte pas la gestion des layers DHTML');
 return retour;
}

// Rendre un layer VISIBLE
function montrer(layer)
{   
 	if (test_layer(layer)) 
	{
	 if (is_gecko || is_ie5_5up) document.getElementById(layer).style.visibility="visible";
	 else if (is_nav4) document.layers[layer].visibility="show";
	 else if (is_ie) document.all[layer].style.visibility="visible";
	}
}

//Rendre un layer INVISIBLE
function cacher(layer) 
{
    if (test_layer(layer)) 
	{
	 if (is_gecko || is_ie5_5up) document.getElementById(layer).style.visibility="hidden";
	 else if (is_nav4) document.layers[layer].visibility = "hide";
     else if (is_ie) document.all[layer].style.visibility = "hidden";
    }
}

//Modifier la position verticale d'un layer
function positionnerY(layer,y)
{
	if (test_layer(layer)) 
	{
	 if (is_gecko || is_ie5_5up) document.getElementById(layer).style.top=y;	
	 else if (is_nav4) document.layers[layer].top=y;
	 else if (is_ie) document.all[layer].style.pixelTop=y;
	}
} 

//Modifier la position horizontale d'un layer
function positionnerX(layer,x)
{
	if (test_layer(layer)) 
	{
	 if (is_gecko || is_ie5_5up) document.getElementById(layer).style.left=x;	
	 else if (is_nav4) document.layers[layer].left=x;
	 else if (is_ie) document.all[layer].style.pixelLeft=x;
    }
}

//Modifier les deux coordonnees d'un layer
function positionnerXY(layer,x,y)
{
	positionnerX(layer,x);
	positionnerY(layer,y);
}

// Modifier une dimension d'un layer
function modifierLargeur(layer,largeur)
{
	if (test_layer(layer)) 
	{
	 if (is_gecko || is_ie5_5up) document.getElementById(layer).style.width=largeur;	
	 else if (is_nav4) document.layers[layer].width=largeur;
	 else if (is_ie) document.all[layer].style.width=largeur;
    }
}

function modifierHauteur(layer,hauteur)
{
	if (test_layer(layer)) 
	{
	 if (is_gecko || is_ie5_5up) document.getElementById(layer).style.height=hauteur;	
	 else if (is_nav4) document.layers[layer].height=hauteur;
	 else if (is_ie) document.all[layer].style.height=hauteur;
    }
}

// Modifier les deux dimensions d'un layer
function modifierDimensions(layer,largeur,hauteur)
{
	modifierLargeur(layer,largeur);
	modifierHauteur(layer,hauteur);
}

// Modifier le clipping
function modifierClipping(layer,haut,gauche,bas,droite)
{
	if (test_layer(layer)) 
	{
	  if (is_gecko || is_ie5_5up) 
	  {
		document.getElementById(layer).style.clip="rect("+haut+"px,"+droite+"px,"+bas+"px,"+gauche+"px)";
	  }
	  else if (is_nav4)
	 {
		document.layers[layer].clip.top=haut;
		document.layers[layer].clip.left=gauche;
		document.layers[layer].clip.right=droite;
	    document.layers[layer].clip.bottom=bas;
	 }
	 else if (is_ie)
	 {
		 document.all[layer].style.clip="rect("+haut+"px,"+droite+"px,"+bas+"px,"+gauche+"px)";
	 }
   }
}

////////////////////////////
/// Animer des layers en mouvement
//////////////////////////
//definition des coordonnees x,y
function Coordonnees(p_x,p_y)
{
	this.x=p_x;
	this.y=p_y;
}

//definition d'un segment avec les coordonnes de ses extremites
// et le nb d'iterations voulues pour le parcourir
function Segment(nb_iter,xdeb,ydeb,xfin,yfin)
{
	this.nb_iterations = nb_iter;
	this.position=0;
	this.coordsDebut   = new Coordonnees(xdeb,ydeb);
	this.coordsFin     = new Coordonnees(xfin,yfin);
	var deltax=Math.floor((xfin-xdeb)/nb_iter);
	var deltay=Math.floor((yfin-ydeb)/nb_iter);
	this.coordsDelta=  new Coordonnees(deltax,deltay);
	this.deplacer=calculPosition;
	this.finSegment=false;
	this.debutSegment=true;
	this.init=initSegment
}

function initSegment()
{
 this.finSegment=false;
 this.debutSegment=true;
 this.position=0;
}

function calculPosition(sens)
{
 (sens >0)?++(this.position):--(this.position);
 if (this.position <0) 
 {
 	this.position=0;
	this.debutSegment=true;
	this.finSegment=false;
	return this.coordsDebut;
 }
 else if (this.position >this.nb_iterations)
 {
 	this.position=this.nb_iterations;
 	this.finSegment=true;
	this.debutSegment=false;
	return this.coordsFin;
 }
 else 
 {
  var x=this.coordsDebut.x+this.position*this.coordsDelta.x;
  var y=this.coordsDebut.y+this.position*this.coordsDelta.y;
  this.debutSegment=false;
  this.finSegment=false;
  return new Coordonnees(x,y);
 }
}



// definition des proprietes d'un layer pour l'animation 
// premier parametre : le nom du layer
// ensuite, des quintuplet pour definir le chemin parcouru sous forme de segments
function LayerDeplacement()
{
	var args          = LayerDeplacement.arguments;
	this.nom          = args[0];
	var taille_nUplet = 5;
	var nb_segments   = Math.floor((args.length-1)/taille_nUplet);
	this.segments     = new Array(nb_segments);
	for(i=0;i<nb_segments;++i)
	{
		this.segments[i] = new Segment(	args[taille_nUplet*i+1],
										args[taille_nUplet*i+2],
										args[taille_nUplet*i+3],
										args[taille_nUplet*i+4],
										args[taille_nUplet*i+5]);
	}	
	this.segment_courant     = 0;
	this.aTermineDeplacementAvant   = false;
	this.aTermineDeplacementArriere = true;
	this.coordsDebut         = 	this.segments[0].coordsDebut;
	this.coordsCourantes     =	this.coordsDebut;
	this.coordsFin           = 	this.segments[nb_segments-1].coordsFin;	
	this.deplacer=deplacer;	
	this.calculAvant=calculerDeplacementAvant;
	this.calculArriere=calculerDeplacementArriere;
	this.reinit=reinitialiserLayer;
	this.aTermineDeplacement=calculFinDeplacement;
}

function reinitialiserLayer()
{
	this.aTermineDeplacementAvant=false;
	this.aTermineDeplacementArriere=true;
	this.segment_courant=0;
	this.coordsCourantes = this.coordsDebut;
	positionnerXY(this.nom,this.coordsDebut.x,this.coordsDebut.y);
	for(i=0;i<this.segments.length;++i){this.segments[i].init();}
}

// Function de deplacement d'un layer sur les segments de son trajet, selon le sens de deplacement
function calculerDeplacementAvant()
{
 	if(this.segment_courant<0){this.segment_courant=0;}
	else if (this.segment_courant<this.segments.length)
	{
		var nouvPos = this.segments[this.segment_courant].deplacer(1);
		this.coordsCourantes=nouvPos;
		if (this.segments[this.segment_courant].finSegment)++(this.segment_courant);
	}
	else
	{	
		this.segment_courant=this.segments.length-1;
		this.coordsCourantes=this.coordsFin;
		this.aTermineDeplacementAvant=true;
	}
	this.aTermineDeplacementArriere=false;
}

function calculerDeplacementArriere()
{
 	if (this.segment_courant>=this.segments.length){this.segment_courant=this.segments.length-1;}
	else if (this.segment_courant>=0)
	{		
		var nouvPos = this.segments[this.segment_courant].deplacer(-1);
		this.coordsCourantes=nouvPos;
		if (this.segments[this.segment_courant].debutSegment)--(this.segment_courant);
	}
	else
	{
		this.segment_courant=0;
		this.coordsCourantes=this.coordsDebut;
		this.aTermineDeplacementArriere=true;
	}
	this.aTermineDeplacementAvant=false;	
}

function calculFinDeplacement(sens)
{
 return (sens>0)?this.aTermineDeplacementAvant:this.aTermineDeplacementArriere;
}

function deplacer(sens)	
{
	(sens > 0)?this.calculAvant():this.calculArriere();
	positionnerXY(this.nom,this.coordsCourantes.x,this.coordsCourantes.y);
}

// Definition d'un animation en deplacement
// premier param : nom de la var js 
// deuxieme parametre : pause en ms
// autres: les layers a animer
function AnimDeplacement()
{
	var args=AnimDeplacement.arguments;
	this.nom=args[0];
	this.delai=args[1];
	this.tableauLayers=	new Array(args.length -2);
	for (i=2;i<args.length;++i)
	{
		this.tableauLayers[i-2]=args[i];	
	}
	this.timeOut=0;
	this.loop=false;
	this.sens=1;
	this.changerSens=changerSensAnimDeplacement;
	this.choisirSens=positionnerSens;
	this.boucler=changerLooping;
	this.stopper=stopperDeplacement;
	this.reinitialiser=reinitAnim;
	this.lancer=sequenceDeplacement;
}

function reinitAnim()
{
	this.stopper();
	for (n=0;n<this.tableauLayers.length;++n){this.tableauLayers[n].reinit();}
}

function changerSensAnimDeplacement()
 {
	this.sens=-this.sens;
}

function positionnerSens(arg)
{
	(arg=='avant')?(this.sens=1):(this.sens=-1);
}

function changerLooping()
{
	this.loop=!this.loop;
}

// Arreter l'anim en cours
function stopperDeplacement()
{
	clearTimeout(this.timeOut);
}

// Fonction de base d'animation
function sequenceDeplacement()
{
	var sequence_terminee=true;
	for (i=0;i<this.tableauLayers.length;++i)
	{		
		var layer=this.tableauLayers[i];		
		if (!layer.aTermineDeplacement(this.sens))
		{
			layer.deplacer(this.sens);
		}
		sequence_terminee=sequence_terminee&&layer.aTermineDeplacement(this.sens);			
	}
	if (!sequence_terminee)
	{		
		this.timeOut=setTimeout(this.nom+'.lancer()',this.delai);   
	}
	else 
	{
		clearTimeout(this.timeOut);
		if (this.loop)	
		{		
			this.reinitialiser();
			this.lancer();
		}
	}
}
