/* ———————————————————————————————————————————————————————————————————— */
/*																		*/
/*						  SKY		Version 0.1.9						*/
/*					  Dernière Mise à Jour : 09-10-08					*/
/*																		*/
/*						 		Gestion									*/
/*	Ce script contient les méthodes pour établire des connections		*/
/*	entre un élément de l'interface client et le site.					*/
/*																		*/
/* ———————————————————————————————————————————————————————————————————— */




/* ———————————————————————————————————————————— */
/*												*/
/*			     CONSTRUCTEUR SOURIS			*/
/*												*/
/* ———————————————————————————————————————————— */

// NOMBRE CLICK
// Compte le Nombre de Click par 1/2 Seconde
var nbrClick = 0;
//
var onmousedown_F = [];



/* ———————————————————————————————————————————— */
/*												*/
/*			    CONNECTION MOUSE PORT			*/
/*	Connecte un Port souris pour récupérer  	*/
/*	constemment la position du curseur sur		*/
/*	la page.									*/
/*												*/
/*				Optimisée pour IE7				*/
/*												*/
/* ———————————————————————————————————————————— */

function connectionMousePort( Nom ){
	
	
	// Si cette connection n'éxiste pas déjà ————>
	if( this[ Nom + "X" ] == null ){
		
		
		// Créé le port virtuel
		var port = this;
		
		// Créé les variable de position du curseur X et Y
		this[ Nom + "X" ] = 0;
		this[ Nom + "Y" ] = 0;
		//
		// Variables de mémoire des anciennes positions de la souris (Pour calculer sa vitesse)
		this[ Nom + "MemX" ] = 0;
		this[ Nom + "MemY" ] = 0;
		//
		// Variables de vitesse de la souris
		this[ Nom + "SpeedX" ] = 0;
		this[ Nom + "SpeedY" ] = 0;
		//
		// Variable levier du clip
		this[ Nom + "Click" ] = false;
		
		// Si ce port avait déjà un branchement ————>
		if( document.onmousemove ){
			
			// Se contente de lister le nouveau port
			this.AssemblagePort = this.AssemblagePort || new Array;
			//
			this.AssemblagePort.push( Nom );
			
		} else {
		
			// Initialise un Multiclick par défaut
			MultiClick( 99 , "" );
			
			
			// Lorsque l'on bouge la souris...
			document.onmousemove = function( e ){
				
				// Mémorise l'ancienne position
				port[ Nom + "MemX" ] = port[ Nom + "X" ];
				port[ Nom + "MemY" ] = port[ Nom + "Y" ];
				
				// Si on est sur un BON navigateur ——>
				try{
					// Modification de l'état des variables de position X et Y
					
					port[ Nom + "X" ] = e.pageX;
					port[ Nom + "Y" ] = e.pageY;
					
					
				// Si on est sur IE...
				} catch( err ){
					
					port[ Nom + "X" ] = event.x + document.documentElement.scrollLeft;
					port[ Nom + "Y" ] = event.y + document.documentElement.scrollTop;
				}
				
				// Calcule la vitesse de déplacement X,Y de la souris
				port[ Nom + "SpeedX" ] = ( port[ Nom + "X" ] - port[ Nom + "MemX" ] );
				port[ Nom + "SpeedY" ] = ( port[ Nom + "Y" ] - port[ Nom + "MemY" ] );
				
				
				// S'il y a d'autres ports ————>
				if( port.AssemblagePort ){
					
					// Pour chaque autre port ————>
					for( var AutrePort = 0 ; AutrePort < port.AssemblagePort.length ; AutrePort++ ){
						
						// Récupère le nom du port
						var AutreNom = port.AssemblagePort[ AutrePort ];
						
						// Mémorise l'ancienne position pour ce port
						port[ AutreNom + "MemX" ] = port[ AutreNom + "X" ];
						port[ AutreNom + "MemY" ] = port[ AutreNom + "Y" ];
						
						// Si on est sur un BON navigateur ——>
						try{
							// Modification de l'état des variables de position X et Y pour ce port
							
							port[ AutreNom + "X" ] = e.pageX;
							port[ AutreNom + "Y" ] = e.pageY;
							
							
						// Si on est sur IE...
						} catch( err ){
							
							port[ AutreNom + "X" ] = event.x + document.documentElement.scrollLeft;
							port[ AutreNom + "Y" ] = event.y + document.documentElement.scrollTop;
						}
						
						// Calcule la vitesse de déplacement X,Y de la souris pour ce port
						port[ AutreNom + "SpeedX" ] = ( port[ AutreNom + "X" ] - port[ AutreNom + "MemX" ] );
						port[ AutreNom + "SpeedY" ] = ( port[ AutreNom + "Y" ] - port[ AutreNom + "MemY" ] );
					}
				}
			}
		}
	}
}




