/****************************************************************************************
SMI (Services Maintenance Interventions) est une gestion libre de maintenance et de SAV

Version 0.9.6
Copyright (C) 2006  Sylvain FATOME

This program is free software; you can redistribute it and/or modify it under the terms
of the GNU General Public License as published by the Free Software Foundation; 
either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program
(in the directory docs); 
if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
Boston, MA  02110-1301, USA.

Contact : galawa@free.fr
****************************************************************************************/

/****************************************************************************************
						-- Utilisation du script VFORM--
	
	Définir un tableau (chaque paramètre doit être séparés par un ";", mais il n'y a 
	pas d'ordre imposé) pour détailler les champs.
	
	IMPORTANT : ne pas metre d'espace autour des ':'.
	
>>> Paramètres :
	
	nom:nom_du_champ						Nom du champ dans le formulaire
	
	format:format_de_saisie					Format de la saisie
	
		alpha			: Alphabétique
		alphamin		: Alphabétique (minuscules seulement)
		alphamaj		: Alphabétique (majuscules seulement)
		alphanum		: Alphanumérique
		alphanummin		: Alphanumérique (minuscules seulement)
		alphanummaj		: Alphanumérique (majuscules seulement)
		date			: Date
			masques possibles :
				mmddyy		mmddyyyy	mm/dd/yy	mm/dd/yyyy
				jjmmaa		jjmmaaaa	jj/mm/aa	jj/mm/aaaa
				mm-dd-yy	mm-dd-yyyy	jj-mm-aa	jj-mm-aaaa

		duree			: Durée (format hh:mm:ss), pas de contrôle sur les heures
		dureehhmm		: Durée (format hh:mm), pas de contrôle sur les heures
		mail			: Email
		entier			: Entier signé
		heure			: Heure (format hh:mm:ss)
		heurehhmm		: Heure (format hh:mm)
		hexa			: Hexadécimal
		ip				: Adresse IP
		nf_fr			: Numéro fiscal Français
		reel			: Réel signé
		reel_ns			: Réel non signé
		siren_fr		: Numéro de SIREN
		siret_fr		: Numéro de SIRET
		naf_fr			: Numéro de NAF
		tva_fr			: Numéro de TVA (FR)
		tel_fr			: Numéro de téléphone français
							xxxxxxxxxx ou +33 xxxxxxxxx
						ou 
							xx xx xx xx xx ou +33 x xx xx xx xx
						ou 
							xx-xx-xx-xx-xx ou +33 x-xx-xx-xx-xx
						ou 
							xx.xx.xx.xx.xx ou +33 x.xx.xx.xx.xx
						
		telp_fr			: Numéro de téléphone portable français
							06xxxxxxxx ou +33 6xxxxxxxx
						ou 
							06 xx xx xx xx ou +33 6 xx xx xx xx
						ou 
							06-xx-xx-xx-xx ou +33 6-xx-xx-xx-xx
						ou 
							06.xx.xx.xx.xx ou +33 6.xx.xx.xx.xx
						
		txt				: Tout type de texte
		unsigned		: Entier non signé
		url_pref		: url (avec préfixe http, https, ftp, sftp, ftps, gopher, telnet)
			Conforme à la norme xxxx://log:mdp@xxx.xxxxxx.xxx:1234/xxxx?xxx=123&xxx=123
			Accepte aussi les adresse IP au lieu des noms de domaines
		url_npref				: url (sans préfixe)
			Conforme à la norme log:mdp@xxx.xxxxxx.xxx:1234/xxxx?xxx=123&xxx=123
			Accepte aussi les adresse IP au lieu des noms de domaines


	req:Y ou y ou O ou o					Champ requis ?
		(si rien, pas requis)

	lmn										Longueur minimum
		(Entier non signé. si rien : 0)
		Pour les listes multiples	: nb minimum de lignes à choisir

	lmx										Longueur maximum
		(Entier non signé)
		Pour les listes multiples	: nb maximum de lignes à choisir

	vmn										Valeur minimum
		(Entier non signé)

		Pour les listes     : n° minimum de la 1ère ligne
		Pour les "à cocher" : n° minimum de la 1ère case ou du 1er bouton
		Pour les dates		: date minimum
		Pour les valeurs	: valeur minimum

	vmx										Valeur maximum
		(Entier non signé)

		Pour les listes     : n° maximum de la dernière ligne sélectionnable
		Pour les "à cocher" : n° minimum de la dernière case ou du dernier bouton
		Pour les dates		: date maximum
		Pour les valeurs	: valeur maximum
		
				
	masque								définition du masque de saisie
		(Pour les dates. OBLIGATOIRE dans ce cas)

	stok								Style si champ ok
		(Si rien, on n'y touche pas)

	stbad								Style si champ pas ok
		(Si rien, on n'y touche pas)

	txt									Texte descriptif du champ pour popup erreur
		(Si rien, le script fabrique une chaîne avec le nom du champ)

	comp								Champ à comparer (détection de champs identiques)
		on y entre le nom du champ qui doit être comparé
		
		Pour les textes : comparaison des 2 saisies
		Pour les boutons et cases à cocher : comparaison des structures et 
			cases/boutons cochés
		Pour les listes simples : comparaison des structures et de la ligne choisie
		Pour les litses multiples : comparaison des structures et de la (des) 
			ligne(s) choisie(s)

	La fonction s'appelle par :
	
				VForm(nom_du_formulaire,tableau_de_définition,langage)
				
	Nota :
		Si pas de langage défini, Français ('fr') par défaut
****************************************************************************************/

// Suppression des espaces en début en fin de chaîne
function RLtrim(texte)
{	
	return texte.replace(/(^\s*)|(\s*$)/g,"");
}

