/***************************************************************
		Project Name	: 
		Programmer	: Mohit Naveria
		Created Date	: 29/Jan/2007
		Modified Date	: 08/Feb/2007
		Purpose		: 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. 
		Language	: JS
/***************************************************************/
/*

  VALIDATION FUNCTIONS:

  validateAlphaNumeric - check only Character and numeric
  validateCharacter- checks for valid Character only
  validateName     - check for name (allow space)
  validateEmail    - checks format of email address
  validatePhone    - checks format of phone number only integer
  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
  validateZipCode  - checks for valid US zip code
  validateURL      - checks for valid URL
  validateUSDate   - checks for valid date in US format
  validateCurrency - checks for valid currency format
  validateValue    - checks a string against supplied pattern
  validateFileUpload - checks upload file extension present in array or not
  validateTime     - checks for valid 12 hour time
  validateState    -  checks for valid state abbreviation  
  validateSSN      - checks format of social security number

  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

  OTHER FUNCTIONs:

  validateMaxLenght - Check Maximum length in Textarea  
  popupWindow       - Used to open Popup window
  mouseOverClass    - Used to apply the css class 
*******************************************************************************/

// Check Alpha numeric 
function validateAlphaNumeric(strValue)
{
	/************************************************
	DESCRIPTION: Validates that a string contains a valid  Character and number only. 
	  
	PARAMETERS:
	   strValue - String to be tested for validity
	   
	RETURNS:
	   True if valid, otherwise false.
	*************************************************/

	var objRegExp = /^([a-zA-Z0-9]+)$/;

	return objRegExp.test( strValue );
}


// Check username , character.... 
function validateCharacter(strValue)
{
	/************************************************
	DESCRIPTION: Validates that a string contains a valid  Username, character. 
	  
	PARAMETERS:
	   strValue - String to be tested for validity
	   
	RETURNS:
	   True if valid, otherwise false.
	*************************************************/

	var objRegExp = /^([a-zA-Z]+)$/;

	return objRegExp.test( strValue );
}

