<!--
 /* @author : xavier.ottolini[at]adelis.com
 * @param argument id : String : paramètre id du formulaire
 */
function UniForm(id) 
{
	this.formulaire = document.getElementById(id);
	this.listeChamps = new ListeChamps(this.formulaire);
	this.valide = valideForm;
	this.ajouteChamp = ajouteChampForm;
	this.creer = creer;
	this.DEFAUT = "";
	this.ENTIER = "entier";
	this.FLOTTANT = "flottant"
	this.EMAIL = "email";
	this.URL = "url";
	this.DATE = "date";
	this.FICHIER_IMAGE = "img";
	this.FICHIER_TEXTE = "txt";
}

function valideForm() 
{
	var etat = true;
	var taille = this.listeChamps.getLength();
	var message = "";
	var champFocus;

	for(var i = taille; i>0; i--) 
	{
		var champ = this.listeChamps.getChamp(taille - i);

		if(!champ.valide()) 
		{
			if(etat) champFocus = champ;
			message += champ.getMessage() + "\r\n";
			etat = false;			
		}
	}
	
	if(!etat) {
		window.alert(message);
		champFocus.focus();
	}

	return etat;
}

/**
 * Méthode ajouteChamp
 * Paramètre un champ du formulaire
 * 
 * @param nom , String représentant le praramètre name du champ
 * @param regle , String représentant la règle à appliquer pour tester un champ. 
 * Il existe une règle prédéfinie : UniForm.DEFAUT .
 * @param requis : boolean qui vaut true si le champ est requis, false dans le cas contraire
 * @param messageRequis : message à afficher si le champ requis n'est pas affiché
 */
function ajouteChampForm(nom, regle, requis, messageRequis) 
{
	this.listeChamps.ajouteChamp(this.creer(this.formulaire, nom, regle, requis, messageRequis));
}

/**
 * Méthode ajouteChamp
 * Paramètre un champ du formulaire
 * 
 * @param nom , String représentant le praramètre name du champ
 * @param regle , String représentant la règle à appliquer pour tester un champ. 
 * Il existe des règles prédéfinies : UniForm.DEFAUT, UniForm.ENTIER, UniForm.FLOTTANT, UniForm.EMAIL, UniForm.URL, UniForm.DATE, UniForm.FICHIER_IMAGE, UniForm.FICHIER_TEXTE.
 * Ca peut être aussi une expression régulière. 
 * Dans ce cas, attention a remplacer les '\' par des '\\' et les '/' par des '\/'. 
 * @param requis : boolean qui vaut true si le champ est requis, false dans le cas contraire
 * @param messageRequis : message à afficher si le champ requis n'est pas affiché
 * @param messageRegle : message à afficher si la règle n'est pas respectée
 */
function ajouteChampForm(nom, regle, requis, messageRequis,messageRegle) 
{
	this.listeChamps.ajouteChamp(this.creer(this.formulaire, nom, regle, requis, messageRequis,messageRegle));
}