// Convertion caractère accentués en octal
function ConvertAccents(texte)
{
	var texte_ok = '';
	
	for (var i=0; i<texte.length; i++)
	{
		switch(texte.charAt(i))
		{
			case '¢':
				texte_ok=texte_ok+'\242';
				break;
			case '£':
				texte_ok=texte_ok+'\243';
				break;
			case '¥':
				texte_ok=texte_ok+'\245';
				break;
			case '¼':
				texte_ok=texte_ok+'\274';
				break;
			case '½':
				texte_ok=texte_ok+'\275';
				break;
			case '¾':
				texte_ok=texte_ok+'\276';
				break;
			case '¡':
				texte_ok=texte_ok+'\241';
				break;
			case '«':
				texte_ok=texte_ok+'\253';
				break;
			case '»':
				texte_ok=texte_ok+'\273';
				break;
			case '¿':
				texte_ok=texte_ok+'\277';
				break;
			case 'À':
				texte_ok=texte_ok+'\300';
				break;
			case 'Á':
				texte_ok=texte_ok+'\301';
				break;
			case 'Â':
				texte_ok=texte_ok+'\302';
				break;
			case 'Ã':
				texte_ok=texte_ok+'\303';
				break;
			case 'Ä':
				texte_ok=texte_ok+'\304';
				break;
			case 'Å':
				texte_ok=texte_ok+'\305';
				break;
			case 'Æ':
				texte_ok=texte_ok+'\306';
				break;
			case 'Ç':
				texte_ok=texte_ok+'\307';
				break;
			case 'È':
				texte_ok=texte_ok+'\310';
				break;
			case 'É':
				texte_ok=texte_ok+'\311';
				break;
			case 'Ê':
				texte_ok=texte_ok+'\312';
				break;
			case 'Ë':
				texte_ok=texte_ok+'\313';
				break;
			case 'Ì':
				texte_ok=texte_ok+'\314';
				break;
			case 'Í':
				texte_ok=texte_ok+'\315';
				break;
			case 'Î':
				texte_ok=texte_ok+'\316';
				break;
			case 'Ï':
				texte_ok=texte_ok+'\317';
				break;
			case 'Ë':
				texte_ok=texte_ok+'\313';
				break;
			case 'Ð':
				texte_ok=texte_ok+'\320';
				break;
			case 'Ñ':
				texte_ok=texte_ok+'\321';
				break;
			case 'Ë':
				texte_ok=texte_ok+'\313';
				break;
			case 'Ò':
				texte_ok=texte_ok+'\322';
				break;
			case 'Ó':
				texte_ok=texte_ok+'\323';
				break;
			case 'Ô':
				texte_ok=texte_ok+'\324';
				break;
			case 'Õ':
				texte_ok=texte_ok+'\325';
				break;
			case 'Ö':
				texte_ok=texte_ok+'\326';
				break;
			case 'Ø':
				texte_ok=texte_ok+'\330';
				break;
			case 'Ù':
				texte_ok=texte_ok+'\331';
				break;
			case 'Ú':
				texte_ok=texte_ok+'\332';
				break;
			case 'Û':
				texte_ok=texte_ok+'\333';
				break;
			case 'Ü':
				texte_ok=texte_ok+'\334';
				break;
			case 'Ý':
				texte_ok=texte_ok+'\335';
				break;
			case 'Þ':
				texte_ok=texte_ok+'\336';
				break;
			case 'ß':
				texte_ok=texte_ok+'\337';
				break;
			case 'à':
				texte_ok=texte_ok+'\340';
				break;
			case 'á':
				texte_ok=texte_ok+'\341';
				break;
			case 'â':
				texte_ok=texte_ok+'\342';
				break;
			case 'ã':
				texte_ok=texte_ok+'\343';
				break;
			case 'ä':
				texte_ok=texte_ok+'\344';
				break;
			case 'å':
				texte_ok=texte_ok+'\345';
				break;
			case 'æ':
				texte_ok=texte_ok+'\346';
				break;
			case 'ç':
				texte_ok=texte_ok+'\347';
				break;
			case 'è':
				texte_ok=texte_ok+'\350';
				break;
			case 'é':
				texte_ok=texte_ok+'\351';
				break;
			case 'ê':
				texte_ok=texte_ok+'\352';
				break;
			case 'ë':
				texte_ok=texte_ok+'\353';
				break;
			case 'ì':
				texte_ok=texte_ok+'\354';
				break;
			case 'í':
				texte_ok=texte_ok+'\355';
				break;
			case 'î':
				texte_ok=texte_ok+'\356';
				break;
			case 'ï':
				texte_ok=texte_ok+'\357';
				break;
			case 'ð':
				texte_ok=texte_ok+'\360';
				break;
			case 'ñ':
				texte_ok=texte_ok+'\361';
				break;
			case 'ò':
				texte_ok=texte_ok+'\362';
				break;
			case 'ó':
				texte_ok=texte_ok+'\363';
				break;
			case 'ô':
				texte_ok=texte_ok+'\364';
				break;
			case 'õ':
				texte_ok=texte_ok+'\365';
				break;
			case 'ö':
				texte_ok=texte_ok+'\366';
				break;
			case 'ø':
				texte_ok=texte_ok+'\370';
				break;
			case 'ù':
				texte_ok=texte_ok+'\371';
				break;
			case 'ú':
				texte_ok=texte_ok+'\372';
				break;
			case 'û':
				texte_ok=texte_ok+'\373';
				break;
			case 'ü':
				texte_ok=texte_ok+'\374';
				break;
			case 'ý':
				texte_ok=texte_ok+'\375';
				break;
			case 'þ':
				texte_ok=texte_ok+'\376';
				break;
			case 'ÿ':
				texte_ok=texte_ok+'\377';
				break;
			default:
				texte_ok=texte_ok+texte.charAt(i);
				break;
		}
	}
	
	return texte_ok;
}

// Vérifie si une valeur est bien dans une fourchette
function ValInMinMax(valeur,mini,maxi)
{
	// On vérifie que min et maxi sont définis. Si oui, on vérifie que mini <= Maxi
	if ((!isNaN(mini)) && (!isNaN(maxi)))
		if (mini>maxi)
			return false;
	// On vérifie que mini est défini. Si oui, on teste
	if (!isNaN(mini))
		if (valeur<mini)
			return false;
	// On vérifie que maxi est défini. Si oui, on teste
	if (!isNaN(maxi))
		if (valeur>maxi)
			return false;

	return true;
}

// Vérifie si la chaîne est au format hexadécimal
function IsHexa(str)
{	
	var expr = new RegExp("^[a-f0-9]+$","gi");
	if ( !expr.test(str) )
		return false;

	return true;
}

// Vérifie si la chaîne est au format entier non signé
function IsUnsigned(str)
{	
	var expr = new RegExp("^[0-9]*$","gi");
	if ( !expr.test(str) )
		return false;

	return true;
}

// Vérifie si la chaîne est au format entier signé
function IsInteger(str)
{	
	var expr = new RegExp("^[\+\-]?[0-9]*$","gi");
	if ( !expr.test(str) )
		return false;

	return true;
}

// Vérifie si la chaîne est au format réel signé
function IsReal(str)
{	
	var expr = new RegExp("^[\+\-]?[0-9]+(\.[0-9]{0,})?$","gi");
	if ( !expr.test(str) )
		return false;

	return true;
}

// Vérifie si la chaîne est au format réel non signé
function IsRealUnsigned(str)
{	
	var expr = new RegExp("^[0-9]+(\.[0-9]{0,})?$","gi");
	if ( !expr.test(str) )
		return false;

	return true;
}

// Vérifie une date
function IsDate(date,masque)
{	
	if (!date)
		return false;

	var jour,mois,annee;
	switch (masque)
	{
		case "mmddyy":
			var expr = new RegExp("^[0-9]{6}$");
			// On vérifie le format
			if (!expr.test(date))
			{
				return false;
			}
			else
			{
				mois=Number(date.substr(0,2));
				jour=Number(date.substr(2,2));
				annee=Number(date.substr(4,2))+2000;
			}
			break;
		case "mmddyyyy":
			var expr = new RegExp("^[0-9]{8}$");
			// On vérifie le format
			if (!expr.test(date))
			{
				return false;
			}
			else
			{
				mois=Number(date.substr(0,2));
				jour=Number(date.substr(2,2));
				annee=Number(date.substr(4,4));
			}
			break;
		case "jjmmaa":
			var expr = new RegExp("^[0-9]{6}$");
			if (!expr.test(date))
			{
				return false;
			}
			else
			{
				jour=Number(date.substr(0,2));
				mois=Number(date.substr(2,2));
				annee=Number(date.substr(4,2))+2000;
			}
			break;
		case "jjmmaaaa":
			var expr = new RegExp("^[0-9]{8}$");
			if (!expr.test(date))
			{
				return false;
			}
			else
			{
				jour=Number(date.substr(0,2));
				mois=Number(date.substr(2,2));
				annee=Number(date.substr(4,4));
			}
			break;
		case "mm-dd-yy":
			var expr = new RegExp("^[0-9]{2}\-[0-9]{2}\-[0-9]{2}$");
			// On vérifie le format
			if (!expr.test(date))
			{
				return false;
			}
			else
			{
				var tab_date = date.split("-");
				mois=Number(tab_date[0]);
				jour=Number(tab_date[1]);
				annee=Number(tab_date[2])+2000;
			}
			break;
		case "mm/dd/yy":
			var expr = new RegExp("^[0-9]{2}\/[0-9]{2}\/[0-9]{2}$");
			// On vérifie le format
			if (!expr.test(date))
			{
				return false;
			}
			else
			{
				var tab_date = date.split("/");
				mois=Number(tab_date[0]);
				jour=Number(tab_date[1]);
				annee=Number(tab_date[2])+2000;
			}
			break;
		case "mm-dd-yyyy":
			var expr = new RegExp("^[0-9]{2}\-[0-9]{2}\-[0-9]{4}$");
			// On vérifie le format
			if (!expr.test(date))
			{
				return false;
			}
			else
			{
				var tab_date = date.split("-");
				mois=Number(tab_date[0]);
				jour=Number(tab_date[1]);
				annee=Number(tab_date[2]);
			}
			break;
		case "mm/dd/yyyy":
			var expr = new RegExp("^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$");
			// On vérifie le format
			if (!expr.test(date))
			{
				return false;
			}
			else
			{
				var tab_date = date.split("/");
				mois=Number(tab_date[0]);
				jour=Number(tab_date[1]);
				annee=Number(tab_date[2]);
			}
			break;
		case "jj-mm-aa":
			var expr = new RegExp("^[0-9]{2}\-[0-9]{2}\-[0-9]{2}$");
			if (!expr.test(date))
			{
				return false;
			}
			else
			{
				var tab_date = date.split("-");
				jour=Number(tab_date[0]);
				mois=Number(tab_date[1]);
				annee=Number(tab_date[2])+2000;
			}
			break;
		case "jj/mm/aa":
			var expr = new RegExp("^[0-9]{2}\/[0-9]{2}\/[0-9]{2}$");
			if (!expr.test(date))
			{
				return false;
			}
			else
			{
				var tab_date = date.split("/");
				jour=Number(tab_date[0]);
				mois=Number(tab_date[1]);
				annee=Number(tab_date[2])+2000;
			}
			break;
		case "jj-mm-aaaa":
			var expr = new RegExp("^[0-9]{2}\-[0-9]{2}\-[0-9]{4}$");
			if (!expr.test(date))
			{
				return false;
			}
			else
			{
				var tab_date = date.split("-");
				jour=Number(tab_date[0]);
				mois=Number(tab_date[1]);
				annee=Number(tab_date[2]);
			}
			break;
		case "jj/mm/aaaa":
			var expr = new RegExp("^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$");
			if (!expr.test(date))
			{
				return false;
			}
			else
			{
				var tab_date = date.split("/");
				jour=Number(tab_date[0]);
				mois=Number(tab_date[1]);
				annee=Number(tab_date[2]);
			}
			break;
		default :
			return false;
			break;
	}
	// On contrôle la validité du jour
	if ((jour==0) || (jour>31))
	{
		return false;
	}
	else
	{
		// vérification du nombre de jour dans le mois
		var dt_test = new Date(annee, Number(mois-1), jour);
		if (dt_test.getMonth() != Number(mois-1))
			return false;
	}

	// On contrôle la validité du mois
	if ((mois==0) || (mois>12))
	{
		return false;
	}
	
	return true;
}

