/*************************************************************************************************
* Fichier js qui fournit des méthodes utilitaires pour la manipulation des listes de messages 
* d'erreurs des champs des formalaires.
**************************************************************************************************/

/**
* Méthode qui permet de valider les champs obligatoires d'un formulaire. 
* La liste des noms de ces champs obligatoires ainsi que les messages à afficher en cas d'erreurs
* sont fournis dans une liste qui a la forme suivante : 
* [		["message à afficher au début dans le cas d'un affichage de toutes les erreurs à la fois"]
		['nomChamp1'	, 'message à afficher si le champ1 est vide'],
*		['nomChamp2'	, 'message à afficher si le champ2 est vide'],
* 		['nomChampDate'	, 'message à afficher si le champDate est vide'
*						, 'message à afficher si la date dans le champ n'est pas une date'
*						, 'message à afficher si la date n'est pas supérieure à la date du jour'
*						]
* ];
* 
* Lorsque la validation se fait champ par champ (paramètre elementParElement=true), 
* et lors d'une erreur rencontrée dans un champs, un message d'erreur est affiché 
* et le focus est placé sur le champ qui est erronée.<br>
* Lorsque la validation se fait pour tout le formulaire (paramètre elementParElement=false)
* tous les messages d'erreurs sont cumulés et une seule boîte de dialogue est affichée à la fin.
* 
* Les cas gérés sont les suivants : 
* Pour les champ de type 'text' et 'textArea': test si le champ est vide sinon affichage de message d'erreur
* Pour les champs 'checkbox' : test si le checkbox est à true, sinon erreur 
* Pour les champs 'select-one' : test si la valeur sélectionnée est différente de 'selectionner' sinon message d'erreur
*
* @param  formulaire 
*			le formulaire à valider
* @param  messagesList 
* 			la liste des messages d'erreurs correspondant à ce formulaire
* @param elementParElement 
*			indique si les erreurs des éléments manquants seront affichés élement par élément ou sur
*			une seule boite de dialogue.
* @param caractereDebutLigne 
*			caractère de début de ligne dans le cas où l'affichage des erreurs se fait pour tous les 
* 			champs dans une seule boîte de dialogue. 
*  
* @return true si tout le formulaire a été validé avec succès et false sinon.
*/
function validerFormulaire(formulaire, messagesList, elementParElement, caractereDebutLigne){	
	var longueur = formulaire.length;
	var formulaireValide = true;	
	var messageAAfficher;
	
	if(!elementParElement)
		messageAAfficher = messagesList[0][0];
	
	// passage par tous le champs	
	for(i=0 ; i<longueur && (!elementParElement || formulaireValide) ; i++){ 	
	
		// récupération des informations de l'élément courant	
		element = formulaire.elements[i];
		nameElement = element.name;
		// récupération des messages de l'élément dans la liste
		messages = getMessagesFor(nameElement, messagesList);			
		messagesLength = messages.length;
		
		// Tester si le champ est vide, non coché ou pas de sélection, selon le type du champ
		messageVide = messages[1];
		if(messagesLength  >= 2) {
			if (!isElementValide(element)){					
				formulaireValide = false;
				if(elementParElement)
					messageAAfficher = messageVide;
				else 
					messageAAfficher = messageAAfficher + "\n" + caractereDebutLigne + messageVide;
			}
		}

		// Tester si la date est valide ou non dans le cas où un message d'erreur existe
		if(messagesLength >= 3 && (!elementParElement || formulaireValide)){ 
			messageDateNonValide = messages[2];
			if(!isDate(element.value)){				
				formulaireValide = false;
				if(elementParElement)
					messageAAfficher = messageDateNonValide;	
				else 
					messageAAfficher = messageAAfficher + "\n" + caractereDebutLigne + messageDateNonValide;			
			}			
		} 
		
		// Tester si la date est supérieure à la date du jour ou non 
		// selon si un message d'erreur existe ou non
		if(messagesLength >= 4 && (!elementParElement || formulaireValide)){ 	
			messageDateNouvelle = messages[3];
			if(!estSuperieureEgaleADateJour(element.value)){
				formulaireValide = false;
				if(elementParElement)
					messageAAfficher = messageDateNouvelle;
				else 
					messageAAfficher = messageAAfficher + "\n" + caractereDebutLigne + messageDateNouvelle;			
			}			
		}
		
		// Affichage du message d'erreur
		if(!formulaireValide && elementParElement){
			element.focus();
			alert(messageAAfficher);			
		}
	}
	
	if(!formulaireValide && ! elementParElement)			
		alert(messageAAfficher);			
	
	return formulaireValide; 
}