function creer() {
	var a = creer.arguments;
	var oForm = a[0];
	var nom = a[1];
	var regle = a[2];
	var requis = a[3];
	var messageRequis = a[4];
	var messageRegle = null;
	if(a.length == 6) messageRegle = a[5];

	var unChamp = oForm.elements[nom];
	var instanceChamp;
	if(!unChamp.length) 
	{
		if(unChamp.tagName.toLowerCase()=='input') 
		{
			if(unChamp.type.toLowerCase()=='text')
			{
				if(regle == this.DEFAUT) 
				{

					return instanceChamp = new ChampTexte(oForm,nom, regle ,requis, messageRequis);
				}
				
				else if(regle == this.ENTIER)
				{
					return instanceChamp = new ChampEntier(oForm,nom, requis, messageRequis, messageRegle);
				}
		
				else if(regle == this.FLOTTANT)
				{
					return instanceChamp = new ChampFlottant(oForm,nom, requis, messageRequis, messageRegle);
				}
		
				else if(regle == this.EMAIL)
				{
					return instanceChamp = new ChampEmail(oForm,nom, requis, messageRequis, messageRegle);
				}
		
				else if(regle == this.URL)
				{
					return instanceChamp = new ChampURL(oForm,nom, requis, messageRequis, messageRegle);
				} 
				
				else if(regle == this.DATE)
				{
					return instanceChamp = new ChampDate(oForm,nom, requis, messageRequis, messageRegle);
				} 
				
				else 
				{
					return instanceChamp = new ChampTexte(oForm,nom, regle, requis, messageRequis, messageRegle);
				}
				
			} 
			else if(unChamp.type.toLowerCase()=='file') 
			{
				if(regle == this.FICHIER_IMAGE) 
				{
					return instanceChamp = new ChampFichierImage(oForm,nom, requis, messageRequis, messageRegle);
				}

				else if(regle == this.FICHIER_TEXTE)
				{
					return instanceChamp = new ChampFichierTexte(oForm,nom, requis, messageRequis, messageRegle);
				}

				else 
				{
					return instanceChamp = new ChampFichier(oForm,nom, requis, messageRequis, messageRegle);
				}
			} 
			else  if(unChamp.type.toLowerCase()=='checkbox') 
			{
				return instanceChamp = new ChampCase(oForm,nom, requis, messageRequis);
			} 
			else if(unChamp.type.toLowerCase()=='radio') 
			{
				return instanceChamp = new ChampRadio(oForm,nom, requis, messageRequis);
			}
		}
		else if(unChamp.tagName.toLowerCase()=='select') 
		{
			if(unChamp.multiple) 
			{
				return instanceChamp = new ChampListeMultiple(oForm,nom, requis, messageRequis);
			} 
			else 
			{
				return instanceChamp = new ChampListeUnique(oForm,nom, requis, messageRequis);
			}
		} 
		else if(unChamp.tagName.toLowerCase()=='textarea')
		{
			return instanceChamp = new ChampArea(oForm,nom, requis, messageRequis);
		}
	}	
	else 
	{
		if(unChamp[0].tagName.toLowerCase()=='input') 
		{
			if(unChamp[0].type.toLowerCase()=='checkbox') 
			{
				return instanceChamp = new ChampsCase(oForm,nom, requis, messageRequis);
			} 
			else if(unChamp[0].type.toLowerCase()=='radio') 
			{
				return instanceChamp = new ChampsRadios(oForm,nom, requis, messageRequis);
			}
		}
		else if(unChamp.tagName.toLowerCase()=='select') 
		{
			if(unChamp.multiple) 
			{
				return instanceChamp = new ChampListeMultiple(oForm,nom, requis, messageRequis);
			} 
			else 
			{
				return instanceChamp = new ChampListeUnique(oForm,nom, requis, messageRequis);
			}
		} 
	}
	
}


function ListeChamps()
{
	this.liste = new Array()
	this.ajouteChamp = ajouteChampListe;
	this.getChamp = getChamp;
	this.getLength = getLength;
}

function ajouteChampListe(element)
{
	this.liste[this.liste.length] = element;
}

function getChamp(i) 
{
	return this.liste[i];
}

function getLength() 
{
	return this.liste.length;
}

function Champ(oForm,nom, regle, requis, messageRequis)
{
	this.element = oForm.elements[nom];
	this.regle = regle;
	this.requis = requis;
	this.messageRequis = messageRequis;
	this.messageRegle = null;
	this.message = null;
	this.getMessage = getMessage;
}

function Champ(oForm,nom, regle, requis, messageRequis, messageRegle)
{
	this.element = oForm.elements[nom];
	this.regle = regle;
	this.requis = requis;
	this.messageRequis = messageRequis;
	this.messageRegle = messageRegle;
	this.message = null;
	this.getMessage = getMessage;
}

function getMessage() 
{
	return this.message;
}

function ChampTexte(oForm,nom, regle, requis, messageRequis) {
	this.parent = Champ;
	if(regle==this.DEFAUT) {
		regle = "(.*)";
	}
	this.parent(oForm,nom, regle, requis, messageRequis); 
	this.getValeur=getValeurChampTexte;
	this.valide = valideChampTexte;
	this.focus = uniqueFocus;
}