// Check name allow space.
function validateName(strValue)
{
	/************************************************
	DESCRIPTION: Validates that a string contains a valid name allow space. 
	  
	PARAMETERS:
	   strValue - String to be tested for validity
	   
	RETURNS:
	   True if valid, otherwise false.
	*************************************************/

	var objRegExp = /^([a-zA-Z\s]+)$/;

	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;
	var objRegExp  = /^[a-z0-9]([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 validatePhone( strValue ) 
{
 /************************************************
 DESCRIPTION: Validates that a string contains valid phone pattern. 
      
 PARAMETERS:
    strValue - String to be tested for validity
    
 RETURNS:
    True if valid, otherwise false.
 *************************************************/
 var objRegPhonedigit  = /^\d{3}\s?\-?\d{3}\s?\-?\d{4}$/;  
 var objRegPhoneUS     = /^\([1-9]\d{2}\)\s?\d{3}\-\d{4}$/;
 var objRegPhoneCouSt  = /^\+1{1}\s?\([0-9]\d{2}\)\s?\-?\d{3}\-?\s?\d{3}\-?\s?\d{4}$/;
 var objRegPhoneAsia  = /^\+?[0-9]\d{1}\s?\-?\d{3}\s?\-?\d{3}\s?\-?\d{4}$/; 
 var objRegPhoneOther  = /^([0-9]{6,10})$/; if (!objRegPhonedigit.test(strValue)) // 999-999-9999
 {
  if (!objRegPhoneOther.test(strValue)) // 9999999999
  {
   if (!objRegPhoneUS.test(strValue)) // (999) 999-9999 or (999)999-9999
   {
    if (!objRegPhoneCouSt.test(strValue)) // +1 (111) 111 111 1111 , +1 (111)-111-111-1111, 
    {
     if (!objRegPhoneAsia.test(strValue)) // +91 111 111 1111 , +91-111-111-1111, 
     {
      return false;
     }
    }
   }
  }
 }
 
 return true;
 
}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}$/;
	var objRegExp  = /^([0-9\s\(\)\-\+]+)$/;
 
	//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 validateZipCode( 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}$)/;
	//var objRegExp  =  /^([0-9]{6,9})$/;
 
	//check for valid US Zipcode
	return objRegExp.test(strValue);
}

function validateURL(url)
{
	/************************************************
	DESCRIPTION: Validates that a string contains only valid URL OR NOT. Uses combination of regular expressions and string parsing to validate date.
	Ex. http://localhost/zip/login.php, http://www.test
		
	PARAMETERS:
	   url - String to be tested for validity
	   
	RETURNS:
	   True if valid, otherwise false.
	   
	REMARKS:
	   
	*************************************************/
	var urlRegxp = /^(http:\/\/|https:\/\/|ftp:\/\/|){1}([0-9A-Za-z]+\.)/;

	//var urlRegxp = /^(http:\/\/www.|https:\/\/www.|ftp:\/\/www.|www.){1}([\w]+)(.[\w]+){1,2}$/;
	//var urlRegxp = /^http|https|www/;
	return urlRegxp.test(url);

}
function checkURL(sUrl)
{
	var url = false ;
	var isNot = "`!@$^*()[{]}\|;'',<> " ;
	if (sUrl.length != 0 )
	{
		if (sUrl.indexOf('://') != -1)
		{
			if (sUrl.indexOf('"') == -1)
			{
				url = true ;
				if (sUrl.length <= 7 )
				{
					url = false ;	
				}
				for (i=0;i!=sUrl.length;++i)
				{
					if (isNot.indexOf(sUrl.substring(i,i+1)) != -1)
					{
						url = false ;	
					}
				}
			}
		}
	}	
	if (url == false )
	{
		//alert('In valid URL') ;
		return false;
	}
}
// 
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 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 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 validateFileUpload(strValue, fileextension)
{
		/************************************************
		DESCRIPTION: Validates that a file a matches a valid given extension.
			
		PARAMETERS:
		   strValue - String to be tested for validity 
		   fileextension - Array of allow extension.
			  
		RETURNS:
		   True if valid, otherwise false.
		*************************************************/
		
		var path = new String(strValue)
		fileExt  = path.substr(path.lastIndexOf(".")+1);
		fileExt  = fileExt.toLowerCase();
		var x = 0;
		chk = "false";

		for (x=0; x<11; x++) 
		{ 
			if(fileextension[x] == fileExt)
			{
				chk = "true";
				break;
			}
		} 
		
		if ( chk == "false" )
		{
			 return false ;
		}
		else
		{  
			return true ; 
		}
}
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,'');
}

 
var isNS4 = (navigator.appName=="Netscape")?1:0;
function validateMaxLenght(element, event, maxlength) 
{
	
	var iKey = (!isNS4?event.keyCode:event.which);
	var re = new RegExp("\r\n","g");
	var x = element.value.replace(re,"").length;
	if ((x>=maxlength) && ((iKey > 31 && iKey < 1200) || (iKey > 95 && iKey < 106)) && (iKey != 13)) 
	{
		return false;
	} 
	else 
	{
		return true;
	}
}


function popupWindow(url) 
{
	/************************************************
	DESCRIPTION: Used to Open the POPUP window.

	PARAMETERS: 
	  strValue - OPen Page URL.
	  
	RETURNS: Display the page contant
	  
	USAGE:  
	*************************************************/
	
	window.open(url,'popupWindow','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=100,height=100,screenX=150,screenY=150,top=150,left=150')
}

function mouseOverClass() 
{
	/************************************************
	DESCRIPTION: Used to apply the css class.

	PARAMETERS: 
	  strValue - ID
	  
	RETURNS: Return Class name
	  
	USAGE:  
	*************************************************/
	document.getElementById("EP").style.className=  "TdLfMenu_sel";

}



function replaceSingleDouble( strValue ) {
/************************************************
DESCRIPTION: Replace SingleDouble from source string.PARAMETERS: 
  strValue - Source string from which SingleDouble will 
    be replace with specail character;RETURNS: Source string with replace with specail character;.
*************************************************/
  var objRegExp = /\'/g; //search for ' globally
  //replace all matches with ' strings
  strValue = strValue.replace(objRegExp,"&quot;"); 

  var objRegExp = /\"/g; //search for " globally
  //replace all matches with &quot; strings
  return strValue.replace(objRegExp,'&quot;');
}
