
/*******************************************************************************
FILE: RegExpValidate.js


DESCRIPTION: This file contains a library of validation functions
  using javascript regular expressions.  Library also contains functions that re-
  format fields for display or for storage.
  

  VALIDATION FUNCTIONS:

  validateCurrency - checks for valid currency format
  validateTime - checks for valid 24 hour time with or without seconds
  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
  removeNonnumeric - removes all non-numeric characters
	
  OTHER FUNCTIONS:
	
  explodeArray
*******************************************************************************/


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})?)?$/;
  var objRegExp = /([0-9]|0[0-9]|1[0-2]|2[0-3]):[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 validateEmail( strValue) {
/************************************************
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
  return objRegExp.test(strValue);
}

function validateUSPhone( strValue ) {
/************************************************
DESCRIPTION: Validates that a string contains valid
  US phone pattern. 
  Ex. (999) 999-9999 or (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( strValue ) {
/************************************************
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
  return objRegExp.test(strValue);
}

function validateNotEmpty( strValue ) {
/************************************************
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 = strValue;
   strTemp = trimAll(strTemp);
   if(strTemp.length > 0){
     return true;
   }  
   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 or mm.dd.yy
    
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{2,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 removeDecimal( strValue ) {
/*****************************************************
DESCRIPTION: Removes decimal point from source string.

PARAMETERS: 
  strValue - Source string from which decimal pnt will 
    be removed;

RETURNS: Source string with decimal pnt removed.
*****************************************************/
  var objRegExp = /\./g; //search for decimal pnt globally
 
  //replace all matches with empty strings
  return strValue.replace(objRegExp,'');
}

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 removeAlpha( strValue ) {
/************************************************
DESCRIPTION: Removes other characters other than numbers
   from source string.

PARAMETERS: 
  strValue - Source string from which characters 
  other than numbers will be removed;

RETURNS: Source string with characters other 
  than numbers removed.
*************************************************/
  var objRegExp = /[A-z]/g; //search for alphabet 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 removeNonnumeric(strValue){
/***********************************************
DESCRIPTION: Removes all non-numeric characters from a source string

PARAMETERS: source string

RETRUNS: string of numeric characters only
***********************************************/

	return  strValue.replace(/[\D]/g, "")
}


function is_allDigits(a){
        regexp_allDigits = /^[0-9]*[0-9]$/;

        return(regexp_allDigits.test(a));
}


function is_Measure(a){
        var b=parseFloat(a);

        regexp_isMeasure = /^[0-9]*[.]?[0-9]?[0-9]?[0-9]?[0-9]$/;

        return(regexp_isMeasure.test(a) && b!=0);
}

function is_Date34(strValue){

	if( strValue == '00/00/0000' )
	{
		return false;
	}

        regexp_isDate = /(0[1-9]|1[0-2])[(\x2F)-. ]((0[1-9])|(3[0-1])|([1-2][0-9]))[(\x2F)-. ][0-9]{4}/;
        if(regexp_isDate.test(strValue) && strValue!='') {

                var objRegExp = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2,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) {
                                //alert('Year Entered has an invalid month.');
                                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
                       		else {
                               		//alert('Date is invalid.');
                               		return false;
                        	}
                        }

                        //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
                        else {  //alert('Day in Febuary date is invalid.');
                                return false; //any other values, bad date
                        }
                }
        }
        // else alert('Date must be in MM/DD/YYYY format. Please check your date.');
        return false;
}

function removeMyChar(strValue,str1,str2) {
/*****************************************************
DESCRIPTION: Replaces characters.

PARAMETERS: 
  strValue - Source string from which character will 
    be removed;
  str1 - string to be replace
  str2 - string to replace strValue2

RETURNS: Source string with replace characters.
*****************************************************/
  var objRegExp = /str1/g; //search for character match with str1
 
  //replace all matches with str2
  return strValue.replace(objRegExp,str2);
}

/*####################################
# CHECK RECOGNITION SCRIPTS
####################################*/

