// ######################################################################################################################################
// FONCTIONS ET DECLARATION DE BASE - FormControl v2 (11/02/2002)
// version modifiée (LBaccess/QI jeu)
// ######################################################################################################################################

//Tableau des types de donnée 
dataType = new Array ("non-contrôlé" ,"date", "chaîne", "numérique", "email", "pass", "liste de choix" );

//Tableau bi-dimensionnel listant pour chaque type de données les libellés des propriétés additionnelles
propList = new Array ([],
		      ["postdate", "format"],
		      ["mini","maxi","format"],
		      ["notnul", "negatif"],
		      [],
			  ["mini", "maxi"],
			  []);

function formCtrl(type, lib, requis, properties) {
	//Propriétés
	this._type=type;
	this.lib=lib;
	this.requis=requis;
	this.properties=properties;
	//Méthodes
	this.dispObj=displayObj;
	this.dispObj2=displayTabObj;
}

//Méthode de l'objet formCtrl pour l'affichage des données en mode texte --> alert()
function displayObj() {
   var result="champ '"+ this.lib +"' de type "+ dataType[this._type] +" - propriétés : ";
   for (propID=0; propID<propList[this._type].length; propID++) {
	result += "[" + propList[this._type][propID] + ":" + this.properties[propID] + "] ";
   }
   return(result + "\n");
}

//Méthode de l'objet formCtrl pour l'affichage des données en tableau
function displayTabObj() {
   var result= dataType[this._type] +"</td><td>'<i>"+ this.lib +"</i>'</td><td>"+ this.requis +"</td><td>";
   for (propID=0; propID<propList[this._type].length; propID++) {
	result += "<font color=orange>" + propList[this._type][propID] + "</font>:";
    	result += "[<font color=green>" + this.properties[propID] + "</font>] ";
   }
   document.writeln(result + "<br>");
}

// ######################################################################################################################################
// FONCTIONS DE CONTRÔLE	-> source formCtrl v1.0
// ######################################################################################################################################

function checkdate(date2chk, libelle, requis, postdate, DtFormat){
//	alert ("CONTROLE DATE\ndate2chk:"+ date2chk +"   libelle :"+ libelle +"   requis :"+ requis +"   postdate :"+ postdate +"   DtFormat :"+ DtFormat);
	//Liste des message d'alerte
	msg = "Erreur sur le champ " + libelle + " :\n-------------------------------------------------------------------------------   \n\n";
	msg_year4 = msg + "L'année doit comporter quatre caractères.";
	msg_futur = msg + "Vous ne pouvez pas saisir une date future.";
	msg_format = msg + "Mauvais format de date.\nFormat : " + DtFormat;
	msg_mask = msg + "Ce masque de saisie n'est pas géré. (" + DtFormat +")";
	msg_syntax = msg + "Erreur de syntaxe."
	msg_requis = msg + "Une date est requise.\nFormat : " + DtFormat;

	datearray = date2chk.split("/");

	if (date2chk!=""){	//Si la date est saisie 
		switch (DtFormat) {
		case "aaaa" :		// On ne saisit que l'année
			if (!isNaN(date2chk)) {
				if (date2chk.length!=4) {
					alert (msg_year4);
					return false;
				}
				if (postdate==false) {	// Si on ne veut restreindre la saisie aux dates antérieures
					tempdate= new Date();
					if (date2chk>tempdate.getFullYear()) {
						alert (msg_futur);
						return false;
					}
				}
				return date2chk;	//Tout est OK, on renvoie la valeur telle quelle
			} else {
					alert(msg_syntax);
					return false;
			}
			break;

		case "jj/mm/aaaa" :			// La totale
			if ((datearray[0]) && (datearray[1]) && (datearray[2]))	{
				Dday=datearray[0];
				Dmonth=datearray[1];
				Dyear=datearray[2];
				if ((!isNaN(Dday)) && (!isNaN(Dmonth)) && (!isNaN(Dyear)))	{
					if (Dyear.length!=4) {
						alert (msg_year4);
						return false;
					}
					if ((Dmonth>0) && (Dmonth<13)) {	// contrôle du nb de jours
						Tmonth = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
						if (Dday>Tmonth[Dmonth-1]) {
							//contrôle de l'année bissextile
							if (!((Dmonth==2 && Dday==29) && (Dyear%4 == 0 && Dyear%100 !=0 || Dyear%400 == 0))) { 
								alert(msg_format);
								return false;
							}
						}
					}
					if ((Dday==0) || (Dday>31) || (Dmonth==0) || (Dmonth>12)) {
						alert(msg_format);
						return false;
					}
					if (postdate==false) {	// Si on ne veut restreindre la saisie aux dates antérieures
						tempdate= new Date(Dyear, Dmonth-1, Dday)
						if (Date.parse(tempdate)>Date.parse(Date())) {
							alert (msg_futur);
							return false;
						}
					}	
				} else {
					alert(msg_syntax);
					return false;
				}
				return date2chk;
			} else {
				alert(msg_format);
				return false;
			}
			break;
		  default :
			alert(msg_mask);
			return false;
			break;
		}
	} else {
		if (requis==true) {	// Le champ est vide (else) mais requis
			alert(msg_requis);
			return false;
		} else {
			return "#void";	// Le champ est vide mais non requis : on renvoie #void pour signaler le vide toléré.
		}
	}
}

