
function addClass(target, classValue) {
	if (!hasClass(target, classValue)) {
		if (target.className == "") {
			target.className = classValue;
		} else {
			target.className += " " + classValue;
		}
	}
	return true;
};



function removeClass(target, classValue) {
	var removedClass = target.className;
	var pattern = new RegExp("(^| )" + classValue + "( |$)");
	removedClass = removedClass.replace(pattern, "$1");
	removedClass = removedClass.replace(/ $/, "");
	target.className = removedClass;
	return true;
};



function hasClass(target, classValue) {
	var pattern = new RegExp("(^| )" + classValue + "( |$)");
	if (target.className.match(pattern)) {
		return true;
	}
	return false;
};



epValidateForms = function() {

	var allForms = document.getElementsByTagName('form');
	for (var f=0; f<allForms.length; f++) {
		if (hasClass(allForms[f], "ep-validate")) {

			// Update form's onsubmit action
			var oldOnsubmit = allForms[f].onsubmit;
			if (typeof allForms[f].onsubmit != "function") {
				allForms[f].onsubmit = function() {
					return epCheckFields(this);
				}
			} else {
				allForms[f].onsubmit = function() {
					epCheckFields(this);
					return oldOnsubmit();
				}
			}

			//// Update fields onfocus and onblue actions
			//var allInputs = allForms[f].getElementsByTagName("input");
			//for (var i=0; i<allInputs.length; i++) {
			//	if (hasClass(allInputs[i], "txt")) {
			//		if (allInputs[i].value == "") {
			//			allInputs[i].value = allInputs[i].alt;
			//		}
			//		allInputs[i].onfocus = function() {
			//			clearField(this, this.alt);
			//		}
			//		allInputs[i].onblur = function() {
			//			resetField(this, this.alt);
			//		}
			//	}
			//}
		}
	}
	return true;
};



epCheckFields = function(theForm) {

	var hasError = false;
	var errObj;
	var errorMessage = "";

	// Loop through all the fields looking for required fields
	var allInputs = theForm.elements;

	for (var i=0; i<allInputs.length; i++) {
		if (hasClass(allInputs[i], "ep-required")) {

			// Radio inputs
			if (allInputs[i].type == "radio") {
				var radioName = allInputs[i].name;
				var radioChecked = false;
				var allRadio = theForm.getElementsByTagName("input");
				for (var r=0; r<allRadio.length; r++) {
					if (allRadio[r].type == "radio" && allRadio[r].name == radioName) {
						if (allRadio[r].checked) radioChecked = true;
					}
				}
				if (radioChecked == false) {
					hasError = true;
					errObj = allInputs[i].parentNode;
					errorMessage = "Please " + allInputs[i].alt.toLowerCase();
					break;
				} else {
					removeClass(allInputs[i].parentNode, "err");
				}
			// Checkboxes
			} else if (allInputs[i].type == "checkbox") {
				if(!allInputs[i].checked) {
					hasError = true;
					errObj = allInputs[i].parentNode;
					errorMessage = "Please " + allInputs[i].alt.toLowerCase();
					break;
				} else {
					removeClass(allInputs[i].parentNode, "err");
				}
			// Textareas
			} else if (allInputs[i].type == "textarea") {
				if (allInputs[i].value == "") {
					hasError = true;
					errObj = allInputs[i];
					errorMessage = "Please enter " + allInputs[i].title.toLowerCase();
					break;
				} else {
					removeClass(allInputs[i], "err");
				}
			// Text inputs
			} else {
				// If the field is empty of has the default value
				if (allInputs[i].value == "" || allInputs[i].value == allInputs[i].alt) {
					hasError = true;
					errObj = allInputs[i];
					errorMessage = "Please enter " + allInputs[i].title.toLowerCase();
					break;
				// If the field has a value and it is an email field - check it is valid
				} else {
					if (hasClass(allInputs[i], "email") && !validateEmail(allInputs[i].value)) {
						hasError = true;
						errObj = allInputs[i];
						errorMessage = "Please enter a valid email address";
						break;
					} else {
						removeClass(allInputs[i], "err");
					}
				}
			}
		}
	}


	// If we have an error return false
	if(hasError) {
		addClass(errObj,"err");
		if (document.getElementById("errorHolder")) {
			document.getElementById("errorHolder").innerHTML = errorMessage;
		} else {
			var errorHolder = document.createElement("p");
			errorHolder.id = "errorHolder";
			addClass(errorHolder,"error");
			errorHolder.appendChild(document.createTextNode(errorMessage));

			theForm.insertBefore(errorHolder, theForm.childNodes[0]);
		}
		// Move to the correct part of the page
		window.location = String(window.location).replace(/\#.*$/, "") + "#errorHolder";
		return false;
	} else {
		var theAction = theForm.action;
		var theNewAction;
		if (theAction.indexOf("?") != -1) {
			theNewAction = theAction + "&javascript=true";
		} else {
			theNewAction = theAction + "?javascript=true";
		}

		theForm.action = theNewAction;
		return true;
	}
};



// ------------------------------------------------------
// Validate email string
validateEmail = function($addr)
{
	var invalidChars = '\/\'\\ ";:?!()[]\{\}^|';
	for (i=0; i<invalidChars.length; i++)
	{
		if ($addr.indexOf(invalidChars.charAt(i),0) > -1) return false;
	}
	for (i=0; i<$addr.length; i++)
	{
		if ($addr.charCodeAt(i)>127) return false;
	}
	var atPos = $addr.indexOf('@',0);
	if (atPos == -1) { return false; }
	if (atPos == 0) { return false; }
	if ($addr.indexOf('@', atPos + 1) > - 1) { return false; }
	if ($addr.indexOf('.', atPos) == -1) { return false; }
	if ($addr.indexOf('@.',0) != -1) { return false; }
	if ($addr.indexOf('.@',0) != -1){ return false; }
	if ($addr.indexOf('..',0) != -1) { return false; }
	var suffix = $addr.substring($addr.lastIndexOf('.')+1);
	if (suffix.length != 2 && suffix != 'com' && suffix != 'net' && suffix != 'org' && suffix != 'edu' && suffix != 'int' && suffix != 'mil' && suffix != 'gov' & suffix != 'arpa' && suffix != 'biz' && suffix != 'aero' && suffix != 'name' && suffix != 'coop' && suffix != 'info' && suffix != 'pro' && suffix != 'museum') return false;
	return true;
};
// $validateEmail()