/**
 * formValidator.js
 * @author alex
 */
var regexp = {};
regexp.url = new RegExp("^((ftp|http|https):\\/\\/)([\\w]+\\.)+([\\w]{2,4}){1,2}(\\/[\\/:#\\?]?[\\/\\w\.#_\\-%=\\?\\&]*)?$");
regexp.email = new RegExp("^[\\w\\.=-]+@[\\w\\.-]+\\.[\\w\\.-]{2,4}$");
regexp.lettersonly = new RegExp("^[a-zA-Z]+$");
regexp.alphanumeric = new RegExp("^\\w+$");
regexp.integer = new RegExp("^-?\\d+$");
regexp.positiveinteger = new RegExp("^\\d+$");
regexp.number = new RegExp("^-?(\\d+(\\.|\\,)\\d*$)|(^-?\\d+$)|(^-?(\\.|\\,)\\d+$)");
regexp.civicnumber = new RegExp("^\\d+(-([1,3]\\/[2,4]|[a-zA-Z]))?$");
/*
regexp.postalcode = new RegExp("^([a-zA-Z]\\d[a-zA-Z])\\s?(\\d[a-zA-Z]\\d)$");
regexp.zipcode = new RegExp("^(\\d{5}(( |-)\\d{4})?)$");
regexp.postalzipcode = new RegExp("(^([a-zA-Z]\\d[a-zA-Z])\\s?(\\d[a-zA-Z]\\d)$)|(^(\\d{5}(( |-)\\d{4})?)$)");
*/

// 1 caractere ou plus...
regexp.postalcode = new RegExp("[a-zA-Z0-9]");
regexp.zipcode = new RegExp("[a-zA-Z0-9]");
regexp.postalzipcode = new RegExp("[a-zA-Z0-9]");

regexp.phone7 = new RegExp("^(\\d{3})( |-)?(\\d{4})$");
regexp.phone8 = new RegExp("^(((\\d){2})( |-)?){4}$");
regexp.phone10 = new RegExp("^(\\d{3})( |-)?(\\d{3})( |-)?(\\d{4})$");
regexp.creditcard = new RegExp("^3(?:[47]\\d([ -]?)\\d{4}(?:\\1\\d{4}){2}|0[0-5]\\d{11}|[68]\\d{12})$|^4(?:\\d\\d\\d)?([ -]?)\\d{4}(?:\\2\\d{4}){2}$|^6011([ -]?)\\d{4}(?:\\3\\d{4}){2}$|^5[1-5]\\d\\d([ -]?)\\d{4}(?:\\4\\d{4}){2}$|^2014\\d{11}$|^2149\\d{11}$|^2131\\d{11}$|^1800\\d{11}$|^3\\d{15}$");


function parseForms(){
	oForms = document.getElementsByTagName('FORM');
	for(var i=0;i<oForms.length;i++){
		if(eval(oForms[i].getAttribute('js:validate')))
			js.addEvent(oForms[i],"submit",validateForm);
	}
}
function validateForm(e){
	validation = new Array;
	formNode =(e.type=="submit")?js.getTarget(e):e;
	formChilds = js.parseObj(formNode);
	labelNodes = getLabels(formNode);
	removeErrorClass(formChilds);
	try{
		if(formNode.getAttribute('js:display')) var errorFunction = formNode.getAttribute('js:display');
	}
	catch(err){ var errorFunction = false;}
	
	for(var i=0,j=0;i<formChilds.length;i++){
		try{
			if(formChilds[i].nodeType==1 && (formChilds[i].name || formChilds[i].id) && formChilds[i].nodeName.match(/(input)|(textarea)|(select)/i) && eval(formChilds[i].getAttribute('js:required')) ){
				try{
					if(!formChilds[i].getAttribute('type').match(/(submit)|(reset)|(image)/i)){
						try{
							if(formChilds[i].getAttribute('disabled') !== null && formChilds[i].getAttribute('disabled').match(/(false)/i)){
								validation[j] = formChilds[i];
							}
						}
						catch(err){
							validation[j]=formChilds[i];
						}
					}
				}
				catch(err){
					// not an input type, so it's a textarea or a select
					validation[j]=formChilds[i];
				}
				j++;
			}
		}
		catch(err){/*Do nothing*/ }
	}
	var validationOk = true;
	errorsObj = new Array;
	for(var x=0,y=0;x<validation.length;x++){
		if (validation[x] == undefined) continue;
		if(validation[x].value.length===0 && !eval(validation[x].getAttribute('js:required')))
			validationOk = true;
		else if(!validateField(validation[x])){
			//displayError(validation[x]);
			if(errorFunction){
				//eval(errorFunction);
				errorsObj[y] = validation[x];
				y++;
			}
			else{
				displayError(validation[x]);
			}
			validationOk = false;
		}
	}
	if(!validationOk){
		if(e.preventDefault) e.preventDefault();
			else e.returnValue = false;
		if(errorsObj.length>0) eval(errorFunction);
		return false;
	}
	return true;
}
function validateFormSubmit(f){	if(validateForm(f)) f.submit(); }