/* ———————————————————————————————————————————— */
/*												*/
/*			    MOUSE ACTIVATION				*/
/*	Active nue vérification globale d'une   	*/
/*	action de la souris pour lancer des actions	*/
/*	spécifiques									*/
/*												*/
/* ———————————————————————————————————————————— */

///// MOUSE DOWN
function MouseActivation_OnMouseDown(){
	
	// A l'appuie de la souris sur le document ————>
	document.onmousedown = function( e ){
		
		// Pour chaque action à lancer ————>
		for( var i = 0 ; i < onmousedown_F.length ; i++ ){
			
			// Lance l'action si on peut
			try{ eval( onmousedown_F[ i ] ); } catch( err ){}
		}
	}
}





/* ———————————————————————————————————————————— */
/*												*/
/*			    	MOUSE ACTION				*/
/*	Diverses méthode d'action spécifiques et   	*/
/*	globale pour la souris						*/
/*												*/
/* ———————————————————————————————————————————— */

////// STOP SURLIGNE
// Empéche de surligner du texte (Sauf IE7)
function MouseAction_StopSurligne( Etat ){
	
	// Code spécifique
	var code = "if (typeof e.preventDefault != 'undefined') { e.preventDefault(); }";
	
	// Si le code n'y est pas déjà et qu'il faut le mettre ————> il est mis
	if( Etat && TabPositionElement( onmousedown_F , code ) == -1 ){
		onmousedown_F.push( code );
		
	// Si le code existe déjà et qu'il faut l'enlever ————>
	} else if( TabPositionElement( onmousedown_F , code ) != -1 ){
		
		// vérifie où il se trouve et l'enlève
		for( var i = 0 ; i < onmousedown_F.length ; i++ ){
			if( onmousedown_F[ i ] == code ){
				onmousedown_F.splice( i , 1 );
			}
		}
	}
}



/* ———————————————————————————————————————————— */
/*												*/
/*			   		MULTI CLICK					*/
/*	Associe un String d'Eval à un certains 	 	*/
/*	nombre de click en moins de 1/2 Seconde.	*/
/*												*/
/*				Optimisé pour IE7				*/
/*												*/
/* ———————————————————————————————————————————— */

////// CLICK ZERO
// Remet le nombre de click à zéro
function ClickZero(){ nbrClick = 0 ; }

////// MULTI CLICK
function MultiClick( Nombre ,	// ————> Nombre de click à faire
					 Eval ,		// ————> String d'Eval
					 Cible		// ————> Cible du click
					){
	
	// Arguments par défaut
	Cible = Cible || document;
	
	// Au click sur la cible ————>
	Cible.onclick = function(){
		
		// Augmente le nombre de click
		nbrClick++;
		
		// Si c'est le premier click ————>
		if( nbrClick == 1 ){
			
			// Lance le chrono de remise à zéro des click au bout d'une demi seconde
			setTimeout( "ClickZero()" , 700 );
			
		// Si ce n'est pas le premier click ————>
		} else {
			
			// Si on est sur un... IE ————>
			if( navigator.appName == "Microsoft Internet Explorer" ){
				
				// Augmente plus rapidement le nombre de click
				// (Il semblerait que IE ait plus de mal à cumuler les click rapide...)
				nbrClick++;
			}
		}
		
		// Si c'est le nombre désiré de click ————>
		if( nbrClick == Nombre ){

			// Lance l'éval du String ————>
			try{ 
				eval( Eval );
			} catch( err ){}
		}
	}
}