function ChampTexte(oForm,nom, regle, requis, messageRequis, messageRegle) {
	this.parent = Champ;
	if(regle==this.DEFAUT) {
		regle = "(.*)";
	}
	this.parent(oForm,nom, regle, requis, messageRequis, messageRegle); 
	this.getValeur=getValeurChampTexte;
	this.valide = valideChampTexte;
	this.focus = uniqueFocus;
}

function getValeurChampTexte() 
{
	return this.element.value;
}

function valideChampTexte()
{
	var valeur = this.getValeur();

	if(this.requis && ((valeur == null) || (valeur == ""))) {
		this.message = this.messageRequis;
		return false;
	}

	if((!this.requis) && ((valeur == null) || (valeur == ""))) {
		return true;
	}

	var reg=new RegExp(this.regle, "gi");
	var etat = valeur.match(reg);
	if(!etat) this.message = this.messageRegle;
	return etat;
}

function uniqueFocus() {
	this.element.focus();
}

function ChampEntier(oForm,nom, requis, messageRequis, messageRegle) {
	this.parent = Champ;
	var regle = "^(\\+|-)?\\d+$";
	this.parent(oForm,nom, regle, requis, messageRequis, messageRegle); 
	this.element = oForm.elements[nom];
	this.getValeur= getValeurChampTexte;
	this.valide = valideChampTexte;	
	this.focus = uniqueFocus;
}

function ChampFlottant(oForm,nom, requis, messageRequis, messageRegle) {
	this.parent = Champ;
	var regle = "^(\\-)?\\d*((\\.|,)\\d+)?$";
	this.parent(oForm,nom, regle, requis, messageRequis, messageRegle); 
	this.element = oForm.elements[nom];
	this.getValeur=getValeurChampTexte;
	this.valide = valideChampTexte;	
	this.focus = uniqueFocus;
}

function ChampEmail(oForm,nom, requis, messageRequis, messageRegle) {
	this.parent = Champ;
	var regle = "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[_A-Za-z0-9-]+)";
	this.parent(oForm,nom, regle, requis, messageRequis, messageRegle); 
	this.element = oForm.elements[nom];
	this.getValeur=getValeurChampTexte;
	this.valide = valideChampTexte;	
	this.focus = uniqueFocus;
}

function ChampURL(oForm,nom, requis, messageRequis, messageRegle) {
	this.parent = Champ;
	var regle = "^(ht|f)tp(s?)\\:\\\/\\\/[a-zA-Z0-9\\-\\._]+(\\.[a-zA-Z0-9\\-\\._]+){2,}(\\\/?)([a-zA-Z0-9\\-\\.\\?\\,\\'\\\/\\\\\\+&%\$#_]*)?$";
	this.parent(oForm,nom, regle, requis, messageRequis, messageRegle); 
		this.getValeur=getValeurChampTexte;
	this.valide = valideChampTexte;	
	this.focus = uniqueFocus;
}

function ChampDate(oForm,nom, requis, messageRequis, messageRegle) {
	//+tw 9 mai 2006
	this.parent = Champ;
	//-tw 9 mai 2006
	this.parent(oForm,nom, "", requis, messageRequis, messageRegle); 
	this.getValeur=getValeurChampTexte;
	this.valide = valideChampDate;
	this.isPasNombre = isPasNombre;
	this.focus = uniqueFocus;
}

