/*
Projet :		Classes PHP génériques
Version :		1.0
Nom du script :		Controles.js
Version :		1.0
Description :		Fonctions de contrôles de champs dans les formulaires HTML
Créé le :		04/02/03
Dernière modif le :	
Modifs CVS :
$Author: ssc $

$Revision: 9246 $

$Id: Controles.js 9246 2008-05-19 14:27:02Z ssc $
	
*/
var NUMERIQUE=1;
var EMAIL=2;
var DATE=3;
var CHAINE=4;
var EXPREG=5;
var TELEPHONE=7;

var DATE_DIVISEE = 1;
var MIN_INCLUS = 2;
var MAX_INCLUS = 4;
var OBLIGATOIRE = 8;
var CASE_SENSITIVE=16;

var tmpDate;

var jsCst_RS_Vous_devez_saisir = "Vous devez saisir";
var jsCst_RS_Vous_devez_selectionner = "Vous devez sélectionner";
var jsCst_RS_doit_etre_numerique = "doit être numérique.";
var jsCst_RS_doit_etre_superieur_ou_egal = "doit être supérieur(e) ou égal(e) à";
var jsCst_RS_doit_etre_superieur = "doit être supérieur(e) à";
var jsCst_RS_doit_etre_inferieur_ou_egal = "doit être inférieur(e) ou égal(e) à";
var jsCst_RS_doit_etre_inferieur = "doit être inférieur(e) à";
var jsCst_RS_n_est_pas_renseigne_correctement = "n'est pas renseigné correctement.";
var jsCst_RS_doit_avoir_un_format_email = "doit avoir un format de type email (xx@xx.xx).";
var jsCst_RS_n_est_pas_une_date_correcte = "n'est pas une date correcte.";
var jsCst_RS_La_date_minimum_du_champ = "La date minimum pour le champ";
var jsCst_RS_est_incorrecte = "est incorrecte.";
var jsCst_RS_doit_etre_posterieure_ou_egale_a_la_date_du_jour = "doit être postérieure ou égale à la date du jour.";
var jsCst_RS_doit_etre_posterieure_ou_egale_au = "doit être postérieure ou égale au";
var jsCst_RS_doit_etre_posterieure_a_la_date_du_jour = "doit être postérieure à la date du jour.";
var jsCst_RS_doit_etre_posterieure_au = "doit être postérieure au";
var jsCst_RS_doit_etre_anterieure_ou_egale_a_la_date_du_jour = "doit être antérieure ou égale à la date du jour.";
var jsCst_RS_doit_etre_anterieure_ou_egale_au = "doit être antérieure ou égale au";
var jsCst_RS_doit_etre_anterieure_a_la_date_du_jour = "doit être antérieure à la date du jour.";
var jsCst_RS_doit_etre_anterieure_au = "doit être antérieure au";
var jsCst_RS_doit_comporter_au_moins = "doit comporter au moins";
var jsCst_RS_doit_comporter_plus_de = "doit comporter plus de";
var jsCst_RS_ne_doit_pas_comporter_plus_de = "ne doit pas comporter plus de";
var jsCst_RS_ne_doit_pas_comporter_de = "ne doit pas comporter de";
var jsCst_RS_caracteres = "caractères.";

function RTrim(VALUE){
	var w_space = String.fromCharCode(32);
	var v_length = VALUE.length;
	var strTemp = "";
	if(v_length < 0){
		return "";
	}
	var iTemp = v_length -1;
	
	while(iTemp > -1){
		if(VALUE.charAt(iTemp) == w_space){
		} else {
			strTemp = VALUE.substring(0,iTemp +1);
		break;
		}
	iTemp = iTemp-1;
	
	} //End While
	return strTemp;
}//End Function

function LTrim(VALUE){
	var w_space = String.fromCharCode(32);
	if(v_length < 1){
		return "";
	}
	var v_length = VALUE.length;
	var strTemp = "";
	
	var iTemp = 0;
	
	while(iTemp < v_length){
		if(VALUE.charAt(iTemp) == w_space){
		} else {
			strTemp = VALUE.substring(iTemp,v_length);
		break;
		}
		iTemp = iTemp + 1;
	} //End While
	return strTemp;
} //End Function