function checkstring(string2chk, libelle, requis, mini, maxi, format){
	
	var longueur = string2chk.length;
	
	//Variables pour Expressions régulières
//	var strChar = "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789àâäéèëêùüûöôç\\'\\ \\_\\-\\+]";
	var strChar = "[a-zA-Z0-9àâäéèëêùüûöôç()\\'\\ \\_\\-\\+]";
		
	//Liste des message d'alerte
	var msg = "Erreur sur le champ " + libelle + " :\n___________________________________________  \n\n";
	var msg_requis = msg + "Le champ doit etre rempli.";
	var msg_mini = msg + "Le champ doit contenir au minimum " + mini + " caractères.";	
	var msg_maxi = msg + "Le champ ne doit contenir plus de " + maxi + " caractères.";
	var msg_incorrect = msg + "Le champ doit etre rempli correctement.";

if ((string2chk==false)&&(requis==false)){						
	return "#void";	// Le champ est vide mais non requis : on renvoie #void pour signaler le vide toléré.							
}else{		
	if ((string2chk==false)&&(requis==true)){
				alert(msg_requis);
				return false;						
	}else{	
			if(longueur < mini){
				alert(msg_mini);
				return false;
			}else{
					if (longueur > maxi ){
						alert(msg_maxi);
						return false;		
					}else{
							if (format != "pseudo"){
								var regChar = new RegExp(strChar);
									for (ch=0;ch<longueur;ch++){
							
										if (!regChar.test(string2chk.charAt(ch))){ 
											var msg = msg_incorrect + " Caractère " + (ch+1);
											alert(msg + "\n___________________________________________  \n\nCaractères autorisés :\n\n" + strChar);
											return false;
										}																											
									}
						  	}
							
							//Doublement des apostrophes pour éviter les ruptures de chaines
							stringTmp=string2chk.split("''");	//première étape : on réduit les doubles apostrophes (issus d'un contrôle précédent non-validé) en simple apostrophe
							stringTmp=stringTmp.join("'");
												
							stringTmp=stringTmp.split("'");
							string2chk=stringTmp.join("''"); 	// HTML &apos; - ASCII &#39;
							return (string2chk);													 										
					} 																			
			}				
	}			
}
}//FIN DE FONCTION

function checkpass(pass2chk, libelle, requis, mini, maxi){
	
	var longueur = pass2chk.length;
	
	//Variables pour Expressions régulières
	var strChar = "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\\_\\-]";
		
	//Liste des message d'alerte
	var msg = "Erreur sur le champ " + libelle + " :\n___________________________________________  \n\n";
	var msg_requis = msg + "Le champ doit etre rempli.";
	var msg_mini = msg + "Le champ doit contenir au minimum " + mini + " caractères.";	
	var msg_maxi = msg + "Le champ ne doit contenir plus de " + maxi + " caractères.";
	var msg_incorrect = msg + "Le champ doit etre rempli correctement.";


if ((pass2chk==false)&&(requis==false)){						
	return "#void";	// Le champ est vide mais non requis : on renvoie #void pour signaler le vide toléré.							
}else{		
	if ((pass2chk==false)&&(requis==true)){
				alert(msg_requis);
				return false;						
	}else{	
			if(longueur < mini){
				alert(msg_mini);
				return false;
			}else{
					if (longueur > maxi ){
						alert(msg_maxi);
						return false;		
					}else{
							var regChar = new RegExp(strChar);
							for (ch=0;ch<longueur;ch++){
							
									if (!regChar.test(pass2chk.charAt(ch))){ 
										var msg = msg_incorrect + " Caractère " + (ch+1);
										alert(msg + "\n___________________________________________\n\nCaractères autorisés :\n\n" + strChar);
										return false;
									}else{
										if (pass2chk != pass){
											alert(msg + "Les deux mots de passe saisis sont différents.");
											return false;
										}
									}																											
							}													 										
					} 																			
			}				
	}			
}
}//FIN DE FONCTION

