// JavaScript Document

/* ********************************* 
Bibliothèque créée par CR.info, Ghislain Rodrigues (contact@crinfo.fr)
v0.20090525
 ********************************* */

//a faire :
/*
-textArea et select


*/

var resultat = new Array();
var val = true;

function Check(f){
	for(i in resultat[f]){
		val = val && resultat[f][i];
	}
	if(val==false){
		val=true;
		document.getElementById('msg_erreur').innerHTML = "Le formulaire n'est pas correctement rempli";
		return false;
	}
	else{
		return val;
	}
}


function init(sousElem, f, options){
	if(options.validateon){
		if(!resultat[f]){
			resultat[f] = new Array();
		}
		var opt = "";
		for(var i in options){
			opt +=", "+i+":'"+options[i]+"'";	
		}
		//initialisation de resultat au cas ou on valide le formulaire directement
		if(!options["requis"] || options["requis"]=="oui"){
			resultat[f][sousElem]=false;
		}
		else{
			resultat[f][sousElem]=true;
		}
		if(document.all){
			document.getElementById(sousElem).onblur = function(){valider(sousElem, f, options)};
		}
		else{
			document.getElementById(sousElem).setAttribute(options.validateon, "valider('"+sousElem+"', '"+f+"', {"+opt.substr(1)+"});");
		}
	}
}

function valider(sousElem, f, options){
	//model : tel, mail, password, confirmpassword, date
	var elem = document.getElementById(sousElem).parentNode;
	var subelem = document.getElementById(sousElem);
	var opt = "";
	for(var i in options){
		opt +=", "+i+":'"+options[i]+"'";	
	}
	if(subelem.value.length<=0){ //si pas rempli
		presenceChamp(f,elem,sousElem,options);
	}
	else{
		etatMessage('erreurPresence',elem,'none');
		etatMessage('erreurTailleMax',elem,'none');
		etatMessage('erreurTailleMin',elem,'none');
		resultat[f][sousElem] = checkSize(elem, subelem, options["min"], options["max"]);
		//on teste maintenant sa forme
		switch(options["model"]){
			case "tel":
				var expReg=/^0[1-9]([-. ]?[0-9]){8}$/;
				affErreur(expReg, elem, sousElem,f);
			break;
			
			//email
			case "mail":
				var expReg=/^[\w\.-]+@[\w\.-]+\.\w+$/i;
				affErreur(expReg, elem, sousElem,f);
			break;
			
			//cpfrench
			case "cp":
				var expReg=/^\d{5}$/;
				affErreur(expReg, elem, sousElem,f);
			break;
			//mot de passe et confirmation
			case "passwd":
			break;
			case "confirm":	
				//si une confirmation de mdp est précisée
				if(options["pass"]){
					//si l'élément de confirmation existe 
					if(document.getElementById(options["pass"])){
						//et que sa valeur = celle du mdp
						if(document.getElementById(options["pass"]).value.length==0){
							if(getElementsByClassNameIE('erreurPresence',elem)[0]){
								getElementsByClassNameIE('erreurPresence',elem)[0].style.display='block';
							}
							resultat[f][sousElem]=false;
						}
						else{
							if(getElementsByClassNameIE('erreurPresence',elem)[0]){
								getElementsByClassNameIE('erreurPresence',elem)[0].style.display='none';
							}
							if(document.getElementById(options["pass"]).value==document.getElementById(sousElem).value){
								//on cache le message d'erreur des mots de passes différents
								if(getElementsByClassNameIE('erreurConfirmIdentique',elem)[0]){
									getElementsByClassNameIE('erreurConfirmIdentique',elem)[0].style.display='none';
								}
							}
							else{
								//si les mdp sont differents
								if(getElementsByClassNameIE('erreurConfirmIdentique',elem)[0]){
									getElementsByClassNameIE('erreurConfirmIdentique',elem)[0].style.display='block';
								}
								resultat[f][sousElem]=false;
							}
						}
					}
				}
			break;
			//date
			case "date":
				var expReg;
				var sep;
				switch(options['forme']){
					case "aaaa-mm-jj":
						expReg=/^[1-2][0-9]{3}\-[0-9]{2}\-[0-9]{2}$/;
						affErreurDate(expReg, sousElem, elem, "-", options['forme'],f);
					break;
					case "jj-mm-aaaa":
						expReg=/^\d{2}\-\d{2}\-\d{4}$/;
						affErreurDate(expReg, sousElem, elem, "-", options['forme'],f);
					break;
					case "jj/mm/aaaa":
						expReg=/^\d{2}\/\d{2}\/\d{4}$/;
						affErreurDate(expReg, sousElem, elem, "/", options['forme'],f);
					break;
					default:
						expReg=/^\d{4}\-\d{2}\-\d{2}$/;
						affErreurDate(expReg, sousElem, elem, "-", "aaaa-mm-jj", f);
					break;
				}
			break;
			//pas de model
			default:
			break;
		}
	}
}


