addLoadEvent(focusLabels);
addLoadEvent(prepareForms);



function focusLabels() {
	if (!document.getElementsByTagName) return false;
	var labels = document.getElementsByTagName("label");
	//gets array of label elements
	for (var i = 0; i < labels.length; i++) {
		if (!labels[i].getAttribute("for")) continue;
		labels[i].onclick = function() {
			var id = this.getAttribute("for");
			if (!document.getElementById(id)) return false;
			var element = document.getElementById(id);
			element.focus();
		}
	}
}

function resetFields(whichform) {
	for (var i=0; i<whichform.elements.length; i++) {
		var element = whichform.elements[i];
		if(element.type == "submit") continue;
		if(element.type == "reset") continue;
		if(element.type == "radio") continue;
		if(!element.defaultValue) continue;
		element.onfocus = function() {
			if (this.value == this.defaultValue) {
				this.value = "";
			}
		}
		element.onblur = function() {
			if (this.value == "") {
				this.value = this.defaultValue;
			}
		}
	}
}



function isFilled(field) {
	// if field is less than one character (empty) then the field has not had anything entered and will not allow submission
	if (field.value.length < 1 || field.value == field.defaultValue) {
		return false;
	} else {
		return true;
	}
}

function isEmail(field) {
	//if there is no '@' symbol or '.' than it is not a valid email address and will not allow submission
	if (field.value.indexOf("@") == -1 || field.value.indexOf(".") == -1)
	{
		return false;
	} else {
		return true;
	}
}


function validateForm(whichform) {
	var isValid = true;
	// variable for confirming email address later
	var emailValue;
	
	for (var i=0; i<whichform.elements.length; i++) {
		var element = whichform.elements[i];
		//looks at all required elements (inputs) in the form
		if (element.className.indexOf("required") != -1) {
			//gets id of required element for easy reference
			var elem_id = element.getAttribute("id");
			var error_div = error_divs[elem_id];
			//checks to see if required elements are filled, displays error msg if not
			if (!isFilled(element)) {
				error_div.firstChild.nodeValue = "Please fill in the "+element.name+" field.";
				error_div.style.display = "block";				
				isValid = false;
			} else {
				//clears out previous error messages
				error_div.style.display = "none";
				
				//displays msg specifically for incorrect email address
				if (element.className.indexOf("email") != -1) {
					if (!isEmail(element)) {
						error_div.firstChild.nodeValue = "The "+element.name+" field must be a valid email address.";
						error_div.style.display = "block";
						isValid = false;
					} else {
						emailValue = element.value;
					}				
				}
				// if previous element (email) is filled correctly than it stores the value filled in and this checks it against the confirm field
				if(element.className.indexOf ("confirm") != -1) {
					if(element.value != emailValue) {
						error_div.firstChild.nodeValue = "Please reenter your email address.";
						error_div.style.display = "block";
						isValid = false;
					}
				} 				
			}
		}
	}
	return isValid;
}

			



function prepareForms() {
	error_divs = Array();
	for (var i=0; i < document.forms.length; i++) {
		var thisform = document.forms[i];
		resetFields(thisform);
		thisform.onsubmit = function() {
			return validateForm(this);
		}
		
		for (var i=0; i<thisform.elements.length; i++) {
			var element = thisform.elements[i];
			//gets required elements in form
			if (element.className.indexOf("required") != -1) {
				//gets id for easy reference
				var elem_id = element.getAttribute("id");
				//creates div for displaying
				var error_div = document.createElement("div");
				insertAfter(error_div, element);
				
				//sets class for styling purposes
				//error_div.setAttribute("class", "error"); <- former code, works only in firefox and netscape
				error_div.className = "error";
				
				//hides error div, will only be set to display if error occurs
				//error_div.setAttribute("style", "display: none;"); <- former code, works only in FF and NS
				error_div.style.display = "none";
				
				//creates text for the error message
				var msg = document.createTextNode(" ");
				error_div.appendChild(msg);
				
				error_divs[elem_id] = error_div;
			}
		}
	}
}

function addLoadEvent(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	} 
	else {
		window.onload = function() {
		oldonload();
		func();
		}
	}	
}



function insertAfter(newElement,targetElement) {
	var parent = targetElement.parentNode;
	if (parent.lastChild == targetElement) {
		parent.appendChild(newElement);
	} 
	else {
		parent.insertBefore(newElement,targetElement.nextSibling);
	}
}
