/*** ——————————————————————————————————————————————————————————————————————————————————————————————————————————— ***/
/*** ——————————————————————————————————————————————————————————————————————————————————————————————————————————— ***/
/***																											 ***/
/***						  			  DYNAMIC TOOLS	 Version 0.4.0										 	 ***/
/***					  				 Dernière Mise à Jour : 10-06-16										 ***/
/***																											 ***/
/*** ——————————————————————————————————————————————————————————————————————————————————————————————————————————— ***/
/***																											 ***/
/***												 Dynamique												 	 ***/
/***	Ce script contient les méthodes de créations d'objet et autre simulant un codage sous ActionScript et 	 ***/
/***	permettant de manipuler	dynamiquement des éléments.													 	 ***/
/***																											 ***/
/*** ——————————————————————————————————————————————————————————————————————————————————————————————————————————— ***/
/***									       cybORg version 0.05											 	 ***/
/***									        MIND version 0.2											 	 ***/
/*** ——————————————————————————————————————————————————————————————————————————————————————————————————————————— ***/
//
// © Ockam Razor — ockam.razor@gmail.com
// cybORg pakage — Since 21/11/2009
// MIND universe — Since 26/12/2009


///* —— LEGENDE —— */
//
// Tans qu'une méthode n'affirme pas être compatible pour un navigateur, c'est qu'elle n'a pas été testée sur ce dernier.
//
// Algo : Méthode de pure algorythme ne présentant aucun risque d'incompatibilité navigateur
// Perf : Méthodes compatible avec l'ensembles des navigateurs
//
// Comp. : Compatible avec le navigateur cité précédemment.
// no-Comp. : Incompatible avec le navigateur cité précédemment.
//
// FF : Firefox
// IE : Internet Explorer
// Ch : Chrome
// Sa : Safari
// Op : Opéra

// Ces légendes peuvent se trouver après le nom d'une méthode quand cela désigne cette méthode uniquement.
// Elles peuvent, également, se trouver sous la définition d'un ensemble de méthode. En ce cas cela concerne la totalité des méthodes de cet ensemble.



/* ———————————————————————————————————————————————————————————————————————————————————————— */
/*																							*/
/*										   VARIABLES										*/
/*		  				 Variables de gestion générale de MiscTools							*/
/*																							*/
/* ———————————————————————————————————————————————————————————————————————————————————————— */

// Objet de variables
var DynamicTools = new Object();

// Images par secondes ( Utilisés par la méthode onEnterFrame )
var IPS = 30;

// Simulation de Scène
var Stage = document.body;




/* ———————————————————————————————————————————————————————————————————————————————————————— */
/*																							*/
/*										  EVENEMENTS										*/
/*		  				 Méthodes pour créer et gérer des événements.						*/
/*																							*/
/* ———————————————————————————————————————————————————————————————————————————————————————— */

// —————— VARIABLES
// Variables de traitment des événements

// Objet de variables
var DynamicToolsEvents = new Object();

// Objet AddEvents
var AddEventsObject = new Object();

// Totalité des Events
AddEventsObject.Total = new Object();

// Liste des événements et de leur surnom
DynamicToolsEvents.Liste = { 
								ENTER_FRAME	:[ "ENTER_FRAME" ,	"EnterFrame" , 	"EF" , 		"Boucle" 		] ,
								MOUSE_DOWN	:[ "MOUSE_DOWN" ,	"MouseDown" ,	"MDown" ,	"Appuie" 		] ,
								MOUSE_UP	:[ "MOUSE_UP" ,		"MouseUp" ,		"MUp" ,		"Relache" 		] ,
								MOUSE_OVER	:[ "MOUSE_OVER" ,	"MouseOver" ,	"MOver" ,	"Survol" 		] ,
								MOUSE_OUT	:[ "MOUSE_OUT" ,	"MouseOut" ,	"MOut" ,	"Desurvol" 		] ,
								MOUSE_MOVE	:[ "MOUSE_MOVE" ,	"MouseMove" ,	"MMove" ,	"Deplacement" 	]
						   };
							
// Tableau des événements et de leur fonctionnement
DynamicToolsEvents.Events = {
								ENTER_FRAME:	{ Fonctionnement:"Boucle" , 	Fonction:"ENTER_FRAME" ,	Evenement:null 			} ,
								MOUSE_DOWN:		{ Fonctionnement:"Event" , 		Fonction:"MOUSE_DOWN" ,		Evenement:"onmousedown" } ,
								MOUSE_UP:		{ Fonctionnement:"Event" , 		Fonction:"MOUSE_UP" ,		Evenement:"onmouseup" 	} ,
								MOUSE_OVER:		{ Fonctionnement:"Event" , 		Fonction:"MOUSE_OVER" ,		Evenement:"onmouseover" } ,
								MOUSE_OUT:		{ Fonctionnement:"Event" , 		Fonction:"MOUSE_OUT" ,		Evenement:"onmouseout" 	} ,
								MOUSE_MOVE:		{ Fonctionnement:"Event" , 		Fonction:"MOUSE_MOVE" ,		Evenement:"onmousemove" }
							};
							
// Tableau des listes des noms standardisé pour les events
DynamicToolsEvents.Standards = [ 
									"onmousedown" ,
									"onmouseup" ,
									"onmouseover" ,
									"onmouseout" ,
									"onmousemove"
								];


// —————— ADD EVENTS
// Donne un événement à un élément
// NOTE : Si l'objet d'événement recelle le risque d'une boucle infinie par CloneObject, utiliser la variable "IDPrevention" sur cet objet ou un de ses parents.
//
// Beta : On doit pouvoir en ajouter plusieurs d'un coup
// Beta : La vérification du type de l'événement ne doit pas se faire en brut de fonction

function AddEvents( Cible ,		// ————> La cible de l'événement
					Evenement	// ————> Le ou les événements
				  ){
	
	// Si l'événement transmis ne porte pas un nom d'events standards ——>
	if( !IndexOf( DynamicToolsEvents.Standards , Evenement[ 1 ] , "Etat" ) ){
		
		// Si la cible n'a pas d'objet d'événements ——> Lui en donne un
		Cible.EventsObject = Cible.EventsObject || new Object();
		
		// Clone l'objet d'événement
		Evenement = CloneObject( Evenement , "IDPrevention" );
		
		// Recherche l'événement pour voir s'il existe ——>
		var Levier = false;
		//
		// Pour chaque événements de la liste ——>
		for( var iListe in DynamicToolsEvents.Liste ){
			
			// S'il possède l'événement nommé ——>
			if( IndexOf( DynamicToolsEvents.Liste[ iListe ] , Evenement[ 0 ] , "Etat" ) ){
				//
				// Récupère sa nommination absolue
				Evenement[ 0 ] = iListe;
				
				// Déverouille le levier
				Levier = true;
			}
		}
		
		// Si l'événement a été trouvé ——>
		if( Levier ){
			
			// Récupère ses infos d'événement
			var InfoEvent = CloneObject( DynamicToolsEvents.Events[ Evenement[ 0 ] ] );
			//
			// Donne à l'info-event un ID qui n'existe pas déjà
			var Levier = false;
			//
			while( !Levier ){
				//	
				InfoEvent.ID = GetEncryption();
				//
				Levier = ( AddEventsObject.Total[ InfoEvent.ID ] == null );
			}
			// 
			// Donne la liste à l'information d'événement
			InfoEvent.Cible = Cible;
			//
			// Le donne à l'événement ( En tans que dernière clée )
			Evenement.push( InfoEvent );
			
			// Selon le fonctionnement de l'événement ——>
			//
			// BOUCLE ——>
			if( InfoEvent.Fonctionnement == "Boucle" ){
				
				// Créait l'objet de cette boucle
				Cible.EventsObject[ Evenement[ 1 ] ] = Evenement;
				
				// Lance la boucle
				AddEnterFrame( Cible , Evenement[ 1 ] , AddEventsObject[ InfoEvent.Fonction ] , [ [ { target:Cible , data:Evenement , arguments:Evenement[ 3 ] } ] ] );
				
				// Intégre l'événement à la liste total des événements
				AddEventsObject.Total[ InfoEvent.ID ] = Evenement;
			}
			//
			// EVENT ——>
			if( InfoEvent.Fonctionnement == "Event" ){
				
				// Créait l'objet de cet event s'il n'existe pas déjà
				var ObjetEvent = Cible.EventsObject[ InfoEvent.Fonction ] = Cible.EventsObject[ InfoEvent.Fonction ] || new Object();
				
				// Donne à cet objet cette méthode
				Cible.EventsObject[ Evenement[ 1 ] ] = ObjetEvent[ Evenement[ 1 ] ] = Evenement;
				
				// Donne l'événement
				Cible[ InfoEvent.Evenement ] = AddEventsObject[ InfoEvent.Evenement ];
				
				// Intégre l'événement à la liste total des événements
				AddEventsObject.Total[ InfoEvent.ID ] = Evenement;
			}
			
		// Si l'événement n'a pas été trouvé ——> Trace l'erreur
		} else {
			//
			TraceErreur( "DynamicTools" , "AddEvents" , "L'événement «" + Evenement[ 0 ] + "» n'a pas été trouvé ou n'existe pas sur DynamicTools." );
		}
			
	// Si l'événement transmis porte un nom d'events standards ——> Trace l'erreur
	} else {
		//
		TraceErreur( "DynamicTools" , "AddEvents" , [ "Le nom «" + Evenement[ 1 ] + "» fait partie des standards. Vous ne devez pas l'utiliser." ,
													  "Il est recommandé de mettre un nom d'identifiant pour votre événement ne risquant pas de se retrouver ailleurs." ] );
	}
}