function valideChampDate() {
	// This method checks if the format corresponds to JJ/MM/AAAA and if the date existes in the gregorian calendar.
	// The separator is set up in the separateur value.
	// return  0 if the date format is false (french format), 
	// return 1 if the date format is correct, 
	var valeur = this.getValeur();

	if(this.requis && (valeur == "")) {
		this.message = this.messageRequis;
		return false;
	}

	if((!this.requis) && (valeur == "")) return true;

	var etat=true;
	var amin=1970;  // year mini
	var amax=9999;  // year maxi
	var separateur="/"; // separator between days/months/years
	var j=(valeur.substring(0,2));
	var m=(valeur.substring(3,5));
	var a=(valeur.substring(6));
	var ok=1;
	if ( ((this.isPasNombre(j))||(j<1)||(j>31)) && (ok==1) ) {
		etat=false;
	}

	if ( ((this.isPasNombre(m))||(m<1)||(m>12)) && (ok==1) ) {
		etat=false;
	}
	if ( ((this.isPasNombre(a))||(a<amin)||(a>amax)) && (ok==1) ) {
		etat=false;
	}
	if ( ((valeur.substring(2,3)!=separateur)||(valeur.substring(5,6)!=separateur)) && (ok==1) ) {
		etat=false;
	}
	
	if (etat) {
		var dateTest=new Date(a,m-1,j);
		jTest=dateTest.getDate();
		mTest=dateTest.getMonth()+1;
		if ( (j!=jTest)||(m!=mTest) ) etat=false;
	} 
	
	if(!etat) this.message = this.messageRegle;
	return etat;
}

function isPasNombre(n)
{ 
	// notNb = 0 : the value is digital ; 
	// notNb = 1 : the value is not digital ;
	var notNb=false; 
	var i = 0;                // counter
	
	if(n.length > 0) 
	{
		// comparison realized on every caracters of the string 
		// if a caracter is not between "0" and "9" then the value is not digital
		for(var i=n.length;i>0;i--) 
		{
			if(isNaN(parseInt( n.charAt(n.length - i) ))) notNb =true;   
		}
	}
	return notNb ;
}


function ChampFichierImage(oForm,nom, requis, messageRequis, messageRegle) {
	this.parent = Champ;
	var regle = "^(\\w|-)+\\.(((j|J)(p|P)(g|G))|((g|G)(i|I)(f|F))|((p|P)(n|N)(g|G)))$";
	this.parent(oForm,nom, regle, requis, messageRequis, messageRegle); 
	this.getValeur=getValeurChampTexte;
	this.getNomFichierDuChemin = getNomFichierDuChemin;
	this.valide = valideChampFichier;	
	this.focus = uniqueFocus;
}

function ChampFichierTexte(oForm,nom, requis,  messageRequis, messageRegle) {
	this.parent = Champ;
	var regle = "^(\\w|-)+\\.(((d|D)(o|O)(c|C))|((r|R)(t|T)(f|F))|((t|T)(x|X)(t|T))|((p|P)(d|D)(f|F)))$";
	this.parent(oForm,nom, regle, requis, messageRequis, messageRegle); 
	this.getValeur=getValeurChampTexte;
	this.getNomFichierDuChemin = getNomFichierDuChemin;
	this.valide = valideChampFichier;	
	this.focus = uniqueFocus;
}

function ChampFichier(oForm,nom, requis, messageRequis, messageRegle) {
	this.parent = Champ;
	var regle = "^(\\w|-)+\\.([a-z]|[A-Z]){1,4}$";
	this.parent(oForm,nom, regle, requis, messageRequis, messageRegle); 
	this.getValeur=getValeurChampTexte;
	this.getNomFichierDuChemin = getNomFichierDuChemin;
	this.valide = valideChampFichier;	
	this.focus = uniqueFocus;
}

function getNomFichierDuChemin(valeur) {
	var separateursExpression = Array(":","\/\/","\\\\");
	var separateurs = Array(":","\/","\\");

	for(var n=separateurs.length; n>0 ; n--) {
		var regSeparateur = new RegExp(separateursExpression[n-1], "gi");
		var res = valeur.match(regSeparateur);

		if(res) 
		{
			return valeur.substring(valeur.lastIndexOf(separateurs[n-1]) + 1);
		}
	}

	return valeur;
}

function valideChampFichier()
{
	var valeur = this.getNomFichierDuChemin(this.getValeur());

	if(this.requis && ((valeur == null) || (valeur == ""))) {
		this.message = this.messageRequis;
		return false;
	}

	if((!this.requis) && ((this.getValeur() == null) || (this.getValeur() == ""))) return true;

	var reg=new RegExp(this.regle, "gi");
	var etat = valeur.match(reg);
	if(!etat) this.message = this.messageRegle;
	return etat;
}