function Trim(TRIM_VALUE) {
	if(TRIM_VALUE.length < 1){
		return "";
	}
	TRIM_VALUE = RTrim(TRIM_VALUE);
	TRIM_VALUE = LTrim(TRIM_VALUE);
	if(TRIM_VALUE==""){
		return "";
	} else {
		return TRIM_VALUE;
	}
}//End Function

// controle de champs
// nomChamp : non du champ à tester (attribut name ou id)
// libelleChamp : intitulé du champ
// Obligatoire : true si le champ est obligatoire
// typeChamp : spéficie le type du champ (peut prendre les valeurs NUMERIC,EMAIL,DATE,SIREN)
// Minimum, Maximum(facultatif) : définit les bornes min et max du champ (numérique ou date)
// dateDivisee (obligatoire pour les champs date) : true si la date est saisie en trois champs jour,mois et année
function ControleChamps(nomChamp, libelleChamp, typeChamp, parametres, valeurIgnoree, Minimum, Maximum, caracteresAutorises, numFormulaire) {
	var maxInclus = false;
	var minInclus = false;
	var dateDivisee = false;
	var Obligatoire = false;
	var CaseSensitive = false;
	var optionsChoisies;
	var numForm;
	if (parametres!=null) {
		if (testNumerique(parametres)) {
			optionsChoisies = parametres%32;
			CaseSensitive = ((optionsChoisies/16)>=1);
			optionsChoisies = optionsChoisies%16;
			Obligatoire = ((optionsChoisies/8)>=1);
			optionsChoisies = optionsChoisies%8;
			maxInclus = ((optionsChoisies/4)>=1);
			optionsChoisies = optionsChoisies%4;
			minInclus = ((optionsChoisies/2)>=1);
			optionsChoisies = optionsChoisies%2;
			dateDivisee = (optionsChoisies>=1);
		}
	}
	
	if (numFormulaire != null) {
		numForm = numFormulaire;
	} else {
		numForm = 0;
	}
	
	if ((typeChamp == DATE) && (dateDivisee)) {
		// teste le remplissage des composantes des champs date
		if ((eval("document.forms[" + numForm + "]." + nomChamp + "Jour.value") + eval("document.forms[" + numForm + "]." + nomChamp + "Mois.value") + eval("document.forms[" + numForm + "]." + nomChamp + "Annee.value")) == "") {
			vide = true;
		} else {
			vide = false;
		}
	} else {
		// récupération de la valeur du champ
		var Champ = eval("document.forms[" + numForm + "].elements['" + nomChamp + "'].type");
		var typeDuChamp = typeof(Champ);		
		if (typeDuChamp == "undefined") {
			var listeRadioBouton = document.forms[numForm].elements[nomChamp];
			valeur = "";
			for(var CaseACocher=0; CaseACocher<listeRadioBouton.length; CaseACocher++) {
				if (listeRadioBouton[CaseACocher].checked) {
					valeur=listeRadioBouton[CaseACocher].value;
				}
			}
		} else {
			valeur = eval("document.forms[" + numForm + "].elements['" + nomChamp + "'].value;");
			if (valeur == valeurIgnoree) {
			    valeur = "";
			}
		}
		vide = (valeur == "");
		if (vide == false) {
			vide = (Trim(valeur) == "");
		}
	}
	
	// message d'erreur si le champ est obligatoire et n'est pas rempli
	if (vide) {
	 	if (Obligatoire) {
			if (dateDivisee) {
				alert(jsCst_RS_Vous_devez_saisir + " " + libelleChamp + ".");
				if (eval("document.forms[" + numForm + "].elements['" + nomChamp + "Jour'].type")=="text") {
					eval("document.forms[" + numForm + "]." + nomChamp + "Jour.focus();");
				} else {
					eval("document.forms[" + numForm + "]." + nomChamp + "Mois.focus();");
				}
			} else {
				var Champ=eval("document.forms[" + numForm + "].elements['" + nomChamp + "'].type");
				var typeDuChamp = typeof(Champ);
				switch(typeDuChamp) {
					case "password":
					case "text":
					case "string":
					case "textarea":
						alert(jsCst_RS_Vous_devez_saisir + " " + libelleChamp + ".");
						break;
					default:
						alert(jsCst_RS_Vous_devez_selectionner + " " + libelleChamp + ".");
				}
				//alert(typeDuChamp);
				if ((typeDuChamp != "undefined") && (typeDuChamp != "hidden")) {
					eval("document.forms[" + numForm + "].elements['" + nomChamp + "'].focus();");
				}
			}
			return(false);
		}
	} else {
		switch(typeChamp)
		{
		case NUMERIQUE:
			valeur = valeur.replace(/ /gi, "");
			valeur = valeur.replace(",", ".");
			valeur = valeur.replace(",", ".");
			if (valeur.indexOf(".") != valeur.lastIndexOf(".")) {
				alert(libelleChamp + " " + jsCst_RS_doit_etre_numerique);
				eval("document.forms[" + numForm + "]." + nomChamp + ".focus();");
				return false;
			}
			valeur = valeur*1.;
			if (!testNumerique(valeur)) {
				alert(libelleChamp + " " + jsCst_RS_doit_etre_numerique);
				eval("document.forms[" + numForm + "]." + nomChamp + ".focus();");
				return false;
			} else {
				if (Minimum != null) {
					if (minInclus) {
						if (valeur < Minimum) {
							alert(libelleChamp + " " + jsCst_RS_doit_etre_superieur_ou_egal + " " + Minimum + ".");
							eval("document.forms[" + numForm + "]." + nomChamp + ".focus();");
							return(false);
						}
					} else {
						if (valeur <= Minimum) {
							alert(libelleChamp + " " + jsCst_RS_doit_etre_superieur + " " + Minimum + ".");
							eval("document.forms[" + numForm + "]." + nomChamp + ".focus();");
							return(false);
						}
					}
				}
				if (Maximum != null) {
					if (maxInclus) {
						if (valeur > Maximum) {
							alert(libelleChamp + " " + jsCst_RS_doit_etre_inferieur_ou_egal + " " + Maximum + ".");
							eval("document.forms[" + numForm + "]." + nomChamp + ".focus();");
							return(false);
						}
					} else {
						if (valeur >= Maximum) {
							alert(libelleChamp + " " + jsCst_RS_doit_etre_inferieur + " " + Maximum + ".");
							eval("document.forms[" + numForm + "]." + nomChamp + ".focus();");
							return(false);
						}
					}
				}
			}
			break;
		case EXPREG:
			var expressionReguliere;
			if (CaseSensitive) {
				expressionReguliere = new RegExp(caracteresAutorises, "g");
			} else {
				expressionReguliere = new RegExp(caracteresAutorises, "gi");
			}
			valide= (valeur.match(expressionReguliere) != null);
			if (!valide) {
				alert(libelleChamp + " " + jsCst_RS_n_est_pas_renseigne_correctement);
				eval("document.forms[" + numForm + "]." + nomChamp + ".focus();");
				return(false);
			}
			break;
		case TELEPHONE:
			valide = (valeur.match(/^[0-9][0-9](\/|-| |\.)?[0-9][0-9](\/|-| |\.)?[0-9][0-9](\/|-| |\.)?[0-9][0-9](\/|-| |\.)?[0-9][0-9]$/)!=null);
			if (!valide) {
				alert(libelleChamp + " " + jsCst_RS_n_est_pas_renseigne_correctement);
				eval("document.forms[" + numForm + "]." + nomChamp + ".focus();");
				return(false);
			}
			break;
		case EMAIL:
			valide = (valeur.search(/^[^,@]{1,}[^,@\.]@[^\.,@]{2,}(\.[^\.,@]{2,})+$/)!=-1);
/*			// recherche du symbole @
			indice = valeur.indexOf("@");
			if (indice<1)
				valide = false;
			else {
				// teste la présence d'un point derrière le @, avec au moins un caractère entre les deux
				indice2 = valeur.lastIndexOf(".");
				if (indice2-indice<2)
					valide = false;
				else {
					// vérifie si le point n'est pas le dernier caractère
					if (valeur.length <= indice2 + 1)
						valide = false;
					else {
						// vérifie qu'il n'y a pas d'autres @ derrière le point
						valide = (valeur.indexOf("@",indice2) == -1);
					}
				}
			}*/
			if (!valide) {
				alert(libelleChamp + " " + jsCst_RS_doit_avoir_un_format_email);
				eval("document.forms[" + numForm + "]." + nomChamp + ".focus();");
				return(false);
			}
			break;
		case DATE: // VERIFICATION SUR LES DATES
			if (dateDivisee) {
				// récupération des composantes de la date
				// le mois est décrémenté de 1 car la création
				// d'une date utilise un numéro de mois entre 0 et 11
				jour = 1.*eval("document.forms[" + numForm + "]." + nomChamp + "Jour.value");
				mois = 1.*eval("document.forms[" + numForm + "]." + nomChamp + "Mois.value")-1.;
				annee = 1.*eval("document.forms[" + numForm + "]." + nomChamp + "Annee.value");
				// transformations des années sur 2 chiffres en années sur 4 chiffres (ou +)
				if (annee<100) {
					tmpDate = new Date();
					anneeComplete = tmpDate.getFullYear();
					anneeEnCours = tmpDate.getFullYear()%100;
					siecleEnCours = anneeComplete-anneeEnCours;
					if (anneeEnCours+50 > 99) {
						if (annee <= (anneeEnCours-50)) {
							annee += siecleEnCours+100;
						} else {
							annee += siecleEnCours;
						}
					} else {
						if (annee >= (anneeEnCours+50)) {
							annee += siecleEnCours-100;
						} else {
							annee += siecleEnCours;
						}
					}
				}
				
				var testDate = new Date(annee,mois,jour);
				if (( y2k(testDate.getFullYear()) != annee) || (mois != testDate.getMonth()) || (jour != testDate.getDate()) ) {
					alert(libelleChamp + " " + jsCst_RS_n_est_pas_une_date_correcte);
					if (eval("document.forms[" + numForm + "].elements['" + nomChamp + "Jour'].type")=="text") {
						eval("document.forms[" + numForm + "]." + nomChamp + "Jour.focus();");
					} else {
						eval("document.forms[" + numForm + "]." + nomChamp + "Mois.focus();");
					}
					return(false);
				}
			} else {
				if (!(testDate = creeDate(valeur))) {
					alert(libelleChamp + " " + jsCst_RS_n_est_pas_une_date_correcte);
					eval("document.forms[" + numForm + "]." + nomChamp + ".focus();");
					return(false);
				}
			}
			// vérifie que la date est postérieure à Minimum (ou égale, selon la valeur de MinInclus)
			if (Minimum != null) {
				// si Minimum = "today", on prend la date du jour
				if (Minimum=="today") {
					tmpDate = new Date();
				} else {
					// crée tmpDate à partir de la chaine Maximum
					if (!creeDate(Minimum)) {
						alert(jsCst_RS_La_date_minimum_du_champ + " '" + libelleChamp + "' " + jsCst_RS_est_incorrecte);
						return(false);
					}
				}
				// calcule l'écart entre les deux dates
				ecart = ecartDates(testDate,tmpDate);

				// si minInclus = true, la date peut etre postérieure ou égale à Minimum
				if (minInclus) {
					if (ecart<0) {
						if (Minimum == "today") {
							alert(libelleChamp + " " + jsCst_RS_doit_etre_posterieure_ou_egale_a_la_date_du_jour);
						} else {
							alert(libelleChamp + " " + jsCst_RS_doit_etre_posterieure_ou_egale_au + " " + Minimum + ".");
						}
						if (dateDivisee) {
							eval("document.forms[" + numForm + "]." + nomChamp + "Jour.focus();");
						} else {
							eval("document.forms[" + numForm + "]." + nomChamp + ".focus();");
						}
						return(false);
					}
				} else { // si minInclus = false, la date ne peut etre que postérieure à Minimum
					if (ecart<=0) {
						if (Minimum == "today") {
							alert(libelleChamp + " " + jsCst_RS_doit_etre_posterieure_a_la_date_du_jour);
						} else {
							alert(libelleChamp + " " + jsCst_RS_doit_etre_posterieure_au + " " + Minimum + ".");
						}
						if (dateDivisee) {
							eval("document.forms[" + numForm + "]." + nomChamp + "Jour.focus();");
						} else {
							eval("document.forms[" + numForm + "]." + nomChamp + ".focus();");
						}
						return(false);
					}
				}
			}
			// vérifie que la date est antérieure à Maximum (ou égale, selon la valeur de MaxInclus)
			if (Maximum != null) {
				// si Maximum = "today", on prend la date du jour
				if (Maximum=="today") {
					tmpDate = new Date();
				} else {
					// crée tmpDate à partir de la chaine Maximum
					if (!creeDate(Maximum)) {
						alert("La date maximum pour le champ '" + libelleChamp + "' est incorrecte!");
						return(false);
					}
				}
				// calcule l'écart entre les deux dates
				ecart = ecartDates(testDate,tmpDate);

				// si minInclus = true, la date peut etre postérieure ou égale à Minimum
				if (maxInclus) {
					if (ecart>0) {
						if (Maximum == "today") {
							alert(libelleChamp + " " + jsCst_RS_doit_etre_anterieure_ou_egale_a_la_date_du_jour);
						} else {
							alert(libelleChamp + " " + jsCst_RS_doit_etre_anterieure_ou_egale_au + " " + Maximum + ".");
						}
						if (dateDivisee) {
							eval("document.forms[" + numForm + "]." + nomChamp + "Jour.focus();");
						} else {
							eval("document.forms[" + numForm + "]." + nomChamp + ".focus();");
						}
						return(false);
					}
				} else { // si maxInclus = false, la date ne peut etre que postérieure à Minimum
					if (ecart>=0) {
						if (Maximum=="today") {
							alert(libelleChamp + " " + jsCst_RS_doit_etre_anterieure_a_la_date_du_jour);
						} else {
							alert(libelleChamp + " " + jsCst_RS_doit_etre_anterieure_au + " " + Maximum + ".");
						}
						if (dateDivisee) {
							eval("document.forms[" + numForm + "]." + nomChamp + "Jour.focus();");
						} else {
							eval("document.forms[" + numForm + "]." + nomChamp + ".focus();");
						}
						return(false);
					}
				}
			}
			break;
		case CHAINE:
			longueur = valeur.length;
			if (Minimum != null) {
				if (minInclus) {
					if (longueur < Minimum) {
						alert(libelleChamp + " " + jsCst_RS_doit_comporter_au_moins + " " + Minimum + " " + jsCst_RS_caracteres);
						eval("document.forms[" + numForm + "].elements['" + nomChamp + "'].focus();");
						return(false);
					}
				} else {
					if (longueur <= Minimum) {
						alert(libelleChamp + " " + jsCst_RS_doit_comporter_plus_de + " " + Minimum + " " + jsCst_RS_caracteres);
						eval("document.forms[" + numForm + "].elements['" + nomChamp + "'].focus();");
						return(false);
					}
				}
			}
			if (Maximum != null) {
				if (maxInclus) {
					if (longueur > Maximum) {
						alert(libelleChamp + " " + jsCst_RS_ne_doit_pas_comporter_plus_de + " " + Maximum + " " + jsCst_RS_caracteres);
						eval("document.forms[" + numForm + "].elements['" + nomChamp + "'].focus();");
						return(false);
					}
				} else {
					if (longueur >= Maximum) {
						alert(libelleChamp + " " + jsCst_RS_ne_doit_pas_comporter_plus_de + " " + (Maximum-1) + " " + jsCst_RS_caracteres);
						eval("document.forms[" + numForm + "].elements['" + nomChamp + "'].focus();");
						return(false);
					}
				}
			}
			if (caracteresAutorises!=null) {
				if (caracteresAutorises!="") {
					valide = true;
					for(var i=0;(i<valeur.length)&&(valide);i++) {
						if (caracteresAutorises.indexOf(valeur.charAt(i))<0)
							valide = false;
					}
					
					if (!valide) {
						alert(libelleChamp + " " + jsCst_RS_ne_doit_pas_comporter_de + " " + valeur.charAt(i-1) + ".");
						eval("document.forms[" + numForm + "].elements['" + nomChamp + "'].focus();");
						return(false);
					}
				}
			}
		default: 
		}
	}
	return (true);
}