// —————— OUTILS DES EVENTS
// Les différentes fonctions outils concernant la gestion des événements

// ——— DESTRUCTION
// Sonde la présence d'un argument de destruction et évalue sa pérénité et effet le cas échéant
AddEventsObject.Destruction = function( Cible ,	// ————> La cible de l'événement
									    Data	// ————> Les données de l'événement
									   ){
	
	// S'il est auto-destructeur
	if( Data[ 3 ] ){
		//
		if( Data[ 3 ].Destruction != null ){
			//
			// S'auto-détruit suivant son compteur
			if( Data[ 3 ].Destruction == true ){
				//
				RemoveEvents( Cible , Data[ 1 ] );
				
			} else {
				//
				Data[ 3 ].Destruction--;
				//
				if( Data[ 3 ].Destruction <= 0 ){
					//
					RemoveEvents( Cible , Data[ 1 ] );
				}
			}
		}
	}
}


// —————— FONCTIONS DES EVENTS
// Les différentes fonctions suivant les types d'événement

// ——— ENTER FRAME
// Boucle simple, pas de vérification avant lancement de la fonction
AddEventsObject.ENTER_FRAME = function( event ){
	
	// Récupère la cible et les données
	var Cible = event.target;
	var Data = event.data;
	
	// Lance la fonction
	Launch( Data[ 2 ] , [ { target:Cible } ] );
}

// ——— MOUSE DOWN
// Appuie simple, pas de vérification avant lancement de la fonction
AddEventsObject.MOUSE_DOWN = function( event ){
	
	// Récupère la cible et les données
	var Cible = event.target;
	var Data = event.data;
	
	// Vérifie sa destruction
	AddEventsObject.Destruction( Cible , Data );
	
	// Lance la fonction
	Launch( Data[ 2 ] , [ { target:Cible } ] );
}

// ——— MOUSE UP
// Relachement simple, pas de vérification avant lancement de la fonction
AddEventsObject.MOUSE_UP = function( event ){
	
	// Récupère la cible et les données
	var Cible = event.target;
	var Data = event.data;
	
	// Vérifie sa destruction
	AddEventsObject.Destruction( Cible , Data );
	
	// Lance la fonction
	Launch( Data[ 2 ] , [ { target:Cible } ] );
}

// ——— MOUSE OVER
// Survol simple, pas de vérification avant lancement de la fonction
AddEventsObject.MOUSE_OVER = function( event ){
	
	// Récupère la cible et les données
	var Cible = event.target;
	var Data = event.data;
	
	// Vérifie sa destruction
	AddEventsObject.Destruction( Cible , Data );
	
	// Lance la fonction
	Launch( Data[ 2 ] , [ { target:Cible } ] );
}

// ——— MOUSE OUT
// Désurvol simple, pas de vérification avant lancement de la fonction
AddEventsObject.MOUSE_OUT = function( event ){
	
	// Récupère la cible et les données
	var Cible = event.target;
	var Data = event.data;
	
	// Vérifie sa destruction
	AddEventsObject.Destruction( Cible , Data );
	
	// Lance la fonction
	Launch( Data[ 2 ] , [ { target:Cible } ] );
}

// ——— MOUSE MOVE
// Désurvol simple, pas de vérification avant lancement de la fonction
AddEventsObject.MOUSE_MOVE = function( event ){
	
	// Récupère la cible et les données
	var Cible = event.target;
	var Data = event.data;
	
	// Vérifie sa destruction
	AddEventsObject.Destruction( Cible , Data );
	
	// Lance la fonction
	Launch( Data[ 2 ] , [ { target:Cible } ] );
}


// —————— RECEPTIONS DES EVENTS
// Les différentes fonctions de réceptions directs des événements

// ——— onMouseDown
// Appuie souris
AddEventsObject.onmousedown = function( event ){
	
	// Récupère la cible
	var Cible = event.target;
	
	// Vérification des fonctions rattachées ——>
	//
	// MOUSE DOWN ——>
	if( LengthObject( Cible.EventsObject.MOUSE_DOWN ) > 0 ){
		
		// Récupère et clone l'objet
		var ObjetTraitement = CloneObject( Cible.EventsObject.MOUSE_DOWN );
		
		// Pour chaque événements ——>
		for( var iEvent in ObjetTraitement ){
			
			// S'il n'est pas nulle ——>
			if( ObjetTraitement[ iEvent ] != null ){
				//
				// Lance l'événement
				AddEventsObject[ ObjetTraitement[ iEvent ][ 0 ] ]( { target:Cible , data:ObjetTraitement[ iEvent ] } );
			}
		}
	}
}

// ——— onMouseUp
// Relache souris
AddEventsObject.onmouseup = function( event ){
	
	// Récupère la cible
	var Cible = event.target;
	
	// Vérification des fonctions rattachées ——>
	//
	// MOUSE UP ——>
	if( LengthObject( Cible.EventsObject.MOUSE_UP ) > 0 ){
		
		// Récupère et clone l'objet
		var ObjetTraitement = CloneObject( Cible.EventsObject.MOUSE_UP );
		
		// Pour chaque événements ——>
		for( var iEvent in ObjetTraitement ){
			
			// S'il n'est pas nulle ——>
			if( ObjetTraitement[ iEvent ] != null ){
				//
				// Lance l'événement
				AddEventsObject[ ObjetTraitement[ iEvent ][ 0 ] ]( { target:Cible , data:ObjetTraitement[ iEvent ] } );
			}
		}
	}
}

// ——— onMouseOver
// Survol souris
AddEventsObject.onmouseover = function( event ){
	
	// Récupère la cible
	var Cible = event.target;
	
	// Vérification des fonctions rattachées ——>
	//
	// MOUSE OVER ——>
	if( LengthObject( Cible.EventsObject.MOUSE_OVER ) > 0 ){
		
		// Récupère et clone l'objet
		var ObjetTraitement = CloneObject( Cible.EventsObject.MOUSE_OVER );
		
		// Pour chaque événements ——>
		for( var iEvent in ObjetTraitement ){
			
			// S'il n'est pas nulle ——>
			if( ObjetTraitement[ iEvent ] != null ){
				//
				// Lance l'événement
				AddEventsObject[ ObjetTraitement[ iEvent ][ 0 ] ]( { target:Cible , data:ObjetTraitement[ iEvent ] } );
			}
		}
	}
}

// ——— onMouseOut
// Désurvol souris
AddEventsObject.onmouseout = function( event ){
	
	// Récupère la cible
	var Cible = event.target;
	
	// Vérification des fonctions rattachées ——>
	//
	// MOUSE OUT ——>
	if( LengthObject( Cible.EventsObject.MOUSE_OUT ) > 0 ){
		
		// Récupère et clone l'objet
		var ObjetTraitement = CloneObject( Cible.EventsObject.MOUSE_OUT );
		
		// Pour chaque événements ——>
		for( var iEvent in ObjetTraitement ){
			
			// S'il n'est pas nulle ——>
			if( ObjetTraitement[ iEvent ] != null ){
				//
				// Lance l'événement
				AddEventsObject[ ObjetTraitement[ iEvent ][ 0 ] ]( { target:Cible , data:ObjetTraitement[ iEvent ] } );
			}
		}
	}
}

// ——— onMouseMove
// Déplacement souris
AddEventsObject.onmousemove = function( event ){
	
	// Récupère la cible
	var Cible = event.target;
	
	// Vérification des fonctions rattachées ——>
	//
	// MOUSE MOVE ——>
	if( LengthObject( Cible.EventsObject.MOUSE_MOVE ) > 0 ){
		
		// Récupère et clone l'objet
		var ObjetTraitement = CloneObject( Cible.EventsObject.MOUSE_MOVE );
		
		// Pour chaque événements ——>
		for( var iEvent in ObjetTraitement ){
			
			// S'il n'est pas nulle ——>
			if( ObjetTraitement[ iEvent ] != null ){
				//
				// Lance l'événement
				AddEventsObject[ ObjetTraitement[ iEvent ][ 0 ] ]( { target:Cible , data:ObjetTraitement[ iEvent ] } );
			}
		}
	}
}
	

// —————— REMOVE EVENTS
// Supprime un événement à un élément
//
// Beta : On doit pouvoir en supprimer plusieurs d'un coup

function RemoveEvents( Cible ,		// ————> La cible de l'événement
					   Evenement	// ————> Le ou les événements
					 ){
	
	// Si la cible a un objet d'événements
	if( Cible.EventsObject ){
	
		// Si l'événement existe ——>
		if( Cible.EventsObject[ Evenement ] ){
		
			// Récupère l'InfoEvent
			var InfoEvent = LastArray( Cible.EventsObject[ Evenement ] );
			
			// Retire l'élément de la liste total des événements
			AddEventsObject.Total[ InfoEvent.ID ] = null;
			
			// Selon le type d'événement ——>
			//
			// BOUCLE ——>
			if( InfoEvent.Fonctionnement == "Boucle" ){
		
				// Supprime la boucle
				RemoveEnterFrame( Cible , Cible.EventsObject[ Evenement ][ 1 ] );
				
				// Supprime l'événement
				Cible.EventsObject[ Evenement ] = null;
			}
			//
			// EVENT ——>
			else if( InfoEvent.Fonctionnement == "Event" ){
				
				// Supprime l'événement
				Cible.EventsObject[ Evenement ] = Cible.EventsObject[ InfoEvent.Fonction ][ Evenement ] = null;
			}
			
		// Si la cible n'a pas cet événement ——> Trace l'erreur
		} else {
			//
			TraceErreur( "DynamicTools" , "RemoveEvents" , [ "L'événement " + Evenement + " n'a pas été trouvé sur " + Cible + "." ] );
		}
		
	// Si la cible n'a pas d'objet d'événements ——> Trace l'erreur
	} else {
		//
		TraceErreur( "DynamicTools" , "RemoveEvents" , [ "La Cible " + Cible + " n'a aucun événements." ] );
	}
}
	
	
// —————— REMOVE ALL EVENTS
// Supprime tout les événements ( Non vérouillés ) d'un élément