// Vérifie si une date est bien dans une fourchette
function DateInMinMax(date,dmini,dmaxi,masque)
{
	if ((IsDate(date,masque)) && (IsDate(dmini,masque)) && (IsDate(dmaxi,masque)))
	{
		var jour,mois,annee,
			jourmn,moismn,anneemn,
			jourmx,moismx,anneemx;
		switch (masque)
		{
			case "mmddyy":
				mois=Number(date.substr(0,2));
				jour=Number(date.substr(2,2));
				annee=Number(date.substr(4,2))+2000;
				moismn=Number(dmini.substr(0,2));
				jourmn=Number(dmini.substr(2,2));
				anneemn=Number(dmini.substr(4,2))+2000;
				moismx=Number(dmaxi.substr(0,2));
				jourmx=Number(dmaxi.substr(2,2));
				anneemx=Number(dmaxi.substr(4,2))+2000;
				break;
			case "mmddyyyy":
				mois=Number(date.substr(0,2));
				jour=Number(date.substr(2,2));
				annee=Number(date.substr(4,4));
				moismn=Number(dmini.substr(0,2));
				jourmn=Number(dmini.substr(2,2));
				anneemn=Number(dmini.substr(4,4));
				moismx=Number(dmaxi.substr(0,2));
				jourmx=Number(dmaxi.substr(2,2));
				anneemx=Number(dmaxi.substr(4,4));
				break;
			case "jjmmaa":
				jour=Number(date.substr(0,2));
				mois=Number(date.substr(2,2));
				annee=Number(date.substr(4,2))+2000;
				moismn=Number(dmini.substr(0,2));
				jourmn=Number(dmini.substr(2,2));
				anneemn=Number(dmini.substr(4,2))+2000;
				moismx=Number(dmaxi.substr(0,2));
				jourmx=Number(dmaxi.substr(2,2));
				anneemx=Number(dmaxi.substr(4,2))+2000;
				break;
			case "jjmmaaaa":
				jour=Number(date.substr(0,2));
				mois=Number(date.substr(2,2));
				annee=Number(date.substr(4,4));
				moismn=Number(dmini.substr(0,2));
				jourmn=Number(dmini.substr(2,2));
				anneemn=Number(dmini.substr(4,4));
				moismx=Number(dmaxi.substr(0,2));
				jourmx=Number(dmaxi.substr(2,2));
				anneemx=Number(dmaxi.substr(4,4));
				break;
			case "mm-dd-yy":
			case "mm-dd-yyyy":
				var tab_date = date.split("-");
				mois=Number(tab_date[0]);
				jour=Number(tab_date[1]);
				annee=Number(tab_date[2]);
				if (annee<2000)
					annee=annee+2000;
				var tab_dmini = dmini.split("-");
				moismn=Number(tab_dmini[0]);
				jourmn=Number(tab_dmini[1]);
				anneemn=Number(tab_dmini[2]);
				if (anneemn<2000)
					anneemn=anneemn+2000;
				var tab_dmaxi = dmaxi.split("-");
				moismx=Number(tab_dmaxi[0]);
				jourmx=Number(tab_dmaxi[1]);
				anneemx=Number(tab_dmaxi[2]);
				if (anneemx<2000)
					anneemx=anneemx+2000;
				break;
			case "mm/dd/yy":
			case "mm/dd/yyyy":
				var tab_date = date.split("/");
				mois=Number(tab_date[0]);
				jour=Number(tab_date[1]);
				annee=Number(tab_date[2]);
				if (annee<2000)
					annee=annee+2000;
				var tab_dmini = dmini.split("/");
				moismn=Number(tab_dmini[0]);
				jourmn=Number(tab_dmini[1]);
				anneemn=Number(tab_dmini[2]);
				if (anneemn<2000)
					anneemn=anneemn+2000;
				var tab_dmaxi = dmaxi.split("/");
				moismx=Number(tab_dmaxi[0]);
				jourmx=Number(tab_dmaxi[1]);
				anneemx=Number(tab_dmaxi[2]);
				if (anneemx<2000)
					anneemx=anneemx+2000;
				break;
			case "jj-mm-aa":
			case "jj-mm-aaaa":
				var tab_date = date.split("-");
				jour=Number(tab_date[0]);
				mois=Number(tab_date[1]);
				annee=Number(tab_date[2]);
				if (annee<2000)
					annee=annee+2000;
				var tab_dmini = dmini.split("-");
				jourmn=Number(tab_dmini[0]);
				moismn=Number(tab_dmini[1]);
				anneemn=Number(tab_dmini[2]);
				if (anneemn<2000)
					anneemn=anneemn+2000;
				var tab_dmaxi = dmaxi.split("-");
				jourmx=Number(tab_dmaxi[0]);
				moismx=Number(tab_dmaxi[1]);
				anneemx=Number(tab_dmaxi[2]);
				if (anneemx<2000)
					anneemx=anneemx+2000;
				break;
			case "jj/mm/aa":
			case "jj/mm/aaaa":
				var tab_date = date.split("/");
				jour=Number(tab_date[0]);
				mois=Number(tab_date[1]);
				annee=Number(tab_date[2]);
				if (annee<2000)
					annee=annee+2000;
				var tab_dmini = dmini.split("/");
				jourmn=Number(tab_dmini[0]);
				moismn=Number(tab_dmini[1]);
				anneemn=Number(tab_dmini[2]);
				if (anneemn<2000)
					anneemn=anneemn+2000;
				var tab_dmaxi = dmaxi.split("/");
				jourmx=Number(tab_dmaxi[0]);
				moismx=Number(tab_dmaxi[1]);
				anneemx=Number(tab_dmaxi[2]);
				if (anneemx<2000)
					anneemx=anneemx+2000;
				break;
			default :
				return false;
				break;
		}

		var datetst = new Date(annee, Number(mois-1), jour);
		var datemn = new Date(anneemn, Number(moismn-1), jourmn);
		var datemx = new Date(anneemx, Number(moismx-1), jourmx);
		
		if (datemx.getTime()>=datemn.getTime())
		{
			if ((datetst.getTime()>=datemn.getTime()) && (datetst.getTime()<=datemx.getTime()))
			{
				return true;
			}
			else
			{
				return false;
			}
		}
		else
		{
			return false;
		}
	}
	else
	{
		return true;
	}
}

