/* ———————————————————————————————————————————————————————————————————— */
/*																		*/
/*						  		Glossaire	  							*/
/*					  Dernière Mise à Jour : 09-03-18					*/
/*																		*/
/*	Relié à une base de donnée, rend certains mots accecibles avec des	*/
/*	définitions et permet d'uploader d'autres définitions.				*/
/*																		*/
/* ———————————————————————————————————————————————————————————————————— */




/* ———————————————————————————————————————————— */
/*												*/
/*					 VARIABLES					*/
/*												*/
/* ———————————————————————————————————————————— */

// Les mots du Glossaire
var Mots = [];
//
// Le nombre maximal de mot dans le petit cartouche de définition
var MaxBloc = 0;
//
// La couleur des mots ayant des définitions
var Couleur = "";




/* ———————————————————————————————————————————— */
/*												*/
/*			 GLOSSAIRE INITIALISATION			*/
/*		Fonction appelée depuis la scène. 		*/
/*	Elle initilise les éléments et mes en place	*/
/*	les mots du glossaire.						*/
/*												*/
/* ———————————————————————————————————————————— */

function GlossaireInitialisation( TableauxMots ,	// ————> Le tableaux contenant les mots et définitions du glossaire
								  Contenu ,			// ————> Les divs prises en compte pour l'affichage glossaire
								  laCouleur ,		// ————> La couleur des mots ayant des définitions
								  Bloc ,			// ————> Le Style du cartouche de courte définition
								  BlocMax ,			// ————> Le nombre maximal de caractère dans le cartouche de courte définition
								  Fenetre ,			// ————> Le style de la fenètre de longue définition
								  Bouton ,			// ————> Le style du bouton de la fenètre de longue définition
								  Reglages			// ————> Reglages
								 ){
	
	
	/**************************/
	/** 	  DEFAUTS 		 **/
	/**************************/
	//
	laCouleur = laCouleur || "#000099";
	//
	Reglages = Reglages || new Object();
	//
	Reglages.DecalageXInfoBulleIE = Reglages.DecalageXInfoBulleIE || 10;
	Reglages.DecalageYInfoBulleIE = Reglages.DecalageYInfoBulleIE || 10;
  	//
	Bloc = Bloc || [ 
						"backgroundImage='url(../Images/Bloc.png)'" ,
						"width='185px'" ,
						"height='122px'" ,
						"color='#000066'"
				  	];
  	//
	BlocMax = BlocMax || 100;
	//
  	Fenetre = Fenetre || [ "backgroundImage='url(../Images/Fenetre.png)'" ];
  	//
	Bouton = Bouton || [
							"backgroundImage='url(../Images/BoutonX.png)'" ,
							"width='37px'" ,
							"height='34px'"
						];
	
	
	
	
	/**************************/
	/** 	 VARIABLES 		 **/
	/**************************/
	
	// Récupération du tableau des mots
	Mots = TableauxMots;
	
	// Récupération du nombre maximal de caractère dans la description courte
	MaxBloc = BlocMax;
	
	// Récupération de la couleur des mots ayant une définition
	Couleur = laCouleur;
	
	
	
	/**************************/
	/** 	  INITIALS 		 **/
	/**************************/
	
	// Connection du port de la souris
	connectionMousePort( "GlossaireMouse" );
	
	
	
	
	/**************************/
	/** 	  ELEMENTS 		 **/
	/**************************/
	
	
	// ————> INFO-BULLE DESCRIPTION COURTE
	//
	// Création de la div de l'infobulle
	creationDiv( 0 , 0 , "" , 
				  Fusion( [ 
							"position='absolute'" ,
							"display='none'"
						  ] , 
						 Bloc ) ,
				  [] ,
				  "GlossaireInfoBulle" ,
				  99
				);
	//
	// Création de la div du texte de l'infobulle
	creationDiv( 0 , 0 , "Test" , 
				 [ "paddingLeft='10px'" ,
				   "paddingRight='10px'" , 
				   "paddingTop='10px'" 
				 ] ,
				 [] ,
				 "GlossaireInfoBulle_Texte" ,
				 1 ,
				 $( "GlossaireInfoBulle" )
				);
	
	
	// ————> FENÊTRE DESCRIPTION LONGUE
	//
	// Création de la div de la fenêtre
	creationDiv( 0 , 0 , "" , 
				 [
					"position='absolute'" ,
					"left='0px'" ,
					"right='0px'" ,
					"display='none'"
				 ],
				 [] ,
				 "GlossaireFenetre" ,
				 100
				);
	//
	// Création de la div du texte de la fenêtre
	creationDiv( 0 , 0 , "" , 
				 Fusion( [ 
						  	"width='" + ( getLargeurEcran() - 80 ) + "px'" ,
							"paddingLeft='20px'" ,
							"paddingRight='40px'" ,
							"paddingTop='10px'" ,
							"paddingBottom='20px'"
						  ] 
						, Fenetre ) ,
				 [] ,
				 "GlossaireFenetre_Texte" ,
				 1 ,
				 $( "GlossaireFenetre" )
				);
	//
	// Création du bouton de fermeture de la fenêtre
	IncrustationBouton( "GlossaireFenetreBouton" , 
						"Simple" ,
						getLargeurEcran() - 37 - 30 ,
						10 ,
						2 ,
						3 ,
						"" ,
						{
							General : Bouton
						} ,
						{ onmousedown : "FermeFenetreGlossaire()" } ,
						$( "GlossaireFenetre" )
						)
	
	
	
	
	
	/**************************/
	/**     COMPORTEMENT 	 **/
	/**************************/
	
	// Donne à l'info-bulle la fonction pour se placer sur la souris ————> 
	$( "GlossaireInfoBulle" ).PositionnementSouris = function(){
		
		// Elle se place sur la souris
		PositionDiv( this , GlossaireMouseX + 10 , GlossaireMouseY + 10 );
		
		// Pour IE...
		if( GimmeNavigator() == "IE" ){
			
			// Positionne en Y avec une multiplication équivalent au pourcentage de réduction
			PositionDiv( this , GlossaireMouseX + Reglages.DecalageXInfoBulleIE , ( GlossaireMouseY + Reglages.DecalageYInfoBulleIE ) - document.documentElement.scrollTop);
		}
	}
	
	// Donne une boucle pour cette fonction à l'info-bulle
	addEnterFrame( $( "GlossaireInfoBulle" ) , "PositionnementSouris_Boucle" , "PositionnementSouris" , 0.1 );
	
	
	
	
	/**************************/
	/**    ETAPE SUIVANTE 	 **/
	/**************************/
	
	// Pour chaque div à vérifier ————> 
	for( var i = 0 ; i < Contenu.length ; i++ ){
		
		// Vérifie puis change son contenu pour ajouter la liaison au Glossaire
		Contenu[ i ].innerHTML = VerificationGlossaire( Contenu[ i ].innerHTML );
	}
}




