//******************************************************************************
//	Simple Form Validation Script
//	Created on May 24, 2005
//
//	Performs form validation based on a per element basis (where that element 
//	has a rule set.  Displays on error on validation failure and causes the 
//	validation() function to return false.
//
//
// TODO:  Regular Expression Rule not working properly.  Need to implement 
// phone number validation as well.
//******************************************************************************


//******************************************************************************
//******************************************************************************
// Validation Object - Created for each form;  Validates each 
// field based on a specific rule.
//******************************************************************************

function Validation(divID, errorFontColor, defaultFontColor) {
	// Member Variables
	this.m_formElements = new Array();
	this.m_fieldDescs = new Array();
	this.m_fieldRules = new Array();
	this.m_values = new Array();
	this.m_displayDIV = divID;
	this.m_fontColor = errorFontColor;
	this.m_defaultColor = defaultFontColor;
	
	// Member Functions
	this.addElement = addElement;
	this.validate = validate;
	this.sendMessage = sendMessage;
}	


//******************************************************************************
// Validation::addElement() - Adds an element by ID to the object.  Description
// also added for alert messages.  Rule added for which validation rule to use
// and value added for max/min lengths.
//******************************************************************************
function addElement(elementID, elementDesc, rule, value) {
	this.m_formElements[this.m_formElements.length] = elementID;
	this.m_fieldDescs[this.m_fieldDescs.length] = elementDesc;
	this.m_fieldRules[this.m_fieldRules.length] = rule;
	this.m_values[this.m_values.length] = value;
}


//******************************************************************************
// Validation::addElement() - Adds an element by ID to the object.  Description
// also added for alert messages.  Rule added for which validation rule to use
// and value added for max/min lengths.
//******************************************************************************
function sendMessage(msg) {
	var div = document.getElementById(this.m_displayDIV);
	div.innerHTML = '<p style="color:'+this.m_fontColor+'">'+msg+'</p>';
}