// Vérifie si la chaîne est au format heure hh:mm:ss
function IsHeure(str)
{	
	var expr = new RegExp("^[0-9]{1,2}\:[0-9]{1,2}\:[0-9]{1,2}$");
	if ( !expr.test(str) )
		return false;

	// On vérifie les valeurs individuelles
	var tab_duree = str.split(":");
	if ((Number(tab_duree[0]) > 23) || (Number(tab_duree[1]) > 59) || (Number(tab_duree[2]) > 59))
		return false;

	return true;
}

// Convertit une heure en secondes
function ConvertHeureSec(str)
{
	var totalsec =0;
	if (IsHeure(str)) // Si c'est vraiment une heure
	{
		// On calcule la durée totale en secondes
		var tab_duree = str.split(":");
		totalsec = (Number(tab_duree[0])*3600)+(Number(tab_duree[1])*60)+Number(tab_duree[2]);
	}

	return totalsec;
}

// Vérifie si la chaîne est au format heure hh:mm
function IsHeurehhmm(str)
{	
	var expr = new RegExp("^[0-9]{1,2}\:[0-9]{1,2}$");
	if ( !expr.test(str) )
		return false;

	// On vérifie les valeurs individuelles
	var tab_duree = str.split(":");
	if ((Number(tab_duree[0]) > 23) || (Number(tab_duree[1]) > 59))
		return false;

	return true;
}

// Convertit une heure hhmm en secondes
function ConvertHeurehhmmSec(str)
{
	var totalsec =0;
	if (IsHeurehhmm(str)) // Si c'est vraiment une heure hhmm
	{
		// On calcule la durée totale en secondes
		var tab_duree = str.split(":");
		totalsec = (Number(tab_duree[0])*3600)+(Number(tab_duree[1])*60);
	}

	return totalsec;
}

// Vérifie si la chaîne est une durée
function IsDuree(str)
{	
	var expr = new RegExp("^[0-9]{1,}\:[0-9]{1,2}\:[0-9]{1,2}$");
	if ( !expr.test(str) )
		return false;

	// On vérifie les valeurs individuelles
	var tab_duree = str.split(":");
	if ((Number(tab_duree[1]) > 59) || (Number(tab_duree[2]) > 59))
		return false;

	return true;
}

// Vérifie si la chaîne est une durée
function IsDureehhmm(str)
{	
	var expr = new RegExp("^[0-9]{1,}\:[0-9]{1,2}$");
	if ( !expr.test(str) )
		return false;

	// On vérifie les valeurs individuelles
	var tab_duree = str.split(":");
	if (Number(tab_duree[1]) > 59)
		return false;

	return true;
}

// Convertit une durée en secondes
function ConvertDureeSec(str)
{
	var totalsec=0;
	if (IsDuree(str)) // Si c'est vraiment une durée
	{
		// On calcule la durée totale en secondes
		var tab_duree = str.split(":");
		totalsec = (Number(tab_duree[0])*3600)+(Number(tab_duree[1])*60)+Number(tab_duree[2]);
	}

	return totalsec;
}

// Convertit une durée hhmm en secondes
function ConvertDureehhmmSec(str)
{
	var totalsec=0;
	if (IsDureehhmm(str)) // Si c'est vraiment une durée hhmm
	{
		// On calcule la durée totale en secondes
		var tab_duree = str.split(":");
		totalsec = (Number(tab_duree[0])*3600)+(Number(tab_duree[1])*60);
	}

	return totalsec;
}

// Vérifie si un texte est vide
function ChampEstVide(texte)
{
	if (!texte)
	{
		return true;
	}

	if (RLtrim(texte)=="")
	{
		return true;
	}
	
	return false;
}

// Donne le nombre d'éléments sélectionnés dans une liste
function NbElementsSel(liste)
{
	var nbSelected=0;
	for (var nb=0; nb<liste[0].options.length; nb++)
	{
		if (liste[0].options[nb].selected)
		{
			nbSelected++;
		}
	}
	
	return nbSelected;
}

// Donne le nombre d'éléments cochés dans une liste
function NbElementsChk(liste)
{
	var nbChecked=0;
	for (var nb=0; nb<liste.length; nb++)
	{
		if (liste[nb].checked)
		{
			nbChecked++;
		}
	}
	
	return nbChecked;
}

// Fonction de contrôle du SIREN
function IsSiren(siren)
{
	if ((siren.length != 9) || (isNaN(siren)) )
		return false;

	var somme = 0;
	var tmp;
	for (var idx=0; idx<siren.length; idx++) 
	{
		// Les positions paires : 2ème, 4ème, 6ème et 8ème chiffre
		if ((idx % 2) == 1) 
		{ 
			tmp = siren.charAt(idx) * 2; // On le multiplie par 2
			if (tmp > 9)
				tmp -= 9;    // Si le résultat est supérieur à 9, on lui soustrait 9
		}
		else
			tmp = siren.charAt(idx);

		somme += parseInt(tmp);
	}

	// Si la somme est un multiple de 10 alors le SIREN est valide
	if ((somme % 10) == 0)
		return true; 
	else
		return false;
}

// Fonction de contrôle du SIRET
function IsSiret(siret)
{
	if ( (siret.length != 14) || (isNaN(siret)) )
		return false;

	var somme = 0;
	var tmp;

	for (var idx = 0; idx<siret.length; idx++) 
	{
		// Les positions impaires : 1er, 3è, 5è, etc...
		if ((idx % 2) == 0) 
		{ 
			tmp = siret.charAt(idx) * 2; // On le multiplie par 2
			if (tmp > 9)
				tmp -= 9;    // Si le résultat est supérieur à 9, on lui soustrait 9
		}
		else
			tmp = siret.charAt(idx);
		somme += parseInt(tmp);
	}

	if ((somme % 10) == 0)
		return true; // Si la somme est un multiple de 10 alors le SIRET est valide
	else
		return false;
}

