/*
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 :
*/

var NUMERIQUE=1;
var EMAIL=2;
var DATE=3;
var SIREN=4;
var SIRET=5;
var CHAINE=6
var EXPREG=7;
var TELEPHONE=8;

var DATE_DIVISEE = 1;
var MIN_INCLUS = 2;
var MAX_INCLUS = 4;
var OBLIGATOIRE = 8;
var CASE_SENSITIVE=16;

var tmpDate;

// 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, 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;");
		}
		vide = (valeur == "");
	}
	
	// message d'erreur si le champ est obligatoire et n'est pas rempli
	if (vide){
	 	if(Obligatoire){
			if(dateDivisee){
				alert("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("Vous devez saisir "+libelleChamp+".");
						break;
					default:
						alert("Vous devez sélectionner "+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+" doit être numérique.");
				eval("document.forms["+numForm+"]."+nomChamp+".focus();");
				return false;
			}
			valeur = valeur*1.;
			if(!testNumerique(valeur)){
				alert(libelleChamp+" doit être numérique.");
				eval("document.forms["+numForm+"]."+nomChamp+".focus();");
				return false;
			}
			else{
				if(Minimum != null){
					if(minInclus){
						if(valeur < Minimum){
							alert(libelleChamp+" doit être supérieur(e) ou égal(e) à "+Minimum+".");
							eval("document.forms["+numForm+"]."+nomChamp+".focus();");
							return(false);
						}
					}
					else{
						if(valeur <= Minimum){
							alert(libelleChamp+" doit être supérieur(e) à "+Minimum+".");
							eval("document.forms["+numForm+"]."+nomChamp+".focus();");
							return(false);
						}
					}
				}
				if(Maximum != null){
					if(maxInclus){
						if(valeur > Maximum){
							alert(libelleChamp+" doit être inférieur(e) ou égal(e) à "+Maximum+".");
							eval("document.forms["+numForm+"]."+nomChamp+".focus();");
							return(false);
						}
					}
					else{
						if(valeur >= Maximum){
							alert(libelleChamp+" doit être inférieur(e) à "+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+" n'est pas renseigné 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+" n'est pas renseigné 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+" doit avoir un format de type email (xx@xx.xx).");
				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+" 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+" 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("La date minimum 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(minInclus){
					if(ecart<0){
						if(Minimum=="today"){
							alert(libelleChamp+" doit être postérieure ou égale à la date du jour.");
						}else{
							alert(libelleChamp+" doit être postérieure ou égale au "+Minimum+".");
						}
						if(dateDivisee){
							eval("document.forms["+numForm+"]."+nomChamp+"Jour.focus();");
						}else{
							eval("document.forms["+numForm+"]."+nomChamp+".focus();");
						}
						return(false);
					}
				}
				// si minInclus = false, la date ne peut etre que postérieure à Minimum
				else{
					if(ecart<=0){
						if(Minimum=="today"){
							alert(libelleChamp+" doit être postérieure à la date du jour.");
						}else{
							alert(libelleChamp+" doit être postérieure 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+" doit être antérieure ou égale à la date du jour.");
						}else{
							alert(libelleChamp+" doit être antérieure ou égale au "+Maximum+".");
						}
						if(dateDivisee){
							eval("document.forms["+numForm+"]."+nomChamp+"Jour.focus();");
						}else{
							eval("document.forms["+numForm+"]."+nomChamp+".focus();");
						}
						return(false);
					}
				}
				// si maxInclus = false, la date ne peut etre que postérieure à Minimum
				else{
					if(ecart>=0){
						if(Maximum=="today"){
							alert(libelleChamp+" doit être antérieure à la date du jour.");
						}else{
							alert(libelleChamp+" doit être antérieure au "+Maximum+".");
						}
						if(dateDivisee){
							eval("document.forms["+numForm+"]."+nomChamp+"Jour.focus();");
						}else{
							eval("document.forms["+numForm+"]."+nomChamp+".focus();");
						}
						return(false);
					}
				}
			}
			break;
		case SIREN:
			if(Modulo10(nomChamp,false,numForm)==false){
				alert(libelleChamp+" n'est pas valide.");
				eval("document.forms["+numForm+"]."+nomChamp+".focus();");
				return(false);
			}
			break;
		case SIRET:
			if(Modulo10(nomChamp,true,numForm)==false){
				alert(libelleChamp+" n'est pas valide.");
				eval("document.forms["+numForm+"]."+nomChamp+".focus();");
				return(false);
			}
			break;
		case CHAINE:
			longueur = valeur.length;
			if(Minimum!=null){
				if(minInclus){
					if(longueur < Minimum){
						alert(libelleChamp+" doit comporter au moins "+Minimum+" caractères.");
						eval("document.forms["+numForm+"].elements['"+nomChamp+"'].focus();");
						return(false);
					}
				}
				else{
					if(longueur <= Minimum){
						alert(libelleChamp+" doit comporter plus de "+Minimum+" caractères.");
						eval("document.forms["+numForm+"].elements['"+nomChamp+"'].focus();");
						return(false);
					}
				}
			}
			if(Maximum!=null){
				if(maxInclus){
					if(longueur > Maximum){
						alert(libelleChamp+" ne doit pas comporter plus de "+Maximum+" caractères.");
						eval("document.forms["+numForm+"].elements['"+nomChamp+"'].focus();");
						return(false);
					}
				}
				else{
					if(longueur >= Maximum){
						alert(libelleChamp+" ne doit pas comporter plus de "+Maximum+"-1 caractères.");
						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+" 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);
}

function Modulo10(nomChamp,siret,numFormulaire)
{
	var numForm;
	if(numFormulaire!=null){
		numForm = numFormulaire;
	}else{
		numForm = 0;
	}
	// Récup. N° de SIREN
	var Siren = new String(eval("document.forms["+numForm+"]."+nomChamp+".value"));
	valide = true;
	
	if(!testNumerique(Siren))
		valide = false;
	else
	{
		if((Siren.length==9)||((Siren.length==14)&&(siret))){
			Siren = Siren.substring(0,9);
			// Découpage de la chaine
			var s1, s2, s3, s4, s5, s6, s7, s8, s9;
			s8 = Siren.substring(0,1);
			s7 = Siren.substring(1,2);
			s6 = Siren.substring(2,3);
			s5 = Siren.substring(3,4);
			s4 = Siren.substring(4,5);
			s3 = Siren.substring(5,6);
			s2 = Siren.substring(6,7);
			s1 = Siren.substring(7,8);
			s0 = Siren.substring(8,9);								
			// Multiplication par 2 des chiffres en position impaire et total de ces chiffres
			var total1 = foisdeux(s1) + foisdeux(s3) + foisdeux(s5) + foisdeux(s7);
			// Addition des chiffres en position paire
			var total2 = parseInt(s2) + parseInt(s4) + parseInt(s6) + parseInt(s8);
			// TOTAL
			var Total = total1 + total2;
			// Détermination de la dizaine suivante
			var temp = Total.toString();
			var unite = temp.substring(1,2);
			var temp = temp.substring(0,1);
			var dizaine = 0;
			if (unite == "0") {
				dizaine = Total;
			}
			else {
				dizaine = (parseInt(temp) + 1) * 10;
			}
			// dizaine contient la "dizaine suivante"
			// Soustraction
			var x = dizaine - Total;
			if (x!=s0) 
				valide = false;
		}
		else valide = false;
	}
	return(valide);
}

// 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);
}