// teste si une chaine est numérique ou pas
function testNumerique(chaine) {
	chaine2 = new String(chaine);
	chaine2 = chaine2.replace(",",".");
	chaine2 = chaine2.replace(/ /gi,"");
	return (("" + parseFloat(chaine2)) == chaine2*1.);
}

// crée un objet de type Date à partir d'une chaine
// retourne false si la date n'est pas de format JJ/MM/AAAA
// ou n'est pas valide
function creeDate(chaine) {
	var laDate = chaine;
	var jour;
	var mois;
	var annee;
	var indice = laDate.indexOf("/");
	if ((indice>2)||(indice<1))
		return(false);
	else {
		jour = laDate.substring(0,indice);
		laDate = laDate.substring(indice+1,laDate.length);
		indice = laDate.indexOf("/");
		if ((indice>2)||(indice<1)) {
			return(false);
		} else {
			mois = laDate.substring(0,indice);
			annee = laDate.substring(indice+1,laDate.length);;
			if (isNaN(1.+jour+mois+annee)) {
				return false;
			} else {
				jour=jour*1.;
				mois=mois-1.;
				annee=annee*1.;
				
								// transformations des années sur 2 chiffres en années sur 4 chiffres (ou +)
				if (annee<100) {
					tmpDate = new Date();
					anneeComplete=tmpDate.getFullYear();
					anneeEnCours=tmpDate.getFullYear()%100;
					siecleEnCours=anneeComplete-anneeEnCours;
					if (anneeEnCours+50>99) {
						if (annee<=(anneeEnCours-50)) {
							annee+=siecleEnCours+100;
						} else {
							annee+=siecleEnCours;
						}
					} else {
						if (annee>=(anneeEnCours+50)) {
							annee+=siecleEnCours-100;
						} else {
							annee+=siecleEnCours;
						}
					}
				}
				
				var newDate = new Date(annee,mois,jour);
				if (( y2k(newDate.getFullYear()) != annee) || (mois != newDate.getMonth()) || (jour != newDate.getDate()) ) {
					return(false);
				} else {
					tmpDate = newDate;
					return(tmpDate);
				}
			}
		}
	}
}