function checknum(num2chk, libelle, requis, notnul, notneg) {

	//Liste des message d'alerte
	msg = "Erreur sur le champ " + libelle + " :\n-------------------------------------------------------------------------------   \n\n";
	msg_syntax = msg + "Erreur de syntaxe.\nUn nombre est requis."
	msg_requis = msg + "Le champ doit etre rempli.";
	msg_null = msg + "La valeur nulle n'est pas autorisée.";
	msg_neg = msg + "Le champ n'autorise pas les valeurs négatives.";

	num2chk=num2chk.replace(",", ".");
	
	if (isNaN(num2chk)){
		alert(msg_syntax);
		return false;
	} else {
		if (num2chk==""){
			if (requis==true) {
				alert(msg_requis);
				return false;
			} else {
				return "#void";	// Le champ est vide mais non requis : on renvoie #void pour signaler le vide toléré.
			}
		}
		if (num2chk=="0"){
			if (notnul==true) {
				alert(msg_null);
				return false;
			} else {
				return "#void";
			}
		} else {
			if (num2chk<0 && notneg==true){
				alert(msg_neg);
				return false;
			} else {
				return num2chk;
			}
		}
	}
}

function checkemail(email2chk, libelle, requis){

//Liste des message d'alerte
	var msg = "Erreur sur le champ " + libelle + " :\n___________________________________________  \n\n";
	var msg_requis = msg + "Le champ doit etre rempli.";
	var msg_incorrect = msg + "Le champ doit etre rempli correctement\n (Exemple : nom@domaine.fr).";
 
	if ((email2chk==false)&&(requis==false)){						
		return "#void";	// Le champ est vide mais non requis : on renvoie #void pour signaler le vide toléré.							
	}else{
		if ((email2chk==false)&&(requis==true)){
				alert(msg_requis);
				return false;						
		}else{		
			 //Expressions régulières
			var strChar = "[abcdefghijklmnopqrstuvwxyz0123456789_\\-\\.]";
			var regEmail= new RegExp("^" + strChar + "+@" + strChar + "+\\." + strChar + "+$","i");
			
			if (!regEmail.test(email2chk)){
				alert(msg_incorrect + "\n___________________________________________  \n\nCaractères autorisés :\n\n" + strChar);
				return false;
			}//FIN TEST VALID EMAIL
		}//FIN TEST if ((pass2chk==false)&&(requis==true))
	}//FIN if ((string2chk==false)&&(requis==false))
}//FIN FONCTION

function checklist(list2chk, libelle, requis) {

	//Liste des message d'alerte
	msg = "Erreur sur le champ " + libelle + " :\n-------------------------------------------------------------------------------   \n\n";
	msg_requis = msg + "Une option de la liste doit etre sélectionnée."

	if (requis==true && list2chk=="") {
		alert(msg_requis);
		return false;
	} else {
		return "#void";	//On ne renvoie pas la valeur, elle n'est pas modifiée
	}
}

