function FormValidator(form_name) {
	// OBJECT FIELDS:
	this.not_null_fields = new Array();
	this.not_null_messages = new Array();

	this.numeric_fields = new Array();
	this.numeric_messages = new Array();

	this.redundant_text_fields = new Array();
	this.redundant_text_messages = new Array();

	this.email_fields = new Array();
	this.email_messages = new Array();

	// LINKED NUMERIC FIELDS ARE MULTIPLE NUMERIC FIELDS THAT SHOULD BE VALIDATED AS A SINGLE
	// UNIT SUCH AS A PHONE NUMBER INPUT VIA 3 TEXT BOXES OR A DOB DONE W/ 3 SELECTS:
	this.linked_numeric_fields = new Array();
	this.linked_numeric_messages = new Array();

	this.form_name = form_name;
	this.error_cnt = 0;
	this.error_header = "Request cancelled for the following reason(s):";
	this.error_footer = "\n Please correct and resubmit";
	this.error_indent = "   ";
	this.error_strng = "";

	// OBJECT METHODS:
	this.setErrorHeader = setErrorHeader;
	this.addNotNullField = addNotNullField;
	this.addNumericField = addNumericField;
	this.addLinkedNumericFields = addLinkedNumericFields;
	this.addRedundantTextFields = addRedundantTextFields;

	this.addEmailField = addEmailField;

	this.execute = execute;
}

function setErrorHeader(newErrorHeader) {
	this.error_header = newErrorHeader;
}

function addNotNullField(name, error_message) {
	var new_indx = this.not_null_fields.length;
	this.not_null_fields.length++;
	this.not_null_messages.length++;

	this.not_null_fields[new_indx] = name;
	this.not_null_messages[new_indx] = error_message;
}

function addNumericField(name, error_message) {
	var new_indx = this.numeric_fields.length;
	this.numeric_fields.length++;
	this.numeric_messages.length++;

	this.numeric_fields[new_indx] = name;
	this.numeric_messages[new_indx] = error_message;
}

function addLinkedNumericFields(names_array, error_message) {
	var new_indx = this.linked_numeric_fields.length;
	this.linked_numeric_fields.length++;
	this.linked_numeric_messages.length++;

	this.linked_numeric_fields[new_indx] = names_array;
	this.linked_numeric_messages[new_indx] = error_message;
}

function addRedundantTextFields(field1, field2, error_message) {
	var new_indx = this.redundant_text_fields.length;

	this.redundant_text_fields.length++;
	this.redundant_text_messages.length++;

	this.redundant_text_fields[new_indx] = new Array(field1, field2);
	this.redundant_text_messages[new_indx] = error_message;
}

function addEmailField(name, error_message) {
	var new_indx = this.email_fields.length;

	this.email_fields.length++;
	this.email_messages.length++;

	this.email_fields[new_indx] = name;
	this.email_messages[new_indx] = error_message;
}


// HERE'S THE MAIN METHOD - IT MOSTLY JUST LOOPS THROUGH THE FIELD ARRAYS CREATED BY THE "add...." METHODS:
function execute() {
	var len = this.not_null_fields.length;

	// HANDLE NOT NULL FORM FIELDS:
	for (var i=0; i<len; i++) {
		var type = eval("document." + this.form_name + ".elements." + this.not_null_fields[i] + ".type");

		if (type == "text" || type == "textarea") {
			var tmp = eval("document." + this.form_name + ".elements." + this.not_null_fields[i] + ".value");
		} else if (type == "select-one") {
			var tmp = eval("document." + this.form_name + ".elements." + this.not_null_fields[i] + "[document." + this.form_name + ".elements." + this.not_null_fields[i] +  ".selectedIndex].value");
		} else if (type == "checkbox") {
            var tmp = eval("document." + this.form_name + ".elements." + this.not_null_fields[i] + ".checked");
        }
        //alert(this.not_null_fields[i]+": "+tmp);
		if(tmp == "") {
			this.error_cnt++;
			this.error_strng += this.error_indent + this.not_null_messages[i] + "\n";
		}

	} // END NOT NULL FIELDS

	var len = this.numeric_fields.length;

	// HANDLE NUMERIC FORM FIELDS:
	for (var i=0; i<len; i++) {
		var type = eval("document." + this.form_name + ".elements." + this.numeric_fields[i] + ".type");

		if (type == "text") {
			var tmp = eval("document." + this.form_name + ".elements." + this.numeric_fields[i] + ".value");
		} else if (type == "select-one") {
			var tmp = eval("document." + this.form_name + ".elements." + this.numeric_fields[i] + "[document." + this.form_name + ".elements." + this.numeric_fields[i] +  ".selectedIndex].value");
		}

		if(isNaN(tmp) || tmp == "") {
			this.error_cnt++;
			this.error_strng += this.error_indent + this.numeric_messages[i] + "\n";
		}

	} // END NUMERIC FIELDS

	var len = this.linked_numeric_fields.length;

	// HANDLE LINKED NUMERIC FIELDS - A LITTLE TRICKIER:
	for (var i=0; i<len; i++) {
		var len2 = this.linked_numeric_fields[i].length;
		var linked_err_cnt = 0;

		for (var j=0; j<len2; j++) {
			var type = eval("document." + this.form_name + ".elements." + this.linked_numeric_fields[i][j] + ".type");

			if (type == "text") {
				var tmp = eval("document." + this.form_name + ".elements." + this.linked_numeric_fields[i][j] + ".value");
			} else if (type == "select-one") {
				var tmp = eval("document." + this.form_name + ".elements." + this.linked_numeric_fields[i][j] + "[document." + this.form_name + ".elements." + this.linked_numeric_fields[i][j] +  ".selectedIndex].value");
			}

			if(isNaN(tmp) || tmp == "") {
				linked_err_cnt++;
			}
		}

		if(linked_err_cnt != 0) {
			this.error_cnt++;
			this.error_strng += this.error_indent + this.linked_numeric_messages[i] + "\n";
		}
	} // END LINKED NUMERIC FIELDS


	var len = this.redundant_text_fields.length;

	// HANDLE REDUNDANT TEXT FIELDS - A LITTLE TRICKIER:
	for (var i=0; i<len; i++) {
		var redundant_err_cnt = 0;

		if (eval("document." + this.form_name + ".elements." + this.redundant_text_fields[i][0] + ".value") != eval("document." + this.form_name + ".elements." + this.redundant_text_fields[i][1] + ".value") || eval("document." + this.form_name + ".elements." + this.redundant_text_fields[i][0] + ".value") == "") {
			this.error_cnt++;
			this.error_strng += this.error_indent + this.redundant_text_messages[i] + "\n";
		}

	} // END REDUNDANT TEXT FIELDS

	var len = this.email_fields.length;

	// HANDLE EMAIL FIELDS:
	for (var i=0; i<len; i++) {

		var email_val = eval("document." + this.form_name + ".elements." + this.email_fields[i] + ".value")

		if (!email_val.match(/^[a-zA-Z0-9]+[.a-zA-Z0-9_+-]*@[a-zA-Z0-9_-]{2,}[.a-zA-Z0-9_-]*$/)) {
			this.error_cnt++;
			this.error_strng += this.error_indent + this.email_messages[i] + "\n";
		}
	}

	// FINALLY EITHER RETURN TRUE OR ALERT THE USER:
	if (this.error_cnt == 0) {
		return true;
	} else {
		alert(this.error_header + "\n" + this.error_strng + this.error_footer);
		this.error_cnt = 0;
		this.error_strng = "";
		return false;
	}
}