function RemoveAllEvents( Cible ,		// ————> La cible concernée
						  Verrouillage	// ————> Si on supprime également les événements verrouillés
						 ){
	
	// Si la cible a un objet d'événements
	if( Cible.EventsObject ){
	
		// Pour chaque événement de la cible ——>
		for( var iEvents in Cible.EventsObject ){
			
			// S'il ne s'agit pas d'un standards ——>
			if( DynamicToolsEvents.Events[ iEvents ] == null ){
				
				// Levier de vérification du verrouillage
				var Levier = true;
				//
				if( Cible.EventsObject[ iEvents ][ 3 ] ){
					//
					if( Cible.EventsObject[ iEvents ][ 3 ].Verrouillage ){
						//
						Levier = false;
					}
				}
				
				// S'il n'est pas verrouillé ou si le verrouillage ne change rien ——>
				if( Levier || Verrouillage ){
					
					// Supprime l'événement
					RemoveEvents( Cible , Cible.EventsObject[ iEvents ][ 1 ] );
				}
			}
		}
	}
}
	
	
// —————— REFRESH ALL EVENTS
// Supprime tout les événements ( Non vérouillés ) ayant été donné depuis le lancement de la page

function RefreshAllEvents(){
	
	// Pour chaque événements ——>
	for( var iEvents in AddEventsObject.Total ){
		
		// Récupère son Evenement et InfoEvent
		var Evenement = AddEventsObject.Total[ iEvents ];
		var InfoEvent = LastArray( Evenement );
		
		// Levier de vérification du verrouillage
		var Levier = true;
		//
		if( Evenement[ 3 ] ){
			//
			if( Evenement[ 3 ].Verrouillage ){
				//
				Levier = false;
			}
		}
		
		// S'il n'est pas verrouillé ——>
		if( Levier ){
			
			// Supprime l'événement
			RemoveEvents( InfoEvent.Cible , Evenement[ 1 ] );
		}
	}
}


// —————— ADD ENTER FRAME
//	Donne une boucle à un élément pour lancer une de ses fonctions constemment.

function AddEnterFrame( Cible , 	// ————> Cible ayant la boucle
					    Nom , 		// ————> Nom de la boucle
						Fonction , 	// ————> Fonction Launch
						Arguments ,	// ————> Arguments supplantés et additifs ( Un tableau de deux tableau, le premier pour les Sup et le second pour les Add )
						Cadence  	// ————> Cadence de la boucle ( En nombre de dixième de seconde )
					   ){
	
	// Arguments par défaut
	Cadence = Cadence || "IPS";
	Arguments = Arguments || [ null ];
	Arguments[ 1 ] = Arguments[ 1 ] || null;
	
	// Ajoute à la cible la fonction du nom de cette boucle
	//
	// Dans cette boucle :
	if( Cible != null ){
		
		// Lui donne la fonction de boucle
		Cible[ Nom + "Loop" ] = function(){
			
			// Lance la fonction rattachée à cette boucle
			Launch( Fonction , Arguments[ 0 ] , Arguments[ 1 ] );
			
			// Si la boucle existe toujours...
			if( Cible[ Nom + "Loop" ] != null ){
				
				// La Relance au bout d'un certain temps suivant la cadence prévue
				window.setTimeout( Cible[ Nom + "Loop" ] , ( ( Cadence == "IPS" ? IPS / 60 : Cadence ) * 100 ) );
			}
		}
	}
	
	// Lance la boucle une première fois
	Cible[ Nom + "Loop" ]();
}


// —————— REMOVE ENTER FRAME
// Détruit la boucle d'un élément.

function RemoveEnterFrame( Cible , 	// ————> Cible à retirer une boucle
						   Nom 		// ————> Nom de la boucle à retirer
						 ){
	
	// Mes cette boucle à null
	Cible[ Nom + "Loop" ] = null;
}





/* ———————————————————————————————————————————————————————————————————————————————————————— */
/*																							*/
/*										   ELEMENTS											*/
/*		  Méthodes pour créer dynamiquement des éléments et leur boucle de gestion.			*/
/*																							*/
/* ———————————————————————————————————————————————————————————————————————————————————————— */

// —————— VARIABLES
// Variables de gestion des éléments

// Objet des variables
DynamicToolsElements = new Object();
//
// variable de prévention
DynamicToolsElements.IDPrevention = "I_AM_DynamicToolsElements";

// Objet des types d'éléments
DynamicToolsElements.ListeTypes = { Clip:{			Boucle:{ Cible:DynamicToolsElements , Fonction:"StandardLoop" } ,
													Heritage:[ { Cible:DynamicToolsElements , Fonction:"ClipLoop" } ] ,
													Valeurs:{ x:1 , y:1 , z:1 , alpha:1 , width:100 , height:100 , color:"000000" , position:"absolute" , visible:true }	
										 } , 
									//
									Flash:{			Boucle:{ Cible:DynamicToolsElements , Fonction:"StandardLoop" } ,
													Heritage:[ { Cible:DynamicToolsElements , Fonction:"ClipLoop" } ,
															   { Cible:DynamicToolsElements , Fonction:"FlashLoop" } ] ,
													Valeurs:{ x:1 , y:1 , z:1 , alpha:1 , width:100 , height:100 , color:"transparent" , position:"absolute" , visible:true , 
													          link:"" , transparence:false }	
										 } , 
									//
									TextField:{		Boucle:null	} , 
									//
									TextBox:{		Boucle:null	}
								  };


// —————— NEW ELEMENT
// Créait un élément au choix selon son type et le calibre sur une méthode en boucle en relation avec son type

function NewElement( Type ,		// ————> Le type de l'élément
					 Cible ,	// ————> La cible de l'élément
					 Nom ,		// ————> Le nom de l'élément
					 Valeurs	// ————> Les valeurs par défauts de l'élément
					){
	
	// Convertie la Cible si besoin est
	if( Cible == window ){ Cible = document.body; }
	
	// Si son type existe ——>
	if( DynamicToolsElements.ListeTypes[ Type ] ){
		
		// Commence par créer une Div
		var NouvelElement = Cible[ Nom ] = NewDiv( Nom + "Div" , Cible , "" , {} );
		
		// Lui donne les valeurs inhérentes à son type s'il en a
		TakeAll( NouvelElement , DynamicToolsElements.ListeTypes[ Type ].Valeurs );
		//
		// Lui donne son héritage
		NouvelElement.legacy = DynamicToolsElements.ListeTypes[ Type ].Heritage;
		//
		// Lui donne son type et son nom
		NouvelElement.type = Type;
		NouvelElement.name = Nom;
		NouvelElement.parent = Cible;
		
		// Lui donne son trace
		NouvelElement.toString = function(){
			//
			return( "[object " + this.type + "]" );
		}
		
		// Lui donne ses valeurs additives
		TakeAll( NouvelElement , Valeurs );
		
		// S'il a une boucle ——> Lui donne cette boucle en événement
		if( DynamicToolsElements.ListeTypes[ Type ].Boucle ){
			//
			AddEvents( NouvelElement , [ "ENTER_FRAME" , "Boucle" + Type , DynamicToolsElements.ListeTypes[ Type ].Boucle , { Verrouillage:true } ] );
		}
		
		// Retourne l'élément
		return NouvelElement;
	
	// Si son type n'existe pas ——> Trace l'erreur
	} else {
		//
		var Sortie = new Array();
		//
		for( var iType in DynamicToolsElements.ListeTypes ){ Sortie.push( iType ); }
		//
		TraceErreur( "DynamicTools" , "NewElement" , [ "Le type \"" + Type + "\" n'existe pas." , "Les types d'éléments existants sont :" , Sortie.join( " , " ) ] );
	}
}


// —————— BOUCLE DES ELEMENTS
// Les différentes boucles suivant les types d'éléments

// ——— STANDARD LOOP
// Boucle standard avec lancement des intelligences en héritage
DynamicToolsElements.StandardLoop = function( event ){
	
	// Transfert à l'héritage
	FullLaunch( event.target.legacy , [ event ] );
}

// ——— CLIP LOOP
// Boucle d'un clip avec altération des états suivant les variables
DynamicToolsElements.ClipLoop = function( event ){
	
	// Essaye ——>
	try {
	
		// Récupère la cible
		var Cible = event.target;
		
		// Positionne s'il y a demande d'attache
		if( Cible.tie ){
			
			// Récupère les alignements
			var Alignement = Cible.tie.split( "" );
			//
			// Hauteur ——>
			switch( Alignement[ 0 ] ){
				//
				case "T" : 
					Cible.y = 0;
					break;
				//
				case "B" : 
					Cible.y = GetScreenScale().height - Cible.height;
					break;
				//
				case "C" : 
					Cible.y = GetScreenScale().height / 2 - Cible.height / 2;
					break;
			}
			//
			//
			// Largeur ——>
			switch( Alignement[ 1 ] ){
				//
				case "L" : 
					Cible.x = 0;
					break;
				//
				case "R" : 
					Cible.x = GetScreenScale().width - Cible.width;
					break;
				//
				case "C" : 
					Cible.x = GetScreenScale().width / 2 - Cible.width / 2;
					break;
			}
		}
		
		// Taille Ecran s'il y a demande
		if( Cible.screenWidth || Cible.screenSize ){
			//
			Cible.width = GetScreenScale().width;
		}
		//
		if( Cible.screenHeight || Cible.screenSize ){
			//
			Cible.height = GetScreenScale().height;
		}
		
		// Normalise ses états
		if( !Cible.x ){ Cible.x = 1; }
		if( !Cible.y ){ Cible.y = 1; }
		
		// Applique ses états
		ApplyStyle( Cible , 
					//
				 { left:Cible.x ,
				   top:Cible.y ,
				   zIndex:String( Cible.z ) ,
				   //
				   width:Cible.width ,
				   height:Cible.height ,
				   //
				   alpha:BumpNumber( Cible.alpha , 0.1 , 1 ) ,
				   //
				   backgroundColor:Cible.color == 0 ? "000000" : Cible.color ,
				   //
				   position:Cible.position ,
				   //
				   display:( Fusion( Cible.visible , ( Cible.alpha >= 0.1 ) ) ) ? "block" : "none" ,
				   //
				   cursor:( Cible.buttonMode )	? "pointer" : 
						  ( Cible.grabMode ) 	? "move" :
						  null
				  } );
			//
	} catch( e ){}
}

