/* addRemoveEvent
********************/
function addRemoveEvent(add, el, evt, func){
	if(add){
		if(el.addEventListener) el.addEventListener(evt, func, false);
		else if (el.attachEvent) el.attachEvent("on" + evt, func);
	}else{
		if(el.removeEventListener) el.removeEventListener(evt, func, false);
		else if (el.detachEvent) el.detachEvent("on" + evt, func);
	}
}

/* form methods
********************/
function getSkinnedForms(){ /* inutile ?! */
	var forms = document.getElementsByTagName("form");
	var skinnedForms = new Array();
	for(var i=0; i<forms.length; ++i){
		if(forms[i].className != "skinnedForm") continue;
		skinnedForms.push(forms[i]);
	}
	return skinnedForms;
}
function getRows(form){
	if(form) var skinnedForms = [form];
	else var skinnedForms = getSkinnedForms();
	var rows = new Array();
	for(var i=0; i<skinnedForms.length; ++i){
		var el = skinnedForms[i].getElementsByTagName("div");
		for(var j=0; j<el.length; ++j){
			if(!el[j].className.match("row")) continue;
			rows.push(el[j]);
		}
	}
	return rows;
}
function rowToInput(row, n){
	var i = row.getElementsByTagName("input");
	if(i.length) return i[n];
	var s = row.getElementsByTagName("select");
	if(s.length) return s[n];
	var t = row.getElementsByTagName("textarea");
	if(t.length) return t[n];
}
function inputToRow(el){ /* changer nom de la méthode "elTo, goto..." */
	var parent = el.parentNode;
	while (!parent.className.match("row")) parent = parent.parentNode;
	return parent;
}
function inputToForm(el){ /* changer nom de la méthode "elTo, goto..." */
	var form = el.parentNode;
	while (form.nodeName != "FORM") form = form.parentNode;
	return form;
}

/* formVerif
********************/
function verifInput(el){
	switch(el.className){
		case "filled" :
			if(el.value == "") return "-with-error";
			else return "";
		
		case "numeric" :
			if(el.value == "" || isNaN(el.value)) return "-with-error";
			else return "";
		
		case "email" :
			rx=new RegExp("^[\\w\.-]+@[\\w\\.-]+\\.[a-zA-Z]{2,4}$");
			if(!rx.test(el.value)) return "-with-error";
			else return "";
	}
}
function verifAllInput(form){ /* optimiser, revoir repère de concaténation, genre "__" */
	var valid = true;
	var rows = getRows(form);
	for(var i=0; i<rows.length; ++i){
		var input = rowToInput(rows[i], 0);
		if(input.className){
			var parentClasses = rows[i].className.split("-with-");
			var error = verifInput(input);
			if(error == "-with-error") valid = false;
			rows[i].className = parentClasses[0] + error;
		}
	}
	return valid;
}

/* formBehaviour
********************/
function initForm(){
	var rows = getRows();
	for(var i=0; i<rows.length; ++i){
		if(rows[i].className == "rowsubmit"){
			initFormSubmit(rows[i]);
			//return;
		}else{
			var input = rowToInput(rows[i], 0);
			addRemoveEvent(true, input, "focus", formFocus);
			addRemoveEvent(true, input, "blur", formFocus);
		}
	}
}
function formFocus(e){
	var evt = e || window.event;
	var evtTarget = evt.target || evt.srcElement;
	var parent = inputToRow(evtTarget);
	var parentClasses = parent.className.split("-with-");
	if(evt.type == "focus"){
		parent.className = parentClasses[0] + "-with-focus";
	}else if(evt.type == "blur"){
		var error = ""
		if(evtTarget.className) error = verifInput(evtTarget);
		parent.className = parentClasses[0] + error;
	}
}
function initFormSubmit(row){
	var inputReset = rowToInput(row, 0);
	//addRemoveEvent(true, inputReset, "click", formReset);
	inputReset.onclick = formReset;
	var inputSubmit = rowToInput(row, 1);
	inputSubmit.onclick = formSubmit;
	//var form = inputToForm(inputReset);
	//addRemoveEvent(true, form, "submit", formSubmitAlt);
}
function formReset(){
	var form = inputToForm(this);
	form.reset();
	return false;
}
function formSubmit(){
	var form = inputToForm(this);
	var valid = verifAllInput(form);
	if(!valid){
		alert("Des champs obligatoires sont erronés, veuillez corriger les champs en rouge.");
		return false;
	}
}
/* à débugguer
function formReset(e){
	var evt = e || window.event;
	var evtTarget = evt.target || evt.srcElement;
	var form = inputToForm(evtTarget);
	if(evt.type == "click"){
		form.reset();
		return false;
	}
}
function formSubmitAlt(e){
	var evt = e || window.event;
	var evtTarget = evt.target || evt.srcElement;
	var form = evtTarget;
	var valid = verifAllInput(form);
	if(!valid){
		alert("Des champs obligatoires sont erronés, veuillez corriger les champs en rouge.");
	}
	alert(valid);
	return valid;
}
*/

addRemoveEvent(true, window, "load", initForm); /* break sur row submit, ne peux pas initialiser plusieurs forms */

/* gérer les évènements clavier */
