/* ———————————————————————————————————————————————————————————————————— */
/*																		*/
/*						  YAHWEH	  Version 1.2.8						*/
/*					  Dernière Mise à Jour : 09-03-18					*/
/*																		*/
/*							  Mise en Forme								*/
/*	Ce script contient les méthodes pour former la page d'un point de	*/
/*	vue posé, placement des balises, etc.								*/
/*																		*/
/* ———————————————————————————————————————————————————————————————————— */




/* ———————————————————————————————————————————— */
/*												*/
/*						STAGE					*/
/*	Simule une scène avec des données commune 	*/
/*	partagé ou récupéré par défaut si elles		*/
/*	n'éxistent pas.								*/
/*												*/
/* ———————————————————————————————————————————— */

function Stage( Element , 		// ————> Le nom de la variable
			    Separateur , 	// ————> Le Séparateur ( « || » pour une récupération de la valeur ou une valeur par défaut, « = » pour modifier la valeur de la variable )
				Etat , 			// ————> Etat à donner à la Variable ou Valeur par défaut à retourner si la Variable n'éxiste pas
				Racine			// ————> Racine faisant la Stage
			   ){
	
	// Arguments par défaut
	var Racine = Racine || document.body;
	var Element;
	
	
	// Si c'est une récupération ————> 
	if( Separateur == " || " ){

		// Si la variable n'éxiste pas, renvoie la valeur par défaut
		if( Racine[ Element ] == null ){ return Etat;
		
		// Si elle éxiste, la renvoie
		} else { return Racine[ Element ]; }
	
	
	// Si c'est un gain d'état ————> 
	} else if( Separateur == " = " ){

		// Donne l'état à la variable
		Racine[ Element ] = Etat;
		
		// Renvoie l'état
		return Etat;
	}
}





/* ———————————————————————————————————————————— */
/*												*/
/*					CREATION DIV				*/
/*	Créé et positionne une balise Div.		 	*/
/*												*/
/* ———————————————————————————————————————————— */

function creationDiv( XX , 			// ————> Position en X de la Balise
					  YY ,			// ————> Position en Y de la Balise
					  Contenu , 	// ————> Contenu de la Div
					  Style ,		// ————> Style donné au Div	
					  Fonctions ,	// ————> Fonctioncs additionnels
					  ID ,			// ————> ID à donner au Div
					  ZZ ,			// ————> Position en Z de la Balise
					  Cible			// ————> Cible acquérant la Balise
					){
	
	
	// Argument par défaut
	XX = XX || 0 ;
	YY = YY || 0 ;
	ZZ = ZZ || 0 ;
	//
	Cible = Cible || document.body;
	
	
	// Interférance des données Stage
	XX += Stage( "StageX" , " || " , 0 );
	YY += Stage( "StageY" , " || " , 0 );
	
	
	// Créé la DIV
	var DIV = document.createElement( 'div' );
	
	
	// Positionne la DIV
	DIV.style.position = "absolute";
	//
	DIV.style.left = XX + "px";
	DIV.style.top = YY + "px";
	DIV.style.zIndex = ZZ;
	
	
	// ID
	if( ID != null ){ DIV.id = ID; }
	
	
	
	// S'il y a des Styles additionnels ————>
	if( Style != null ){
		
		// Donne ces paramètres au DIV
		for( var i = 0 ; i < Style.length ; i++ ){
			
			try{
				eval( "DIV.style." + Style[ i ] );
			} catch( err ){}
		}
	}
	
	
	// Mes son contenu
	DIV.innerHTML = Contenu;
					
	// Affiche la DIV
	Cible.appendChild( DIV );
	
	
	
		
	// S'il y a des Fonctions additionnels ————>
	if( Fonctions != null ){
		
		// Donne ces Fonctioncs au DIV
		for( var i = 0 ; i < Fonctions.length ; i++ ){
			
			// Vérifie qu'il n'y a pas plus d'un caractére "égal"
			if( Fonctions[ i ].split( "=" ).length <= 2 ){
				eval( "DIV." + Fonctions[ i ].split( "=" )[ 0 ] + "=function(){" + Fonctions[ i ].split( "=" )[ 1 ] + "}" );
				
			// Sinon, il coupe avec des égales à espace
			} else {
				eval( "$( '" + ID + "' )." + Fonctions[ i ].split( " = " )[ 0 ] + "=function(){" + Fonctions[ i ].split( " = " )[ 1 ] + "}" );
				
			}
		}
	}
	
	
	
	// Retourne la DIV
	return DIV;
}



/* ———————————————————————————————————————————— */
/*												*/
/*				INCRUSTATION BOUTON				*/
/*	Place un bouton interractif et dynamique.  	*/
/*												*/
/* ———————————————————————————————————————————— */