// ——— FLASH LOOP
// Boucle d'un flash avec création et altération des états du flash
DynamicToolsElements.FlashLoop = function( event ){
	
	// Essaye ——>
	try {
		
		// Récupère la cible
		var Cible = event.target;
		
		// Si elle a un lien sans flash ——>
		if( Cible.link != "" && !Cible.flash ){
			
			// Intégre le flash
			Cible.flash = IncrustationFlash( Cible.link , Cible , Cible.width , Cible.height , "Flash" , Cible.transparent );
		}
		
		// Si elle a un flash ——>
		if( Cible.flash ){
			
			// Applique ses états au flash
			ApplyStyle( Cible.flash , 
						//
					  { width:Cible.width ,
						height:Cible.height ,
					  } );
		}
		//
	} catch( e ){}
}


// —————— DESTROY ELEMENT
// Détruit un élément en le nettoyant complétement

function DestroyElement( Element ){
	
	// Si l'élément existe ——>
	if( Element ){
		
		// Nettoie ses événements y compris l'héritage
		RemoveAllEvents( Element , true );
		
		// Si l'élément existe sur son parent ——>
		if( Element.parent[ Element.name ] ){
			
			// Retire l'élément du parent
			Element.parent[ Element.name ] = null;
		
			// Retire l'élément de la scène
			Element.parent.removeChild( Element );
		
		// Si l'élément n'existe pas sur son parent ——> Trace l'erreur
		} else {
			//
			TraceErreur( "DynamicTools" , "DestroyElement" , [ "L'élément " + Element + " portant le name : «" + Element.name + "» est introuvable sur son parent : " + Element.parent ,
															   "Cette erreur peut se produire si vous essayez de détruire un élément n'ayant pas été créé par NewElement()." ] );
		}
		
	
	// Si l'élément n'existe pas ——> Trace l'erreur
	} else {
		//
		TraceErreur( "DynamicTools" , "DestroyElement" , "L'élément à détruire n'existe pas" );
	}
}























/////////////////////////////////////////// ARCHAIQUE //////////////////////////////////////////////////////


/* ———————————————————————————————————————————————————————————————————————————————————————— */
/*																							*/
/*										     CLIP											*/
/*		  			Gestion des clips, à savoir des Div personnalisées.						*/
/*																							*/
/* ———————————————————————————————————————————————————————————————————————————————————————— */

// —————— CREATION CLIP
// Créé et positionne une balise Div prévue pour être conçue comme un clip.

function creationClip( XX , 		// ————> Positionnement X Initial
					   YY , 		// ————> Positionnement Y Initial
					   Width ,		// ————> Largeur Initial
					   Height , 	// ————> Hauteur Initial
					   GizmoX ,		// ————> Point Gizmo X
					   GizmoY , 	// ————> Point Gizmo Y
					   ID ,			// ————> ID du clip
					   cible ,  	// ————> Cible où placer l'élément
					   Parametres	// ————> Parametres Additionnels
					  ){
	
	// Argument par défaut
	XX = XX || 0;
	YY = YY || 0;
	//
	Parametres = Parametres || {};
	ZZ = Parametres.z || 0;
	Style = Parametres.Style || [];
	Fonctions = Parametres.Fonctions || [];
	
	GizmoX = GizmoX || Width / 2;
	GizmoY = GizmoY || Height / 2;
	
	cible = cible || document.body;
	
	// Créé et affiche la DIV
	var clip = creationDiv( ( XX + ( GizmoX * -1 ) ) , 
							( YY + ( GizmoY * -1 ) ) , 
							"",
							Style ,
							Fonctions ,
							ID ,
							ZZ ,
							cible 
						   );
	
	
	// Calibre la taille du Clip
	clip.style.height = Height + "px";
	clip.style.width = Width + "px";
	
	// Donne au clip ses valeurs
	clip.name = ID;
	//
	clip.X = XX;
	clip.Y = YY;
	clip.Width = Width;
	clip.Heigth = Height;
	clip.GizmoX = GizmoX;
	clip.GizmoY = GizmoY;
	
	// Donne au clip son ID
	if( ID ){ clip.id = ID; }
	
	// Calibre un contenu vide du clip
	clip.innerHTML = "";
	
	// Retourne le lien du clip
	return clip;
}


// —————— DEPLACE CLIP
// Déplace un Clip sur un point X / Y selon son Gizmo.

function deplaceClip( Clip , 	// ————> Clip à déplacer
					  X , 		// ————> Position à atteindre en X
					  Y 		// ————> Position à atteindre en Y
					 ){
	
	// Transforme en Clip si c'est un ID
	if( typeof( Clip ) == "string" ){ Clip = $( Clip ); }
	
	// Positionnement X
	Clip.style.left = ( X - ( Clip.GizmoX || 0 ) ) + "px";
	
	// Positionnement Y
	Clip.style.top = ( Y - ( Clip.GizmoY || 0 ) ) + "px";
}


// —————— ALPHA CLIP
//	Modifie l'Alpha d'un Clip.
//
// Optimisé pour IE.

function AlphaClip( Clip , 	// ————> Clip à modifier
					Alpha 	// ————> Alpha à avoir
					 ){
	
	// Argument par défaut
	Alpha = Alpha || 100;
	
	// Place son argument rapellant la valeur de son alpha
	Clip._alpha = String( ( Alpha / 100 ) );
	
	// Si on est sur un bon Navigateur ————>
	if( navigator.appName != "Microsoft Internet Explorer" ){
		
		// Modification de l'opacité par l'opacité des styles et renvoie Vrai
		Clip.style.opacity = String( ( Alpha / 100 ) );
		return true;
		
	
	// Si on est... sur IE
	} else {
		
		// Modification de l'opacité par les filtres et renvoie Vrai
		Clip.style.filter = ( 'alpha(opacity=' + Alpha + ')' );
		return true;
	
	}
}


// —————— ATTACHE IMAGE
//	Attache une image à une balise ou un "clip".

function attacheImage( lien , 	// ————> Lien de l'image
					   cible	// ————> Cible où placer l'image
					 ){
	
	// Argument par défaut
	cible = cible || document.body;
	
	// Créé et affiche l'image
	var image = document.createElement( 'img' );
	image.setAttribute( "src" , lien );
	cible.appendChild( image );
	
	// Retourne l'image
	return image;
}


// —————— DESTROY DIV
//	Détruit un élément div.

function DestroyDiv(  ID ,		// ————> ID de l'élément
					  Cible		// ————> Cible de l'élément
					 ){
	
	// S'il existe ————>
	try{
		
		// L'écrase
		( Cible || document.body ).removeChild( $( ID ) );
	
	// Si le lien par son parent échoue ————>
	} catch( err ){
		
		// Passe directement par son parent direct pour le détruire
		try{ $( ID ).parentNode.removeChild( $( ID ) );
		} catch( err ){}
	}
}


/* ———————————————————————————————————————————————————————————————————————————————————————— */
/*																							*/
/*										  EVENEMENTS										*/
/*		  			  Gestion des événements placé sur des clip ou div.						*/
/*																							*/
/* ———————————————————————————————————————————————————————————————————————————————————————— */

// —————— ADD ENTER FRAME
//	Donne une boucle à un élément pour lancer une de ses fonctions constemment.

function addEnterFrame( Cible , 	// ————> Cible ayant la boucle
					    Nom , 		// ————> Nom de la boucle
						Fonction , 	// ————> Nom de la fonction à lancer sur la cible
						Cadence 	// ————> Cadence de la boucle (En nombre de dixième de seconde)
					   ){
	
	// Arguments par défaut
	Cadence = Cadence || 1;
	
	// Ajoute à la cible la fonction du nom de cette boucle
	//
	// Dans cette boucle :
	if( Cible != null ){
		
		Cible[ Nom ] = function(){
			
			// Lance la fonction rattaché à cette boucle au sein de la cible
			Cible[ Fonction ]();
		
			// Si la boucle éxiste toujours...
			if( Cible[ Nom ] != null ){
				
				// La Relance au bout d'un certain temps suivant la cadence prévue
				window.setTimeout( Cible[ Nom ] , ( Cadence * 100 ) );
			}
		}
	}
	
	// Lance la boucle une première fois
	Cible[ Nom ]();
}


// —————— REMOVE ENTER FRAME
// Détruit la boucle d'un élément.

function removeEnterFrame( Cible , 	// ————> Cible à retirer une boucle
						   Nom 		// ————> Nom de la boucle à retirer
						 ){
	
	// Mes cette boucle à null
	Cible[ Nom ] = null;
}



/* ———————————————————————————————————————————————————————————————————————————————————————— */
/*																							*/
/*										     CHAMP											*/
/*		  			Gestion des champs divers tel les champ de textes.						*/
/*																							*/
/* ———————————————————————————————————————————————————————————————————————————————————————— */