function CheckForm (formname) {
	
	formObj = eval("document."+ formname );
	// debug="Rapport des tests effectués :\n----------------------------------------------      \n";
	for (i=0; i<formObj.length; i++) {
		if (formObj[i].name != "")	//Les champs à controler doivent avoir un nom
		{
			Inpout = formObj[i];
			INom = Inpout.name;
			IType = eval(INom + "._type");
			ILib = eval(INom + ".lib");
			IRequis = eval(INom + ".requis");
			//		alert (Inpout.name +":  type="+ IType +"   lib="+ ILib +"   requis="+ IRequis +"   val="+ Inpout.value );
			switch (IType) {
			case 0:
				// do nothing
				result="#void"
				break;
			case 1:
				result=checkdate(Inpout.value, ILib, IRequis, eval(INom +".properties[0]"), eval(INom +".properties[1]"));
				break;
			case 2:
				result=checkstring(Inpout.value, ILib, IRequis, eval(INom +".properties[0]"), eval(INom +".properties[1]"), eval(INom +".properties[2]"));
				break;
			case 3:
				result=checknum(Inpout.value, ILib, IRequis, eval(INom +".properties[0]"), eval(INom +".properties[1]"));
				break;
			case 4:
				result=checkemail(Inpout.value, ILib, IRequis);
				break;
			case 5:
				result=checkpass(Inpout.value, ILib, IRequis, eval(INom +".properties[0]"), eval(INom +".properties[1]") );
				break;
			case 6:
				optionValue = Inpout.options[Inpout.selectedIndex].value;
				result=checklist(optionValue, ILib, IRequis);
				break;
			}
			//		debug += Inpout.name + "(" + Inpout.value + ")   ->   [" + result + "]\n";
			if (result==false) {	// Si le contôle du champ renvoie false
				Inpout.focus();	// on se place sur le champ concerné
				result=false;		// on réinitialise result
				break;				// et on stoppe le contrôle
			} else {
				// Si le type de champ est date, chaine ou decimal et qu'il n'est pas vide
				if (IType>0 && IType<4  && result!="#void")
				Inpout.value=result;	// on met à jour la valeur du champ (corrigée)
				result=true;			// on réinitialise result
			}
		}
	} 
//	alert (debug);
	return result;	//Si le traitement s'est arrêté sur une erreur, on annule la soumission du formulaire
}

// ######################################################################################################################################
// FONCTIONS DIVERSES
// ######################################################################################################################################

//Memento de la fonction - affiche le contenu des tableaux des types et des propriétés
function formCtrlHelp(){
	document.write ("&nbsp;<table style='font-size=10px; color=gray;' cellspacing=1 cellpadding=2 bgcolor='#FF9900'><caption>Memento formCtrl()</caption><tr><td bgcolor='#FFFAF0'>");
	document.write ("<font size=1>Syntaxe : <i>inputname = new <b>formCtrl</b>(<b>type</b>, <b>lib</b>, <b>requis</b>, [<b>properties</b>,...])</i><br>");
	document.write ("Exemple : <i>nomchamp = new formCtrl(3, \"champ contrôlé\", true, [false,true])<br>&nbsp;");
	document.write ("<table style='font-size=10px; color=gray;' cellspacing=0 cellpadding=2 bgcolor='#FFFFFF'><tr bgcolor='#CCCCCC'><th align=left width=100>Type</th><th>Propriétés</th></tr>");
	for (i=0; i<dataType.length; i++) {
		propertiesNb = propList[i].length;
		document.write ("<tr><td><b>("+ i +") " + dataType[i] +"</b></td><td>");
		if (propertiesNb>1){
			for (j=0; j<propList[i].length; j++) {
				document.write ("[<font color='orange'>"+ propList[i][j] +"</font>]");
			}
		} else {
			document.write ("none");
		} 
		document.write ("</td></tr><tr bgcolor='#CCCCCC'><td colspan=2></td></tr>");
	}
	document.write ("</table></td></table>");
}

function ShowAlertElements(formName, showproperties){ 
	formObj = eval("document."+ formName );
	var result="Formulaire "+ formName +" :\n";
	for (i=0; i<formObj.length; i++) {
		result += formObj[i].name + " : [" + formObj[i].value + "]    ";
		result += eval (formObj[i].name +".dispObj()");
	}
	alert(result);
}

//Affichage des éléments du formulaire avec ses propriétés
function ShowFormElements(formName, showproperties){ 
	formObj = eval("document."+ formName );
	cols=6;
	document.write ("<table style='font-size=10px; color=gray;' cellspacing=0 cellpadding=2 bgcolor='#FFFFFF'>");
	document.write ("<tr bgcolor='#CCCCCC'><th colspan="+ cols +">Elements déclarés du formulaire " + formName + ":</th></tr>");
	document.write ("<tr><th>nom</th><th>valeur</th><th>type</th><th>libellé</th><th>requis</th><th>propriétés</th></tr>");
	for (i=0; i<formObj.length; i++) {
	    if (formObj[i].name!="") {
		document.write ("<tr><td><b>" + formObj[i].name + "</b></td><td>" + formObj[i].value + "</td><td>")
		if (showproperties==true)
			eval (formObj[i].name +".dispObj2()");
		document.write ("</td></tr><tr bgcolor='#CCCCCC'><td colspan="+ cols +"></td></tr>");
	    }
	}
	document.write ("</table>");
}