function IncrustationBouton( Nom ,			// ————> Nom ID du bouton
							 Type ,			// ————> Type du bouton (Simple ou Levier)
							 X , 			// ————> Position X du bouton
							 Y , 			// ————> Position Y du bouton
							 Z ,			// ————> Position Z du bouton
							 Pointeur ,		// ————> Forme du pointeur lors du survol du bouton
							 Contenu ,		// ————> Contenu du bouton
							 Styles ,		// ————> Les styles du bouton (Général, Roll, Press, Lock et Actif)
							 Fonctions ,	// ————> Fonctions associés au bouton ( onclick, onmousedown, onmouseovee & onmouseout )
							 Cible ,		// ————> Le Parent où on mes le bouton
							 Parametres		// ————> Parametres additifs
							){
	
	// Arguments par défauts
	Cible = Cible || document.body;
	//
	Parametres = Parametres || {};
	
	
	// Pour un bouton Cliquable-Deplaçable
	if( Type == "clique-deplace" ){
		
		// Si la souris n'a pas été connecté, on la connecte en vue de son utilisation pour le placement des images par exemple
		if( document.body.MouseX == null ){
			connectionMousePort( "Mouse" );
		}
	}
	
	
	// Création du bouton
	// Place la Div
	creationDiv( X , 
				 Y , 
				 Contenu , 
				 [] , 
				 [] ,
				 Nom ,
				 Z ,
				 Cible
				 );
	
	// Lui donne ses paramètres
	$( Nom ).InitialX = X;
	$( Nom ).InitialY = Y;
	//
	$( Nom ).RayonX = Parametres.RayonX || 0;
	$( Nom ).RayonY = Parametres.RayonY || Parametres.RayonX || 0;
	
	// Création des styles par défaut par rapport à la forme que doit prendre le curseur
	var StyleDefaut = [ "position='absolute'" , "cursor='" + ( ( typeof( Pointeur ) == "string" ) ? Pointeur : Curseur( Pointeur ) ) + "'" ];
	
	////// Styles
	//
	$( Nom ).Styles = Styles || Object();
	//
	// Général
	$( Nom ).Styles.General = Fusion( Styles.General , StyleDefaut );
	//
	// Actions directes
	$( Nom ).Styles.Roll = Fusion( ( Styles.Roll || [] ) , StyleDefaut );
	$( Nom ).Styles.Press = Fusion( ( Styles.Press || [] ) , StyleDefaut );
	//
	// Actions indirectes
	$( Nom ).Styles.Lock = Fusion( ( Styles.Lock || [] ) , [ "cursor='auto'" ] );
	$( Nom ).Styles.Actif = Fusion( ( Styles.Actif || [] ) , StyleDefaut );
	$( Nom ).Styles.Deplace = Fusion( ( Styles.Deplace || [] ) , StyleDefaut );
	
	
	////// Fonctions
	//
	$( Nom ).Fonctions = Fonctions || Object();
	//
	// 
	$( Nom ).Fonctions.onmousedown = Fonctions.onmousedown || "";
	$( Nom ).Fonctions.onclick = Fonctions.onclick || "";
	$( Nom ).Fonctions.onmouseover = Fonctions.onmouseover || "";
	$( Nom ).Fonctions.onmouseout = Fonctions.onmouseout || "";
	
	// Type du bouton
	$( Nom ).type = Type;
	
	// Etats initials
	$( Nom ).actif = false;
	$( Nom ).lock = false;
	
	
	// Applique le style général au bouton
	applyStyle( $( Nom ) , Styles.General );
	
	
	////// A L'APPUIE ————>
	$( Nom ).onmousedown = function( action ){
		
		// Arguments par défaut
		action = action || true;
		
		// S'il n'est pas bloqué ————>
		if( !this.lock ){
			
			// Mes le style du bouton par défaut
			applyStyle( this , this.Styles.General );
			
			// S'il est actif, mes le style Actif par dessus
			if( this.actif ){ applyStyle( this , this.Styles.Actif ); }
			
			// Mes le style d'appuie par dessus
			applyStyle( this , this.Styles.Press );
			
			// S'il est de type cliquable, deplacable ————>
			if( this.type == "clique-deplace" ){ 
				
				// Calcul la distance entre son point 0 et la souris
				this.bumpX = Number( getStyle( this , "left" ).split( "px" )[ 0 ] ) - MouseX;
				this.bumpY = Number( getStyle( this , "top" ).split( "px" )[ 0 ] ) - MouseY;
				
				// Lance son déplacement
				this.deplace = true; 
			}
			
			// Lance les fonctions attachées au Mouse Down
			if( action ){ eval( this.Fonctions.onmousedown ); }
		}
	}
	
	
	////// AU RELACHEMENT ————>
	$( Nom ).onclick = function( action ){
		
		// Arguments par défaut
		action = action || true;
		
		// S'il n'est pas bloqué ————>
		if( !this.lock ){
			
			// S'il est de type « levier », toggle son état d'activité
			if( action ){
				if( this.type == "levier" ){ this.actif = !this.actif; }
			}
			
			// Mes le style du bouton par défaut
			applyStyle( this , this.Styles.General );
			
			// S'il est actif, mes le style Actif par dessus
			if( this.actif ){ applyStyle( this , this.Styles.Actif ); }
			
			// Mes le style Roll par dessus
			applyStyle( this , this.Styles.Roll );
			
			// S'il est de type cliquable, deplacable ——>
			if( this.type == "clique-deplace" ){ 
			
				// Cesse son déplacement
				this.deplace = false; 
				
				// Calcul son X , Y
				this.X = Number( getStyle( this , "left" ).split( "px" )[ 0 ] );
				this.Y = Number( getStyle( this , "top" ).split( "px" )[ 0 ] );
				
				// Calcul son X , Y absolue
				this.AbsoluteX = this.X;
				this.AbsoluteY = this.Y;
				
				// Pour chaque Parent
				for( var i = 0 ; i < Parametres.Parent.length ; i++ ){
					
					// Recalibre la valeur Absolue X , Y par rapport à sa position
					this.AbsoluteX += Number( getStyle( Parametres.Parent[ i ] , "left" ).split( "px" )[ 0 ] );
					this.AbsoluteY += Number( getStyle( Parametres.Parent[ i ] , "top" ).split( "px" )[ 0 ] );
				}
				
				
				// S'il a dépassé son Rayon ——>
				if( Math.abs( this.X - this.InitialX ) > this.RayonX 
				 || Math.abs( this.Y - this.InitialY ) > this.RayonY ){
					
					// Lance les fonctions attachées au On Relache
					if( action ){ eval( this.Fonctions.onrelache ); }
				}
				
				// Le fait se repositionner
				this.style.left = this.InitialX + "px";
				this.style.top = this.InitialY + "px";
			}
			
			// Lance les fonctions attachées au On Click
			if( action ){ eval( this.Fonctions.onclick ); }
		}
	}
	
	
	////// AU SURVOL ————>
	$( Nom ).onmouseover = function( action ){
		
		// Arguments par défaut
		action = action || true;
		
		// S'il n'est pas bloqué ni déplacé ————>
		if( !this.lock && !this.deplace ){
			
			// Mes le style du bouton par défaut
			applyStyle( this , this.Styles.General );
			
			// S'il est actif, mes le style Actif par dessus
			if( this.actif ){ applyStyle( this , this.Styles.Actif ); }
			
			// Mes le style Roll par dessus
			applyStyle( this , this.Styles.Roll );
			
			// Lance les fonctions attachées au On Mouse Over
			if( action ){ 
				try{
					eval( this.Fonctions.onmouseover ); 
				} catch( err ){}
			}
		}
	}
	
	
	////// AU DESURVOL ————>
	$( Nom ).onmouseout = function( action ){
		
		// Arguments par défaut
		action = action || true;
		
		// S'il n'est pas bloqué ni déplacé ————>
		if( !this.lock && !this.deplace ){
			
			// Mes le style du bouton par défaut
			applyStyle( this , this.Styles.General );
			
			// S'il est actif, mes le style actif par dessus
			if( this.actif ){ applyStyle( this , this.Styles.Actif ); } 
			
			// S'il est bloqué, mes le style bloqué par-dessus
			else if( this.lock ){ applyStyle( this , this.Styles.Lock ); }
			
			// Lance les fonctions attachées au On Mouse Out
			if( action ){ 
				try{
					eval( this.Fonctions.onmouseout ); 
				} catch( err ){}
			}
		}
	}
	
	
	////// BLOQUAGE ————>
	$( Nom ).locked = function(){
		
		// Le bloque
		this.lock = true;
		
		// Mes le style du bouton par défaut
		applyStyle( this , this.Styles.General );
			
		// S'il est actif, mes le style actif par dessus
		if( this.actif ){ applyStyle( this , this.Styles.Actif ); }
		
		// Mes le style bloqué par dessus
		applyStyle( this , this.Styles.Lock );
	}
	
	
	////// DEBLOQUAGE ————>
	$( Nom ).unlocked = function(){
		
		// Le débloque
		this.lock = false;
		
		// Mes le style du bouton par défaut
		applyStyle( this , this.Styles.General );
		
		// S'il est actif, mes le style Actif par dessus
		if( this.actif ){ applyStyle( this , this.Styles.Actif ); }
	}
	
	
	////// ACTIVATION ————>
	$( Nom ).active = function(){
		
		// S'il est inactif ————>
		if( !this.actif ){
			
			// Active l'On Click et le Mouse Out
			this.actif = true;
			this.onmouseout( false );
		}
	}
	
	
	////// DESACTIVATION ————>
	$( Nom ).desactive = function(){
		
		// S'il est actif ————>
		if( this.actif ){
			
			// Active le On Click et le Mouse Out
			this.actif = false;
			this.onmouseout( false );
		}
	}
	
	
	////// DEPLACEMENT ————>
	$( Nom ).deplacement = function(){
		
		// Si on le déplace
		if( this.deplace ){
			
			// Mes le style Deplace par dessus
			applyStyle( this , this.Styles.Deplace );
			
			// Positionne sur la souris
			this.style.left = this.bumpX + MouseX + "px";
			this.style.top = this.bumpY + MouseY + "px";
		}
	}
	
	
	// S'il est de type déplaçable ————>
	if( Type == "clique-deplace" ){
		
		// On lui donne sa boucle de déplacement
		addEnterFrame( $( Nom ) , "BoucleDeplacement" , "deplacement" , 0.5 );
	}
}