// —————— CHAMP AUTO SIZE
// Créé et place un champ de saisie qui	s'agrandie automatiquement suivant ce que l'on met dedans.
//
// Optimisé pour IE7.

function ChampAutoSize( Racine , 		// ————> Racine où placer les variables et le Champ de saisie
					    Nom , 			// ————> Nom du Champ de Saisie
						Parametres , 	// ————> Parametres du Champ de Saisie ( x , y , Cible , Largeur , Bump )
						Style ,			// ————> Style du Champ de Saisie
						Ajout ,			// ————> Parametres additionnels au Champ de Saisie
						Contenu			// ————> Contenu du formulaire
					   ){
	
	// Définie la Taille du Formulaire en largeur en convertissant les pixels en valeurs de caractère exploitable pour
	// la conception du Champ de saisie
	var tailleFormulaire = ( ( ( Parametres.Largeur || 100 ) / 50 ) - 1 ) * 10 + 1;
	
	// Argument par défaut
	var bumpCaractere = Parametres.Bump || 0;
	var Contenu = Contenu || "";
	
	// Variable additionnel initiée
	var additionnel = "";
	
	
	// S'il y a des Parametres additionnels ————>
	if( Ajout != null ){
		
		// Ajoute chacun de ces paramètres à la variables additionnels séparés d'espaces
		for( var i = 0 ; i < Ajout.length ; i++ ){	additionnel += " " + Ajout[ i ];  }
	}
	
	
	// Détruit tout formulaire portant le même nom
	if( $( "Nom" ) != null ){
		DestroyChamp( Racine , 
				  Nom , 
				  Parametres.Cible  
				);
	}
	
	
	// Créait la Balise Div qui contiendra le Champ de Saisie
	Racine[ "Div" + Nom ] = creationDiv( Parametres.x , 
										 Parametres.y , 
										 null ,
										 null ,
										 null ,
										 ( "Div" + Nom ) ,
										 Parametres.z ,
										 Parametres.Cible 
									   );
	
	
	// Donne à la balise Div le champ de saisie avec son ID, son Contenu et ses Valeurs additionnels
	Racine[ "Div" + Nom ].innerHTML = '<textarea id="' + Nom + '"' + additionnel + '>' + Contenu + '</textarea>';
	
	// Définie la largeur du Champ
	$( Nom ).style.width = Parametres.Largeur + "px";
	
	// Mes le fond transparent
	$( Nom ).style.backgroundColor = 'transparent';
	
	// Mes la Scroll Barre en automatique pour qu'elle soit généralement invisible (Surtout pour IE où elle est visible par essence)
	$( Nom ).style.overflow = "auto";
	
	
	// Si on a définie des styles ————>
	if( Style != null ){
		
		// Définie le style du Champ de Saisie (En prenant soin d'enlever les « ' » pour éviter que ça plante)
		for( var i = 0 ; i < Style.length ; i++ ){
			$( Nom ).style[ Style[ i ].split( " = " )[ 0 ] ] = ConversionCaractere( Style[ i ].split( " = " )[ 1 ] , [ "'" ] , [ "" ] ); 
		}
	}


	// Donne au Champ de Saisie sa Fonction Bouclant
	$( Nom ).AutoSize = function(){
		
		// Définie le Nombre de Ligne à 1
		var nbrLigne = 1;
		
		// Pour chaque Retour Charriot auquel on a procédé ————>
		for( var i = 0 ; i < ( escape( this.value ).split( "%0A" ) ).length ; i++ ){
			
			// Compte le nombre de caractère de cette ligne (Après avoir retiré les caractère de conversion évidemment)
			var caracteresLigne = ( unescape( escape( this.value ).split( "%0A" )[ i ] ).split( "" ) ).length;
			
			// Ajoute au Nombre de ligne le rapport entre la Largeur du champ en caractère, le nobmre de caractère dans cette ligne et le bump
			nbrLigne += Math.floor( caracteresLigne / ( tailleFormulaire + bumpCaractere ) );
			
			// Ajoute une ligne par rapport au Retour Charriot même
			nbrLigne++;
		}
		
		// Modifie la largeur du Champt suivant le Nombre de Ligne obtenu
		this.rows = nbrLigne;
	}
	
	
	// Fait boucler la fonction d'AutoSize du Champ de Saisie
	addEnterFrame( $( Nom ) , 
				   "Boucle" , 
				   "AutoSize" , 
				   1 
				 );
}


// —————— DESTROY CHAMP
//	Détruit un élément champ.

function DestroyChamp( Racine , // ————> Racine de l'élément
					  Nom ,		// ————> Nom de l'élément
					  Cible		// ————> Cible de l'élément
					 ){
	
	// S'il existe ————>
	try{
		// L'écrase
		( Cible || document.body ).removeChild( Racine[ "Div" + Nom ] );
		
	} catch( err ){
		
		// Passe directement par son parent direct pour le détruire
		try{ $( "Div" + Nom ).parentNode.removeChild( $( "Div" + Nom ) );
		} catch( err ){}
	}
}



/* ———————————————————————————————————————————————————————————————————————————————————————— */
/*																							*/
/*										    ENSEMBLE										*/
/*		  		   Gestion des éléments issue d'ensemble des autres méthodes.				*/
/*																							*/
/* ———————————————————————————————————————————————————————————————————————————————————————— */

// —————— CREATION INFO BULLE
// Créé une info-bulle restant en permanance positionnée par rapport à la souris et
// qui apparaît/disparaît et a son contenu	se modifiant suivant ses appels	d'apparition.
//
// Optimisée pour IE7 et Safari.

