	// défini les couleur de fond qui seront appliquées aux éléments à valide
	// - pour une entrée incorrecte => color_bad_entry
	// - pour une entrée correcte => color_good_entry
	var color_bad_entry = "#FFAC62";
	var color_good_entry = "#FFFFFF";
	var color_text_good_entry = "#0E688C";
	var color_text_bad_entry = "#ffffff";
	var contextPath = "/lisa.soft.web";
	var validFormDebugMode = 0; // niveau 0=>pas de debug, niveau 1=>alert des champs invalides
	
	function VerifChamps (contraintes)
	{
		ok = true;
		if (contraintes.length < 1)
		{ alert ('VerifChamps : Contraintes incorrectes.'); return false; }
		f = document.getElementById (contraintes [0]);
		if (f == null)
		{ alert ('VerifChamps : Formulaire non valide.'); return false; }
		
		for (i=1; i<contraintes.length; i++)
		{
			el = f [contraintes[i][0]];
			if (el == null)
				alert("VerifChamps : Element " + contraintes[i][0] + " introuvable.");
			// On détermine la valeur de l'élément
			val = "";
			specialElement = false;
			nb_radio = 0;

			if (el.name == undefined && el.length != undefined)
			{
				// Cas particulier d'un groupe de boutons radio
				specialElement = true;
				nb_radio = el.length;
				for (j=0; j<el.length; j++)
					if (el[j].checked)
						val += el[j].value;
			}
			else
			{
				specialElement = false;
				switch (el.type)
				{
					case "hidden" : specialElement = true;
					case "file" : specialElement = true;
					case "text" :
					case "password" :
					case "textarea" : val = el.value;
						break;
					case "select-one":
						for (j=0; j<el.options.length; j++)
							if (el.options[j].selected)
								val = el.options[j].value;
						break;
					case "select-multiple":
						for (j=0; j<el.options.length; j++)
							if (el.options[j].selected)
								val += el.options[j].value + ",";
						break;
					case "radio" :
						// élément radio seul
						specialElement = true;
						nb_radio = 1;
						if (el.checked)
							val = el.value;
						break;
					case "checkbox" : if (el.checked) val = el.value;
						break;
				}
			}
			// doit-on doit vérifier cet élément (soit on demande à ce qu'il soit rempli, 
			// soit il est rempli et doit avoir un format spécifique)
			this_el_ok = true;
			if (contraintes[i][1] || val != "")
			{

				// On vérifie que la valeur est conforme aux contraintes
				for (j=0; j<contraintes[i][2].length; j++)
				{
					switch (contraintes[i][2][j][0])
					{
						// *** ENTIER ET NUMERIQUE *** //
						case "numerique" :
							// voir entier
						case "entier" :
							if (isNaN(val) || val == "")
							{ ok = false; this_el_ok = false; }
							else
							{
								switch (contraintes[i][2][j][1])
								{
									case "positif" :
										if (eval(val) < 0)
										{ ok=false; this_el_ok = false; }
										break;
									case "" :
										break;
									default :
										alert('VerifChamps : Erreur de format ('+el.name+')');
										ok = false;
										break;
								}
							}
							break;
						// *** LONGUEUR SUPERIEURE A *** //
						case ">" :
							if (isNaN(parseInt(contraintes[i][2][j][1])))
							{ alert ('VerifChamps : Erreur de format ('+el.name+')'); ok = false; }
							else
							{
								if (val.length <= parseInt(contraintes[i][2][j][1]))
								{ ok = false; this_el_ok = false; }
							}
							break;
						// *** LONGUEUR INFERIEURE A *** //
						case "<" :
							if (isNaN(parseInt(contraintes[i][2][j][1])))
							{ alert ('VerifChamps : Erreur de format ('+el.name+')'); ok = false; }
							else
							{
								if (val.length >= parseInt(contraintes[i][2][j][1]))
								{ ok = false; this_el_ok = false; }
							}
							break;
						// *** LONGUEUR EGALE A *** //
						case "=" :
							if (isNaN(parseInt(contraintes[i][2][j][1])))
							{ alert ('VerifChamps : Erreur de format ('+el.name+')'); ok = false; }
							else
							{
								if (val.length != parseInt(contraintes[i][2][j][1]))
								{ ok = false; this_el_ok = false; }
							}
							break;
						// *** DIFFERENT DE *** //
						case "!=" :
							if (val == contraintes[i][2][j][1])
							{ ok = false; this_el_ok = false; }
							break;
						// *** VALEUR EGALE A *** //
						case "egale" :
							if (val != eval(contraintes[i][2][j][1]))
							{ ok = false; this_el_ok = false; }
							break;
						// *** CONTIENT LA CHAINE *** //
						case "contain" :
							if (contraintes[i][2][j][1].length == 0)
							{ alert ('VerifChamps : Erreur de format ('+el.name+')'); ok = false; }
							else
							{
								if (val.indexOf(contraintes[i][2][j][1]) == -1)
								{ ok = false; this_el_ok = false; }
							}
							break;
						// *** EST UNE DATE VALIDE *** //
						case "date" :
							this_el_ok = verif_date (el);
							if (!this_el_ok)
								ok = false;
							break;
						// *** EXECUTE UNE FONCTION POUR TESTER DES VALEURS COMPLEXES *** //
						case "fonction" :
							if (!eval(contraintes[i][2][j][1]))
							{ 
								ok = false; this_el_ok = false;
							}
							break;
						default :
							alert ('VerifChamps : Erreur de format ('+el.name+')');
							ok = false;
							break;
					} // fin switch type contrainte
				} // fin for
			}
			if (specialElement)
			{
				if (nb_radio > 1)
				{
					noeud = document.getElementById(el[0].name + "RADIO");
					if (noeud != null)
						document.getElementById(el[0].name + "RADIO").parentNode.removeChild(noeud);
				}
				else
				{
					noeud = document.getElementById(el.name + "RADIO");
					if (noeud != null)
						document.getElementById(el.name + "RADIO").parentNode.removeChild(noeud);
				}
			
				if (!this_el_ok)
				{
					nok = document.createElement('img');
					nok.src = contextPath + "/images/attention.gif";
					nok.align = "left";
					if (nb_radio > 1)
					{
						if (validFormDebugMode > 0)
							alert("validForm\n\n" + el[0].name + " valeur incorrecte");
						nok.setAttribute("id", el[0].name + "RADIO");
						el[0].parentNode.insertBefore(nok, el[0]);
					}
					else
					{
						if (validFormDebugMode > 0)
							alert("validForm\n\n" + el.name + " valeur incorrecte");			
						nok.setAttribute("id", el.name + "RADIO");
						el.parentNode.insertBefore(nok, el);
					}
				}
			}
			else
			{
				if (this_el_ok)
				{
					el.style.color = color_text_good_entry;
					el.style.background = color_good_entry; //
					el.style.fontWeight = "normal";
				}
				else
				{
					if (validFormDebugMode > 0)
						alert("validForm\n\n" + el.name + " valeur incorrecte");
					el.style.color = color_text_bad_entry;
					el.style.background = color_bad_entry;
					el.style.fontWeight = "bold";
				}
			}
		}
		return ok;
	}

	function verif_date(el)
	{
		Fdate=true;
		if (el.value=="")
		{ Fdate=false; }
		else
		{
			// on vérifie s'il faut séparer l'heure de la date
			if (el.value.split(" ").length > 1)
				Tdate=el.value.split(" ")[0].split(separateur_date);
			else
				Tdate=el.value.split(separateur_date);
			
			Tformat_date=format_date.split(separateur_date);
			if (Tformat_date.length!=3)
				alert('erreur format date');
			else
			{
				Cjour = -1; Cmois = -1; Cannee = -1;
				for (k=0; k<3; k++)
				{
					if (Tformat_date[k].indexOf('dd') != -1) Cjour = k;
					if (Tformat_date[k].indexOf('mm') != -1) Cmois = k;
					if (Tformat_date[k].indexOf('yyyy') != -1) Cannee = k;
				}
				if (Cjour == -1 || Cmois == -1 || Cannee == -1)
					alert('erreur format date');
			}
			// est-ce que l'on a trois champs dd/mm/yyyy
			if (Tdate.length!=3)
			{ Fdate=false; }
			else
			{
				// est-ce que la date est écrite en chiffres
				if (!isNaN(Tdate[Cjour]) && !isNaN(Tdate[Cmois]) && !isNaN(Tdate[Cannee]))
				{
					Tdate[Cjour]=Number(Tdate[Cjour]);
					Tdate[Cmois]=Number(Tdate[Cmois]);
					Tdate[Cannee]=Number(Tdate[Cannee]);
					if (Tdate[Cmois]>0 && Tdate[Cmois]<13)
					{
						if (Tdate[Cjour]>0 )
						{
							// gestion de années bisextiles
							if ((Tdate[Cannee] % 4)==0)
							{ fev=29; }
							else
							{ fev=28; }
							switch (Tdate[Cmois])
							{
								case 1: nbj=31; break;
								case 2: nbj=fev; break;
								case 3: nbj=31; break;
								case 4: nbj=30; break;
								case 5: nbj=31; break;
								case 6: nbj=30; break;
								case 7: nbj=31; break;
								case 8: nbj=31; break;
								case 9: nbj=30; break;
								case 10: nbj=31; break;
								case 11: nbj=30; break;
								case 12: nbj=31; break;
								default: nbj=0; break;
							}
							if (Tdate[Cjour]>nbj)
							{ Fdate=false; }
						}
						else
						{ Fdate=false; }
					}
					else
					{ Fdate=false; }
				}
				else
				{ Fdate=false; }
				// ANNEE comprise entre 1900 et 2100
				if (Tdate[Cannee]<1900 || Tdate[Cannee]>2100)
				{ Fdate=false; }
			}
		}
		return Fdate;
	}