/* ———————————————————————————————————————————— */
/*												*/
/*			 GLOSSAIRE  ACTIVATION				*/
/*		Fonction appelée depuis la scène. 		*/
/*	Elle applique le glossaire sur une nouvelle	*/
/*	div.										*/
/*												*/
/* ———————————————————————————————————————————— */

function GlossaireActivation( Contenu ,		// ————> Les divs prises en compte pour l'affichage glossaire
							  TableauxMots	// ————> Le tableaux contenant les mots et définitions du glossaire
							 ){
	
	/**************************/
	/** 	 VARIABLES 		 **/
	/**************************/
	
	// Récupération du tableau des mots
	Mots = TableauxMots;
	
	
	/**************************/
	/**    ETAPE SUIVANTE 	 **/
	/**************************/
	
	// Pour chaque div à vérifier ————> 
	for( var i = 0 ; i < Contenu.length ; i++ ){
		
		// Vérifie puis change son contenu pour ajouter la liaison au Glossaire
		Contenu[ i ].innerHTML = VerificationGlossaire( Contenu[ i ].innerHTML );
	}
}




/* ———————————————————————————————————————————— */
/*												*/
/*			   VERIFICATION GLOSSAIRE			*/
/*	Fonction vérifiant les mots d'une div par	*/
/*	rapport à ceux du glossaire pour les relier	*/
/*												*/
/* ———————————————————————————————————————————— */