function CreationInfoBulle(	Nom ,			// ————> Nom de l'Info-Bulle
						    Parametres ,	// ————> Parametres de l'Info-Bulle
							Style ,			// ————> Style de l'Info-Bulle
							Cible			// ————> Cible de l'Info-Bulle
						   ){
	
	// Arguments par défaut
	Cible = Cible || document.body;
	//
	var Largeur = Parametres.Largeur || 300;
	var Hauteur = Parametres.Hauteur || 150;
	var DecalageX = Parametres.DecalageX || -10;
	var DecalageY = Parametres.DecalageY || -10;
	//
	Style = Style || [];
	//
	var Fluidite = Parametres.Fluidite || 50;
	
	
	// Création du clip servant pour l'Info-Bulle
	Cible[ Nom ] = creationClip( 0 , 
							     0 , 
							     Largeur ,
							     Hauteur ,
							     DecalageX ,
							     DecalageY , 
							     Nom ,
								 null ,
								 { Style:Style }
							    )  
	
	// Place en Z
	Cible[ Nom ].style.zIndex = '1000000';
	
	
	// Paramètres par défaut de l'Info-Bulle
	Cible[ Nom ].Vitesse = Parametres.Vitesse || 10;
	Cible[ Nom ].AlphaMax = Parametres.AlphaMax || 100;
	//
	Cible[ Nom ].ContenuDebut = Parametres.ContenuDebut || "";
	Cible[ Nom ].ContenuFin = Parametres.ContenuFin || "";
	//
	Cible[ Nom ].Largeur = Largeur;
	Cible[ Nom ].Hauteur = Hauteur;
	//
	Cible[ Nom ].Alpha = 0;			// ——> Alpha à atteindre
	Cible[ Nom ].AlphaActuel = 0;	// ——> Alpha en cour
	//
	Cible[ Nom ].actif = true;
	
	
	/***************** Fonction de Positionnement Souris et Modification Alpha *****************/
	//
	Cible[ Nom ].StayMousePosition = function(){
		
		if( this.actif ){
			
			// Si son Alpha est inférieur ou égal à 0 et qu'il est encore visible en display, mes en display invisible (Opacity bug à 0)
			if( this.AlphaActuel <= 0 && getStyle( this.name , "display" ) == "block" ){ this.style.display = "none"; }
			
			// Si son Alpha est supérieur ou égal à 1 et qu'il est encore invisible en display, mes en display visible
			else if( this.AlphaActuel >= 1 && getStyle( this.name , "display" ) == "none" ){ this.style.display = "block"; } 
			
			// Sinon ————>
			else {
			
				// Si son Alpha actuel est inférieur à son Alpha à atteindre ————>
				if( this.AlphaActuel < this.Alpha ){ 
					
					// Son Alpha actuel augmente par rapport à la vitesse
					this.AlphaActuel += this.Vitesse;
					
					// S'il a dépassé l'alpha à atteindre, il se bloque sur la valeur de l'Alpha à atteindre
					if( this.AlphaActuel > this.Alpha ){ this.AlphaActuel = this.Alpha; }; 
					
					// Applique l'Alpha du Clip
					AlphaClip( this , this.AlphaActuel );
					
					
				// Si son Alpha actuel est supérieur à son Alpha à atteindre ————>
				} else if( this.AlphaActuel > this.Alpha ){ 
					
					// Son Alpha actuel réduit par rapport à la vitesse
					this.AlphaActuel -= this.Vitesse;
					
					// S'il a dépassé l'alpha à atteindre, il se bloque sur la valeur de l'Alpha à atteindre
					if( this.AlphaActuel < this.Alpha ){ this.AlphaActuel = this.Alpha; }
					
					// S'il est toujours supérieur à 0, il applique l'Alpha du clip (Je le redis, opacity bug a 0!!!)
					if( this.AlphaActuel > 0 ){ AlphaClip( this , this.AlphaActuel ); }
				}
			}
			
			
			////// PLACEMENT DE LA BULLE
			//
			// Pour un BON navigateur ————>
			if( window.innerWidth ){
				
				
				//******\\ FIREFOX //******\\
				if( navigator.appName != "Netscape" ){
					
					// Si on est proche du bord droit de la scène ————>
					if( MouseX + this.GizmoX + this.Largeur > window.innerWidth - 50 + document.documentElement.scrollLeft ){ 
						
						// Effet miroir horizontal sur la bulle
						this.style.left = ( ( MouseX - this.GizmoX ) - ( this.Largeur - this.GizmoX * 2 ) ) + "px"; 
						
					// Sinon ————>
					} else {
						
						// Place en X par rapport à son Gizmo et à la souris
						this.style.left = ( MouseX - this.GizmoX ) + "px";
					}
						
						
					// Si on est proche du bord bas de la scène ————>
					if( MouseY + this.GizmoY + this.Hauteur > window.innerHeight - 50 + document.documentElement.scrollTop ){ 
						
						// Effet miroir vertical sur la bulle
						this.style.top = ( ( MouseY - this.GizmoY ) - ( this.Hauteur - this.GizmoY * 2 ) ) + "px"; 
					
					// Sinon ————>
					} else {
						
						// Place en Y par rapport à son Gizmo et à la souris
						this.style.top = ( MouseY - this.GizmoY ) + "px";
					}
				
				
				//******\\ SAFARI //******\\
				} else {
						
					// Si on est proche du bord droit de la scène ————>
					if( MouseX + this.GizmoX + this.Largeur > window.innerWidth - 50 + document.body.scrollLeft ){ 
						
						// Effet miroir horizontal sur la bulle
						this.style.left = ( ( MouseX - this.GizmoX ) - ( this.Largeur - this.GizmoX * 2 ) ) + "px"; 
						
					// Sinon ————>
					} else {
						
						// Place en X par rapport à son Gizmo et à la souris
						this.style.left = ( MouseX - this.GizmoX ) + "px";
					}
						
						
					// Si on est proche du bord bas de la scène ————>
					if( MouseY + this.GizmoY + this.Hauteur > window.innerHeight - 50 + document.body.scrollTop ){ 
						
						// Effet miroir vertical sur la bulle
						this.style.top = ( ( MouseY - this.GizmoY ) - ( this.Hauteur - this.GizmoY * 2 ) ) + "px"; 
					
					// Sinon ————>
					} else {
						
						// Place en Y par rapport à son Gizmo et à la souris
						this.style.top = ( MouseY - this.GizmoY ) + "px";
					}
				}
				
				
				
			// Pour IE...  ————>
			} else if( document.documentElement.clientWidth ) {
				
				
				// Si on est proche du bord droit de la scène ————>
				if( MouseX + this.GizmoX + this.Largeur > document.documentElement.clientWidth - 50 + document.documentElement.scrollLeft ){
					
					// Effet miroir horizontal sur la bulle
					this.style.left = ( ( MouseX - this.GizmoX ) - ( this.Largeur - this.GizmoX * 2 ) ) + "px"; 
					
				// Sinon ————>
				} else {
					
					// Place en X par rapport à son Gizmo et à la souris
					this.style.left = ( MouseX - this.GizmoX ) + "px";
				}
				
				
				// Si on est proche du bord bas de la scène ————>
				if( MouseY + this.GizmoY + this.Hauteur > document.documentElement.clientHeight - 50 + document.documentElement.scrollTop ){
					
					// Effet miroir vertical sur la bulle
					this.style.top = ( ( MouseY - this.GizmoY ) - ( this.Hauteur - this.GizmoY * 2 ) ) + "px"; 
					
				// Sinon ————>
				} else {
					
					// Place en Y par rapport à son Gizmo et à la souris
					this.style.top = ( MouseY - this.GizmoY ) + "px";
				}
			}
			
		} else {
			
			this.style.display = "none";
		}
	}
	
	
	/***************** Donne la Fonction affichant l'Info-Bulle *****************/
	//
	Cible[ Nom ].bulle = function( etat ){ 
											// Affiche du contenu à mettre encapsulé entre le Contenu de Début et le Contenu de Fin
											this.innerHTML = this.ContenuDebut + etat + this.ContenuFin; 
											
											// Donne son Alpha à atteindre à son Alpha Max
											this.Alpha = this.AlphaMax; 
										 }
	
	
	/***************** Donne la Fonction voilant l'Info-Bulle *****************/
	//
	Cible[ Nom ].debulle = function( etat ){
												// Donne son Alpha à atteindre à 0
												this.Alpha = 0; 
											}
	
	
	
	/***************** Donne sa boucle pour le déplacement sur la souris et l'Alpha *****************/
	//
	addEnterFrame( Cible[ Nom ] , 
				   "Boucle" , 
				   "StayMousePosition" , 
				   ( Fluidite / 100 ) 
				 );
}


// —————— CREATION FENETRE
// Créé une fenêtre déplaçable dans la page.
//
// Optimisé pour IE7 et Safari

