var tags = new Array('input','textarea','select');

//Recursively traverse dom tree
function validForm(el, level) {
	var i = 0;
	var tagName = el.tagName;
	if((typeof(tagName) != 'undefined' || tagName != null) && (tags.toString().indexOf(tagName.toLowerCase()) > -1)){
		if (el.value == "" && el.getAttribute('obg')=="true") {
			alert(el.getAttribute('err'));
			el.focus();
			return(false);
		}
		else if (el.getAttribute('obg')=="check" && el.checked == false) {
			alert(el.getAttribute('err'));
			el.focus();
			return(false);
		}
		
		switch(el.getAttribute("special")){
			
			case null : isValid = true;
						break;
			case "email" : 	isValid = (el.getAttribute("obg") != "true" && el.value == '') ? true : validMail(el.value);
							oComments = "\nEx.: nom@site.com";
							break;
			case "date" :  	isValid = (el.getAttribute("obg") != "true" && el.value == '') ? true :  validDate(el.value);
							oComments = "\nEx.: 1982-03-25";
							break;
			case "nospecial" :  isValid = (el.getAttribute("obg") != "true" && el.value == '') ? true :  validSpecial(el.value);
								oComments = "\nEx.: a-z, A-Z, 0-9";
								break;
			case "numeric" :  	isValid = (el.getAttribute("obg") != "true" && el.value == '') ? true :  validNumeric(el.value);
								oComments = '';
								if (isValid && el.getAttribute('minval') != null &&  parseFloat(el.value) < parseFloat(el.getAttribute('minval'))) {
									isValid=false;	
								}
								if (isValid && el.getAttribute('maxval') != null &&  parseFloat(el.value) > parseFloat(el.getAttribute('maxval'))) {
									isValid=false;	
								}
								
								break;
			case "mustequal" : 
							oComments = '';
							if (el.value != document.getElementById(el.getAttribute('depend_id')).value) isValid=false;
							else isValid=true;
							break;	
			case "tel" : 	isValid = (el.getAttribute("obg") != "true" && el.value == '') ? true :  validTel(el.value);
							oComments = "\nEx.: 819-379-8614";
							break;
			case "cp" : 	isValid = (el.getAttribute("obg") != "true" && el.value == '') ? true :  validCP(el.value);
							oComments = "\nEx.: H9H9H9";
							break;
			case "cond" : 	isValid = eval(el.getAttribute("cond"))?false:true;
							oComments = "";
							break;
				
		}
		if(!isValid){
			alert(el.getAttribute("errorspecial")+oComments);
			el.focus();
			return false;
		}
		if (el.getAttribute("minlength") != null && el.value.length < el.getAttribute("minlength")) {
			if(el.getAttribute('obg') == "true" || (el.value.length > 0)){
				alert(el.getAttribute("errorlength"));
				el.focus();
				return false;
			}
		}
	}
	//alert(el.childNodes.length);
	//return false;
	
	if(el.childNodes.length > 0) {
		for(i=0; el.childNodes[i]; i++) {
			good = validForm(el.childNodes[i], level+1);
			if(!good) return false;
		}
	}
	return true;
}

function validCP(val) {
	var reg = /^[a-zA-Z][0-9][a-zA-Z](\s)?[0-9][a-zA-Z][0-9]$/;
	return reg.test(val);
}

function validDate(dateaaaammjj) {
	var dt=dateaaaammjj.split("-"),date=new Date(dt[0],dt[1]-1,dt[2]);
	return date.getDate()==dt[2]&&date.getMonth()+1==dt[1]&&date.getFullYear()==dt[0]?date:false;
}

function validSpecial(fStr){
	myReg = new RegExp("[A-Za-z0-9]+");
	if(myReg.exec(fStr)!=fStr){return false};
	return true;
}

function validNumeric(fStr){
	myReg = new RegExp("[0-9.]+");
	if(myReg.exec(fStr)!=fStr){return false};
	return true;
}


function checkDependency(obg) {
	if (obg.getAttribute('depend')!="")
	{
		var sfElems = document.getElementsByTagName('input');
		for (var i = 0; i < sfElems.length; i++) {
			if (obg.getAttribute('depend')== sfElems[i].name && obg.value=="" && sfElems[i].checked==true && sfElems[i].value=="1") {
				//alert(obg.getAttribute('err'));
				return(false);
			}
		}
		
	}
	return(true);
}

function validMail(email) {
	var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
	return reg.test(email);
}

function validTel(val) {
	if (val.match(/^\(?\d{3}\)?([-\/\.])\d{3}\1\d{4}$/) || val.match(/\d{10}/)) return true;
}