/****** 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 getClearedTextLabel(nLabel) {
	return getTextContent(nLabel).replace(/\s{2,}/g," ").replace(/^[\s:*]+|[\s:*]+$/g,"");
}

function formControlListener(evt) {
	
	var test = evt.target||evt.srcElement;
	var aFormCtrlSchemes, bIsValide, cLabels;
	if(window.aFormCtrlSchemes) {
		aFormCtrlSchemes = window.aFormCtrlSchemes;
	} else {
		aFormCtrlSchemes = [["isNotNull","Oups ! <br> le champ \"%s\" doit être renseigné."],
			["isDate","Oups ! <br> le champ \"%s\" n'est pas une date valide.<br>Format : jj/mm/aaaa."],
			["isEmail","Oups ! <br> le champ \"%s\" n'est pas un email valide."],
			["isInt","Oups ! <br> le champ \"%s\" n'est pas un entier valide."],
			["isCodePostal","Oups ! <br> Merci de saisir un code postal valide."],
			["isDepartementOuCodePostal","Oups ! <br> Merci de saisir un code postal ou un numéro de département valide."],
			["isFloat","Oups ! <br> le champ \"%s\" n'est pas un réel valide."]];
	}
	bIsValide = true;
	var idForm="";
	if (test.getAttributeNode && test.getAttributeNode('id')) {
		idForm = test.getAttributeNode('id').value;
	} else if (test.attributes && test.attributes.length>0) {
		for (var i=0;i<test.attributes.length;i++) {
			if (test.attributes[i].nodeName.toLowerCase()=='id') {
				idForm = test.attributes[i].nodeValue;
				break;
			}
		}
		if (idForm == "")idForm = test.id;
	} else idForm = test.id;
	try {
		if (bIsValide && (typeof(eval("preControl_"+idForm))=="function"))
			bIsValide = eval("preControl_"+idForm+"(test);");
	} catch(err) {}
	cLabels = test.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;
					
					// On lance la colorBox pour afficher le message
					var lienRetour = '';
					if ($('#popup').size() > 0) {
						var lienRetour = '<p class="lien"><a href="" onclick="$.colorbox({inline: true, href : \'#popup\', maxWidth  : 700}); return false;" class="rouge"><span>Retour</span></a></p>';
					}
					$.colorbox(
							{
								html          : '<div class="message">' +
												'<h2>' + aFormCtrlSchemes[j][1].replace(/[^\W]*%s[^\W]*/g,getClearedTextLabel(cLabels[i])) + '</h2>' +
												lienRetour + '</div>', 
								rel           : 'nofollow', 
								opacity       : 0.7,
								maxWidth      : 700,
								scrolling     : false,
								preloading    : false,
								returnFocus   : true
							}
					);
					
					//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);");
	}
	try {
		if (bIsValide && (typeof(eval("postControl_"+idForm))=="function"))
			bIsValide = eval("postControl_"+idForm+"(test);");
	} 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 isCodePostal(s) {
	return isNotNull(s)?parseInt(s, 10)==s && s.length == 5:true;
}
function isDepartementOuCodePostal(s) {
	return isNotNull(s)?parseInt(s, 10)==s && (s.length == 2 || s.length == 5):true;
}
function isFloat(s) {
	return isNotNull(s)?parseFloat(s)==s:true;
}