/* ———————————————————————————————————————————— */
/*												*/
/*			   CONSTRUCTEUR CLAVIER				*/
/*												*/
/* ———————————————————————————————————————————— */

// KEY LINK
//
// Tableau des touches
var KeyLink = [
			   { Key:32 , Nom:"SPACE" , Down:[] , Up:[] },
			   { Key:16 , Nom:"MAJ" , Down:[] , Up:[] },
			   { Key:17 , Nom:"CONTROL" , Down:[] , Up:[] },
			   { Key:18 , Nom:"ALT" , Down:[] , Up:[] },
			   { Key:13 , Nom:"ENTREE" , Down:[] , Up:[] },
			   { Key:38 , Nom:"UP" , Down:[] , Up:[] } ,
			   { Key:40 , Nom:"DOWN" , Down:[] , Up:[] } ,
			   { Key:37 , Nom:"LEFT" , Down:[] , Up:[] } ,
			   { Key:39 , Nom:"RIGHT" , Down:[] , Up:[] } ,
			   { Key:71 , Nom:"G" , Down:[] , Up:[] }
	          ];

// SHORT KEY LINK
//
// Tableau des racourcies
var ShortKeyLink = [];



/* ———————————————————————————————————————————— */
/*												*/
/*			    CONNECTION KEYBOARD PORT		*/
/*	Connecte un Port clavier pour récupérer  	*/
/*	les appels d'appuie de touches.				*/
/*												*/
/*				Optimisé pour IE7				*/
/*			Non-Optimisé pour Safari			*/
/*												*/
/* ———————————————————————————————————————————— */

function connectionKeyboardPort( Nom ){
	
	// Arguments par défaut
	var Nom = Nom || "";
	
	// Création de l'objet Clavier
	var Clavier = this[ Nom + "Keyboard" ] = new Object();
	
	
	// Lors de l'appuie sur une touche dans la scène ———> 
	document.onkeydown = function( event ){
	
		// Récupére la clé tapée
		var Key = ( event || window.event ).keyCode;
		
		// Affiche la clé tapée (Si Souhaité)
		//alert(Key)
		
		// Si la clé tapée n'existe pas ou n'était pas déjà activée ———>
		if( !Clavier[ "KeyboardKey" + Key ] ){
			  
			// Pour chaque touche enregistrée ———>
			for( var i = 0 ; i < KeyLink.length ; i++ ){
				
				// S'il s'agit de cette touche et qu'elle contient des action ———>
				if( KeyLink[ i ].Key == Key && KeyLink[ i ].Down.length > 0 ){
					
					// Pour chacune de ces actions ———>
					for( var j = 0 ; j < KeyLink[ i ].Down.length ; j++ ){
						
						// Si elle n'est pas une action de boucle, lance cette action
						if( !KeyLink[ i ].Down[ j ].Boucle ){ eval( KeyLink[ i ].Down[ j ].Action ); }
					}
				}
			}
			
			
			// Si la touce n'a jamais été enregistrée, enregistre cette touche
			if( Clavier[ "KeyboardKey" + Key ] == null ){ Clavier[ "KeyboardKey" + Key ] = new Boolean( true ); 
			//
			// Sinon, la passe simplement à true
			} else { Clavier[ "KeyboardKey" + Key ] = true; }
			
			
			// Pour chaque Racourcie clavier ———>
			for( var i = 0 ; i < ShortKeyLink.length ; i++ ){
				
				// Si ce racourcie clavier est vérifié ———>
				if( Clavier[ "KeyboardKey" + ShortKeyLink[ i ].Key1 ] && Clavier[ "KeyboardKey" + ShortKeyLink[ i ].Key2 ] ){
					
					// Lance l'action du racourcie clavier
					eval( ShortKeyLink[ i ].Action );
				}
			}
		}
		
		
		// Pour chaque touche enregistrée ———>
		for( var i = 0 ; i < KeyLink.length ; i++ ){
			
			// S'il s'agit de la touche en question et qu'elle a des actions ———>
			if( KeyLink[ i ].Key == Key && KeyLink[ i ].Down.length > 0 ){
				
				// Pour chacune de ses actions ———>
				for( var j = 0 ; j < KeyLink[ i ].Down.length ; j++ ){
						
						// Si elle est une action de boucle, lance cette action
						if( KeyLink[ i ].Down[ j ].Boucle ){ eval( KeyLink[ i ].Down[ j ].Action ); }
					}
			}
		}
	}
	
	
	
	// Lors du relachement d'ne touche sur la scène ———>
	document.onkeyup = function( event ){
		
		// Récupére la touche
		var Key = ( event || window.event ).keyCode;
		
		// Fait passé à faux la valeur de cette touche
		Clavier[ "KeyboardKey" + Key ] = false; 
		
		// Pour chaque touche enregistrée ———>
		for( var i = 0 ; i < KeyLink.length ; i++ ){
			
			// S'il s'agit de la touche en question et qu'elle a des actions ———>
			if( KeyLink[ i ].Key == Key && KeyLink[ i ].Up.length > 0 ){
				
				// Pour chacune de ses actions ———>
				for( var j = 0 ; j < KeyLink[ i ].Up.length ; j++ ){
					
					// Lance cette action
					eval( KeyLink[ i ].Up[ j ].Action );
				}
			}
		}
	}
}