/* ———————————————————————————————————————————— */
/*												*/
/*					APPLY STYLE					*/
/*	Applique un ensemble de style contenue  	*/
/*	dans un tableau à une Div.				  	*/
/*												*/
/* ———————————————————————————————————————————— */

function applyStyle( Cible ,	// ————> La Div
					 Style		// ————> Tableau des styles
					){
	
	// Arguments par défaut
	if( typeof( Cible ) == "string" ){ Cible = $( Cible ); }
	
	// S'il y a des Styles ————>
	if( Style != null ){
		
		// Donne les style au Div
		for( var i = 0 ; i < Style.length ; i++ ){
			
			try{
				eval( "$('" + Cible.id + "').style." + Style[ i ] );
			} catch( err ){}
		}
	}
}






/* ———————————————————————————————————————————— */
/*												*/
/*				  APPLY FONCTION				*/
/*	Applique un ensemble de fonctions contenue  */
/*	dans un tableau à une Div.				  	*/
/*												*/
/* ———————————————————————————————————————————— */

function applyFonction( Cible ,		// ————> La Div
						Fonction	// ————> Tableau des Fonctions
						){
	
	// Arguments par défaut
	if( typeof( Cible ) == "string" ){ Cible = $( Cible ); }
	
	// S'il y a des Fonctions ————>
	if( Fonction != null ){
		
		// Donne ces Fonctioncs a la Div
		for( var i = 0 ; i < Fonction.length ; i++ ){
			
			// Vérifie qu'il n'y a pas plus d'un caractére "égal"
			if( Fonction[ i ].split( "=" ).length <= 2 ){
				eval( "Cible." + Fonction[ i ].split( "=" )[ 0 ] + "=function(){" + Fonction[ i ].split( "=" )[ 1 ] + "}" );
				
			// Sinon, il coupe avec des égales à espace
			} else {
				eval( "Cible." + Fonction[ i ].split( " = " )[ 0 ] + "=function(){" + Fonction[ i ].split( " = " )[ 1 ] + "}" );
			}
		}
	}
}




