/****** BEGIN LICENSE BLOCK *****
 * Copyright (c) 2005-2006 Harmen Christophe and contributors. All rights reserved.
 * 
 * This script is free software; you can redistribute it and/or
 *   modify under the terms of the Creative Commons - Attribution-ShareAlike 2.0
 * <http://creativecommons.org/licenses/by-sa/2.0/>
 * You are free:
 *     * to copy, distribute, display, and perform the work
 *     * to make derivative works
 *     * to make commercial use of the work
 * 
 * Under the following conditions:
 * _Attribution_. You must attribute the work in the manner specified by the
 *   author or licensor.
 * _Share Alike_. If you alter, transform, or build upon this work, you may
 *   distribute the resulting work only under a license identical to this one.
 *     * For any reuse or distribution, you must make clear to others 
 *      the license terms of this work.
 *     * Any of these conditions can be waived if you get permission from 
 *      the copyright holder.
 * 
 * Your fair use and other rights are in no way affected by the above.
 * 
 * This is a human-readable summary of the Legal Code (the full license). 
 * <http://creativecommons.org/licenses/by-sa/2.0/legalcode>
 ***** END LICENSE BLOCK ******/
/******
 ** 2006/10/04 V0.3.0
 *	Todo :
 *		- dès que possible enlever la rustine @Tony Pette sur "this.id" due à
 *		l'utilisation du not réservé "id" pour nommer des champs hidden ;
 ******/