//******************************************************************************
// Validation::validate() - Validates all the elements in the form.  Returns 
// true if no fields fail validation, and false if any do.
//******************************************************************************
function validate() {
	var pass = true;
	var i = 0;
	var div = document.getElementById(this.m_displayDIV) 
	
	div.innerHTML = "<p style='color:"+this.m_defaultColor+"'>.</p>";
	
	while((i < this.m_formElements.length) && pass == true) {
	
		// E-Mail Validation
		if(this.m_fieldRules[i] == "EMAIL") {
			var str = document.getElementById(this.m_formElements[i]).value;
			var at="@"
			var dot="."
			var lat=str.indexOf(at)
			var lstr=str.length
			var ldot=str.indexOf(dot)
			
			if(str.indexOf(at)==-1)
			{
				this.sendMessage(this.m_fieldDescs[i]);
		 		pass = false;
			}
			else if(str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr)
			{
				this.sendMessage(this.m_fieldDescs[i]);
		 		pass = false;
			}
			else if(str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr)
			{
				this.sendMessage(this.m_fieldDescs[i]);
		 		pass = false;
			}
			else if(str.indexOf(at,(lat+1))!=-1)
		 	{
				this.sendMessage(this.m_fieldDescs[i]);
		 		pass = false;
		 	}
			else if(str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot)
		 	{
				this.sendMessage(this.m_fieldDescs[i]);
		 		pass = false;
		 	}
		 	else if(str.indexOf(dot,(lat+2))==-1)
		 	{
				this.sendMessage(this.m_fieldDescs[i]);
		 		pass = false;
		 	}
			else if(str.indexOf(" ")!=-1)
		 	{
				this.sendMessage(this.m_fieldDescs[i]);
		 		pass = false;
		 	}
		 	
		}
		
		// DEPRECIATED - PLEASE USE THE PHONE RULE
		// Phone Number (with area code) Validation
		else if(this.m_fieldRules[i] == "PHONELONG") {
			var number = this.m_formElements[i].value;
			number.replace(" ", "");
			number.replace("-", "");
			number.replace("(", "");
			number.replace(")", "");
			
			this.m_formElements[i].value.replace("(", "");
			this.m_formElements[i].value.replace(")", "");
			
			if(!document.getElementById(this.m_formElements[i]).value.match(/[a-zA-Z]+$/)) {
				this.sendMessage(this.m_fieldDescs[i]);
				pass = false;
			} else if(number.length != 10) {
				this.sendMessage(this.m_fieldDescs[i]);
				pass = false;
			} else {
				if(this.m_formElements[i].value.length == 10) {
					var num1, num2, num3;
					num1 = this.m_formElements[i].value.substr(0, 3);
					num2 = this.m_formElements[i].value.substr(3, 3);
					num3 = this.m_formElements[i].value.substr(6, 4);
					
					this.m_formElements[i].value = num1 + "-" + num2 + "-" + num3;
				}
			}
		}
		
		// DEPRECIATED - PLEASE USE THE PHONE RULE
		//Phone Number Validation
		else if(this.m_fieldRules[i] == "PHONESHORT") {
			var number = this.m_formElements[i].value;
			number.replace(" ", "");
			number.replace("-", "");
			number.replace("(", "");
			number.replace(")", "");
			
			this.m_formElements[i].value.replace("(", "");
			this.m_formElements[i].value.replace(")", "");
			
			if(!document.getElementById(this.m_formElements[i]).value.match(/[a-zA-Z]+$/)) {
				this.sendMessage(this.m_fieldDescs[i]);
				pass = false;
			} else if(number.length != 7) {
				this.sendMessage(this.m_fieldDescs[i]);
				pass = false;
			}			
		}
		
		else if(this.m_fieldRules[i] == "PHONE")
		{
			//var regex = /(^\d{3}(-|\.)\d{3}(-|\.)\d{4}$)|(^\d{3}(-|\.)\d{4}$)|(^\d{3} \d{3} \d{4}$)|(^\(\d{3}\)( |)\d{3}(-|\.)\d{4}$)/;
			var regex = /((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,3})|(\(?\d{2,3}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}/;
			if(!document.getElementById(this.m_formElements[i]).value.match(regex)) {
				this.sendMessage(this.m_fieldDescs[i]);
				pass = false;
			}
		}
		
		// Date Validation
		// TODO:  Add validation for a variety of other date formats.  Currently only supports MM/YY
		else if(this.m_fieldRules[i] == "DATE")
		{
			var regex = /(^(0[1-9]|1[012])\/[0-9]{2}$)/;
			if(!document.getElementById(this.m_formElements[i]).value.match(regex)) {
				this.sendMessage(this.m_fieldDescs[i]);
				pass = false;
			}
		}
		
		// Zip Code Validation - Supports US and Canadian Zip Codes
		else if(this.m_fieldRules[i] == "ZIP") {
			var usRegex = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
			var caRegex = /^\s*[A-CEGHJ-NPR-TVXY]\d[A-Z] \d[A-Z]\d$/;
			
			if(!document.getElementById(this.m_formElements[i]).value.match(usRegex) && !document.getElementById(this.m_formElements[i]).value.match(caRegex)) {
				this.sendMessage(this.m_fieldDescs[i]);
				pass = false;
			}
		}
		
		// Minimum Length Validation
		else if(this.m_fieldRules[i] == "MAXLENGTH") {
			if(document.getElementById(this.m_formElements[i]).value.length > this.m_values[i]) {
				this.sendMessage(this.m_fieldDescs[i]);
				pass = false;
			}
		} 
		
		// Maximum Length Validation
		else if(this.m_fieldRules[i] == "MINLENGTH")  {
			if(document.getElementById(this.m_formElements[i]).value.length < this.m_values[i]) {
				this.sendMessage(this.m_fieldDescs[i]);
				pass = false;
			}
		}
		
		// Numeric Only Validation
		else if(this.m_fieldRules[i] == "NUMONLY") {
			if(!document.getElementById(this.m_formElements[i]).value.match(/^\d+$/)) {
				this.sendMessage(this.m_fieldDescs[i]);
				pass = false;
			}
		}
		
		// Character Only Validation
		else if(this.m_fieldRules[i] == "CHARONLY") {
			if(!document.getElementById(this.m_formElements[i]).value.match(/[a-zA-Z]+$/)) {
				this.sendMessage(this.m_fieldDescs[i]);
				pass = false;
			} 
		}
		
		// Match Found Validation
		else if(this.m_fieldRules[i] == "MATCH") {
			if(document.getElementById(this.m_formElements[i]).value.match(this.m_values[i])) {
				this.sendMessage(this.m_fieldDescs[i]);
				pass = false;
			}
		}
		
		// Nonzero Validation
		else if(this.m_fieldRules[i] == "NONZERO") {
			if(document.getElementById(this.m_formElements[i]).value < 0 && 
			   document.getElementById(this.m_formElements[i]).value > 0) {
				this.sendMessage(this.m_fieldDescs[i]);
				pass = false;
			}
		}
		
		// Positive Validation
		else if(this.m_fieldRules[i] == "NUMPOS") {
			if(document.getElementById(this.m_formElements[i]).value < 0) { 
				this.sendMessage(this.m_fieldDescs[i]);
				pass = false;
			}
		}
		
		// Compare Fields Validation
		else if(this.m_fieldRules[i] == "COMPARE") {
			if(document.getElementById(this.m_formElements[i]).value != document.getElementById(this.m_values[i]).value) {
				this.sendMessage(this.m_fieldDescs[i]);
				pass = false;
			}
		}
		
		// Different Fields Validation
		else if(this.m_fieldRules[i] == "GREATER") {
			if(+(document.getElementById(this.m_formElements[i]).value) <= this.m_values[i]) {
				this.sendMessage(this.m_fieldDescs[i]);
				pass = false;
			}
		}
		
		// Greater Than Fields Validation
		else if(this.m_fieldRules[i] == "LESS") {
			if(+(document.getElementById(this.m_formElements[i]).value) >= this.m_values[i]) {
				this.sendMessage(this.m_fieldDescs[i]);
				pass = false;
			}
		}
		
		// Two fields must be different
		else if(this.m_fieldRules[i] == "DIFF") {
			if(document.getElementById(this.m_formElements[i]).value == document.getElementById(this.m_values[i]).value) {
				this.sendMessage(this.m_fieldDescs[i]);
				pass = false;
			}
		}
		
		// Field value differs from a numeric value
		else if(this.m_fieldRules[i] == "NUMDIFF") {
			if(document.getElementById(this.m_formElements[i]).value == this.m_values[i]) {
				this.sendMessage(this.m_fieldDescs[i]);
				pass = false;
			}
		}
		
		// Regex Validation
		else if(this.m_fieldRules[i] == "REGEX") {
			var regObj = new RegExp("/" + this.m_values[i] + "/");
			this.sendMessage(document.getElementById(this.m_formElements[i]).value.match(regObj));
			
			if(!document.getElementById(this.m_formElements[i]).value.match(/^[0-9]+$/)) {
				this.sendMessage(this.m_fieldDescs[i]);
				pass = false;
			}
		}
		
		// Unknown Validation
		else {
			
		}
		
		++i;
	}
	if (!pass && document.getElementById('anchor_top') != null) {
		window.scrollTo(0,0);
		//document.getElementById('anchor_top').focus();
	}
	
	return pass;
}

//******************************************************************************
//******************************************************************************


//******************************************************************************
// 
// Working Example
//
//******************************************************************************
/*
		<div id="msgDiv"></div>	
		<script language="JavaScript">
			var validateObj = new Validation("msgDiv", "red");
		</script>
			
		
		<form name="test" method="post" action="" onSubmit="return validateObj.validate();">
			<p>E-Mail:<br /><input type="text" name="email" id="email" /></p>
			
			<script language="JavaScript">
				// Vaidates as an e-mail address.
				validateObj.addElement("email", "The E-Mail Address is too small.", "MINLENGTH", 5);
				validateObj.addElement("email", "The E-Mail Address is too large.", "MAXLENGTH", 256);
				validateObj.addElement("email", "The E-Mail Address entered is not valid.", "EMAIL");
			</script>
			
			
			<p>Username:<br /><input type="text" name="username" id="username" /></p>
			
			<script language="JavaScript">
				// Validates to be greater than 5 and less than 10.
				validateObj.addElement("username", "The Username field is too small.", "MINLENGTH", 5);
				validateObj.addElement("username", "The Username field is too large.", "MAXLENGTH", 10);
				validateObj.addElement("username", "The Username can not contain numbers.", "CHARONLY");
			</script>
			
			
			<p>Password:<br /><input type="password" name="password" id="password" /></p>
			
			<script language="JavaScript">
				// Validates to be greater than 5 and less than 20.
				validateObj.addElement("password", "The Passwords entered must match", "COMPARE", "password_confirm");
				validateObj.addElement("password", "The Password field is too small.", "MINLENGTH", 5);
				validateObj.addElement("password", "The Password field is too large.", "MAXLENGTH", 20);
				validateObj.addElement("password", "The Username and Password must be different.", "DIFF", "username");
			</script>
			
			<p>Confirm Password:<br /><input type="password" name="password_confirm" id="password_confirm" /></p>

			<p><input type="submit" name="submit" value="Send" /></p>
		</form>
*/
//******************************************************************************
