window.onload = function () {
	for (var i=0; i<document.forms.length; i++) {
		document.forms[i].onsubmit = function () {
			frmcls = this.className.split(" ");
			for (i=0; i<frmcls.length; i++) {
				if (frmcls[i] == "erron") vld = validForm(this, "erron");
				else vld = validForm(this, "");
			}
			if (vld && this.getAttribute("call")!= "") {
				return eval(this.getAttribute("call"));
			}
			return vld;
		}
		setInput(document.forms[i].elements);
	}
}
function validForm (frm, frmClass) {
	var valid = true;
	var dtags = frm.getElementsByTagName ("*");

	for (var i=0; i<dtags.length; i++) {
		switch(dtags[i].nodeName) {
			case "INPUT":
				if (dtags[i].type != "submit") {
					validInput (dtags[i]);
				}
				break;
			default:
				break;
		}
	}
	return valid;
	
	function validInput (elem) {
		classes = elem.className.split(" ");
		cls = "";
		msg = "";
		for (var j=0; j<classes.length; j++) {
			if (classes[j] == "req") {
				if (elem.value == "" || elem.value == elem.getAttribute("def")) {
					cls = "invalid "; 
					msg = "Required Field should not be empty";
				} else {
					msg = "";
					cls = "valid "; 
				}
				cls += classes[j] + " ";
			}
			switch (classes[j]) {
				case " ": case  "invalid": break;
				case "pass1":
					p1 = elem.value
					cls += classes[j] + " ";
					break;
				case "pass2":
					if (p1!=elem.value) {
						cls = "invalid ";
						msg = "Passwords didn't match";
					} else {
						msg = "";
						cls = "valid "; 
					}
					cls += classes[j] + " ";
					break;
				case "email":
					var regex = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
					if (!regex.test(elem.value)) {
						cls = "invalid ";
						msg = "Invalid Format";
					} else {
						msg = "";
						cls = "valid "; 
					}
					cls += classes[j] + " ";
					break;
				case "address":
					var regex = /^[a-z-A-Z0-9 \.\,]+$/;
					if (!regex.test(elem.value)) {
						cls = "invalid ";
						msg = "Invalid Format";
					} else {
						msg = "";
						cls = "valid "; 
					}
					cls += classes[j] + " ";
					break;
				case "username":
					var regex = /^[a-z-A-Z0-9]*[a-z-A-Z0-9_\.\,]+$/;
					if (!regex.test(elem.value)) {
						cls = "invalid ";
						msg = "Invalid Format";
					} else {
						msg = "";
						cls = "valid "; 
					}
					cls += classes[j] + " ";
					break;
				case "name":
					var regex = /^[a-z-A-Z ]+$/;
					if (!regex.test(elem.value)) {
						cls = "invalid ";
						msg = "Invalid Format";
					} else {
						msg = "";
						cls = "valid "; 
					}
					cls += classes[j] + " ";
					break;
				case "phone":
					var regex = /^(\+\d)*\s*(\(\d{3}\)\s*)*\d{3}(-{0,1}|\s{0,1})\d{2}(-{0,1}|\s{0,1})\d{2}$/;
					if (!regex.test(elem.value)) {
						cls = "invalid ";
						msg = "Invalid Format";
					} else {
						msg = "";
						cls = "valid "; 
					}
					cls += classes[j] + " ";
					break;
				default:
					cls += classes[j] + " ";
					break;
			}
		}
		elem.className = cls;
		if (cls.indexOf("invalid") > -1) {
			if (valid) elem.focus();
			valid = false;
		}
		if (frmClass=="erron") {
			prnt = elem.parentNode;
			for (var l=0; l<prnt.childNodes.length; l++) {
				if (prnt.childNodes[l].nodeName == "SPAN" && prnt.childNodes[l].getAttribute("id") == "err") {
					prnt.childNodes[l].innerHTML = msg;
				}
			}
		}
	}
}
function setInput (elem) {
	for (var i=0; i<elem.length; i++) {
		switch (elem[i].nodeName) {
			case "INPUT":
				var val = elem[i].getAttribute("def");
				prnt = elem[i].parentNode;
				errs = document.createElement("span");
				errs.id = "err";
				prnt.appendChild(errs);
				
				if (elem[i].type != "submit" && val) {
					if (elem[i].value == "") {
						elem[i].value = val;
					}
					elem[i].onfocus = function () {
						this.value = '';
					};
					elem[i].onblur = function () {
						var val = this.getAttribute("def");
						this.value = this.value == '' ? val : this.value;
					};
				}
			default: break;
		}
	}
}
