
/*******************************************************************************
 * 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:
 * 
 * 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
 * 
 * 
 * AUTHOR: Karen Gayda
 * 
 * DATE: 03/24/2000
 ******************************************************************************/
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.) or valid country suffix.
 ******************************************************************************/
// var objRegExp =
// /(^[a-z]([a-z_\.]*)@([a-z_\.]*)([.][a-z]{3})$)|(^[a-z]([a-z_\.]*)@([a-z_\.]*)(\.[a-z]{3})(\.[a-z]{2})*$)/i;
// srikar
var objRegExp  = /[$\\@\\\#%\^\&\*\(\)\[\]\+\_\{\}\`\~\=\.\,\;\'\"\:\[0-9]|]/;// /(^.+\@([a-z_\.]*)([.][a-z]{3})$)|(^.+\@([a-z_\.]*)(\.[a-z]{2})(\.[a-z]{2})*$)/i;
// var objRegExp =
// /(^.+\@([a-z_\.]*)([.][a-z]{3})$)|(^.+\@([a-z_\.]*)(\.[a-z]{2})(\.[a-z]{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
 * 
 * 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
 * 
 * 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 strSeparator = strValue.substring(2,3) // find date separator
    var arrayDate = strValue.split(strSeparator); // split date into month,
													// day, year
    // 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}
    var intDay = parseInt(arrayDate[1],10); 

    // 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 intMonth = parseInt(arrayDate[0],10);
    if (intMonth == 2) { 
       var intYear = parseInt(arrayDate[2],10);
       if( ((intYear % 4 == 0 && intDay <= 29) || (intYear % 4 != 0 && 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;
}
/* kiran add this function to check for credit card vaild or not */
function validateCredit(num)
{
	var objRegExp = /^((67\d{2})|(4\d{3})|(5[1-5]\d{2})|(6011))(-\s\d{4}){3}|(3[4,7])\d{2}-\s\d{6}-\s\d{5}/;
	// alert(objRegExp.test(num));
	return objRegExp.test(num);
}


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,'') + ')';
      }
      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 validateChar( 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.) or valid country suffix.
 ******************************************************************************/
// var objRegExp =
// /(^[a-z]([a-z_\.]*)@([a-z_\.]*)([.][a-z]{3})$)|(^[a-z]([a-z_\.]*)@([a-z_\.]*)(\.[a-z]{3})(\.[a-z]{2})*$)/i;
// var objRegExp =
// /(^.+\@([a-z_\.]*)([.][a-z]{3})$)|(^.+\@([a-z_\.]*)(\.[a-z]{2})(\.[a-z]{2})*$)/i;
var mikExp = /[$\\@\\\#%\^\&\*\(\)\[\]\+\_\{\}\`\~\=\.\,\;\'\"\:\[0-9]|]/;

 
  // check for valid email
  return mikExp.test(strValue);
}
function validateSignedFloat(floatValue){
	var signedFloat = /^((\d+(\.\d*)?)|((\d*\.)?\d+))$/;
	return signedFloat.test(floatValue);
}

function ValidateImage(oForm){
	if (!/(\.(gif|jpg|jpeg|bmp|png))$/i.test(oForm.value)){
		return false;
	}
	return true;
}
function validatePhone(strValue)
{
	var objRegExp = / /g; // search for commas globally

	// replace all matches with empty strings
	var newString=strValue.replace(objRegExp,'');

	var objRegExp  = /(^[0123456789+-]*[0-9]$)/;
	return objRegExp.test(newString);
}

function createDDMMYYY(strDate)
    {
        arrDt = strDate.split("/");
        var stdt=null;
   		stdt=new Date();
   		stdt.setFullYear(arrDt[2]);
		if (parseInt(arrDt[1],10) == 1 || parseInt(arrDt[1],10)==3 || parseInt(arrDt[1],10)==5 || parseInt(arrDt[1],10)==7 || parseInt(arrDt[1],10)==8 || parseInt(arrDt[1],10)==10 || parseInt(arrDt[1],10)==12)
   		{
   		    stdt.setMonth(arrDt[1]-1);
   		    stdt.setDate(arrDt[0]);
   		}
   		if (parseInt(arrDt[1],10) == 2 || parseInt(arrDt[1],10)==4 || parseInt(arrDt[1],10)==6 || parseInt(arrDt[1],10)==9 || parseInt(arrDt[1],10)==11)
   		{
   		    stdt.setDate(arrDt[0]);
   		    stdt.setMonth(arrDt[1]-1);
   		}
        return stdt;
    }

function createMMYYY(strDate)
    {
		
        return createDDMMYYY("01/"+strDate);
    } 
function compareDate(startDate,endDate)
    {
    	
    	if(endDate >= startDate)
    	{
            return 1;
    	}
            else 
            return -1;
    }
   function compareMon(mon)
    {
    	
    }
function isUrl(s) {
	var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
	return regexp.test(s);
}
 function validateFloatTwoDecimal(str) {
    
    return /^[-+]?\d{3,5}(\.\d{1,3})?$/.test(str);
}
 
//Declaring required variables
 var digits = "0123456789";
 // non-digit characters which are allowed in phone numbers
 var phoneNumberDelimiters = "()- ";
 // characters which are allowed in international phone numbers
 // (a leading + is OK)
 var validWorldPhoneChars = phoneNumberDelimiters + "+";
 // Minimum no of digits in an international phone no.
 var minDigitsInIPhoneNumber = 10;

 function isInteger(s)
 {   var i;
     for (i = 0; i < s.length; i++)
     {   
         // Check that current character is number.
         var c = s.charAt(i);
         if (((c < "0") || (c > "9"))) return false;
     }
     // All characters are numbers.
     return true;
 }
 function trim(s)
 {   var i;
     var returnString = "";
     // Search through string's characters one by one.
     // If character is not a whitespace, append to returnString.
     for (i = 0; i < s.length; i++)
     {   
         // Check that current character isn't whitespace.
         var c = s.charAt(i);
         if (c != " ") returnString += c;
     }
     return returnString;
 }
 function stripCharsInBag(s, bag)
 {   var i;
     var returnString = "";
     // Search through string's characters one by one.
     // If character is not in bag, append to returnString.
     for (i = 0; i < s.length; i++)
     {   
         // Check that current character isn't whitespace.
         var c = s.charAt(i);
         if (bag.indexOf(c) == -1) returnString += c;
     }
     return returnString;
 }

 function checkInternationalPhone(strPhone){
 	var bracket=3
 	strPhone=trim(strPhone)
 	if(strPhone.indexOf("+")>1) 
 		return false
 	if(strPhone.indexOf("-")!=-1)
 		bracket=bracket+1
 	if(strPhone.indexOf("(")!=-1 && strPhone.indexOf("(")>bracket)
 		return false
 	var brchr=strPhone.indexOf("(")
 	if(strPhone.indexOf("(")!=-1 && strPhone.charAt(brchr+2)!=")")
 		return false
 	if(strPhone.indexOf("(")==-1 && strPhone.indexOf(")")!=-1)
 		return false
 	s=stripCharsInBag(strPhone,validWorldPhoneChars);
 	return (isInteger(s) && s.length >= minDigitsInIPhoneNumber);
 }