/* 
Le paramétrage et le chargement de la fonction DF_ObjetDefilant se fait dans le second bloc javascript à la ligne :
addLoad_DF_ObjetDefilant(function(){DF_ObjetDefilant(id,larg_d,mode,sens,vit,pos,b_esp,pause)});

DETAIL DES PARAMETRES DE LA FONCTION DF_ObjetDefilant(id,larg_d,mode,sens,vit,pos,b_esp,pause)

Les deux premiers paramètres de la fonction DF_ObjetDefilant - id, et larg_d - doivent être obligatoirement renseignés (les autres paramètres possèdent des valeurs par défaut).

id = ID de l'objet défilant (et non pas du cadre).

larg_d = largeur de l'objet défilant en pixel. Peut être paramétré sur 'auto' uniquement pour faire défiler du texte avec des espaces insécables. Dans ce cas, ne pas insérer de retour ligne entre les balises d'ouverture et de fermeture de l'élément "div" de l'objet défilant et le texte.
Pour tous les autres cas de figure, l'indication de la bonne valeur en pixel est indispensable.

mode = 'b' pour boucle continue, 'r' pour aller-retour, ('b' par défaut)
sens = 'g' pour défilement de la droite vers la gauche, 'd' pour un défilement inverse. ('g' par défaut)

vit = vitesse de l'objet défilant entre 7 et environ 50 (ou plus si besoin). Les valeurs les plus petites sont les plus rapides. (20 par défaut)

pos = position initiale de départ en pourcentage par rapport à la largeur du cadre.
A noter que lorsque la largeur du cadre est supérieure à la largeur de l'objet défilant - et uniquement dans ce cas - la valeur 0 est utilisée pour calculer la position qui permet de caler la fin de l'objet défilant sur le bord du cadre afin qu'il soit visible en totalité avant le mouvement. (0 par défaut)

b_esp = espacement en pourcentage par rapport à la largeur du cadre entre deux boucles pour les boucles continues. N'a pas d'incidence pour le mode aller-retour. (0 par défaut)

pause = pause en millisecondes avant le départ de l'objet défilant. Ce paramètre est également pris en compte pour le retour dans le mode aller-retour. (0 par défaut)

Notes :

- Vous pouvez faire défiler plusieurs objets défilants dans une même page.
- Les paramètres exprimés en pourcentages - "pos" et "b_esp" - supportent les valeurs décimales avec le point comme séparateur.
- L'indication réelle de la largeur de l'objet défilant (passée en paramètre dans la fonction) est recommandé même si l'objet défilant ne contient qu'une image. En effet, en utilisant le paramètre 'auto', si l'image n'est pas totalement chargée dans la page lors de l'exécution du script, la largeur renvoyée sera erronée. Alternativement on pourrait vérifier par javascript le téléchargement complet de l'image, puis lancer la fonction DF_ObjetDefilant() à la suite de cette vérification.
- Eviter de paramétrer des styles directement sur le DIV de l'objet défilant et en particulier des paramètres de postionnement, de largeur ou de marges car il pourraient interférer avec la fonction ou être ignorés.
Les attributs pour formater votre objet défilant sont à renseigner dans les paramètres de la fonction pour ceux disponibles et dans le cadre CSS pour les autres. Vous pouvez aussi incorporer des styles à l'intérieur de l'objet défilant. Si vous rentrez des espacements (padding, margin, letter-spacing...) rentrez des valeurs en pixels et non en em.
- Pour compatibilité avec IE6 (et peut-être certains autres navigateurs) aucun id de votre page ne doit se nommer DF_ObjetParam
- Les risques de collision avec d'autres scripts sont très peu propables puisqu'ils sont limités aux noms des fonctions "DF_ObjetDefilant", "DF_ObjetNavigMous", "DF_ObjetSensInverse", "addLoad_DF_ObjetDefilant" et à celui de la variable globale "DF_ObjetParam".
- Fonction écrite en utilisant exclusivement les éléments du DOM. Compatible XHTML 1.1 et CSS 2.1
*/

/*DETAIL DES PARAMETRES DE LA FONCTION DF_ObjetDefilant(id,larg_d,mode,sens,vit,pos,b_esp,pause)*/
addLoad_DF_ObjetDefilant(function(){DF_ObjetDefilant('objetdefilant','981','b','g','20','981','0','0')});