function addFormsControlListener() {
	var cForms, lg, cLabels, nLabel;
	cForms = document.forms;
	lg = cForms.length;
	for (var i=0; i < lg; i++) {
		cLabels = cForms[i].getElementsByTagName("label");
		for (var j=0; nLabel=cLabels[j];j++) {
			if ((nLabel.htmlFor!="") && (document.getElementById(nLabel.htmlFor)==null)) {
				alert("L'étiquette  \"" + getClearedTextLabel(nLabel) + "\" est associée à un champ de formulaire inexistant (sans l'id \""+nLabel.htmlFor+"\").");
			}
		}
		addEventLst(cForms[i],"submit",formControlListener);
	}
}
addEventLst(window,"load",addFormsControlListener);
function getClearedTextLabel(nLabel) {
	return getTextContent(nLabel).replace(/\s{2,}/g," ").replace(/^[\s:*]+|[\s:*]+$/g,"");
}
function formControlListener(evt) {
	var aFormCtrlSchemes, bIsValide, cLabels;
	if(window.aFormCtrlSchemes) {
		aFormCtrlSchemes = window.aFormCtrlSchemes;
	} else {
		aFormCtrlSchemes = [["isNotNull","Le champ \"%s\" doit être renseigné."],
			["isDate","Le champ \"%s\" n'est pas une date valide.\nFormat : jj/mm/aaaa."],
			["isEmail","Le champ \"%s\" n'est pas un email valide."],
			["isInt","Le champ \"%s\" n'est pas un entier valide."],
			["isFloat","Le champ \"%s\" n'est pas un réel valide."],
			["isTelDomicile","Le champ \"%s\" n'est pas un numéro de téléphone de domicile valide."],
			["isTelPortable","Le champ \"%s\" n'est pas un numéro de téléphone de portable valide."],
			["minLength5","Le champ \"%s\" n'est pas un CP valide."],
			["minLength6","La taille du champ \"%s\" n'est pas valide."]];
	}
	bIsValide = true;
	var idForm="";
	if (this.getAttributeNode && this.getAttributeNode('id')) {
		idForm = this.getAttributeNode('id').value;
	} else if (this.attributes && this.attributes.length>0) {
		for (var i=0;i<this.attributes.length;i++) {
			if (this.attributes[i].nodeName.toLowerCase()=='id') {
				idForm = this.attributes[i].nodeValue;
				break;
			}
		}
		if (idForm == "")idForm = this.id;
	} else idForm = this.id;
	try {
		if (bIsValide && (typeof(eval("preControl_"+idForm))=="function"))
			bIsValide = eval("preControl_"+idForm+"(this);");
	} catch(err) {}
	cLabels = this.getElementsByTagName("label");
	var nField, oNode;
	for (var i=0; bIsValide && i<cLabels.length; i++) {
		if ((cLabels[i].htmlFor=="") || !(nField=document.getElementById(cLabels[i].htmlFor))) continue;
		for (var j=0; bIsValide && aFormCtrlSchemes[j]; j++) {
			if (hasClassName(cLabels[i],aFormCtrlSchemes[j][0])) {
				if (aFormCtrlSchemes[j][0]=="isFloat") nField.value = nField.value.replace(",",".");
				if (!eval(aFormCtrlSchemes[j][0]+"(nField.value)")) {
					bIsValide = false;
					alert(aFormCtrlSchemes[j][1].replace(/[^\W]*%s[^\W]*/g,getClearedTextLabel(cLabels[i])));
				}
			}
		}
		if (bIsValide && hasClassName(cLabels[i],"extendedControl"))
			bIsValide = eval("extendedControl_"+cLabels[i].htmlFor+"(nField);");
		if (!bIsValide) {
			try
			  {
				if (nField.focus)
					nField.focus();
				else if (nField.selected)
					nField.selected();
			  }
			catch(err)
			  {
			  //Handle errors here
			  }
			
		}
	}
	try {
		if (bIsValide && (typeof(eval("postControl_"+idForm))=="function"))
			bIsValide = eval("postControl_"+idForm+"(this);");
	} catch(err) {}
	if (!bIsValide) {
		if (evt && evt.preventDefault) {
			evt.preventDefault();
		} else if (window.event) {
			window.event.returnValue = false;
		}
	}
	return bIsValide;
}
function getTextContent(oNode) {
	if (typeof(oNode.textContent)!="undefined") {return oNode.textContent;}
	switch (oNode.nodeType) {
		case 3: // TEXT_NODE
		case 4: // CDATA_SECTION_NODE
			return oNode.nodeValue;
			break;
		case 7: // PROCESSING_INSTRUCTION_NODE
		case 8: // COMMENT_NODE
			if (getTextContent.caller!=getTextContent) {
				return oNode.nodeValue;
			}
			break;
		case 9: // DOCUMENT_NODE
		case 10: // DOCUMENT_TYPE_NODE
		case 12: // NOTATION_NODE
			return null;
			break;
	}
	var _textContent="";
	oNode=oNode.firstChild;
	while (oNode) {
		_textContent += getTextContent(oNode);
		oNode = oNode.nextSibling;
	}
	return _textContent;
}
function addEventLst(EventTarget,type,listener,useCapture) {
	useCapture = typeof(useCapture)=="boolean"?useCapture:false;
	if (EventTarget.addEventListener) {
		EventTarget.addEventListener(type, listener, useCapture);
	} else if ((EventTarget==window) && document.addEventListener) {
		document.addEventListener(type, listener, useCapture);
	} else if (EventTarget.attachEvent) {
		EventTarget["e"+type+listener] = listener;
		EventTarget[type+listener] = function() {EventTarget["e"+type+listener]( window.event );}
		EventTarget.attachEvent("on"+type, EventTarget[type+listener]);
	} else {
		EventTarget["on"+type] = listener;
	}
}
function hasClassName(oNode,className) {
	return (oNode.nodeType==1)?
		((" "+oNode.className+" ").indexOf(" "+className+" ")!=-1):false;
}
function trim(s) {return s.replace(/^\s+|\s+$/g,"");}
function isNotNull(s) {return trim(s)!="";}
function isEmail(s) {
 if (isNotNull(s)) return /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})+$/i.test(s); else return true;
}
function isDate(s) {
	var bIsDate, d, m, y;
	bIsDate = true;
	if (isNotNull(s)) {
		if ((s.length != 10) || (s.substring(2,3) != "/") || (s.substring(5,6) != "/")) bIsDate = false;
		var d = s.substring(0,2);
		var m = s.substring(3,5);
		var y = s.substring(6,10);	
		if (m==1 || m==3 || m==5 || m==7 | m==8 || m==10 || m==12) {
			if (d > 31) bIsDate = false;
		} else if (m==4 || m==6 || m==9 || m==11) {
			if (d > 30) bIsDate = false;	
		} else if (m==2) {
			if (y % 4 == 0) {
				if (d > 29) bIsDate = false;	
			} else {
				if (d > 28) bIsDate = false;	
			}
		} else {
			bIsDate = false;	
		}
	}
	return bIsDate;
}
function isInt(s) {
	return isNotNull(s)?parseInt(s, 10)==s:true;
}
function isFloat(s) {
	return isNotNull(s)?parseFloat(s)==s:true;
}
function isTelDomicile(s) {
	var bIsTelDomicile;
	bIsTelDomicile = true;
	if (isNotNull(s)) {
		if (s.length != 10 || (s.substring(0,2) != '01' && s.substring(0,2) != '02' && s.substring(0,2) != '03' && s.substring(0,2) != '04' && s.substring(0,2) != '05' && s.substring(0,2) != '08' && s.substring(0,2) != '09')) {
			 
			bIsTelDomicile = false;
		}
	}
	return bIsTelDomicile;
}
function isTelPortable(s) {
	var bIsTelPortable;
	bIsTelPortable = true;
	if (isNotNull(s)) {
		if (s.length != 10 || s.substring(0,2) != '06') {
			bIsTelPortable = false;
		}
	}
	return bIsTelPortable;
}
function minLength6(s) {
	return isNotNull(s)?(s.length)>=6:true;
}
function minLength5(s) {
	return isNotNull(s)?(s.length)==5:true;
}