// JavaScript Document
/*******************************************************************************
  VALIDATION FUNCTIONS:

  validateCurrency - checks for valid currency format
  validateTime - checks for valid 12 hour time
  validateState -  checks for valid state abbreviation  
  validateSSN - checks format of social security number
  validateEmail - checks format of email address
  validateUSPhone - checks format of US phone number
  validateNumeric - checks for valid numeric value
  validateInteger - checks for valid integer value
  validateNotEmpty - checks for blank form field
  validateUSZip - checks for valid US zip code
  validateUSDate - checks for valid date in US format
  validateValue - checks a string against supplied pattern
  
  FORMAT FUNCTIONS:
  
  rightTrim - removes trailing spaces from a string
  leftTrim - removes leading spaces from a string
  trimAll - removes leading and trailing spaces from a string
  removeCurrency - removes currency formatting characters (), $ 
  addCurrency - inserts currency formatting characters
  removeCommas - removes comma separators from a number
  addCommas - adds comma separators to a number
  removeCharacters - removes characters from a string that match passed pattern
*******************************************************************************/
	function validateCurrency( strValue)  {
	/************************************************
	DESCRIPTION: Validates that a string contains a 
	  valid currency format. 
	  
	 PARAMETERS:
	   strValue - String to be tested for validity
	   
	RETURNS:
	   True if valid, otherwise false.
	*************************************************/
	  var objRegExp = /(^\$\d{1,3}(,\d{3})*\.\d{2}$)|(^\(\$\d{1,3}(,\d{3})*\.\d{2}\)$)/;
	  return objRegExp.test( strValue );
	}
	
	function validateTime ( strValue ) {
	/************************************************
	DESCRIPTION: Validates that a string contains a 
	  valid 12 hour time format. Seconds are optional.
	  
	 PARAMETERS:
	   strValue - String to be tested for validity
	   
	RETURNS:
	   True if valid, otherwise false.
	
	REMARKS: Returns True for time formats such as:
	  HH:MM or HH:MM:SS or HH:MM:SS.mmm (where the
	  .mmm is milliseconds as used in SQL Server 
	  datetime datatype.  Also, the .mmm portion will 
	  accept 1 to 3 digits after the period)
	*************************************************/
	  var objRegExp = /^([1-9]|1[0-2]):[0-5]\d(:[0-5]\d(\.\d{1,3})?)?$/;
	
	  return objRegExp.test( strValue );
	
	}
	
	function validateState (strValue ) {
	/************************************************
	DESCRIPTION: Validates that a string contains a 
	  valid state abbreviation. 
	  
	 PARAMETERS:
	   strValue - String to be tested for validity
	   
	RETURNS:
	   True if valid, otherwise false.
	*************************************************/
	
	var objRegExp = /^(AK|AL|AR|AZ|CA|CO|CT|DC|DE|FL|GA|HI|IA|ID|IL|IN|KS|KY|LA|MA|MD|ME|MI|MN|MO|MS|MT|NB|NC|ND|NH|NJ|NM|NV|NY|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VA|VT|WA|WI|WV|WY)$/i; 
	
	  return objRegExp.test(strValue);
	}
	
	function validateSSN( strValue ) {
	/************************************************
	DESCRIPTION: Validates that a string contains a 
	  valid social security number. 
	  
	 PARAMETERS:
	   strValue - String to be tested for validity
	   
	RETURNS:
	   True if valid, otherwise false.
	*************************************************/
	var objRegExp  = /^\d{3}\-\d{2}\-\d{4}$/;
	 
	  //check for valid SSN
	  return objRegExp.test(strValue);
	
	}
	
	function validNumSSN(formField,message)
	{
		var result = true;
		if (!validateNotEmpty(formField,message))
			result = false;
		if (result)
		{
			var num = parseInt(formField.value);
			if (isNaN(num) || formField.value == 0)
			{
				alert(message);
				formField.focus();
				result = false;
			}
		}
		if (result)
		{
			if(formField.value.length < 4)
			{
				alert(message);
				formField.focus();
				result = false;
			}
		}
		return result;
	}
	
	
	function validateEmail(formfield,strMsg) {
	/************************************************
	DESCRIPTION: Validates that a string contains a 
	  valid email pattern. 
	  
	 PARAMETERS:
	   strValue - String to be tested for validity
	   
	RETURNS:
	   True if valid, otherwise false.
	   
	REMARKS: Accounts for email with country appended
	  does not validate that email contains valid URL
	  type (.com, .gov, etc.) and optionally,
	  a valid country suffix.  Since email has many
	  forms this expression only tests for near valid
	  address.  Some additional validation may be
	  required.
	*************************************************/
	var objRegExp  = /^[a-z0-9]([a-z0-9_\-\.]*)@([a-z0-9_\-\.]*)(\.[a-z]{2,3}(\.[a-z]{2}){0,2})$/i;
	  //check for valid email
		if(objRegExp.test(formfield.value))
			return true;
		else	
		{
			alert(strMsg);
			formfield.focus();
			return false;		
		}
	}	
	
	function validateUSPhone( strValue ) {
	/************************************************
	DESCRIPTION: Validates that a string contains valid
	  US phone pattern. 
	  Ex. (999) 999-9999 or (999)999-9999
	  
	PARAMETERS:
	   strValue - String to be tested for validity
	   
	RETURNS:
	   True if valid, otherwise false.
	*************************************************/
	  var objRegExp  = /^\([1-9]\d{2}\)\s?\d{3}\-\d{4}$/;
	 
	  //check for valid us phone with or without space between 
	  //area code
	  return objRegExp.test(strValue); 
	}
	
	function  validateNumeric( strValue ) {
	/******************************************************************************
	DESCRIPTION: Validates that a string contains only valid numbers.
	
	PARAMETERS:
	   strValue - String to be tested for validity
	   
	RETURNS:
	   True if valid, otherwise false.
	******************************************************************************/
	  var objRegExp  =  /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/; 	
	  //check for numeric characters 
	  return objRegExp.test(strValue);
	}
	
	function validateInteger( form_field,strmsg  ) {
	/************************************************
	DESCRIPTION: Validates that a string contains only 
		valid integer number.
		
	PARAMETERS:
	   strValue - String to be tested for validity
	   
	RETURNS:
	   True if valid, otherwise false.
	******************************************************************************/
	  var objRegExp  = /(^-?\d\d*$)/;
	 
	  //check for integer characters
	  if(!objRegExp.test(form_field.value))
	  {
		alert(strmsg);		
		form_field.focus();
		return false;
	  }
	  else
		return true;
	}
	
	function validateNotEmpty( form_field,strmsg ) {
	/************************************************
	DESCRIPTION: Validates that a string is not all
	  blank (whitespace) characters.
		
	PARAMETERS:
	   strValue - String to be tested for validity
	   
	RETURNS:
	   True if valid, otherwise false.
	*************************************************/
	   var strTemp = form_field.value;
	   strTemp = trimAll(strTemp);
	   if(strTemp.length > 0){
		 return true;
	   }  
	   else
	   {
			alert(strmsg);		
			form_field.focus();
			return false;
		}	
	}
	
	function validateUSZip( strValue ) {
	/************************************************
	DESCRIPTION: Validates that a string a United
	  States zip code in 5 digit format or zip+4
	  format. 99999 or 99999-9999
		
	PARAMETERS:
	   strValue - String to be tested for validity
	   
	RETURNS:
	   True if valid, otherwise false.
	
	*************************************************/
	var objRegExp  = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
	 
	  //check for valid US Zipcode
	  return objRegExp.test(strValue);
	}
	
	function validateUSDate( strValue ) {
	/************************************************
	DESCRIPTION: Validates that a string contains only 
		valid dates with 2 digit month, 2 digit day, 
		4 digit year. Date separator can be ., -, or /.
		Uses combination of regular expressions and 
		string parsing to validate date.
		Ex. mm/dd/yyyy or mm-dd-yyyy or mm.dd.yyyy
		
	PARAMETERS:
	   strValue - String to be tested for validity
	   
	RETURNS:
	   True if valid, otherwise false.
	   
	REMARKS:
	   Avoids some of the limitations of the Date.parse()
	   method such as the date separator character.
	*************************************************/
	  var objRegExp = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/
	 
	  //check to see if in correct format
	  if(!objRegExp.test(strValue))
		return false; //doesn't match pattern, bad date
	  else{
		var arrayDate = strValue.split(RegExp.$1); //split date into month, day, year
		var intDay = parseInt(arrayDate[1],10); 
		var intYear = parseInt(arrayDate[2],10);
		var intMonth = parseInt(arrayDate[0],10);
		
		//check for valid month
		if(intMonth > 12 || intMonth < 1) {
			return false;
		}
		
		//create a lookup for months not equal to Feb.
		var arrayLookup = { '01' : 31,'03' : 31, '04' : 30,'05' : 31,'06' : 30,'07' : 31,
							'08' : 31,'09' : 30,'10' : 31,'11' : 30,'12' : 31}
	  
		//check if month value and day value agree
		if(arrayLookup[arrayDate[0]] != null) {
		  if(intDay <= arrayLookup[arrayDate[0]] && intDay != 0)
			return true; //found in lookup table, good date
		}
			
		//check for February
		var booLeapYear = (intYear % 4 == 0 && (intYear % 100 != 0 || intYear % 400 == 0));
		if( ((booLeapYear && intDay <= 29) || (!booLeapYear && intDay <=28)) && intDay !=0)
		  return true; //Feb. had valid number of days
	  }
	  return false; //any other values, bad date
	}
	
	function validateValue( strValue, strMatchPattern ) {
	/************************************************
	DESCRIPTION: Validates that a string a matches
	  a valid regular expression value.
		
	PARAMETERS:
	   strValue - String to be tested for validity
	   strMatchPattern - String containing a valid
		  regular expression match pattern.
		  
	RETURNS:
	   True if valid, otherwise false.
	*************************************************/
	var objRegExp = new RegExp( strMatchPattern);
	 
	 //check if string matches pattern
	 return objRegExp.test(strValue);
	}
	
	
	function rightTrim( strValue ) {
	/************************************************
	DESCRIPTION: Trims trailing whitespace chars.
		
	PARAMETERS:
	   strValue - String to be trimmed.  
		  
	RETURNS:
	   Source string with right whitespaces removed.
	*************************************************/
	var objRegExp = /^([\w\W]*)(\b\s*)$/;
	 
		  if(objRegExp.test(strValue)) {
		   //remove trailing a whitespace characters
		   strValue = strValue.replace(objRegExp, '$1');
		}
	  return strValue;
	}
	
	function leftTrim( strValue ) {
	/************************************************
	DESCRIPTION: Trims leading whitespace chars.
		
	PARAMETERS:
	   strValue - String to be trimmed
	   
	RETURNS:
	   Source string with left whitespaces removed.
	*************************************************/
	var objRegExp = /^(\s*)(\b[\w\W]*)$/;
	 
		  if(objRegExp.test(strValue)) {
		   //remove leading a whitespace characters
		   strValue = strValue.replace(objRegExp, '$2');
		}
	  return strValue;
	}
	
	function trimAll( strValue ) {
	/************************************************
	DESCRIPTION: Removes leading and trailing spaces.
	
	PARAMETERS: Source string from which spaces will
	  be removed;
	
	RETURNS: Source string with whitespaces removed.
	*************************************************/ 
	 var objRegExp = /^(\s*)$/;
	
		//check for all spaces
		if(objRegExp.test(strValue)) {
		   strValue = strValue.replace(objRegExp, '');
		   if( strValue.length == 0)
			  return strValue;
		}
		
	   //check for leading & trailing spaces
	   objRegExp = /^(\s*)([\W\w]*)(\b\s*$)/;
	   if(objRegExp.test(strValue)) {
		   //remove leading and trailing whitespace characters
		   strValue = strValue.replace(objRegExp, '$2');
		}
	  return strValue;
	
	}
	
	function removeCurrency( strValue ) {
	/************************************************
	DESCRIPTION: Removes currency formatting from 
	  source string.
	  
	PARAMETERS: 
	  strValue - Source string from which currency formatting
		 will be removed;
	
	RETURNS: Source string with commas removed.
	*************************************************/
	  var objRegExp = /\(/;
	  var strMinus = '';
	 
	  //check if negative
	  if(objRegExp.test(strValue)){
		strMinus = '-';
	  }
	  
	  objRegExp = /\)|\(|[,]/g;
	  strValue = strValue.replace(objRegExp,'');
	  if(strValue.indexOf('$') >= 0){
		strValue = strValue.substring(1, strValue.length);
	  }
	  return strMinus + strValue;
	}
	
	function addCurrency( strValue ) {
	/************************************************
	DESCRIPTION: Formats a number as currency.
	
	PARAMETERS: 
	  strValue - Source string to be formatted
	
	REMARKS: Assumes number passed is a valid 
	  numeric value in the rounded to 2 decimal 
	  places.  If not, returns original value.
	*************************************************/
	  var objRegExp = /-?[0-9]+\.[0-9]{2}$/;
	   
		if( objRegExp.test(strValue)) {
		  objRegExp.compile('^-');
		  strValue = addCommas(strValue);
		  if (objRegExp.test(strValue)){
			strValue = '($' + strValue.replace(objRegExp,'') + ')';
		  }
		  else {
			strValue = '$' + strValue;
		  }
		  return  strValue;
		}
		else
		  return strValue;
	}
	
	function removeCommas( strValue ) {
	/************************************************
	DESCRIPTION: Removes commas from source string.
	
	PARAMETERS: 
	  strValue - Source string from which commas will 
		be removed;
	
	RETURNS: Source string with commas removed.
	*************************************************/
	  var objRegExp = /,/g; //search for commas globally
	 
	  //replace all matches with empty strings
	  return strValue.replace(objRegExp,'');
	}
	
	function addCommas( strValue ) {
	/************************************************
	DESCRIPTION: Inserts commas into numeric string.
	
	PARAMETERS: 
	  strValue - source string containing commas.
	  
	RETURNS: String modified with comma grouping if
	  source was all numeric, otherwise source is 
	  returned.
	  
	REMARKS: Used with integers or numbers with
	  2 or less decimal places.
	*************************************************/
	  var objRegExp  = new RegExp('(-?[0-9]+)([0-9]{3})'); 
	
		//check for match to search criteria
		while(objRegExp.test(strValue)) {
		   //replace original string with first group match, 
		   //a comma, then second group match
		   strValue = strValue.replace(objRegExp, '$1,$2');
		}
	  return strValue;
	}
	
	function removeCharacters( strValue, strMatchPattern ) {
	/************************************************
	DESCRIPTION: Removes characters from a source string
	  based upon matches of the supplied pattern.
	
	PARAMETERS: 
	  strValue - source string containing number.
	  
	RETURNS: String modified with characters
	  matching search pattern removed
	  
	USAGE:  strNoSpaces = removeCharacters( ' sfdf  dfd', 
									'\s*')
	*************************************************/
	 var objRegExp =  new RegExp( strMatchPattern, 'gi' );
	 
	 //replace passed pattern matches with blanks
	  return strValue.replace(objRegExp,'');
	}
	
	function validateRadioNotEmpty(form_field,strmsg)
	{
		//alert(form_field);
		var rtnBool = false;
		var count=form_field.length;
		for(var i=0; i<count; i++)
		{
			if(form_field[i].checked)
				rtnBool = true;
		}
		if(!rtnBool)
			alert(strmsg);
		return rtnBool;
	}
	function __validateNotEmpty( form_field,strmsg ) {
	/************************************************
	DESCRIPTION: Validates that a string is not all
	  blank (whitespace) characters.
		
	PARAMETERS:
	   strValue - String to be tested for validity
	   
	RETURNS:
	   True if valid, otherwise false.
	*************************************************/
	   var strTemp = form_field.value;
	   strTemp = trimAll(strTemp);
	   if(strTemp.length > 0){
		 return true;
	   }  
	   else
	   {
			alert(strmsg);		
			form_field.focus();
			return false;
		}	
	}
	/******************************************************/
	function validate_al_num(form_field)
	{
		//var al_num=/[a-zA-Z0-9]/;
		//alert(form_field.value);
		//var al_num=/\w/;
		var objRegExp  = /(^\d{5}$)|(^\d{5}-\d{4}$)/; 
		//check for valid US Zipcode 	
		
		alert(objRegExp.test(form_field.value));
		
		return al_num.test(form_field.value); 
	}
	/******************************************************/
	function validate_pass_confpass(pass, confpass, msg)
	{
		if(pass.value != confpass.value)
		{
			alert(msg);
			pass.focus();
			return false;
		}
		
		return true;
	}
	/******************************************************/
	function validDateMDY(formField, message)
	{
		var result = true;
		if (!validateNotEmpty(formField, message))
			result = false;
		if (result)
		{
			var elems = formField.value.split('/');
			result = (elems.length == 3); // should be three components
			if (result)
			{
				var day = parseInt(elems[1]);
				var month = parseInt(elems[0]);
				var year = parseInt(elems[2]);
				//alert(month + "/" + day + "/" + year);
				result = !isNaN(month) && (month > 0) && (month < 13) && !isNaN(day) && (day > 0) && (day < 32) && !isNaN(year) && (elems[2].length == 4);
			}
			if (!result)
			{
				//alert(month + "/" + day + "/" + year);
				alert(message);
				formField.focus();
			}
		}
		return result;
	}
// ------------------------------------------------------------------------