function CreationFenetre( Groupe ,			// ————> Nom du groupe de fenêtre auquel il appartient
						  Nom , 			// ————> Nom d'instance de la fenêtre
						  NomApparant ,		// ————> Titre de la fenêtre
						  Contenue ,		// ————> Contenue de la fenêtre
						  X , 				// ————> Position initial en X de la fenêtre
						  Y , 				// ————> Position initial en Y de la fenêtre
						  Z ,				// ————> Position initial en Z de la fenêtre
						  W , 				// ————> Largeur initial de la fenêtre
						  H ,				// ————> Hauteur initial de la fenêtre
						  Cible ,			// ————> Cible de la fenêtre
						  Parametres		// ————> Parametres additifs
						  ){
	
	// Arguments par défaut
	Cible = Cible || document.body;
	//
	Parametres = Parametres || Object();
	//
	Parametres.HauteurBarre = ( Parametres.HauteurBarre != null ) ? Parametres.HauteurBarre : 20;
	Parametres.LargeurBarre = ( Parametres.LargeurBarre != null ) ? Parametres.LargeurBarre : W;
	Parametres.DecalageBarreX = ( Parametres.DecalageBarreX != null ) ? Parametres.DecalageBarreX : 0;
	Parametres.DecalageBarreY = ( Parametres.DecalageBarreY != null ) ? Parametres.DecalageBarreY : -20;
	Parametres.LargeurBouton = ( Parametres.LargeurBouton != null ) ? Parametres.LargeurBouton : 20;
	Parametres.HauteurBouton = ( Parametres.HauteurBouton != null ) ? Parametres.HauteurBouton : 20;
	Parametres.DecalageBoutonX = ( Parametres.DecalageBoutonX != null ) ? Parametres.DecalageBoutonX : 0;
	Parametres.DecalageBoutonY = ( Parametres.DecalageBoutonY != null ) ? Parametres.DecalageBoutonY : 0;
	Parametres.DecalageContenuX = ( Parametres.DecalageContenuX != null ) ? Parametres.DecalageContenuX : 0;
	Parametres.DecalageContenuY = ( Parametres.DecalageContenuY != null ) ? Parametres.DecalageContenuY : Parametres.DecalageBarre;
	//
	if( Parametres.BoutonX == null ){ Parametres.BoutonX = true; }
	if( Parametres.Bouton_ == null ){ Parametres.Bouton_ = true; }
	//
	Parametres.StyleFenetre = Parametres.StyleFenetre || [ "backgroundColor='#00FFCC'" ];
	Parametres.StyleBarre = Parametres.StyleBarre || [ "backgroundColor='#FFFFCC'" ];
	Parametres.StyleContenu = Parametres.StyleContenu || [ "width='" + W + "px'" ];
	Parametres.StyleX = Parametres.StyleX || [ "backgroundColor='#FF0000'" , "textAlign='center'" ];
	Parametres.StyleXRoll = Parametres.StyleXRoll || [ "backgroundColor='#FFAAAA'" ];
	Parametres.Style_ = Parametres.Style_ || [ "backgroundColor='#00FF00'" , "textAlign='center'" ];
	Parametres.Style_Roll = Parametres.Style_Roll || [ "backgroundColor='#AAFFAA'" ];
	//
	Parametres.StyleX = Fusion( Parametres.StyleX , [ "width='" + Parametres.LargeurBouton + "px'" , "height='" + Parametres.HauteurBouton + "px'" ]  );
	Parametres.Style_ = Fusion( Parametres.Style_ , [ "width='" + Parametres.LargeurBouton + "px'" , "height='" + Parametres.HauteurBouton + "px'" ] );
	//
	if( Parametres.Deplacable == null ){ Parametres.Deplacable = true; }
	if( Parametres.Fluide == null ){ Parametres.Fluide = true; }

	
	
	// Connection au Mouse Port (Si jamais cela n'a pas déjà été fait)
	connectionMousePort( "Mouse" );
	
	// Si le groupe des fenêtres n'éxiste pas, le créé
	if( Cible[ Groupe ] == null ){ Cible[ Groupe ] = Object(); }
	//
	// Si le tableau des Fenêtre et les Objets associés à ce tableau n'éxistent pas, les créé
	if( Cible[ Groupe ].Fenetres == null ){ Cible[ Groupe ].Fenetres = []; }
	if( Cible[ Groupe ].FenetresZ == null ){ Cible[ Groupe ].FenetresZ = Object(); }
	
	
	// Si la fenêtre n'est pas déjà ouverte ————>
	if( $( Nom + "Fenetre" ) == null ){
		
		// Si le Z est null ————>
		if( Z == null ){
			
			// Donne 0 par défaut
			Z = 0;
			
			// Pour chaque autre profondeur de fenêtres ouvertes ————>
			for( var i = 0 ; i < Cible[ Groupe ].Fenetres.length ; i++ ){
				
				// Si elle est supérieur ou égale à celle en cour ——>
				if( Z <= Cible[ Groupe ].FenetresZ[ Cible[ Groupe ].Fenetres[ i ] ] ){
				
					// Donne cette même fenêtre plus un à cette fenêtre pour qu'elle soit, automatiquement, par dessus elle (Et donc par dessus toutes)
					Z = Cible[ Groupe ].FenetresZ[ Cible[ Groupe ].Fenetres[ i ] ] + 1;
				}
			}
		}
		
		
		// Si elle est unique
		if( Parametres.Unique ){
			
			// Pour chaque fenètre, la détruit
			for( var i = 0 ; i < Cible[ Groupe ].Fenetres.length ; i++ ){
				
				$( Cible[ Groupe ].Fenetres[ i ] ).AutoDestruction();
			}
		}
		//
		// Ajoute au tableau des fenêtres de ce groupe l'éxistance de cette fenêtre et sa profondeur
		Cible[ Groupe ].Fenetres.push( Nom + "Fenetre" )
		Cible[ Groupe ].FenetresZ[ Nom ] = Z;
		
		
		// Définit le style des parties de la fenêtre
		var divStyleGlobale = Fusion( Parametres.StyleFenetre ,
									 [ "width='" + W + "px'" , "height='" + H + "px'" ] );
		var divStyleBarre = Fusion( Parametres.StyleBarre ,
								   [ "width='" + Parametres.LargeurBarre + "px'" , "height='" + Parametres.HauteurBarre + "px'" , 
									"cursor='" + Curseur( ( Parametres.Deplacable ) ? 6 : 1 ) + "'"
									] );
		
		////// CRÉATION de la fenêtre ——>
		creationDiv( Number( X ) , Number( Y ) , // ————> Positions
					 "" ,						 // ————> Contenue
					 [],						 // ————> Style
					 [] ,						 // ————> Fonctions
					 ( Nom + "Fenetre" ) ,		 // ————> ID
					 Z ,						 // ————> Z
					 Cible
					);				// ——> Fenêtre globale
		
		creationDiv( 0 , 0 , 					 // ————> Positions
					 "" ,						 // ————> Contenue
					 divStyleGlobale,			 // ————> Style
					 [] ,						 // ————> Fonctions
					 Nom ,		 				 // ————> ID
					 0 , 						 // ————> Z
					 $( Nom + "Fenetre" )		 // ————> Parent
					);				// ——> Partie basse de la fenêtre
		
		creationDiv( Parametres.DecalageContenuX , 											// ————> Positions
					 Parametres.DecalageContenuY , 		
					 OptimiseConversionCaractere( Contenue , [ "[*ACCENT*]" ] , [ "'" ] ) ,	// ————> Contenue (Self-Optimisé pour remmettre les accents)
					 Parametres.StyleContenu ,	 											// ————> Style
					 [] ,						 											// ————> Fonctions
					 ( Nom + "Contenu" ) ,		 											// ————> ID
					 0 , 						 											// ————> Z
					 $( Nom + "Fenetre" )		 											// ————> Parent
					);				// ——> Contenue de la partie basse de la fenêtre
		
		creationDiv( Parametres.DecalageBarreX , 		 // ————> Positions
					 Parametres.DecalageBarreY ,
					 OptimiseConversionCaractere( NomApparant , [ "[*ACCENT*]" ] , [ "'" ] ) ,	// ————> Contenue (Self-Optimisé pour remmettre les accents)
					 divStyleBarre,	 	 		 		 // ————> Style
					 [] ,				 		 		 // ————> Fonctions
					 ( Nom + "Barre" ) , 		 		 // ————> ID
					 0 , 				 		 		 // ————> Z
					 $( Nom + "Fenetre" )			 	 // ————> Parent
					);				// ——> Barre haute de la fenêtre
		
		if( Parametres.BoutonX ){
			
			IncrustationBouton( ( Nom + "BarreX" ) ,
							"simple" ,
							( W - Parametres.LargeurBouton - Parametres.DecalageBoutonX ) , Parametres.DecalageBoutonY , 0 ,
							3 ,
							"" ,
							{ 
								General:Parametres.StyleX ,
								Roll:Parametres.StyleXRoll
							} ,
							{
								onclick:"this.parentNode.parentNode.AutoDestruction();"
							} ,
							$( ( Nom + "Barre" ) )
						);	// ——> Bouton de Suppression
		}
		
		if( Parametres.Bouton_ ){
			IncrustationBouton( ( Nom + "Barre_" ) ,
							"simple" ,
							( W - ( Parametres.LargeurBouton * 2 ) - Parametres.DecalageBoutonX ) , Parametres.DecalageBoutonY , 0 ,
							3 ,
							"" ,
							{ 
								General:Parametres.Style_ ,
								Roll:Parametres.Style_Roll
							} ,
							{
								onclick:"this.onPress();"
							} ,
							$( ( Nom + "Barre" ) )
						);	// ——> Bouton de Réduction
		}

		
		// Paramètres de la fenêtre
		$( Nom + "Fenetre" ).move = false;
		$( Nom + "Fenetre" ).reduit = false;
		//
		$( Nom + "Fenetre" ).X = X;
		$( Nom + "Fenetre" ).Y = Y;
		$( Nom + "Fenetre" ).Z = Z;
		//
		$( Nom + "Fenetre" ).Largeur = Math.max( W , Parametres.LargeurBarre );
		$( Nom + "Fenetre" ).Hauteur = H - Parametres.DecalageBarre;
		//
		$( Nom + "Fenetre" ).bumpX = Parametres.DecalageContenuX;
		$( Nom + "Fenetre" ).bumpY = Parametres.DecalageContenuY;
		//
		$( Nom + "Fenetre" ).Fluide = Parametres.Fluide;
		//
		$( Nom + "Fenetre" ).DecX = 0;
		$( Nom + "Fenetre" ).DecY = 0;
		//
		$( Nom + "Fenetre" ).VitesseX = 0;
		$( Nom + "Fenetre" ).VitesseY = 0;
		//
		$( Nom + "Barre" ).Deplacable = Parametres.Deplacable;
		$( Nom + "Barre" ).Fluide = Parametres.Fluide;
	
		
		////// ACTIONS de la fenêtres
		
		// A l'appuie sur la barre de la fenêtre ——>
		$( ( Nom + "Barre" ) ).onmousedown = function(){
			
			// Si la fenêtre est déplaçable ——>
			if( this.Deplacable ){
					
				// On peut déplacer la fenêtre
				this.parentNode.Moving( true );
				
				// Mes la fenêtre devant les autres
				this.parentNode.Up();
			}
		}
		
		// Au survol de la fenêtre ——>
		$( ( Nom + "Barre" ) ).onmouseover = function(){
			
			// Bloque le surlignage
			MouseAction_StopSurligne( true );
		}
		
		// Au désurvol de la fenêtre ——>
		$( ( Nom + "Barre" ) ).onmouseout = function(){
			
			// Débloque le surlignage
			MouseAction_StopSurligne( false );
		}
		
		
		
		// Au click sur le bouton de Réduction ——>
		if( Parametres.Bouton_ ){
				$( ( Nom + "Barre_" ) ).onPress = function(){
				
				// Toggle la réduction
				this.parentNode.parentNode.reduit = !this.parentNode.parentNode.reduit;
				
				// Réduit ou agrandie selon le choix
				if( !this.parentNode.parentNode.reduit ){ 
					$( Nom ).style.display = "block"; 
					$( ( Nom + "Contenu" ) ).style.display = "block";
				}
				else { 
					$( Nom ).style.display = "none"; 
					$( ( Nom + "Contenu" ) ).style.display = "none";
				}
			}
		}
		
		
		// Au lancement du déplacement (ou arrêt de déplacement) de la fenêtre ——>
		$( Nom + "Fenetre" ).Moving = function( Etat ){
			
			// Change l'état de déplacement de la fenêtre
			this.move = Etat;
			
			// Calcule le décalage entre le curseur et le point 0,0 de la fenêtre
			this.DecX = this.X - MouseX;
			this.DecY = this.Y - MouseY;
		}
		
		
		// A la mise au premier plan de la fenêtre ——>
		$( Nom + "Fenetre" ).Up = function(){
			
			// Pour chaque fenêtres du même groupe ———>
			for( var i = 0 ; i < Cible[ Groupe ].Fenetres.length ; i++ ){
				
				// Si la profondeur de cette fenêtre est supérieur ou égale à celle de cette fenêtre ————>
				if( this.Z <= Cible[ Groupe ].FenetresZ[ Cible[ Groupe ].Fenetres[ i ] ] ){
					
					// La profondeur de cette fenêtre devient égale à celle de l'autre fenêtre plus un
					this.Z = Cible[ Groupe ].FenetresZ[ Cible[ Groupe ].Fenetres[ i ] ] + 1;
				}
			}
			
			// Si ce n'était pas le Z qu'il possédait ——>
			if( Cible[ Groupe ].FenetresZ[ this.id ] != ( this.Z - 1 ) ){
				
				// S'il y a une fonction de mise premier plan ——>
				if( Parametres.FonctionGet != null ){
					
					// Lance la fonction
					Parametres.CibleGet[ Parametres.FonctionGet ]();
				}
			}
			
			// Enregistre la nouvelle profondeur de cette fenêtre
			Cible[ Groupe ].FenetresZ[ this.id ] = this.Z;
			
			// Applique la nouvelle profondeur à cette fenêtre
			this.style.zIndex = String( this.Z );
		}
		
		
		// A l'autodestruction de la fenêtre
		$( Nom + "Fenetre" ).AutoDestruction = function(){
			
			// Détruit la boucle de la fenêtre
			removeEnterFrame( this , "ENTER_FRAME" );

			// Retire du tableau le nom de cette fenêtre
			Cible[ Groupe ].Fenetres.splice( TabPositionElement( Cible[ Groupe ].Fenetres , Nom ) , 1 );
			
			// Mes à null l'occurence de profondeur de cette fenêtre sur l'objet l'ayant retenu
			Cible[ Groupe ].FenetresZ[ Nom ] = null;
			
			// Détruit la fenêtre
			DestroyDiv( this.id );
		}
		
		
		// Durant la boucle de déplacement de la fenêtre ——>
		$( Nom + "Fenetre" ).Boucle = function(){
			
			// Si elle est en train d'être déplacée ————>
			if( this.move ){
				
				
				// Si on est plus appuyé sur la souris ————>
				if( nbrClick > 0 ){ 
					
					// Cesse le suivis de la souris
					this.move = false; 
					
					
					// Si elle est Fluide ————>
					if( this.Fluide ){
						
						// Transmes la vitesse de la souris à la fenêtre
						this.VitesseX = ( MouseSpeedX * 0.5 );
						this.VitesseY = ( MouseSpeedY * 0.5 );
						
					// Si elle n'est pas Fluide ————>
					} else {
						
						// S'arrête dessuite
						this.VitesseX = this.VitesseY = 0;
					}
				}
			
			
				// Récupére la position X,Y du curseur par rapport au décalage qu'il avait lorsqu'on a lancé la demande de déplacement
				this.X = MouseX + this.DecX;
				this.Y = MouseY + this.DecY;
				
				
				////// BORDURE
				
				// Si la fenêtre dépasse par le côté gauche ————>
				if( this.X < 0 ){ 
					
					// Positionne sur le bord gauche
					this.X = 0
					
					
				// Si la fenêtre dépasse par le côté droit à condition que la largeur de la fenêtre soit inférieur à celle de l'écran ————>
				} else if( this.X > ( getLargeurEcran() - W ) && getLargeurEcran() > this.Largeur ){
					
					// Positionne sur le bord droit
					this.X = ( getLargeurEcran() - W )
				}
				
				// Si la fenêtre dépasse par le côté haut ————>
				if( this.Y < Parametres.DecalageBarre * -1 ){ 
				
					// Positionne sur le bord haut
					this.Y = Parametres.DecalageBarre * -1;
					
				
				// Si la fenêtre dépasse par le bord bas à condition que la largeur de la fenêtre soit inférieur à celle de l'écran ————>
				// Quand elle est ouverte ————>
				} else if( this.Y > ( getHauteurEcran() - H ) && !this.reduit && getHauteurEcran() > this.Hauteur ){
					
					// Positionne sur le bord bas
					this.Y = ( getHauteurEcran() - H )
					
				// Quand elle est fermée ————>
				} else if( this.Y > ( getHauteurEcran() - ( Parametres.HauteurBarre + Parametres.DecalageBarre ) ) && this.reduit ){
					
					// Positionne sur le bord bas
					this.Y = ( getHauteurEcran() - ( Parametres.HauteurBarre + Parametres.DecalageBarre ) )
				}
				
				// Applique les nouvelles positions X,Y
				deplaceClip( this , this.X , this.Y );	
			
			
			
			// S'il est en train de subir une vitesse ————>
			} else if( Math.abs( this.VitesseX ) > 0 ||  Math.abs( this.VitesseY ) > 0 ) {
				
				// Applique la vitesse en X,Y
				this.X += this.VitesseX;
				this.Y += this.VitesseY;
				
				// Frein de Vitesse
				this.VitesseX *= 0.95;
				this.VitesseY *= 0.95;
				
				
				////// BORDURE
				
				// Si la fenêtre dépasse par le côté gauche ————>
				if( this.X < 0 ){ 
					
					// Positionne sur le bord gauche
					this.X = 0
					
					// Inverse la vitesse
					this.VitesseX *= -1;
					
					
				// Si la fenêtre dépasse par le côté droit à condition que l'écran soit plus grand que la fenêtre ————>
				} else if( this.X > ( getLargeurEcran() - W ) && getLargeurEcran() > this.Largeur ){
					
					// Positionne sur le bord droit
					this.X = ( getLargeurEcran() - W );
					
					// Inverse la vitesse
					this.VitesseX *= -1;
				}
				
				// Si la fenêtre dépasse par le côté haut ————>
				if( this.Y < Parametres.DecalageBarre * -1 ){ 
				
					// Positionne sur le bord haut
					this.Y = Parametres.DecalageBarre * -1;
					
					// Inverse la vitesse
					this.VitesseY *= -1;
					
				
				// Si la fenêtre dépasse par le bord bas à condition que l'écran soit plus grand que la fenêtre ————>
				// Quand elle est ouverte ————>
				} else if( this.Y > ( getHauteurEcran() - H ) && !this.reduit && getHauteurEcran() > this.Hauteur  ){
					
					// Positionne sur le bord bas
					this.Y = ( getHauteurEcran() - H )
					
					// Inverse la vitesse
					this.VitesseY *= -1;
					
				// Quand elle est fermée ————>
				} else if( this.Y > ( getHauteurEcran() - ( Parametres.HauteurBarre + Parametres.DecalageBarre ) ) && this.reduit ){
					
					// Positionne sur le bord bas
					this.Y = ( getHauteurEcran() - ( Parametres.HauteurBarre + Parametres.DecalageBarre ) );
					
					// Inverse la vitesse
					this.VitesseY *= -1;
				}
				
				// Si la vitesse est tombé trop bas, elle tombe à 0
				if( Math.abs( this.VitesseX ) < 0.2 ){ this.VitesseX = 0; }
				if( Math.abs( this.VitesseY ) < 0.2 ){ this.VitesseY = 0; }
				
				// Applique les nouvelles positions X,Y
				deplaceClip( this , this.X , this.Y );
			}
		}
		
		
		// Donne à la fenêtre sa boucle de déplacement
		addEnterFrame( $( Nom + "Fenetre" ) , "ENTER_FRAME" , "Boucle" , 0.1 );
		
		
		// Renvoie que la fenêtre a été créée
		return true;
	}
	
	// Si aucune fenêtre n'a été créé (Principalement parce qu'il y en a déjà une) renvoie faux
	return false;
}