/* ———————————————————————————————————————————— */
/*												*/
/*				  	  CAPSULE					*/
/*	Retourne une chaine de caractère encapsulée */
/*	dans une balise div comportant une class  	*/
/*	ou un id spécifique.						*/
/*	C'est, en quelques sortes, la version		*/
/*	string de la méthode "creationDiv"			*/
/*												*/
/* ———————————————————————————————————————————— */

function Capsule( Contenu , 	// ————> Contenu de la Div
				  ID , 			// ————> ID de la div
				  Class , 		// ————> Style de class de la div
				  Type 			// ————> Type d'encapsulation
				){
	
	// Arguments par défaut
	Type = Type || "div";
	
	// Variable de sortie
	var Sortie = "<" + Type + " ";
	
	// Ajoute ID et/ou Class (Ou rien...)
	if( ID ){ Sortie += "id = \"" + ID + "\" "; }
	if( Class ){ Sortie += "class = \"" + Class + "\" "; }
	
	// Retourne l'ensemble
	return( Sortie + ">" + Contenu + "</" + Type + ">" );
}






/* ———————————————————————————————————————————— */
/*												*/
/*				  POSITION DIV					*/
/*	Positionne une div à l'emplacement X,Y,Z    */
/*	en passant par les styles.					*/
/*	Permet de gagner du temps sur l'écriture.	*/
/*												*/
/* ———————————————————————————————————————————— */

function PositionDiv( Div , // ————> La Div
					  X ,	// ————> Position X
					  Y ,	// ————> Position Y
					  Z		// ————> Position Z
					 ){
	
	// Modification de la position X
	if( X ){ Div.style.left = X + "px";	}
	
	// Modification de la position Y
	if( Y ){ Div.style.top = Y + "px"; }
	
	// Modification de la position Z
	if( Z ){ Div.style.zIndex = Z + "px"; }
}