//fonctions annexes
function calculeNbrJoursMois(mois, annee) {

		var jours = 0;

		switch (mois) {

		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			jours = 31;
			break;

		case 4:
		case 6:
		case 9:
		case 11:
			jours = 30;
			break;

		case 2:
			if (mois == 2 && estBissextile(annee)) {
				jours = 29;
			} else {
				jours = 28;
			}

			break;
		}

		return jours;

	}
	
	function estBissextile(annee) {
		return annee % 4 == 0 && annee % 100 != 0 || annee % 400 == 0;
	}
	
	function estValide(jour, mois, annee){
		return (parseInt(annee) > 1582 && parseInt(mois) >= 1 && parseInt(mois) <= 12 && parseInt(jour) <= calculeNbrJoursMois(parseInt(mois), parseInt(annee)));
	}
	
	//fonction pour afficher ou cacher un message d'erreur 
	function etatMessage(message, element, action){
		if(getElementsByClassNameIE(message,element)[0]){
			getElementsByClassNameIE(message,element)[0].style.display=action;
		}
	}
	
	function checkSize(elem, subelem, min, max){
		if(min && subelem.value.length<min){
			etatMessage('erreurTailleMax',elem,'none');
			etatMessage('erreurTailleMin',elem,'block');
			return false;
		}
		else if(max && subelem.value.length>max){
			etatMessage('erreurTailleMax',elem,'block');
			etatMessage('erreurTailleMin',elem,'none');
			return false;
		}
		else{
			etatMessage('erreurTailleMax',elem,'none');
			etatMessage('erreurTailleMin',elem,'none');
			//le champ est bon concernant sa taille
			return true;
		}
	}
	
	
	function affErreur(expReg, elem, subElem, f){
		if (expReg.test(document.getElementById(subElem).value)){
			etatMessage('erreurPresence',elem,'none');
			etatMessage('erreurForme',elem,'none');
			resultat[f][subElem]=true;
		}
		else{
			etatMessage('erreurPresence', elem,'none');
			etatMessage('erreurForme', elem,'block');
			resultat[f][subElem]=false;
		}
	}


function affErreurDate(expReg, subElem, elem, sep, form, f){
	if (expReg.test(document.getElementById(subElem).value)){
		var bool;var sep;
		var date = document.getElementById(subElem).value.split(sep);
		switch(form){
			case"aaaa-mm-jj":
				bool = estValide(date[2], date[1], date[0]);
				break;
			case"jj-mm-aaaa":
			case"jj/mm/aaaa":
				bool = estValide(date[0], date[1], date[2]);
				break;
			default:
				bool = false;
				break;
		}
		if (bool) {
			getElementsByClassNameIE('erreurForme',elem)[0].style.display='none';
			resultat[f][subElem]=true;
		}
		else{
			getElementsByClassNameIE('erreurForme',elem)[0].style.display='block';
			resultat[f][subElem]=false;
		}
	}
	else{
		getElementsByClassNameIE('erreurForme',elem)[0].style.display='block';
			resultat[f][subElem]=false;
	}
}

function presenceChamp(f, elem, sousElem, options){
	if(!options["requis"] || options["requis"]=="oui"){
		etatMessage('erreurPresence',elem,'block');
		resultat[f][sousElem]=false;
	}
	else{
		etatMessage('erreurPresence',elem,'none');
		resultat[f][sousElem]=true;
	}
	etatMessage('erreurForme',elem,'none');
	etatMessage('erreurTailleMax',elem,'none');
	etatMessage('erreurTailleMin',elem,'none');
}

function getElementsByClassNameIE(classe,elem){
	var tabResult = Array();
	var temp = 0;
	if(elem.hasChildNodes()){
		var list = elem.childNodes;
		for(var i = 0;i<list.length;i++){ //pour chaque enfant direct de elem, si sa classe est class alors on l'ajoute dans le tableau
			if(elem.childNodes[i].className == classe){
				tabResult.push(elem.childNodes[i]);
			}
			tabResult.concat(getElementsByClassNameIE(classe,elem.childNodes[i]));
		}
	}
	return tabResult;
}