/**
* Méthode à utiliser pour valider les formulaires élément par élement.<b>
* Lors d'une erreur rencontrée dans un champs, un message d'erreur est affiché 
* et le focus est placé sur le champ qui est erronée.<br>
*
* @param  formulaire 
*			le formulaire à valider
* @param  messagesList 
* 			la liste des messages d'erreurs correspondant à ce formulaire
*
* @return true si tout le formulaire a été validé avec succès et false sinon. 
*/
function validerElementsFormulaire(formulaire, messagesList){	
	return validerFormulaire(formulaire, messagesList, true, '');
}

/**
* Méthode à utiliser pour valider les champs d'un formulaire à la fois.
* Un message d'erreur est affiché à la fin indiquant toutes les erreurs rencontrées 
* au cours du passage sur les champs.
*
* @param  formulaire 
*			le formulaire à valider
* @param  messagesList 
* 			la liste des messages d'erreurs correspondant à ce formulaire
*
* @param caractereDebutLigne 
*			caractère de début de ligne de chaque message relatif à un champ erroné
*  
* @return true si tout le formulaire a été validé avec succès et false sinon.
*/
function validerToutFormulaire(formulaire, messagesList, caractereDebutLigne){	
	return validerFormulaire(formulaire, messagesList, false, caractereDebutLigne);
}


/**
* Teste si un élement est valide selon son type 
* Un élement est valide lorsqu'il : 
* - n'est pas vide s'il s'agit d'un champ 
* - il est coché lorsqu'il s'agit d'un checkbox 
* - il y a une valeur non vide sélectionné dans le cas d'une liste
* 
*/
function isElementValide(element){
	elementValide = true;
	typeElement = element.type;
	switch(typeElement){
		 case 'text' :  
		 	if(element.value=='')
		 		elementValide = false;				 				 						 	
	     	break; 
	     
	     case 'password' :  
		 	if(element.value=='')
		 		elementValide = false;				 				 						 	
	     	break;
	     	    
	     case 'checkbox' : 
		 	if(element.checked==false) 
		 		elementValide = false;				 	
		    break; 

	     case 'select-one' : 
		 	if(element.value =='selectionner' || element.value=='')
		 		elementValide = false;				 	
	     	break; 
	     
	     case 'textarea' : 
		 	if(element.value=='')
		 		elementValide = false;
	     	break; 			   
	}
	
	return elementValide;
}

/**
* Retourne toute la liste des messages d'erreurs relatifs à un champ dont le nom 
* est fournit en paramètre. 
* 
* @param nomChamp nom du champ 
* @param nomListe nom de la liste de tous les messages du formulaire contenant le champ
* 
* @return la liste des messages d'erreurs correspondant à ce champ, et une liste vide 
* 	si le champ est introuvable
*/ 
function getMessagesFor(nomChamp, nomListe){
	trouve = false;
	sousListe = [];
	for(j=0; j<nomListe.length && !trouve; j++){
		sousListe = nomListe[j];
		if(sousListe[0]== nomChamp){
			return sousListe;			
		}	
	}
	sousListe=[];
	return sousListe;
}

/**
* Retourne le message d'erreur à afficher si un champ est vide.
* 
* @param nomChamp nom du champ 
* @param nomListe nom de la liste de tous les messages du formulaire contenant le champ
* 
* @return le message d'erreur à afficher si un champ est vide.
*/ 
function getMessageVideFor(nomChamp, nomListe){
	messages = getMessagesFor(nomChamp, nomListe);			
	messagesLength = messages.length;
	videMessage ='';
	if(messagesLength>=2)
		videMessage	= messages[1];
		
	return videMessage;
}