function VerificationGlossaire( Texte ){
	
	// Pour chaque mot du glossaire ————> 
	for( var j = 0 ; j < Mots.length ; j++ ){
		
		// Il est en minuscules
		Mots[ j ].Mot = Mots[ j ].Mot.toLowerCase();
		
		// Par 2 ————> 
		for( var k = 0 ; k < 2 ; k++ ){
			
			// Récupère le mot du glossaire une fois en minuscule et une fois avec une majuscule à la première lettre
			var leMot = ( k == 0 ) ? Mots[ j ].Mot : MajLigne( Mots[ j ].Mot );
			
			// S'il y a suffisamment de mots dans la div ————> 
			if( Texte.split( leMot ).length > 1 ){
				
				// Coupe tout les mots
				var TransitionTexte = Texte.split( leMot );
				
				// Pour chaque partie coupée ————>
				for( var l = 0 ; l < TransitionTexte.length - 1 ; l++ ){
					
					// Convertie la chaine
					var TransitionTexteTest = TransitionTexte[ l ].split( "" );
					var TransitionNextTexteTest = TransitionTexte[ l + 1 ].split( "" );
					
					// S'il n'y a pas trop de caractère avant et après le mot
					if( TransitionTexteTest[ TransitionTexteTest.length - 1 ] == " " || TransitionTexteTest[ TransitionTexteTest.length - 1 ] == "-" 
					 || TransitionTexteTest[ TransitionTexteTest.length - 2 ] == " " || TransitionTexteTest[ TransitionTexteTest.length - 2 ] == "-" 
					 || TransitionTexteTest[ TransitionTexteTest.length - 3 ] == " " || TransitionTexteTest[ TransitionTexteTest.length - 3 ] == "-"  ){
						//
						//
						if( TransitionNextTexteTest[ 0 ] == " " || TransitionNextTexteTest[ 0 ] == "-" 
						 || TransitionNextTexteTest[ 1 ] == " " || TransitionNextTexteTest[ 1 ] == "-" 
						 || TransitionNextTexteTest[ 2 ] == " " || TransitionNextTexteTest[ 2 ] == "-" ){
						
							// Rajoute le mot en question du glossaire
							TransitionTexte[ l ] += GlossaireMotBalise( Mots[ j ].Description , Mots[ j ].DescriptionLongue );
							TransitionTexte[ l + 1 ] = "</a>" + TransitionTexte[ l + 1 ];
						}
					}
				}
				
				// S'il s'agit du mot en question sur le glossaire, passe par la méthode "GlossaireMotBalise" pour rajouter sa balise de liaison au glossaire
				Texte = TransitionTexte.join( leMot );
			}
		}
	}
	
	// Renvoie le nouveau contenu de la div
	return Texte;
}




/* ———————————————————————————————————————————— */
/*												*/
/*			   GLOSSAIRE MOT BALISE				*/
/*	Fonction donnant la balise de liaison		*/
/*	info-bulle à un mot.						*/
/*												*/
/* ———————————————————————————————————————————— */

function GlossaireMotBalise( Description , 		// ————> La Description courte
							 DescriptionLongue 	// ————> La Description longue
							){
	
	// Début de balise
	var Sortie = "<a ";
	
	// Événement d'ouverture de l'info-bulle au roll over
	Sortie += "onmouseover='OuvreGlossaire( \"" + Encrypte( Description ) + "\" , \"" + Encrypte( DescriptionLongue ) + "\" )' ";
	//
	// Événement de fermeture de l'info-bulle au roll out
	Sortie += "onmouseout='FermeGlossaire()' ";
	
	
	// S'il y a une description longue ————> 
	if( DescriptionLongue ){
		
		// Événement d'ouverture de la fenètre au mouse down
		Sortie += "onmousedown='OuvreFenetreGlossaire( \"" + Encrypte( DescriptionLongue ) + "\" )' ";
	}
	
	
	// Ouvre la partie des styles et donne la couleur
	Sortie += "style='color:" + Couleur + "; ";
	
	// S'il y a une description longue, donne le pointeur de la main
	if( DescriptionLongue ){ Sortie += "cursor:pointer; "; }
	
	// Ferme la partie des styles
	Sortie += "'";
	
	// Ferme la balise
	Sortie += ">"
	

	// Renvoie le tout
	return Sortie;
}