// Cette fonction multiplie un nombre par deux et additionne les chiffres qui composent le résultat.
// ex : foisdeux(6) renvoie 6*2=12 1+2 = 3
function foisdeux(nb) {
	var ret = nb*2;
	if (ret > 9) {
		var truc = new String(ret);
		ret = parseInt(truc.substring(0,1)) + parseInt(truc.substring(1,2));
	}
	return(ret);
}

// retourne le nombre de jours entre date1 et date2 (date1-date2)
function ecartDates(date1,date2) {
  var difference = Date.UTC(date1.getFullYear(),date1.getMonth(),date1.getDate(),0,0,0) - Date.UTC(date2.getFullYear(),date2.getMonth(),date2.getDate(),0,0,0);
  return difference;
}

// convertit une date sur 2 chiffres en une date sur 4 chiffres
function y2k(number) {
	 return (number < 1900) ? number + 1900 : number;
} 

// si la valeur passée est numérique, le point
// est remplacé par la virgule, et le nombre de décimales
// est passé à deux
function formatteNombre(valeur,nbDec) {
	affichage = new String(valeur);
	
	if (nbDec == null) {
		nbDec = 2;
	}
	if (parseInt(nbDec)<1) {
		nbDec = 2;
	}
	
	// valeur non numérique : on ne modifie rien
	if (testNumerique(valeur)) {
		// remplacement des points par des virgules
		affichage = affichage.replace(".",",");
		indice = affichage.indexOf(",");
		// calcul du nombre de chiffres derrière la virgule
		nombreDecimales = affichage.length-indice-1;
		if (indice==-1) {
			affichage = affichage.concat(',0');
			nombreDecimales = 1;
		}
		if (nombreDecimales>nbDec) {
			arrondi = Math.round(affichage.replace(",",".")*Math.pow(10,nbDec));
			affichage = new String(arrondi/Math.pow(10,nbDec));
			affichage = formatteNombre(affichage,nbDec);
		} else {
			for(;nombreDecimales<nbDec;nombreDecimales++) {
				affichage = affichage.concat('0');
			}
		}
		
		// enlève les espaces dans l'affichage (pour ne pas en avoir en double)
		affichage = affichage.replace(" ","");
		
		// ajoute des espaces tous les 3 chiffres à partir de la virgule
		indice = affichage.indexOf(",");
		for(var i=indice-3;i>0;i-=3) {
			// découpe le nombre en deux
			prefixe = affichage.substr(0,i);
			suffixe = affichage.substring(i,affichage.length);
			// et les recolle avec un espace entre les deux
			affichage = prefixe +' '+suffixe;
		}
		
	}
	return(affichage);
}
