function ValidationList() {
	this.fields = new Array();
	
	this.get = function(fieldName) { return this.fields[fieldName] }
	this.length = function() { return this.fields.length }
	
	this.addField = function(fieldName,validateMethod,defaultErrorMsg) {
		var newField = new Field();
		newField.fieldName = fieldName;
		newField.validateFunction = validateMethod;
		newField.defaultErrorMsg = defaultErrorMsg;
		this.fields[fieldName] = newField;
	}
	
	this.getErrorCount = function() {
		numErrors = 0;
		for ( var fieldName in this.fields )
			if ( this.get(fieldName).hasError ) numErrors++;
		return numErrors;
	}
}

function Field() {
	this.fieldName;
	this.validateFunction;
	this.hasError = true;
	this.defaultErrorMsg;
	
	this.fieldValue = function() { 
		var thisFormObj = this.inputFieldObj();
		if ( thisFormObj.options != undefined )
			return thisFormObj.options[thisFormObj.selectedIndex].value;
		else if ( thisFormObj.value != undefined )
			return thisFormObj.value;
	}

	this.inputFieldObj = function() { return document.getElementById(this.fieldName) }
	this.errorMsgObj = function() { return document.getElementById('error_' + this.fieldName) }
	this.validate = function() { this.validateFunction( this ); }
	
	this.showError = function() {
		this.errorMsgObj().style.visibility = 'visible';
	}
	
	this.hideError = function() {
		this.errorMsgObj().style.visibility = 'hidden';
	}
	
	this.approve = function() {
		this.hasError = false;
		this.hideError();
	}

	this.reject = function(altMsg) {
		this.hasError = true;
		if ( altMsg != undefined ) {
			this.errorMsgObj().innerHTML = altMsg;
		}
		else {
			this.errorMsgObj().innerHTML = this.defaultErrorMsg;
		}
		this.showError();
	}
	
}

function validateField(inputField) {
	var fieldToValidate = validationList.get(inputField.name);
	if ( fieldToValidate ) fieldToValidate.validate();
}

function validateText(thisField) {
	if ( thisField.fieldValue() == '' ) thisField.reject();
	else thisField.approve();
}

function validateEmail(thisField) {
	if ( thisField.fieldValue() == '' ) thisField.reject();
	else if ( !isValidEmail( thisField.fieldValue() ) ) {
		thisField.reject('Enter a valid email address');
	}
	else thisField.approve();
}

function validateDate(thisField) {
	if ( thisField.fieldValue() == '' ) thisField.reject();
	else if ( !isValidDate( thisField.fieldValue() ) ) {
		thisField.reject('Enter valid date (mm/dd/yyyy)');
	}
	else thisField.approve();
}

function validatePhone(thisField) {
	phoneNumber = trim( thisField.fieldValue() );
	if ( phoneNumber == '' ) thisField.reject();
	else if ( !validPhoneNumber( phoneNumber ) ) {
		thisField.reject('Enter a valid phone number');
	}
	else thisField.approve();
}

function validateFax(thisField) {
	faxNumber = trim( thisField.fieldValue() );
	if ( faxNumber != '' && !validPhoneNumber( faxNumber ) ) {
		thisField.reject('Enter a valid fax number');
	}
	else thisField.approve();
}

function validateZip(thisField) {
	if ( thisField.fieldValue() == '' ) thisField.reject();
	else if ( thisField.fieldValue().length < 5 ) {
		thisField.reject('Enter a valid zip/postal code');
	}
	else thisField.approve();
}

function isValidEmail(str) {
   return ( (str.indexOf("@") > 0) && str.indexOf(".") >= 1 );
}