/* ———————————————————————————————————————————— */
/*												*/
/*			  OUVRE/FERME INFO-BULLE			*/
/*	Fonction ouvrant ou fermant l'info-bulle.	*/
/*												*/
/* ———————————————————————————————————————————— */

// ————> OUVRE
//
function OuvreGlossaire( Description ,		// ————> La description courte
						 DescriptionLongue	// ————> La description longue
						){
	
	// Fait apparaître l'info-bulle
	$( "GlossaireInfoBulle" ).style.display = "block";
	
	// Donne le texte de description courte à l'info-bulle
	$( "GlossaireInfoBulle_Texte" ).innerHTML = TexteInterrompue( Encrypte( Description , false ) , MaxBloc , "..." ) 
	//
	// Plus le message pour plus de précision s'il y a une description longue
	+ ( ( DescriptionLongue != "undefined" ) ? "<div style='font-size:12px ; margin-top:5px' ><u>Cliquez pour plus de precision</u></div>" : "" );
}

// ————> FERME
//
function FermeGlossaire(){
	
	// Fait disparaître l'info-bulle
	$( "GlossaireInfoBulle" ).style.display = "none";
}




/* ———————————————————————————————————————————— */
/*												*/
/*			  OUVRE/FERME FENÊTRE				*/
/*	Fonction ouvrant ou fermant la fenêtre.		*/
/*												*/
/* ———————————————————————————————————————————— */

// ————> OUVRE
//
function OuvreFenetreGlossaire( Description ){
	
	// Si la description à mettre n'est pas déjà celle de la fenêtre ————> 
	if( Encrypte( $( "GlossaireFenetre_Texte" ).innerHTML ) != Description ){
		
		// Fait apparaître la fenêtre
		$( "GlossaireFenetre" ).style.display = "block";
		
		// Mes le contenu de la description
		$( "GlossaireFenetre_Texte" ).innerHTML = Encrypte( Description , false );
		
		// Place la fenêtre en haut de l'écran concernant le niveau de l'ascenseur
		$( "GlossaireFenetre" ).style.top = ( document.body.scrollTop || document.documentElement.scrollTop ) + "px";
	
	
	// Si la description à mettre est celle de la fenêtre ————> 
	} else {
		
		// Ferme la fenêtre
		FermeFenetreGlossaire();
	}
}

// ————> FERME
//
function FermeFenetreGlossaire(){
	
	// Fait disparaîte la fenêtre
	$( "GlossaireFenetre" ).style.display = "none";
	
	// Retire son contenu
	$( "GlossaireFenetre_Texte" ).innerHTML = "";
}




/* ———————————————————————————————————————————— */
/*												*/
/*		 GLOSSAIRE INITIALISATION ADMIN			*/
/*		Fonction appelée depuis la scène. 		*/
/*	Elle initilise les éléments relatifs à la	*/
/*	partie admin du glossaire.					*/
/*												*/
/* ———————————————————————————————————————————— */