// —————— GIVE AUTO PLACEMENT
// Donne à une Div une boucle lui permettant de se déplacer fluidement vers un point
// définie via une fonction de cette Div.
//
// Optimisé pour IE7 et Safari.

function GiveAutoPlacement( Div ,			// ————> La Div concernée
						    ContreVitesse ,	// ————> La Contre Vitesse appliquée
						    X , Y			// ————> La position X , Y initial de la Div ( Ne rien mettre pour qu'elle soit dans son X , Y actuelle )
						  ){
	
	// Arguments par défaut
	ContreVitesse = ContreVitesse || 30;
	//
	Div.X = X || Number( getStyle( Div , "left" ).split( "px" )[ 0 ] );
	Div.Y = Y || Number( getStyle( Div , "top" ).split( "px" )[ 0 ] );
	
	// Donne les Paramètres à la Div
	Div.CibleX = Div.X;
	Div.CibleY = Div.Y;
	//
	Div.ContreVitesse = ContreVitesse;
	
	// Positionne la Div
	Div.style.left = Div.X + "px";
	Div.style.top = Div.Y + "px";
	
	
	// Boucle de Mouvement de la Div //
	Div.MouvementAutoPlacement = function(){
		
		// Si sa position X et sa position X à avoir sont différentes ————>
		if( this.CibleX != this.X ){
			
			// Il se déplace vers sa position X à avoir
			this.X += Math.round( ( this.CibleX - this.X ) / this.ContreVitesse );
			
			// S'il n'est plus très loin de sa position X à avoir, il se place directement dessus
			if( Math.abs( this.CibleX - this.X ) <= 0.5 ){ this.X = this.CibleX; }
			
			// Applique la position X
			this.style.left = this.X + "px";
		}
		
		// Si sa position Y et sa position Y à avoir sont différentes ————>
		if( this.CibleY != this.Y ){
			
			// Il se déplace vers sa position Y à avoir
			this.Y += Math.round( ( this.CibleY - this.Y ) / this.ContreVitesse );
			
			// S'il n'est plus très loin de sa position Y à avoir, il se place directement dessus
			if( Math.abs( this.CibleY - this.Y ) <= 0.5 ){ this.Y = this.CibleY; }
			
			// Applique la position Y
			this.style.top = this.Y + "px";
		}
	}
	
	
	// Méthode à lancer pour donner la prochaine position à atteindre
	Div.AutoPlacement = function( X , Y ){
		
		// Si une position à atteindre n'est pas null ————>
		if( X != null && X != "" ){
			
			// S'il s'agit d'un String, on établie un calcul par rapport a la position en cour ————>
			if( String( X ).split( "ope" ).length > 1 ){ 
				try{ this.CibleX = eval( ( this.X + String( X ).split( "ope" )[ 1 ] ) ); }
				catch( err ){}
			}
			
			// Sinon, la Cible est directement la position
			else { this.CibleX = X; }
		}
		
		
		// Si une position à atteindre n'est pas null ————>
		if( Y != null && Y != "" ){
			
			// S'il s'agit d'un String, on établie un calcul par rapport a la position en cour ————>
			if( String( Y ).split( "ope" ).length > 1 ){ 
				try{ this.CibleY = eval( ( this.Y + String( Y ).split( "ope" )[ 1 ] ) ); }
				catch( err ){}
			}
			
			// Sinon, la Cible est directement la position
			else { this.CibleY = Y; }
		}
	}
	
	
	// Donne la boucle de déplacement
	addEnterFrame( Div , "BoucleAutoPlacement" , "MouvementAutoPlacement" , 0.1 );
}