function isValidDate(dateStr, format) {
   if (format == null) { format = "MDY"; }
   format = format.toUpperCase();
   if (format.length != 3) { format = "MDY"; }
   if ( (format.indexOf("M") == -1) || (format.indexOf("D") == -1) || (format.indexOf("Y") == -1) ) { format = "MDY"; }
   if (format.substring(0, 1) == "Y") { // If the year is first
      var reg1 = /^\d{2}(\-|\/|\.)\d{1,2}\1\d{1,2}$/
      var reg2 = /^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/
   } else if (format.substring(1, 2) == "Y") { // If the year is second
      var reg1 = /^\d{1,2}(\-|\/|\.)\d{2}\1\d{1,2}$/
      var reg2 = /^\d{1,2}(\-|\/|\.)\d{4}\1\d{1,2}$/
   } else { // The year must be third
      var reg1 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2}$/
      var reg2 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/
   }
   // If it doesn't conform to the right format (with either a 2 digit year or 4 digit year), fail
   if ( (reg1.test(dateStr) == false) && (reg2.test(dateStr) == false) ) { return false; }
   var parts = dateStr.split(RegExp.$1); // Split into 3 parts based on what the divider was
   // Check to see if the 3 parts end up making a valid date
   if (format.substring(0, 1) == "M") { var mm = parts[0]; } 
   else if (format.substring(1, 2) == "M") { var mm = parts[1]; } else { var mm = parts[2]; }
   if (format.substring(0, 1) == "D") { var dd = parts[0]; }
   else if (format.substring(1, 2) == "D") { var dd = parts[1]; } else { var dd = parts[2]; }
   if (format.substring(0, 1) == "Y") { var yy = parts[0]; } 
   else if (format.substring(1, 2) == "Y") { var yy = parts[1]; } else { var yy = parts[2]; }
   if (parseFloat(yy) <= 50) { yy = (parseFloat(yy) + 2000).toString(); }
   if (parseFloat(yy) <= 99) { yy = (parseFloat(yy) + 1900).toString(); }
   var dt = new Date(parseFloat(yy), parseFloat(mm)-1, parseFloat(dd), 0, 0, 0, 0);
   if (parseFloat(dd) != dt.getDate()) { return false; }
   if (parseFloat(mm)-1 != dt.getMonth()) { return false; }
   
   //If the date is a past date return false
   var today = new Date();
   if (dt < today) { return false; }
   
   return true;
}

function validPhoneNumber(PhoneNumber) {	
	var PNum = new String(PhoneNumber);	// 555-555-5555	or (555)555-5555 or (555) 555-5555 or 555.555.5555
	var regex = /^[1]*[0-9]{3,3}[ ]*[0-9]{3,3}[ ]*[0-9]{4,4}$|^[0-9]{3,3}\-[0-9]{3,3}\-[0-9]{4,4}$|^\([0-9]{3,3}\) [0-9]{3,3}\-[0-9]{4,4}$|^\([0-9]{3,3}\)[0-9]{3,3}\-[0-9]{4,4}$|^[0-9]{3,3}\.[0-9]{3,3}\.[0-9]{4,4}$/;
	return regex.test(PNum);
}

function isValidZipCode(value) {
   var re = /^\d{5}$|^\d{5}\-\d{4}$|^[\d\w]{6}$/;
   return (re.test(value));
}

function validateInteger(thisField) {
	numP = parseInt( thisField.fieldValue(),10 );
	if ( thisField.fieldValue() == '' ) thisField.reject();
	else if ( isNaN(numP) || thisField.fieldValue() != numP ) thisField.reject('Enter a valid number');
	else thisField.approve();
}

function approveField(thisField) {
	thisField.hasError = false;
	thisField.hideError();
}

function rejectField(thisField,altMsg) {
	thisField.hasError = true;
	if ( altMsg != undefined ) {
		thisField.errorMsgObj().innerHTML = altMsg;
	}
	thisField.showError();
}

function submitForm() {
	for ( var fieldName in validationList.fields ) {
		thisField = validationList.get(fieldName);
		thisField.validate();
	}

	if ( validationList.getErrorCount() > 0 ) {
		window.scrollTo(0,0);
		document.getElementById("error-message").style.display = "block";
		layoutPage();
	}
	if ( validationList.getErrorCount() == 0 ) {
		document.getElementById("error-message").style.display = "none";
		get("oid").value = oidNumber;
		document.getElementById("sf_form").submit();
	}
}

function trim(s) { 
     return s.replace(/^\s+|\s+$/g, ''); 
} 