// JavaScript Document

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

//a faire :
/*
checkbox + radioboutons


 */

var resultat = new Array();
var tabElements = new Array();
var val = true;
var inc = 0;

function Check(f) {
	for (j in tabElements[f]) {
		tabElements[f][j]();
	}
	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();
		}
		if (!tabElements[f]) {
			tabElements[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) {
			if (options['model'] == "select") {
				document.getElementById(sousElem).onblur = function() {
					validerSelectList(sousElem, f, options);
				};
				tabElements[f][inc] = function() {validerSelectList(sousElem, f, options);};
				inc++;
			} else {
				document.getElementById(sousElem).onblur = function() {
					valider(sousElem, f, options);
				};
				tabElements[f][inc] = function() {valider(sousElem, f, options);};
				inc++;
			}
		} else {
			if (options['model'] == "select") {
				document.getElementById(sousElem).setAttribute(
						options.validateon,
						"validerSelectList('" + sousElem + "', '" + f + "', {"
								+ opt.substr(1) + "});");
				tabElements[f][inc] = function() {validerSelectList(sousElem, f, options);};
				inc++;
			} else {
				document.getElementById(sousElem).setAttribute(
						options.validateon,
						"valider('" + sousElem + "', '" + f + "', {"
								+ opt.substr(1) + "});");

				tabElements[f][inc] = function() {valider(sousElem, f, options);};
				inc++;
			}
		}
	}
}

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.value.length,
				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) {
						etatMessage('erreurPresence', elem, 'block');
						resultat[f][sousElem] = false;
					} else {
						etatMessage('erreurPresence', elem, 'none');
						if (document.getElementById(options["pass"]).value == document
								.getElementById(sousElem).value) {
							//on cache le message d'erreur des mots de passes différents
							etatMessage('erreurConfirmIdentique', elem, 'none');
						} else {
							//si les mdp sont differents
							etatMessage('erreurConfirmIdentique', elem, '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;
		// numero de lettre
		case "num_lettre":
			var expReg = /^([0-9]){4}\-([a-zA-Z0-9]){6}$/;
			affErreur(expReg, elem, sousElem, f);
			break;
		// pas de model
		default:
			break;
		}
	}
}

function validerSelectList(sousElem, f, options) {
	var elem = document.getElementById(sousElem).parentNode;
	var subelem = document.getElementById(sousElem);
	var opt = "";
	for ( var i in options) {
		opt += ", " + i + ":'" + options[i] + "'";
	}
	//si rien de sélectionné on vérifie si le champ est requis
	if (subelem.options.length == 0
			|| subelem.selectedIndex == -1
			|| subelem.options[subelem.selectedIndex].getAttribute("value") == null) {
		presenceChamp(f, elem, sousElem, options);
	} else {
		etatMessage('erreurPresence', elem, 'none');
		// nombre d'éléments sélectionnés
		selectedValues = 0;
		for (i = 0; i < subelem.options.length; i++) {
			if (subelem.options[i].selected) {
				selectedValues++;
			}
		}
		resultat[f][sousElem] = checkSize(elem, selectedValues, options["min"],
				options["max"]);
	}
}

//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 < min) {
		etatMessage('erreurTailleMax', elem, 'none');
		etatMessage('erreurTailleMin', elem, 'block');
		return false;
	} else if (max && subelem > 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 tailleMaxTA(e, taille) {
	if (document.getElementById) {
		var length = e.value.length;
		// var length = document.getElementById(e).value.length;
		if (length > taille) {
			//document.getElementById(e).value = document.getElementById(e).value.substr(0,taille);
			e.value = e.value.substr(0, taille);
		}
	}
}

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