function DF_ObjetDefilant(id,larg_d,mode,sens,vit,pos,b_esp,pause)
{
	
	this.DF_ObjetParam = typeof this.DF_ObjetParam == 'undefined' ? new Array() : this.DF_ObjetParam;	
	this.DF_ObjetParam[id] = typeof this.DF_ObjetParam[id] == 'undefined' ? new Array() : this.DF_ObjetParam[id];	
	
	if(typeof this.DF_ObjetParam[id]['id_defile'] == 'undefined') Set_param (id,larg_d,mode,sens,vit,pos,b_esp,pause);
	
	if (this.DF_ObjetParam[id]['largeur_def'] > 0 && this.DF_ObjetParam[id]['largeur_cadre'] > 0)
	{
		if (this.DF_ObjetParam[id]['mode'] == 'r') Boucle_ar(id); else Boucle_cont(id);
	 
		this.DF_ObjetParam[id]['Timer'] = setTimeout(function(){DF_ObjetDefilant(id)},this.DF_ObjetParam[id]['delaicrnt']);	
	}
	



	function Set_param (id,larg_d,mode,sens,vit,pos,b_esp,pause) 
	{
	
	var id_d = null;
	var id_c = null;
	
	if(!(id_d = document.getElementById(id)))  id_d = null; else if(!(id_c = document.getElementById(id_d.parentNode.id))) id_c = null;
	
	
	if(id_c != null && id_d != null && id_d.hasChildNodes())
	
		{
			id_c.style.position = "relative";
			
			id_c.style.overflow = "hidden";
					
	
			id_d.style.position = "absolute";
			
			id_d.width = "auto";
			
				
			this.DF_ObjetParam[id]['largeur_def'] = id_d.offsetWidth;
				
			var div_defile = id_d.cloneNode(true);	
			
			var nb_noeud = id_c.childNodes.length;
							
			for (var i = 0; i < nb_noeud ; i++) id_c.removeChild(id_c.firstChild);
			
			
			var largeur_cadre = document.createElement("div");
			
			id_c.appendChild(largeur_cadre);	
			
			this.DF_ObjetParam[id]['largeur_cadre'] = largeur_cadre.offsetWidth;
			
			id_c.removeChild(id_c.firstChild);
			
		
			id_c.appendChild(div_defile);
	
	
			this.DF_ObjetParam[id]['id_defile'] = 	document.getElementById(id);
			
		
			this.DF_ObjetParam[id]['largeur_def'] = larg_d == 'auto' ? this.DF_ObjetParam[id]['largeur_def'] : parseInt(larg_d);
			
			this.DF_ObjetParam[id]['id_defile'].style.width = this.DF_ObjetParam[id]['largeur_def']+'px';			
			
			this.DF_ObjetParam[id]['mode'] = typeof mode != 'undefined' && (mode == 'r' || mode == 'b') ? mode : 'b';
			
			this.DF_ObjetParam[id]['sens_ini'] = typeof sens != 'undefined' && (sens == 'g' || sens == 'd') ? sens : 'g';
			
			this.DF_ObjetParam[id]['vitesse'] = typeof vit != 'undefined' && parseInt(vit) > 0 ? parseInt(vit) : 20;
		
			this.DF_ObjetParam[id]['psinit'] = typeof pos != 'undefined' && parseFloat(pos) > 0 ? parseFloat(pos) : 0;
			
			this.DF_ObjetParam[id]['b_esp'] = typeof b_esp != 'undefined' && parseFloat(b_esp) > 0 ? parseFloat(b_esp) : 0;		
			
			this.DF_ObjetParam[id]['pause'] = typeof pause != 'undefined' && parseInt(pause) > 0 ? parseInt(pause) : 0;
			
			
		
			this.DF_ObjetParam[id]['b_esp'] = this.DF_ObjetParam[id]['b_esp'] < 0  || this.DF_ObjetParam[id]['b_esp'] > 100 ? 0 : Math.ceil(this.DF_ObjetParam[id]['b_esp'] * this.DF_ObjetParam[id]['largeur_cadre']/100);
			
		
			this.DF_ObjetParam[id]['psinit'] = this.DF_ObjetParam[id]['psinit'] == 100 || this.DF_ObjetParam[id]['psinit'] < 0 || this.DF_ObjetParam[id]['psinit'] > 100 ? this.DF_ObjetParam[id]['largeur_cadre'] : Math.ceil(this.DF_ObjetParam[id]['psinit']*this.DF_ObjetParam[id]['largeur_cadre']/100);		
			
			this.DF_ObjetParam[id]['psinit'] = (this.DF_ObjetParam[id]['largeur_cadre'] > this.DF_ObjetParam[id]['largeur_def'] &&  this.DF_ObjetParam[id]['psinit'] == 0 ) ? this.DF_ObjetParam[id]['largeur_cadre'] - this.DF_ObjetParam[id]['largeur_def'] : this.DF_ObjetParam[id]['psinit'];
			
			
			this.DF_ObjetParam[id]['pscrnt'] = this.DF_ObjetParam[id]['psinit'];
			
			this.DF_ObjetParam[id]['sens'] = 1;
		
		
			this.DF_ObjetParam[id]['p_retour'] = this.DF_ObjetParam[id]['largeur_def'] >= this.DF_ObjetParam[id]['largeur_cadre'] ? this.DF_ObjetParam[id]['largeur_def'] - this.DF_ObjetParam[id]['largeur_cadre'] : 0;
			
			
			this.DF_ObjetParam[id]['largeur_def'] += this.DF_ObjetParam[id]['b_esp'];						
									
		
			this.DF_ObjetParam[id]['p_retour'] = this.DF_ObjetParam[id]['mode'] == 'b' ? this.DF_ObjetParam[id]['largeur_def'] : this.DF_ObjetParam[id]['p_retour'];
			
		
			if (this.DF_ObjetParam[id]['mode'] == 'r' && this.DF_ObjetParam[id]['largeur_def'] == this.DF_ObjetParam[id]['largeur_cadre'] && this.DF_ObjetParam[id]['psinit'] == 0) this.DF_ObjetParam[id]['largeur_def'] = 0;
		
				
			if (this.DF_ObjetParam[id]['largeur_def'] > 0 && this.DF_ObjetParam[id]['mode'] == 'b') Ajout_clone(id);
			
			id_c.style.visibility = "visible";
			
		}
	}




	function Ajout_clone(id) 
	{	   	
	
			   var div_contenu = document.createElement("div");
		
			   var nb_noeud = this.DF_ObjetParam[id]['id_defile'].childNodes.length;
		 
			   for (var i = 0; i < nb_noeud ; i++) 
			   
				   {				   
					div_contenu.appendChild(this.DF_ObjetParam[id]['id_defile'].firstChild.cloneNode(true));
					this.DF_ObjetParam[id]['id_defile'].removeChild(this.DF_ObjetParam[id]['id_defile'].firstChild);
				   }
			   
			   
			   if (this.DF_ObjetParam[id]['b_esp'] > 0)
			   
				   {	   
					this.DF_ObjetParam[id]['sens_ini'] == 'g' ? div_contenu.style.marginRight = this.DF_ObjetParam[id]['b_esp']+'px' : div_contenu.style.marginLeft = this.DF_ObjetParam[id]['b_esp']+'px';   
				   }
						
			   div_contenu.style.display = "inline";
				   
			   this.DF_ObjetParam[id]['id_defile'].appendChild(div_contenu.cloneNode(true));
							
			   var nb_clone = Math.ceil(this.DF_ObjetParam[id]['largeur_cadre']/(this.DF_ObjetParam[id]['largeur_def'])); 	
				   
			   this.DF_ObjetParam[id]['id_defile'].style.width = ((nb_clone+1) * this.DF_ObjetParam[id]['largeur_def'])+'px';
			   
			   for (var j = 0; j < nb_clone ; j++)
			   
				   {	 
					this.DF_ObjetParam[id]['id_defile'].appendChild(this.DF_ObjetParam[id]['id_defile'].firstChild.cloneNode(true));    
				   }
	}




	function Boucle_cont(id)
	{
		this.DF_ObjetParam[id]['delaicrnt'] = this.DF_ObjetParam[id]['vitesse'];
		this.DF_ObjetParam[id]['inverse'] = 1;
	
	
		if(this.DF_ObjetParam[id]['pscrnt'] == - this.DF_ObjetParam[id]['p_retour'])
				
				{					
				this.DF_ObjetParam[id]['id_defile'].appendChild(this.DF_ObjetParam[id]['id_defile'].firstChild.cloneNode(true));  
				this.DF_ObjetParam[id]['id_defile'].removeChild(this.DF_ObjetParam[id]['id_defile'].firstChild); 
				 
				this.DF_ObjetParam[id]['inverse'] = -1;
					
				this.DF_ObjetParam[id]['pscrnt'] = 0;
				
				this.DF_ObjetParam[id]['sens'] = -1;		
				}
				
				else
				
				{
				if(this.DF_ObjetParam[id]['pscrnt'] == this.DF_ObjetParam[id]['psinit'])
		
					{
					this.DF_ObjetParam[id]['sens'] *= -1;
					this.DF_ObjetParam[id]['delaicrnt'] = this.DF_ObjetParam[id]['pause']; 
					}
				}
				
		
			 this.DF_ObjetParam[id]['sens_ini'] == 'g' ? this.DF_ObjetParam[id]['id_defile'].style.left = this.DF_ObjetParam[id]['pscrnt']+"px" : this.DF_ObjetParam[id]['id_defile'].style.right = this.DF_ObjetParam[id]['pscrnt']+"px" ;
			 
			this.DF_ObjetParam[id]['pscrnt'] += this.DF_ObjetParam[id]['sens']; 
	
	}
	
	
	
	
	function Boucle_ar (id) 
	{
		this.DF_ObjetParam[id]['delaicrnt'] = this.DF_ObjetParam[id]['vitesse'];
		this.DF_ObjetParam[id]['inverse'] = 1;
		
		if(this.DF_ObjetParam[id]['pscrnt']  == - this.DF_ObjetParam[id]['p_retour'] || this.DF_ObjetParam[id]['pscrnt'] == this.DF_ObjetParam[id]['psinit'])
			{
			this.DF_ObjetParam[id]['inverse'] = -1;
			this.DF_ObjetParam[id]['delaicrnt'] = this.DF_ObjetParam[id]['pause']; 
			this.DF_ObjetParam[id]['sens'] *= -1;
			} 
			
		this.DF_ObjetParam[id]['sens_ini'] == 'g' ? this.DF_ObjetParam[id]['id_defile'].style.left = this.DF_ObjetParam[id]['pscrnt']+"px" : this.DF_ObjetParam[id]['id_defile'].style.right = this.DF_ObjetParam[id]['pscrnt']+"px" ;
		
		this.DF_ObjetParam[id]['pscrnt'] += this.DF_ObjetParam[id]['sens']; 
	}

}