function ChampCase(oForm,nom, requis, messageRequis) {
	this.parent = Champ;
	this.parent(oForm,nom,'', requis, messageRequis); 
	this.getValeur=getValeurChampTexte;
	this.valide = valideChampCase;	
	this.focus = uniqueFocus;
}

function valideChampCase()
{
	if(this.requis && (!this.element.checked)) {
		this.message = this.messageRequis;
		return false;
	}
	return true;
}

function ChampRadio(oForm,nom, requis, message) {
	this.parent = Champ;
	this.parent(oForm,nom,'', requis, message); 
	this.getValeur=getValeurChampTexte;
	this.valide = valideChampRadio;	
	this.focus = uniqueFocus;
}


function valideChampRadio()
{
	if(this.requis && (!this.element.checked)) {
		this.message = this.messageRequis;
		return false;
	}
	return true;
}

function ChampListeMultiple(oForm,nom, requis, message) {
	this.parent = Champ;
	this.parent(oForm,nom,'', requis, message); 
		this.getValeur=getValeurChampListeMultiple;
	this.valide = valideChampListeMultiple;	
	this.focus = uniqueFocus;
}

function getValeurChampListeMultiple() 
{
	var valeur = new Array();
	var n=0;
	for (var i = this.element.options.length; i > 0; i--) 
		if (this.element.options[this.element.options.length - i ].selected) 
			if((this.element.options[this.element.options.length - i].value != null) && (this.element.options[this.element.options.length - i].value != '')) {
				valeur[n]  = this.element.options[this.element.options.length - i].value;
				n++
			}
	return valeur;
}

function valideChampListeMultiple()
{
	var valeur = this.getValeur() ;
	if(this.requis && (valeur.length==0)) {
		this.message = this.messageRequis;
		return false;
	}
	return true;
}

function ChampListeUnique(oForm,nom, requis, message) {
	this.parent = Champ;
	this.parent(oForm,nom,'', requis, message); 
	this.getValeur=getValeurChampListeUnique;
	this.valide = valideChampListeUnique;	
	this.focus = uniqueFocus;
}

function getValeurChampListeUnique() 
{
	return this.element.options[this.element.selectedIndex].value;
}

function valideChampListeUnique()
{
	var valeur = this.getValeur() ;
	if(this.requis && ((valeur==null) || (valeur==''))) {
		this.message = this.messageRequis;
		return false;
	}

	return true;
}

function ChampArea(oForm,nom, requis, message) {
	this.parent = Champ;
	this.parent(oForm,nom, "(.*)", requis, message); 
	this.getValeur=getValeurChampTexte;
	this.valide = valideChampTexte;	
	this.focus = uniqueFocus;
}

function ChampsCase(oForm,nom, requis, message) {
	this.parent = Champ;
	this.parent(oForm,nom, "", requis, message); 
	this.getValeur=getValeurChampsCase;
	this.valide = valideChampsCase;	
	this.focus = multipleFocus;
}

function getValeurChampsCase() 
{
	var valeur = new Array();
	var n = 0;
	for(var i=this.element.length; i>0;i--) if (this.element[this.element.length - i].checked) {
		valeur[n]  = this.element[this.element.length - i].value;
		n++;
	}
	return valeur;
}

function valideChampsCase()
{
	var valeur = this.getValeur() ;
	if(this.requis && (valeur.length==0)) {
		this.message = this.messageRequis;
		return false;
	}
	return true;
}

function multipleFocus() {
	var elementSimple = this.element[0];
	elementSimple.focus();
}

function ChampsRadios(oForm,nom, requis, message) {
	this.parent = Champ;
	this.parent(oForm,nom, "", requis, message); 
	this.getValeur=getValeurChampsRadios;
	this.valide = valideChampsRadios;	
	this.focus = multipleFocus;
}

function getValeurChampsRadios() 
{
	for(var i=this.element.length; i>0;i--) if (this.element[this.element.length - i].checked) return this.element[this.element.length - i].value;
	return null;
}

function valideChampsRadios()
{
	var valeur = this.getValeur() ;
	if(this.requis && ((valeur==null) || (valeur==''))) {
		this.message = this.messageRequis;
		return false;
	}
	return true;
}
-->