/* ———————————————————————————————————————————— */
/*												*/
/*			  		ADD KEY ACTION				*/
/*	Ajoute une action à une touche définie.	  	*/
/*												*/
/* ———————————————————————————————————————————— */

function AddKeyAction( Key ,		// ————> La touche
					   Action ,		// ————> L'action
					   Direction ,	// ————> La direction du lancement ("Down" ou "Up")
					   Boucle		// ————> Si l'action se fait en boucle lorsque la touche est appuyé ou une seul fois à chaque appuie
					  ){
	
	// Arguments par défaut
	Boucle = Boucle || false;
	Direction = Direction || Down;
	
	// Pour chaque touche enregistrée ————>
	for( var i = 0 ; i < KeyLink.length ; i++ ){
		
		// S'il s'agit de la touche en question, par le numero ou l'appelation ————>
		if( KeyLink[ i ].Key == Key || KeyLink[ i ].Nom == Key ){
			
			// Créait l'objet pour son action et insére son action et son état de boucle
			KeyLink[ i ][ Direction ][ KeyLink[ i ][ Direction ].length ] = new Object();
			KeyLink[ i ][ Direction ][ KeyLink[ i ][ Direction ].length - 1 ].Action = Action;
			KeyLink[ i ][ Direction ][ KeyLink[ i ][ Direction ].length - 1 ].Boucle = Boucle;
		}
	}
}



/* ———————————————————————————————————————————— */
/*												*/
/*			  		ADD SHORT KEY				*/
/*	Ajoute une action à un mélange de deux 	  	*/
/*	touches.									*/
/*												*/
/* ———————————————————————————————————————————— */

function AddShortKey( Key1 ,	// ————> La touche n°1
					  Key2 ,	// ————> La touche n°2
					  Action	// ————> L'action
					 ){
	
	// Pour chaque touche enregistrée ————>
	for( var i = 0 ; i < KeyLink.length ; i++ ){
		
		// Si c'est l'appellation qui a été rentré, la remplace par son numéro
		if( KeyLink[ i ].Nom == Key1 ){ Key1 = KeyLink[ i ].Key }
		if( KeyLink[ i ].Nom == Key2 ){ Key2 = KeyLink[ i ].Key }
	}
	
	// Création de l'objet pour ce racourcie
	ShortKeyLink[ ShortKeyLink.length ] = new Object();
	//
	// Insére les deux clés et l'action
	ShortKeyLink[ ShortKeyLink.length - 1 ].Key1 = Key1;
	ShortKeyLink[ ShortKeyLink.length - 1 ].Key2 = Key2;
	ShortKeyLink[ ShortKeyLink.length - 1 ].Action = Action;
}