function removeErrorClass(formChilds){
	for(var i=0;i<formChilds.length;i++) {
		try{
			if(formChilds[i].getAttribute('js:errorclass')){
				js.removeClass(formChilds[i], formChilds[i].getAttribute('js:errorclass'));
				js.removeClass(labelNodes[getLabelIndex(formChilds[i].id)], formChilds[i].getAttribute('js:errorclass'));
				formChilds[i].title = "";
			}
		}
		catch(err){ /*Do nothing*/ }
	}
}
function getLabels(formNode){
	try{
		if(typeof labelNodes !== 'undefined'){
			for(var i=0;i<labelNodes.length;i++){
				labelNodes[i].innerHTML = labelNodes[i].ori;
			}
		}
	}
	catch(err){ /*Do nothing*/ }


        labelNodes = formNode.getElementsByTagName("label");


        for(var j=0;j<labelNodes.length;j++){
		labelNodes[j].ori=labelNodes[j].innerHTML;
	}
	return labelNodes;
}
function getLabelIndex(oId){
	for(var i=0;i<labelNodes.length;i++){
		if(labelNodes[i].htmlFor == oId) return i;
	}
}
function getInputIndex(nameOrId){
	for(var i=0;i<validation.length;i++){
		if( (validation[i].name == nameOrId) || (validation[i].id == nameOrId) ) return i;
	}
}
function radioChecked(nameOrId){
	for(var i=0;i<validation.length;i++){
		if( (validation[i].name == nameOrId) || (validation[i].id == nameOrId) ){
			if(validation[i].checked) return true;
		}
	}
	return false;
}
function validateField(oToValidate){
	var boolReturn = true;
	try{
		if(oToValidate.getAttribute('js:pattern')){
			if(!regexp[oToValidate.getAttribute('js:pattern')].test(oToValidate.value)) boolReturn=false;
		}
		if(oToValidate.getAttribute('js:minlength')){
			if(oToValidate.value.length < oToValidate.getAttribute('js:minlength')) boolReturn=false;
		}
		if(oToValidate.getAttribute('js:maxlength')){
			if(oToValidate.value.length > oToValidate.getAttribute('js:maxlength')) boolReturn=false;
		}
		if(oToValidate.getAttribute('js:minnumber')){
			if((isNaN(oToValidate.value)) || Number(oToValidate.value) < Number(oToValidate.getAttribute('js:minnumber'))) boolReturn=false;
		}
		if(oToValidate.getAttribute('js:maxnumber')){
			if((isNaN(oToValidate.value)) || Number(oToValidate.value) > Number(oToValidate.getAttribute('js:maxnumber'))) boolReturn=false;
		}
		if(oToValidate.getAttribute('js:equalto')){
			if(oToValidate.value !== validation[getInputIndex(oToValidate.getAttribute('js:equalto'))].value) boolReturn=false;
		}
		if(oToValidate.getAttribute('js:lessthen')){
			if((isNaN(oToValidate.value)) || Number(oToValidate.value) >= Number(validation[getInputIndex(oToValidate.getAttribute('js:lessthen'))].value)) boolReturn=false;
		}
		if(oToValidate.getAttribute('js:greaterthen')){
			if((isNaN(oToValidate.value)) || Number(oToValidate.value) <= Number(validation[getInputIndex(oToValidate.getAttribute('js:greaterthen'))].value)) boolReturn=false;
		}
		if(oToValidate.getAttribute('js:equalorlessthen')){
			if((isNaN(oToValidate.value)) || Number(oToValidate.value) > Number(validation[getInputIndex(oToValidate.getAttribute('js:equalorlessthen'))].value)) boolReturn=false;
		}
		if(oToValidate.getAttribute('js:equalorgreaterthen')){
			if((isNaN(oToValidate.value)) || Number(oToValidate.value) < Number(validation[getInputIndex(oToValidate.getAttribute('js:equalorgreaterthen'))].value)) boolReturn=false;
		}
		if(oToValidate.getAttribute('js:datelessthen')){
			return (extractDate(oToValidate) < extractDate(validation[getInputIndex(oToValidate.getAttribute('js:dategreaterthen'))]))?true:false;
		}
		if(oToValidate.getAttribute('js:dategreaterthen')){
			return (extractDate(oToValidate) > extractDate(validation[getInputIndex(oToValidate.getAttribute('js:dategreaterthen'))]))?true:false;
		}
		if(oToValidate.getAttribute('js:dateequalorlessthen')){
			return (extractDate(oToValidate) <= extractDate(validation[getInputIndex(oToValidate.getAttribute('js:dategreaterthen'))]))?true:false;
		}
		if(oToValidate.getAttribute('js:dateequalorgreaterthen')){
			return (extractDate(oToValidate) >= extractDate(validation[getInputIndex(oToValidate.getAttribute('js:dategreaterthen'))]))?true:false;
		}
		if(oToValidate.getAttribute('js:dateformat')){
			boolReturn=validateDatePattern(oToValidate);
		}
		if(oToValidate.getAttribute('js:invalidindex')){
			return (oToValidate.selectedIndex == oToValidate.getAttribute('js:invalidindex'))?false:true;
		}
		if(oToValidate.type=="checkbox"){
			if(!oToValidate.checked) boolReturn=false;
		}
		if(oToValidate.type=="radio"){
			boolReturn=radioChecked(oToValidate.name);
		}
		return boolReturn;
	}
	catch(err){ /*Do nothing*/ }
}
function displayError(oError){
	try{
		if(oError.getAttribute('js:message')){
			labelNodes[getLabelIndex(oError.id)].innerHTML = oError.getAttribute('js:message');
			oError.title = oError.getAttribute('js:message');
		}
		if(oError.getAttribute('js:errorclass')){
			js.addClass(oError, oError.getAttribute('js:errorclass'));
			js.addClass(labelNodes[getLabelIndex(oError.id)], oError.getAttribute('js:errorclass'));
		}
		else return true;//
	}
	catch(err){ /*Do nothing*/ }
}
function extractDate(obj){
	var rgxp = obj.getAttribute('js:dateformat').toLowerCase();
	var systemDate = new Date();
	var m = (rgxp.match(/mm/)==null)?(systemDate.getMonth()+01):Number(obj.value.substr(rgxp.indexOf("mm"),2));
	var d = (rgxp.match(/dd/)==null)?systemDate.getDate():obj.value.substr(rgxp.indexOf("dd"),2);
	var y = (rgxp.match(/yyyy/)==null)?systemDate.getFullYear():obj.value.substr(rgxp.indexOf("yyyy"),4);
	myDate = new Date(y,(m-1),d);
	if(myDate.getMonth()!=(m-1)) return false;
	else if(myDate.getDate()!=d) return false;
	else if(myDate.getFullYear()!=y) return false;
	else return myDate;
}
function validateDatePattern(obj){
	var rgxp = obj.getAttribute('js:dateformat').toLowerCase();
	rgxp = rgxp.replace(/[ymd]/g,'\\d');
	rgxp = rgxp.replace(/\./g,'\\.');
	rgxp = rgxp.replace(/\s/g,'\\s');
	rgxp = rgxp.replace(/\//g,'\\/');
	rgxp = rgxp.replace(/\*/g,'(\\s|\\.|\\-|\\/)');
	dateRegexp = new RegExp("^"+rgxp+"$");
	if(dateRegexp.test(obj.value)){
		return (extractDate(obj))?true:false;
	}
	else return false;
}
js.addLoadEvent(parseForms);

