//setup multiple window.onload handlers
addOnload(initForms);
addOnload(optionCheck);

function optionCheck() {
	if ( document.getElementById("referred_by") ) {
		document.getElementById("referred_by").onchange = checkForOther;	//if "Other" selected then enable the "Other" input field
	}
}

function checkForOther() {
	var selectedOption = this.options[this.selectedIndex].value;
	if (selectedOption == "Other") {
		//enable Other input field
		document.getElementById("otherReferer").disabled=false;
	} else {
		//make sure Other input field is disabled (in case it was previously enabled)
		document.getElementById("otherReferer").disabled=true;
		document.getElementById("otherReferer").value='';
	}
}

function initForms() {
var o = 1;
	for (var i=0; i< document.forms.length; i++) {
//		document.forms[i].onsubmit = function() {return validForm();}	//call as an anon func causes 'this' is meaningless
		document.forms[i].onsubmit = validForm;
	}
}

function validForm() {
	var allGood = true;
//	var allTags = document.getElementsByTagName("*");
	var allTags = this.elements;						// just the form on which the onsubmit event occurred

	for (var i=0; i<allTags.length; i++) {
		if (!validTag(allTags[i])) {
			allGood = false;
		}
	}
	return allGood;

	function validTag(thisTag) {
		var outClass = "";
		var allClasses = thisTag.className.split(" ");

		for (var j=0; j<allClasses.length; j++) {
			outClass += validBasedOnClass(allClasses[j]) + " ";
		}
	
		thisTag.className = outClass;

		if (outClass.indexOf("invalid") > -1) {
			//highlight the label of the invalid tag
			var labels = document.getElementsByTagName("LABEL");
			for (var k=0; k<labels.length; k++) {
				if (labels[k].getAttribute("FOR") == thisTag.id) invalidLabel(labels[k]);
			}
			thisTag.focus();
			if (thisTag.nodeName == "INPUT") {
				thisTag.select();
			}
			return false;
		}
		return true;
		
		function validBasedOnClass(thisClass) {
			var classBack = thisClass;
			// here's where the validation is done		
			switch(thisClass) {
				case "":
				case "invalid":
					classBack = "";
					break;
				case "reqd":
					if (thisTag.value == "") classBack += " invalid";
					break;
				case "oneonly":	
					if (oneonlyCheck() != 1) classBack += " invalid";
					break;
				case "isNum":
					var pattern = /^[0-9]+(.[0-9][0-9])?$/;
					if (!pattern.test(thisTag.value)) classBack += " invalid";
					break;
				case "numOrNull":
					if (thisTag.value == "") break;
					var pattern = /^[0-9]+(.[0-9][0-9])?$/;
					if (!pattern.test(thisTag.value)) classBack += " invalid";
					break;
				default:
					//check for same values in two inputs (password validation)
					if (!crossCheck(thisTag,thisClass)) classBack += "invalid ";
					//classBack += thisClass;
					//TODO validate e-mail & phone
			}
			return classBack;
		}
				
		function crossCheck(inTag,otherFieldID) {
			if (!document.getElementById(otherFieldID)) return true;
			return (inTag.value == document.getElementById(otherFieldID).value);
		}
		
		function oneonlyCheck() {
			inputs = document.getElementsByTagName("INPUT");
			var fieldCount = 0;
			for (l=0; l<inputs.length; l++) {
				if (inputs[l].className.indexOf("oneonly") > -1 && inputs[l].value != "") fieldCount++;
			}
			return fieldCount;
		}
		
		function invalidLabel(labelTag) {
			if (labelTag.nodeName == "LABEL") {
				labelTag.className += " invalid";
			}
			return;
		}
		return true;	//Firefox error console is reporting an error (function does not always return a value) so this is a dummy
	}
	return allGood;		//ditto

}