function extract_check_no(mystr) {
        str_len=mystr.length;
        cnt1=mystr.indexOf('U');
        str1=mystr.substring(cnt1+1,str_len);
        cnt2=str1.indexOf('U');
        str2=str1.substring(cnt1,cnt2);
        return str2;
}
function extract_rtc_no(mystr) {
        str_len=mystr.length;
        cnt1=mystr.indexOf('U');
        str1=mystr.substring(cnt1+1,str_len);
        cnt2=str1.indexOf('U');
        str2=str1.substring(cnt2+1,str_len);
        cnt3=str2.indexOf('T');
        str3=str2.substring(0,cnt3);
        return str3;
}
function extract_acct_no(mystr) {
        str_len=mystr.length;
        cnt1=mystr.indexOf('T');
        str1=mystr.substring(cnt1+1,str_len);
        cnt2=str1.indexOf('U');
        str2=str1.substring(0,cnt2);
        return str2;
}
function extract_chk_amt(mystr) {
        str_len=mystr.length;
        cnt1=mystr.indexOf('$');
        str1=mystr.substring(cnt1+1,str_len);
        cnt2=str1.indexOf('$');
        str2=str1.substring(0,cnt2);
        str_len2=str2.length;
        ex_str=str2.substring(0,str_len2-2);
        ex_str2=str2.substring(str_len2-2,str_len2);
	if(ex_str=='') ex_str='0';
	if(ex_str2=='') ex_str2='00';
        ex_str3=ex_str+'.'+ex_str2;
	if(ex_str3!='0.00') {
        	for(i=0;i<ex_str3.length;i++) {
                	my_char=ex_str3.substring(0,1);
                	if(my_char=='0') ex_str3=ex_str3.substring(1,ex_str3.length);
        	}
	}
	ex_str3x = new String(ex_str3);
	ex_str3x = addCommas(ex_str3x);
        return ex_str3x;
}
// added to explode string into array  
// *********************************
function explodeArray(item,delimiter) {
  tempArray=new Array(1);
  var Count=0;
  var tempString=new String(item);

  while (tempString.indexOf(delimiter)>0) {
    tempArray[Count]=tempString.substr(0,tempString.indexOf(delimiter));
    tempString=tempString.substr(tempString.indexOf(delimiter)+1,tempString.length-tempString.indexOf(delimiter)+1);
    Count=Count+1
  }

  tempArray[Count]=tempString;
  return tempArray;
}
//****************************************

// ************************************
// FUNCTION TO CLEAR ELEMENTS OF A FORM
// ************************************
function reset_val(obj,a,b) {
        for(i=2;i<=b;i++) {
                switch(obj.elements[i].type) {
                case 'checkbox' :
                        obj.elements[i].checked=false;
			break;
                case 'radio' :
                        obj.elements[i].checked=false;
			break;
                case 'text' :
                        obj.elements[i].value='';
			break;
                case 'textarea' :
                        obj.elements[i].value='';
			break;
                case 'password' :
                        obj.elements[i].value='';
			break;
                case 'select-one' :
			if(obj.elements[i].options.length>0) obj.elements[i].options[0].selected=true;
			break;
		}
        }
}

function formatCurrency( num ) {
        num = num.toString().replace(/\$|\,/g,'');
        if (isNaN(num)) { num = "0"; }
        sign = (num == (num = Math.abs(num)));
        num = Math.floor(num*100+0.50000000001);
        cents = num%100;
        num = Math.floor(num/100).toString();
        if (cents<10) { cents = ".0" + cents; } else { cents="."+cents; }
        for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
        num = num.substring(0,num.length-(4*i+3))+','+ num.substring(num.length-(4*i+3));
        return (((sign)?'':'-') +  num + cents);
}

function formatTime(tym){
	strTime=Date.parse('2006-01-01  '+tym);
	newTime = new Date(strTime);
	hr= newTime.getHours();
	min = newTime.getMinutes();
	a = hr+':'+min;
	return a;
}

function validateKeyPressNumeric(isN,e,s) {

	var ret = false;
	if (isN) { keyCode=e.which;} else { keyCode=e.keyCode; }

	str=new String(s);
	str=str+String.fromCharCode(keyCode);

	if (keyCode == 8 || keyCode == 9 || keyCode==0 || keyCode == 42 || keyCode == 43 || keyCode == 47 || keyCode == 45 || keyCode == 40 || keyCode == 41 || keyCode == 37 || keyCode == 46 ) {
		ret = true;
	}

	if (keyCode > 47 && keyCode < 58 ) {
		ret = true;
	}	

	if (isN) {
		return ret;
	} else {
		e.returnValue=ret;
	}
}