function GlossaireInitialisationAdmin( EtatAdmin ,	// ————> Si on est connecté en admin ou pas
									   Bloc ,		// ————> Le style du bloc d'ajout de mot au glossaire
									   Formulaire ,	// ————> Le style des zones de saisies
									   BoutonX ,	// ————> Le style du bouton Annuler
									   BoutonOk		// ————> Le style du bouton Ok
									  ){
	
	
	/**************************/
	/** 	  DEFAUTS 		 **/
	/**************************/
	//
	Bloc = Bloc || [ 
						"backgroundImage='url(../Images/AdminBloc.png)'" ,
						"color='#000066'"
				   ];
	//
	Formulaire = Formulaire || [ "color='#000066'" ];
	//
	BoutonX = BoutonX || [
							"backgroundImage='url(../Images/BoutonX.png)'" ,
							"width='37px'" ,
							"height='34px'"
						  ];
	//
	BoutonOk = BoutonOk || [
							 "backgroundImage='url(../Images/BoutonOk.png)'" ,
							 "width='37px'" ,
							 "height='34px'"
						   ];
	
	
	
	// Si on est connecté en admin ————> 
	if( EtatAdmin ){
		
	
	
		/**************************/
		/** 	  INITIALS 		 **/
		/**************************/
		
		// Connecte le clavier
		connectionKeyboardPort( "GlossaireKeyboard" );
		//
		// Définie la touche racourcie MAJ + G
		AddShortKey( "MAJ" , "G" , "OuvertureAdminGlossaire( RecuperationSelection() )" );
		
	
	
		/**************************/
		/** 	  ELEMENTS 		 **/
		/**************************/
		
		// Création de la div d'ajout de mot
		creationDiv( 0 , 0 , "" , 
					 Fusion( [ 
							  	"width='369px'" ,
								"height='277px'" ,
								"display='none'" ,
								"paddingLeft='20px'" ,
								"paddingTop='10px'"
							  ] , 
							Bloc ) ,
					 [] ,
					 "AdminGlossaire" ,
					 101
					);
		//
		// Création de la div du texte
		$( "AdminGlossaire" ).innerHTML = "<div id='AdminGlossaire_Texte' style='margin-bottom:10px' ></div>"
		//
		// Création des deux zones de saisies
		$( "AdminGlossaire" ).innerHTML += "<textarea "
										+ "onclick = \"if(this.value == 'Explication courte...' ){ this.value = ''; }\" "
										+ "style='height:50px;width:349px;margin-bottom:10px' "
										+ "type='text' name='textfield' id='ExplicationCourte' value='Explication courte...' />";
		$( "AdminGlossaire" ).innerHTML += "<textarea "
										+ "onclick = \"if(this.value == 'Explication longue...' ){ this.value = ''; }\" "
										+ "style='height:125px;width:349px' "
										+ "type='text' name='textfield' id='ExplicationLongue' value='Explication longue...' />";
		//
		// Donne aux zones de saisie leurs styles
		applyStyle( $( "ExplicationCourte" ) , Formulaire );
		applyStyle( $( "ExplicationLongue" ) , Formulaire );
		//
		// Création du bouton d'annulation
		IncrustationBouton( "AdminAnnuleGlossaire" , 
							"Simple" ,
							300 ,
							240 ,
							2 ,
							3 ,
							"" ,
							{ General : BoutonX } ,
							{ onmousedown : "GlossaireAnnule()" } ,
							$( "AdminGlossaire" )
							)
		//
		// Création du bouton d'envoie
		IncrustationBouton( "AdminEnvoieGlossaire" , 
							"Simple" ,
							340 ,
							240 ,
							2 ,
							3 ,
							"" ,
							{ General : BoutonOk } ,
							{ onmousedown : "GlossaireEnvoie()" } ,
							$( "AdminGlossaire" )
							)
	}
}




/* ———————————————————————————————————————————— */
/*												*/
/*		 	OUVERTURE ADMIN GLOSSAIRE			*/
/*	Ouvre la partie Admin d'ajout de mots.		*/
/*												*/
/* ———————————————————————————————————————————— */