function DF_ObjetNavigMous(id,etat) 
{
	if(typeof this.DF_ObjetParam != 'undefined' && typeof this.DF_ObjetParam[id] != 'undefined' && this.DF_ObjetParam[id]['id_defile'] != null && typeof this.DF_ObjetParam[id]['Timer'] == 'number') 
		{
		clearTimeout(this.DF_ObjetParam[id]['Timer']);
		if (etat == 'out') DF_ObjetDefilant(id);
		}
}




function DF_ObjetSensInverse(id) 
{
if(typeof this.DF_ObjetParam != 'undefined' && typeof this.DF_ObjetParam[id] != 'undefined' && this.DF_ObjetParam[id]['id_defile'] != null && typeof this.DF_ObjetParam[id]['Timer'] == 'number' && this.DF_ObjetParam[id]['inverse'] == 1 && !(this.DF_ObjetParam[id]['pscrnt']  == - this.DF_ObjetParam[id]['p_retour'] || this.DF_ObjetParam[id]['pscrnt'] == this.DF_ObjetParam[id]['psinit'])) this.DF_ObjetParam[id]['sens'] *= -1;	
}




function addLoad_DF_ObjetDefilant(func) {

		if (window.addEventListener) { window.addEventListener("load", func, false); }
        else if (document.addEventListener) { document.addEventListener("load", func, false); }
        else if (window.attachEvent) { window.attachEvent("onload", func); }
}