// Routine de contrôle du formulaire
function VForm(formulaire,a_champs,lng)
{	
	var txt_pop=''; // Texte du popup d'erreur
	
	switch(lng)
	{
		case 'eng' :
			var tab_messerr = new Array(
			"Required field",
			"Field is not valid",
			"Field length is less than required",
			"Field length is more than required",
			"Field is not inside required values",
			"Bad number of selected options",
			"Bad selected option",
			"The field to compare si not the same type",
			"The 2 input are not the same",
			"The 2 fields to be compared have different structure");
			break;
		default : // Français
			var tab_messerr = new Array(
			"Champ obligatoire",
			"Saisie non valide",
			"Saisie inférieure à la longueur minimum demandée",
			"Saisie supérieure à la longueur maximum demandée",
			"Valeur en dehors de la fourchette demandée",
			"Mauvaise quantité d'options sélectionnées",
			"Mauvaise option sélectionnée",
			"Le champ à comparer n'est pas du même type",
			"Les 2 saisies ne sont pas identiques",
			"Structures des 2 champs à comparer différentes");
			break;
	}
	
	if (a_champs)
	{
		for (var no_champ=0; no_champ<a_champs.length; no_champ++)
		{
			var long_saisie=0;
			// Les champs étant séparés par des ";", on éclate la chaîne
			var tab_prm=RLtrim(a_champs[no_champ]).split(";");
			var	tab_prmchamp=new Array();
			// On contrôle tous les paramètres un par un
			for (var no_prm=0; no_prm<tab_prm.length; no_prm++ )
			{
				// Les paramètres étant de la forme "nom_prm : valeur", on éclate la chaîne
				tab_typeprm=RLtrim(tab_prm[no_prm]).split(":");
				
				if ((tab_typeprm.length)>=2)
				{
					// On reconstruit le paramètre (par exemple s'il est de la format hh:mm:ss, vform l'aura éclaté en tableau)
					var str_prm='';
					for (var idx=1; idx<tab_typeprm.length; idx++)
					{
						str_prm+=RLtrim(tab_typeprm[idx])+':';
					}
					
					// On élimine le dernier ':'
					str_prm=str_prm.substr(0,str_prm.length-1);
					
					// On crée le paramètre final
					tab_prmchamp[RLtrim(tab_typeprm[0].toLowerCase())]=str_prm;
				}
			}

			// Contrôle du nom
			if (tab_prmchamp["nom"])
			{
				var nom_champ=RLtrim(tab_prmchamp["nom"]);
				var champ=document.getElementsByName(nom_champ);

				if (champ && champ.length>0) 
				{
					// Contrôle du champ de comparaison (s'il existe...sinon, on ne compare rien)
					if (tab_prmchamp["comp"])
					{
						var nom_champcomp=RLtrim(tab_prmchamp["comp"]);
						var champcomp=document.getElementsByName(nom_champcomp);
		
						if (!champcomp || champcomp.length<=0) 
						{
							delete(tab_prmchamp["comp"]);
						}
						else
						{
							var type_champcomp=champcomp[0].type;
							var val_champcomp=champcomp[0].value;
						}
					}
					
					var type_champ=champ[0].type;
					var val_champ=champ[0].value;

					// On contrôle que les paramètres "minimum" existent, sinon valeur par défaut
		
					// Champ requis ?
					if ( !tab_prmchamp["req"] )
					{
						tab_prmchamp["req"]=false;
					}
					else
					{
						if ((tab_prmchamp["req"]=="Y") || (tab_prmchamp["req"]=="y") || (tab_prmchamp["req"]=="O") || (tab_prmchamp["req"]=="o"))
						{
							tab_prmchamp["req"]=true;
						}
						else
						{
							tab_prmchamp["req"]=false;
						}
					}
		
					// Descriptif du champ
					if ( !tab_prmchamp["txt"] )
					{	
						tab_prmchamp["txt"]="Champ "+champ[0].name;
					}

					var errno=-1;
					var ok=true;
			
					// Test si champ obligatoire
					 // S'il est vide, ce n'est même pas la peine de tester le reste
					if (tab_prmchamp["req"]==true) // le champ est obligatoire
					{
						switch (type_champ.toLowerCase())
						{
							case 'text':
							case 'textarea':
							case 'password':
								if (ChampEstVide(val_champ))
								{
									errno=0;
								}
								break;
							case 'select-one':
								var sel_champ=champ[0].selectedIndex;
								if (parseInt(sel_champ)<0)
								{
									errno=0;
								}
								break;
							case 'select-multiple':
								if (NbElementsSel(champ)==0)
								{
									errno=0;
								}
								break;
							case 'radio':
							case 'checkbox':
								if (NbElementsChk(champ)==0)
								{
									errno=0;
								}
								break;
							default:
								break;
						}
					}
					
					if (errno>=0)
					{
						ok=false;
					}

					// Le test" champ requis" est passé, on vérifie maintenant "longueur mini" et "longueur maxi"
					if (ok==true)
					{
						// Format
						if (!tab_prmchamp["format"])
						{
							tab_prmchamp["format"]="";
						}

										
						// Longueur Minimum (pour liste : nb minimum de sélectionnés)
						if (tab_prmchamp["lmn"])
						{
							// Défini : on vérifie si c'est bien un entier non signé
							if (IsUnsigned(tab_prmchamp["lmn"]))  // Oui, on converti en entier
							{
								tab_prmchamp["lmn"]=parseInt(tab_prmchamp["lmn"]);
							}
							else // Non, on affecte une longueur mini (puisque d'un minimum a été demandé, mais qu'il est faux)
							{
								tab_prmchamp["lmn"]=0;
							}
							
							// On contrôle la longueur mini de la saisie
							switch (type_champ.toLowerCase())
							{
								case 'text':
								case 'textarea':
								case 'password':
									if (ChampEstVide(val_champ))
									{
										long_saisie=0;
									}
									else
									{
										long_saisie=parseInt(val_champ.length);
									}
									if (long_saisie<tab_prmchamp["lmn"])
									{
										errno=2;
									}
									break;
								case 'select-multiple':
									if (NbElementsSel(champ)<tab_prmchamp["lmn"])
									{
										errno=2;
									}
									break;
								case 'checkbox':
									if (NbElementsChk(champ)<tab_prmchamp["lmn"])
									{
										errno=2;
									}
									break;
								default:
									break;
							}
						}
					}
					
					if (errno>=0)
					{
						ok=false;
					}

					// Le test" champ requis" est passé, on vérifie maintenant "longueur mini" et "longueur maxi"
					if (ok==true)
					{
						// Longueur Maximum (pour liste : nb minimum de sélectionnés)
						if (tab_prmchamp["lmx"])
						{
							// Défini : on vérifie si c'est bien un entier non signé
							if (IsUnsigned(tab_prmchamp["lmx"])) // Oui, on converti en entier
							{
								tab_prmchamp["lmx"]=parseInt(tab_prmchamp["lmx"]);
							}
							else // Non, on affecte une longueur maxi (puisque d'un maximum a été demandé, mais qu'il est faux)
							{
								switch (type_champ.toLowerCase())
								{
									case 'text':
									case 'textarea':
									case 'password':
										max_length=Number(champ.maxlength);
										if (max_length)
										{
											tab_prmchamp["lmx"]=max_length;
										}
										else
										{
											tab_prmchamp["lmx"]=0;
										}
										break;
									case 'select-one':
									case 'select-multiple':
										// Le maxi est le nombre maximum d'éléments de la liste
										tab_prmchamp["lmx"]=champ[0].options.length;
										break;
									case 'radio':
									case 'checkbox':
										// Le maxi est le nombre maximum d'éléments à cocher
										tab_prmchamp["lmx"]=champ.length;
									default:
										break;
								}
							}
							
							// On contrôle la longueur maxi de la saisie
							switch (type_champ.toLowerCase())
							{
								case 'text':
								case 'textarea':
								case 'password':
									if (ChampEstVide(val_champ))
									{
										long_saisie=0;
									}
									else
									{
										long_saisie=parseInt(val_champ.length);
									}
									if (long_saisie>tab_prmchamp["lmx"])
									{
										errno=3;
									}
									break;
								case 'select-multiple':
									if (NbElementsSel(champ)>tab_prmchamp["lmx"])
									{
										errno=3;
									}
									break;
								case 'checkbox':
									if (NbElementsChk(champ)>tab_prmchamp["lmx"])
									{
										errno=3;
									}
									break;
								default:
									break;
							}
						}
					}

					if (errno>=0)
					{
						ok=false;
					}

					// Si les paramètres "longueur de champ" sont passés, on vérifie maintenant le paramètre
					// "valeur mini" et on le modifie si besoin
					if (ok==true)
					{
						// Valeur Minimum (vérifiée et modifiée que si paramétrée)
						if (tab_prmchamp["vmn"])
						{
							switch (tab_prmchamp["format"])
							{
								case 'date':
									// Défini : on vérifie si c'est bien une date valable au format demandé
									if (IsDate(tab_prmchamp["vmn"],tab_prmchamp["masque"])) // Oui
									{
										break;
									}
									else // Non
									{
										delete(tab_prmchamp["vmn"]);
									}
									break;
								case 'hexa':
									// Défini : on vérifie si c'est bien un héxadécimal
									if (IsHexa(tab_prmchamp["vmn"])) // Oui
									{
										tab_prmchamp["vmn"]=parseInt(tab_prmchamp["vmn"]);
									}
									else // Non
									{
										delete(tab_prmchamp["vmn"]);
									}
									break;
								case 'unsigned':
									// Défini : on vérifie si c'est bien un non signé
									if (IsUnsigned(tab_prmchamp["vmn"])) // Oui
									{
										tab_prmchamp["vmn"]=parseInt(tab_prmchamp["vmn"]);
									}
									else // Non
									{
										delete(tab_prmchamp["vmn"]);
									}
									break;
								case 'entier':
									// Défini : on vérifie si c'est bien un entier
									if (IsInteger(tab_prmchamp["vmn"])) // Oui
									{
										tab_prmchamp["vmn"]=parseInt(tab_prmchamp["vmn"]);
									}
									else // Non
									{
										delete(tab_prmchamp["vmn"]);
									}
									break;
								case 'reel':
									// Défini : on vérifie si c'est bien un réel
									if (IsReal(tab_prmchamp["vmn"])) // Oui
									{
										tab_prmchamp["vmn"]=parseFloat(tab_prmchamp["vmn"]);
									}
									else // Non
									{
										delete(tab_prmchamp["vmn"]);
									}
									break;
								case 'reel_ns':
									// Défini : on vérifie si c'est bien un réel non signé
									if (IsRealUnsigned(tab_prmchamp["vmn"])) // Oui
									{
										tab_prmchamp["vmn"]=parseFloat(tab_prmchamp["vmn"]);
									}
									else // Non
									{
										delete(tab_prmchamp["vmn"]);
									}
									break;
								case 'heure':
									// Défini : on vérifie si c'est bien une heure
									if (IsHeure(tab_prmchamp["vmn"])) // Oui
									{
										tab_prmchamp["vmn"]=ConvertHeureSec(tab_prmchamp["vmn"]);
									}
									else // Non
									{
										delete(tab_prmchamp["vmn"]);
									}
									break;
								case 'heurehhmm':
									// Défini : on vérifie si c'est bien une heure
									if (IsHeurehhmm(tab_prmchamp["vmn"])) // Oui
									{
										tab_prmchamp["vmn"]=ConvertHeurehhmmSec(tab_prmchamp["vmn"]);
									}
									else // Non
									{
										delete(tab_prmchamp["vmn"]);
									}
									break;
								case 'duree':
									// Défini : on vérifie si c'est bien une heure
									if (IsDuree(tab_prmchamp["vmn"])) // Oui
									{
										tab_prmchamp["vmn"]=ConvertDureeSec(tab_prmchamp["vmn"]);
									}
									else // Non
									{
										delete(tab_prmchamp["vmn"]);
									}
									break;
								case 'dureehhmm':
									// Défini : on vérifie si c'est bien une heure
									if (IsDureehhmm(tab_prmchamp["vmn"])) // Oui
									{
										tab_prmchamp["vmn"]=ConvertDureehhmmSec(tab_prmchamp["vmn"]);
									}
									else // Non
									{
										delete(tab_prmchamp["vmn"]);
									}
									break;
								case 'liste':
								case 'listem':
								case'radio':
								case 'checkbox':
									// Défini : on vérifie si c'est bien un entier
									if (IsUnsigned(tab_prmchamp["vmn"])) // Oui
									{
										tab_prmchamp["vmn"]=parseInt(tab_prmchamp["vmn"]);
									}
									else // Non
									{
										tab_prmchamp["vmn"]=0; // Mini = 1er élément de la liste
									}
									break;
								default:
									delete(tab_prmchamp["vmn"]);
									break;
							}
						}
					}
					
					if (errno>=0)
					{
						ok=false;
					}

					// On vérifie maintenant le paramètre "valeur maxi" et on le modifie si besoin
					if (ok==true)
					{
						// Valeur Maximum (vérifiée et modifiée que si paramétrée)
						if (tab_prmchamp["vmx"])
						{
							switch (tab_prmchamp["format"] )
							{
								case 'date':
									// Défini : on vérifie si c'est bien une date valable au format demandé
									if (IsDate(tab_prmchamp["vmx"],tab_prmchamp["masque"])) // Oui
									{
										break;
									}
									else // Non
									{
										delete(tab_prmchamp["vmx"]);
									}
									break;
								case 'hexa':
									// Défini : on vérifie si c'est bien un héxadécimal
									if (IsHexa(tab_prmchamp["vmx"])) // Oui
									{
										tab_prmchamp["vmx"]=parseInt(tab_prmchamp["vmx"]);
									}
									else // Non
									{
										delete(tab_prmchamp["vmn"]);
									}
									break;
								case 'unsigned':
									// Défini : on vérifie si c'est bien un non signé
									if (IsUnsigned(tab_prmchamp["vmx"])) // Oui
									{
										tab_prmchamp["vmx"]=parseInt(tab_prmchamp["vmx"]);
									}
									else // Non
									{
										delete(tab_prmchamp["vmx"]);
									}
									break;
								case 'entier':
									// Défini : on vérifie si c'est bien un entier
									if (IsInteger(tab_prmchamp["vmx"])) // Oui
									{
										tab_prmchamp["vmx"]=parseInt(tab_prmchamp["vmx"]);
									}
									else // Non
									{
										delete(tab_prmchamp["vmx"]);
									}
									break;
								case 'reel':
									// Défini : on vérifie si c'est bien un réel
									if (IsReal(tab_prmchamp["vmx"])) // Oui
									{
										tab_prmchamp["vmx"]=parseFloat(tab_prmchamp["vmx"]);
									}
									else // Non
									{
										delete(tab_prmchamp["vmx"]);
									}
									break;
								case 'reel_ns':
									// Défini : on vérifie si c'est bien un réel non signé
									if (IsRealUnsigned(tab_prmchamp["vmx"])) // Oui
									{
										tab_prmchamp["vmx"]=parseFloat(tab_prmchamp["vmx"]);
									}
									else // Non
									{
										delete(tab_prmchamp["vmx"]);
									}
									break;
								case 'heure':
									// Défini : on vérifie si c'est bien une heure
									if (IsHeure(tab_prmchamp["vmx"])) // Oui
									{
										tab_prmchamp["vmx"]=ConvertHeureSec(tab_prmchamp["vmx"]);
									}
									else // Non
									{
										delete(tab_prmchamp["vmx"]);
									}
									break;
								case 'heurehhmm':
									// Défini : on vérifie si c'est bien une heure
									if (IsHeurehhmm(tab_prmchamp["vmx"])) // Oui
									{
										tab_prmchamp["vmx"]=ConvertHeurehhmmSec(tab_prmchamp["vmx"]);
									}
									else // Non
									{
										delete(tab_prmchamp["vmx"]);
									}
									break;
								case 'duree':
									// Défini : on vérifie si c'est bien une heure
									if (IsDuree(tab_prmchamp["vmx"])) // Oui
									{
										tab_prmchamp["vmx"]=ConvertDureeSec(tab_prmchamp["vmx"]);
									}
									else // Non
									{
										delete(tab_prmchamp["vmx"]);
									}
									break;
								case 'dureehhmm':
									// Défini : on vérifie si c'est bien une heure
									if (IsDureehhmm(tab_prmchamp["vmx"])) // Oui
									{
										tab_prmchamp["vmx"]=ConvertDureehhmmSec(tab_prmchamp["vmx"]);
									}
									else // Non
									{
										delete(tab_prmchamp["vmx"]);
									}
									break;
								case 'liste':
								case 'listem':
								case 'radio':
								case 'checkbox':
									// Défini : on vérifie si c'est bien un entier
									if (IsUnsigned(tab_prmchamp["vmx"])) // Oui
									{
										tab_prmchamp["vmx"]=parseInt(tab_prmchamp["vmx"]);
										if (tab_prmchamp["vmx"]>champ.length-1)
										{
											tab_prmchamp["vmx"]=champ.length-1; // Maxi = dernier élémént de la liste
										}
									}
									else // Non
									{
										tab_prmchamp["vmx"]=champ.length-1; // Maxi = dernier élémént de la liste
									}
									break;
								default:
									delete(tab_prmchamp["vmx"]);
									break;
							}
						}
					}
					
					if (errno>=0)
					{
						ok=false;
					}
								
					// Les paramètres de champs sont ok, 
					// On analyse les différents paramètres du type déclaré en fonction du type de champ
					// uniquement si le champ est rempli
					if (ok==true)
					{
						switch (type_champ.toLowerCase())
						{
							case 'radio':
								var prem_checked=-1;
								var n=0;
								while ((n<champ.length) && (prem_checked<0)) 
								{
									if (champ[n].checked)
									{	
										if (prem_checked==-1)
										{
											prem_checked=n;
										}
									}
									n++;
								}
								// On ne teste que si au moins un bouton est choché
								if (prem_checked!=-1)
								{
									// On vérifie si la valeur de case cochée est bien dans la fourchette mini/maxi
									if (ValInMinMax(prem_checked,tab_prmchamp["vmn"],tab_prmchamp["vmx"])==false)
									{
										errno=6;
									}
								}
								break;
						
							case 'checkbox':
								// Nombre de cases cochées
								var prem_checked=-1;
								var nbChecked=0;
								for (var nb=0; nb<champ.length; nb++)
								{
									if (champ[nb].checked)
									{	
										if (prem_checked==-1)
										{
											prem_checked=nb;
										}
										nbChecked++;
									}
								}
								// On ne teste que si au moins une case est cochée
								if (nbChecked>0)
								{
									// On vérifie si la valeur de la ligne sélectionnée est bien dans la fourchette
									if (ValInMinMax(prem_checked,tab_prmchamp["vmn"],tab_prmchamp["vmx"])==false)
									{
										errno=6;
									}
									else // On vérifie si le nombre de lignes sélectionnées est bien dans la fourchette
									{
										if (ValInMinMax(nbChecked,tab_prmchamp["lmn"],tab_prmchamp["lmx"])==false)
										{
											errno=5;
										}
									}
								}
								break;
						
							case 'text':
							case 'textarea':
							case 'password':
								// On ne teste que si le champ contient quelque chose
								if (ChampEstVide(val_champ)==false)
								{
									switch (tab_prmchamp["format"] )
									{
										// Date
										case 'date':
											if (IsDate(val_champ,tab_prmchamp["masque"])==false)
											{
												errno=1;
											}
											else
											{
												if (DateInMinMax(val_champ,tab_prmchamp["vmn"],tab_prmchamp["vmx"],tab_prmchamp["masque"])==false)
												{
													errno=4;
												}
											}
											break;
								
										// Email
										case 'mail':
											var expr = new RegExp("^[a-z0-9_\-]+(\.[a-z0-9_\-]+)*@[a-z0-9\-]*[a-z0-9](\.[a-z0-9\-]*[a-z0-9])*[\.][a-z]{2,3}$","gi");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											break;
			
										// Téléphone Français
										case 'tel_fr':
											var expr = new RegExp("^([+]33[ ]|0)[1-6,8]{1}[ \.\-]?[0-9]{2}[ ]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}$","gi");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											break;
	
										// Téléphone portable Français
										case 'telp_fr':
											var expr = new RegExp("^([+]33[ ]|0)6[ \.\-]?[0-9]{2}[ ]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}$","gi");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											break;
	
										// Téléphone international
										case 'tel_int':
											var expr = new RegExp("^([+][0-9]{2,3}[ ]|0)[0-9]{1}[ \.\-]?[0-9]{2}[ ]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}$","gi");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											break;
	
										// Sécurité sociale FR
										case 'secu_fr':
											var expr = new RegExp("^[1-2]{1}[ ][0-9]{2}[ ][0-9]{2}[ ][0-9]{2}[ ][0-9]{3}[ ][0-9]{3}[ ][0-9]{2}$","gi");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											break;
	
										// Sécurité sociale US
										case 'secu_us':
											var expr = new RegExp("^[0-9]{3}[\-][0-9]{2}[\-][0-9]{2}[\-][0-9]{4}$","gi");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											break;
	
										// Code postal FR
										case 'cp_fr':
											var expr = new RegExp("^[0-9]{5}$","gi");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											break;
	
										// Code postal US
										case 'cp_us':
											var expr = new RegExp("^[0-9]{5}(\-[0-9]{4})?$","gi");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											break;
	
										// Adresse IP
										case 'ip':
											var expr = new RegExp("^[0-9]{1,3}[\.][0-9]{1,3}[\.][0-9]{1,3}[\.][0-9]{1,3}$","gi");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											else // On vérifie la validité de l'adresse IP saisie
											{
												var tab_ip=val_champ.split('.');
												var n=0;
												var tstip=true;
												while ((n<4) && (tstip==true)) 
												{
													if (parseInt(tab_ip[n])>255)
													{
														tstip=false;
													}
													n++;
												}
												if (tstip==false)
												{
													errno=1;
												}
											}
											break;
		
										// Hexadécimal
										case 'hexa':
											if (IsHexa(val_champ)==false)
											{
												errno=1;
											}
											else
											{
												if (ValInMinMax(parseInt(val_champ),tab_prmchamp["vmn"],tab_prmchamp["vmx"])==false)
												{
													errno=4;
												}
											}
											break;
			
										// Non signé
										case 'unsigned':
											if (IsUnsigned(val_champ)==false)
											{
												errno=1;
											}
											else
											{
												if (ValInMinMax(parseInt(val_champ),tab_prmchamp["vmn"],tab_prmchamp["vmx"])==false)
												{
													errno=4;
												}
											}
											break;
			
										// Nombre entier
										case 'entier':
											if (IsInteger(val_champ)==false)
											{
												errno=1;
											}
											else
											{
												if (ValInMinMax(parseInt(val_champ),tab_prmchamp["vmn"],tab_prmchamp["vmx"])==false)
												{
													errno=4;
												}
											}
											break;
			
										// Nombre réel
										case 'reel':
											if (IsReal(val_champ)==false)
											{
												errno=1;
											}
											else
											{
												if (ValInMinMax(parseFloat(val_champ),tab_prmchamp["vmn"],tab_prmchamp["vmx"])==false)
												{
													errno=4;
												}
											}
											break;
			
										// Nombre réel non signé
										case 'reel_ns':
											if (IsRealUnsigned(val_champ)==false)
											{
												errno=1;
											}
											else
											{
												if (ValInMinMax(parseFloat(val_champ),tab_prmchamp["vmn"],tab_prmchamp["vmx"])==false)
												{
													errno=4;
												}
											}
											break;
			
										// Tout texte
										case 'txt':
											break;
			
										// Alphabétique seulement
										case 'alpha':
											var expr = new RegExp("^[a-z]*$","gi");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											break;
			
										// Alphabétique seulement (minuscules)
										case 'alphamin':
											var expr = new RegExp("^[a-z]*$","g");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											break;
			
										// Alphabétique seulement (majuscules)
										case 'alphamaj':
											var expr = new RegExp("^[A-Z]*$","g");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											break;
			
										// Alphanumérique
										case 'alphanum':
											var expr = new RegExp("^[a-z0-9]*$","gi");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											break;
			
										// Alphanumérique (minuscules seulement)
										case 'alphanummin':
											var expr = new RegExp("^[a-z0-9]*$","g");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											break;
			
										// Alphanumérique (majuscules seulement)
										case 'alphanummaj':
											var expr = new RegExp("^[A-Z0-9]*$","g");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											break;
			
										// Heure
										case 'heure':
											ok=IsHeure(val_champ);
											if (ok==false)
											{
												errno=1;
											}
											else
											{
												if (ValInMinMax(ConvertHeureSec(val_champ),tab_prmchamp["vmn"],tab_prmchamp["vmx"])==false)
												{
													errno=4;
												}
											}
											break;
			
										// Heure hh:mm
										case 'heurehhmm':
											if (IsHeurehhmm(val_champ)==false)
											{
												errno=1;
											}
											else
											{
												if (ValInMinMax(ConvertHeurehhmmSec(val_champ),tab_prmchamp["vmn"],tab_prmchamp["vmx"])==false)
												{
													errno=4;
												}
											}
											break;
			
										// Durée
										case 'duree':
											if (IsDuree(val_champ)==false)
											{
												errno=1;
											}
											else
											{
												if (ValInMinMax(ConvertDureeSec(val_champ),tab_prmchamp["vmn"],tab_prmchamp["vmx"])==false)
												{
													errno=4;
												}
											}
											break;
								
										// Durée hh:mm
										case 'duree':
											if (IsDureehhmm(val_champ)==false)
											{
												errno=1;
											}
											else
											{
												if (ValInMinMax(ConvertDureehhmmSec(val_champ),tab_prmchamp["vmn"],tab_prmchamp["vmx"])==false)
												{
													errno=4;
												}
											}
											break;
								
										// SIREN Français
										case 'siren_fr':
											var expr = new RegExp("^[0-9]{3}[ ]?[0-9]{3}[ ]?[0-9]{3}$","gi");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											else
											{
												// On "nettoie" la chaîne puis on vérifie
												var tab_siren=val_champ.split(" ");
												var siren=RLtrim(tab_siren.join(""));
												if (IsSiren(siren)==false)
												{
													errno=1;
												}
											}
											break;
								
										// SIRET Français
										case 'siret_fr':
											var expr = new RegExp("^[0-9]{3}[ ]?[0-9]{3}[ ]?[0-9]{3}[ ]?[0-9]{5}$","gi");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											else
											{
												// On "nettoie" la chaîne puis on vérifie
												var tab_siret=val_champ.split(" ");
												var siret=RLtrim(tab_siret.join(""));
												if (IsSiret(siret)==false)
												{
													errno=1;
												}
											}
											break;
								
										// NAF Français
										case 'naf_fr':
											var expr = new RegExp("^[0-9]{3}[a-z,A-Z]{1}$","gi");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											break;
								
										// TVA Français
										case 'tva_fr':
											var expr = new RegExp("^FR[a-z,A-Z,0-9]{2}[0-9]{9}$","gi");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											else
											{
												var siren=val_champ.substr(4,9);
												if (IsSiren(siren)==false)
												{
													errno=1;
												}
											}
											break;
								
										// Numéro fiscal Français
										case 'nf_fr':
											var expr = new RegExp("^[0-9]{2}[ ][0-9]{2}[ ][0-9]{3}[ ][0-9]{3}[ ][0-9]{3}[ ][A-Z]{1}$","gi");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											break;
								
										// url (avec préfixe http / https / ftp / ftps / sftp / telnet / gopher)
										case 'url_pref':
											var expr = new RegExp("^(http(s?)|ftp(s?)|sftp|telnet|gopher)\://([a-z0-9_\-]+[\:][a-z0-9_\-]+@)?([0-9]{1,3}[\.][0-9]{1,3}[\.][0-9]{1,3}[\.][0-9]{1,3}|[a-z0-9_\-]+[\.][a-z0-9_\-]+[\.][a-z]{2,})([\:][0-9]{2,})?([\/][a-zA-Z0-9\-\.\?\,\'\/\\\+=&%\$#_]*)?$","gi");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											break;
								
										// url (sans préfixe)
										case 'url_npref':
											var expr = new RegExp("^([a-z0-9_\-]+[\:][a-z0-9_\-]+@)?([0-9]{1,3}[\.][0-9]{1,3}[\.][0-9]{1,3}[\.][0-9]{1,3}|[a-z0-9_\-]+[\.][a-z0-9_\-]+[\.][a-z]{2,})([\:][0-9]{2,})?([\/][a-zA-Z0-9\-\.\?\,\'\/\\\+=&%\$#_]*)?$","gi");
											if ( !expr.test(val_champ) )
											{
												errno=1;
											}
											break;
								
										default:
											break;
									}
								}
								break;
					
							case 'select-one':
								var sel_champ=champ[0].selectedIndex;
								if (ValInMinMax(parseInt(sel_champ),tab_prmchamp["vmn"],tab_prmchamp["vmx"])==false)
								{
									errno=6;
								}
								break;

							case 'select-multiple':
								// Nombre de sélectionnés
								var prem_select=-1;
								var nbSelected=0;
								for (var nb=0; nb<champ[0].options.length; nb++)
								{
									if (champ[0].options[nb].selected)
									{
										if (prem_select==-1)
										{
											prem_select=nb;
										}
										nbSelected++;
									}
								}
								// On vérifie si la valeur de la ligne sélectionnée est bien dans la fourchette
								if (ValInMinMax(prem_select,tab_prmchamp["vmn"],tab_prmchamp["vmx"])==false)
								{
									errno=6;
								}
								
								// On vérifie si le nombre de lignes sélectionnées est bien dans la fourchette
								if (ValInMinMax(nbSelected,tab_prmchamp["lmn"],tab_prmchamp["lmx"])==false)
								{
									errno=5;
								}
								break;
							default:
								break;
						}
					}

					if (errno>=0)
					{
						ok=false;
					}
			
					// On vérifie maintenant s'il y a un champ de comparaison
					if (ok==true)
					{
						if (tab_prmchamp["comp"])
						{
							if ((type_champ.toLowerCase())!=(type_champcomp.toLowerCase()))
							{
								errno=7;
							}
							else
							{
								switch (type_champ.toLowerCase())
								{
									case 'radio':
									case 'checkbox':
										// On vérifie la longueur des champs
										if (champ.length==champcomp.length)
										{
											var tstok=true;
											var n=0;
											while ((n<champ.length) && (tstok)) 
											{
												// On vérifie la valeur des champs
												if (champ[n].value==champcomp[n].value)
												{
													// On vérifie s'il ont un état "coché"/"non coché" identique
													if (champ[n].checked!=champcomp[n].checked)
													{
														errno=8;
														tstok=false;
													}
												}
												else
												{
													errno=9;
													tstok=false;
												}
												n++;
											}
										}
										else
										{
											errno=9;
										}
										break;
									case 'text':
									case 'textarea':
									case 'password':
										if (val_champ!=val_champcomp)
										{
											errno=8;
										}
										break;
									case 'select-one':
										// On vérifie la longueur des champs
										if (champ[0].options.length==champcomp[0].options.length)
										{
											if (champ[0].selectedIndex!=champcomp[0].selectedIndex)
											{
												errno=8;
											}
										}
										else
										{
											errno=9;
										}
										break;
									case 'select-multiple':
										// On vérifie la longueur des champs
										if (champ[0].options.length==champcomp[0].options.length)
										{
											var tstok=true;
											var n=0;
											while ((n<champ[0].options.length) && (tstok)) 
											{
												// On vérifie la valeur des champs
												if (champ[0].options[n].value==champcomp[0].options[n].value)
												{
													// On vérifie s'il ont un état "coché"/"non coché" identique
													if (champ[0].options[n].selected!=champcomp[0].options[n].selected)
													{
														errno=8;
														tstok=false;
													}
												}
												else
												{
													errno=9;
													tstok=false;
												}
												n++;
											}
										}
										else
										{
											errno=9;
										}
										break;
									default:
										break;
								}
							}
						}
					}

					// Construction du message d'erreur
					if (errno>=0)
					{
						// Si style défini pour l'erreur on l'affiche
						if (tab_prmchamp["stbad"])
						{
							champ[0].className=tab_prmchamp["stbad"]; 
							if (tab_prmchamp["comp"])
							{
								champcomp[0].className=tab_prmchamp["stbad"];
							}
						}
						txt_pop+=ConvertAccents(tab_prmchamp["txt"])+' : '+ConvertAccents(tab_messerr[errno])+'\r\n';
					}
					else
					{
						// Si style défini pour champ ok on l'affiche
						champ[0].className=tab_prmchamp["stok"];
						if (tab_prmchamp["comp"])
						{
							champcomp[0].className=tab_prmchamp["stok"];
						}
					}
				}
				else
				{
					txt_pop="Un des champs n'existe pas ou n'est pas un champ de saisie";
					alert(ConvertAccents(txt_pop));
					return false;
				}
			}
			else
			{
				txt_pop="Mauvaise définition des champs dans le tableau ou le formulaire";
				alert(ConvertAccents(txt_pop));
				return false;
			}
		}
	}
	else
	{
		txt_pop=ConvertAccents("Tableau de paramétrage non défini");
	}
	
	// Si texte pop défini, on l'affiche
	if (txt_pop.length>0)
	{	
		alert(txt_pop);
		return false;
	}
	else
	{
		return true;
	}	
}