function OuvertureAdminGlossaire( Mot ){
	
	// Retire les espaces en trop
	Mot = Mot.split( " " );
	//
	if( Mot[ 0 ] == "" ){ Mot.splice( 0 , 1 ); }
	if( Mot[ Mot.length - 1 ] == "" ){ Mot.splice( Mot.length - 1 , 1 ); }
	//
	Mot = Mot.join( " " );
	
	// Textes des explications
	var ExplicationCourte = "Explication courte...";
	var ExplicationLongue = "Explication longue...";
	
	// Si le mot en question n'est pas le même que celui en court ————> 
	if( getStyle( $( "AdminGlossaire" ) , "display" ) == "none" || $( "AdminGlossaire" ).Mot != Mot ){
		
		// Si ce mot éxiste correctement ————> 
		if( Mot != "" && Mot != " " && Mot != "undefined" && Mot != null ){
			
			// Pour chaque mot du glossaire ————> 
			for( var j = 0 ; j < Mots.length ; j++ ){
				
				// S'il s'agit du même mot ————>
				if( Mots[ j ].Mot.toLowerCase() == Mot.toLowerCase() ){
					
					// Redonne les mêmes explications
					ExplicationLongue = Mots[ j ].DescriptionLongue || "Explication longue...";
					ExplicationCourte = Mots[ j ].Description;
				}
			}
			
			
			// Modifie le texte de la div
			$( "AdminGlossaire_Texte" ).innerHTML = "<b>Ajouter \"" + TexteInterrompue( Mot , 20 , "[...]" ) + "\" au glossaire.</b>";
			
			
			// Place la div au centre de l'écran ————> 
			//
			if( document.body.scrollTop ){ // ————> Pour un bon navigateur
				
				$( "AdminGlossaire" ).style.top = ( window.innerHeight / 2 + document.body.scrollTop - 200 ) + "px";
				$( "AdminGlossaire" ).style.left = ( window.innerWidth / 2 + document.body.scrollLeft - 200 ) + "px";
				
			} else { // ————> Pour IE...
				
				$( "AdminGlossaire" ).style.top = ( document.documentElement.clientHeight / 2 + document.documentElement.scrollTop - 200 ) + "px";
				$( "AdminGlossaire" ).style.left = ( document.documentElement.clientWidth / 2 + document.documentElement.scrollLeft - 200 ) + "px";
			}
			
			
			// Fait apparaître la div
			$( "AdminGlossaire" ).style.display = "block";
			
			// Donne le mot à la div
			$( "AdminGlossaire" ).Mot = Mot;
			
			// Donne les valeurs par défauts aux zones de saisies
			$( "ExplicationCourte" ).value = ExplicationCourte;
			$( "ExplicationLongue" ).value = ExplicationLongue;
		}
		
		
	// Si le mot en question est le même que celui en court ————> 
	} else {
		
		// Ferme le bloc d'envoie de nouveau mot
		GlossaireAnnule();
	}
}



/* ———————————————————————————————————————————— */
/*												*/
/*		 		 GLOSSAIRE ENVOIE				*/
/*	Envoie le mot et ses descriptions à la BDD.	*/
/*												*/
/* ———————————————————————————————————————————— */

function GlossaireEnvoie(){
	
	// Si la description courte est remplie un minimum ————> 
	if( $( "ExplicationCourte" ).value != "undefined" && $( "ExplicationCourte" ).value != "" && $( "ExplicationCourte" ).value != "Explication courte..." ){
		
		// Cache la div d'ajout de mot
		$( "AdminGlossaire" ).style.display = "none";
		
		// Si la valeur de l'explication longue est remplie un minimum ————> 
		if( $( "ExplicationLongue" ).value != null
		 && $( "ExplicationLongue" ).value != ""
		 && $( "ExplicationLongue" ).value != "Explication longue..."
		){
			
			// Envoie les valeurs avec l'explication longue
			Glossaire_AdminEnvoie_AvecDescriptionLongue( $( "AdminGlossaire" ).Mot ,
														 $( "ExplicationCourte" ).value ,
														 $( "ExplicationLongue" ).value
													   );
		
		// Si la valeur de l'explication longue n'est pas remplie ————> 
		} else {
			
			// Envoie les valeurs sans l'explication longue
			Glossaire_AdminEnvoie_SansDescriptionLongue( $( "AdminGlossaire" ).Mot ,
														 $( "ExplicationCourte" ).value
													   );
		}
	
	// Si la description courte n'est pas remplie correctement ————> 
	} else {
		
		// Alerte l'utilisateur
		alert( "Vous n'avez pas mis d'explication courte." );
	}
}

// ————> ANNULE
//
function GlossaireAnnule(){
	
	// Cache la div d'ajout
	$( "AdminGlossaire" ).style.display = "none";
}