/****************************************************************

DESCRIPTION: This file contains a library of validation functions
  using javascript regular expressions.  Library also contains 
  functions that reformat fields for display or for storage.


  VALIDATION FUNCTIONS:

  validateEmail - checks format of email address
  discardSingeColon- find the single quote in the string
  ValidateSpecialChar- Find the Special Char in the String
  ValidatePassword- Find the Space in the Password
  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

*******************************************************************/



/// <summary>
/// <Descripton>Hide / Visible the Error Message</Descripton>
/// <Author>Harish Bansal</Author>
/// <CreatedOn>01/07/2008</CreatedOn>
/// </summary>    

function HideVisibleErrorMessage(errorRow,IsError,objTableErrorMessage,objImgErrorMessage,objRowSpacer)
{
    
    objTableErrorMessage.style.display=errorRow;
    objRowSpacer.style.display=errorRow;
    
    if(IsError)
    {
        objImgErrorMessage.src="http://www.nopaypoker.com/App_Themes/PokerTheme/images/erorr_msgicon.gif";
    }
    else
    {
        objImgErrorMessage.src="http://www.nopaypoker.com/App_Themes/PokerTheme/images/info_msgicon.gif";
    }
}


   
function validateEmail(strValue,objLabelErrorMessage) 
{
    /************************************************
    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-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
    
    //check for valid email
    
    if(!objRegExp.test(strValue))
    {
       objLabelErrorMessage.innerHTML="Please! Enter the valid email id.";
    }
    else
    {
      objLabelErrorMessage.innerHTML="";
    }
    return objRegExp.test(strValue);
    
}

function discardSingeColon(str)
{
     var index;
     var ch;
     var str1=str;
     for(index=0;index<=str1.length-1;index++)
     {
        ch=str1.substr(index,1);
        if(ch=="'")
        {
            return false;
        }           
     }
     return true;
     
 }


/// <summary>
/// <Descripton>
///   Find the Space in the Password
/// </Descripton>
/// <Author>Harish Bansal</Author>
/// <CreatedOn>06/06/2008</CreatedOn>
/// <Return></Return>
/// </summary>

function ValidatePassword(strValue,objLabelErrorMessage)
{

    var index,ch,asciiCode;
    var strCheckString=strValue;
    var spaceExist=false;
            
    for(index=0;index<=strCheckString.length-1;index++)
    {
        ch=strCheckString.substr(index,1);
        
        asciiCode=ascii_value(ch);
        
        if(asciiCode==32)
        {
            
            objLabelErrorMessage.innerHTML="Space are not allowed.";
            spaceExist=true;
            break;
        }
    }
    
    return spaceExist;
}



/// <summary>
/// <Descripton>
/// Find the Special Char in the String
/// </Descripton>
/// <Author>Harish Bansal</Author>
/// <CreatedOn>06/06/2008</CreatedOn>
/// <Return></Return>
/// </summary>

function ValidateSpecialChar(strValue,objLabelErrorMessage)
{
    
    var index,ch,asciiCode;
    var strCheckString=strValue;
    var specialCharacterExist=false;
            
    for(index=0;index<=strCheckString.length-1;index++)
    {
        ch=strCheckString.substr(index,1);
        
        asciiCode=ascii_value(ch);
        
        if(asciiCode>32 && asciiCode<48 || asciiCode>57 && asciiCode<65 || asciiCode>90 && asciiCode<95 || asciiCode==96 || asciiCode>122 && asciiCode<127 || asciiCode==32)
        {
            
            objLabelErrorMessage.innerHTML="Special characters like !,@,#,$,%,^,&,*,',. etc are not allowed.";
            specialCharacterExist=true;
            break;
        }
    }
    if(!specialCharacterExist)
    {
      //  objLabelErrorMessage.innerHTML="";
    }
    return specialCharacterExist;

}

/// <summary>
/// <Descripton>
/// Find the ascii value of the Character
/// </Descripton>
/// <Author>Harish Bansal</Author>
/// <CreatedOn>06/06/2008</CreatedOn>
/// <Return></Return>
/// </summary>

function ascii_value (c)
{
    // restrict input to a single character
    c = c . charAt (0);

    // loop through all possible ASCII values
    var i;
    for (i = 0; i < 256; ++ i)
    {
	    // convert i into a 2-digit hex string
	    var h = i . toString (16);
	    if (h . length == 1)
		    h = "0" + h;

	    // insert a % character into the string
	    h = "%" + h;

	    // determine the character represented by the escape code
	    h = unescape (h);

	    // if the characters match, we've found the ASCII value
	    if (h == c)
		    break;
    }
   return i;
}




function validatePhone( 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 validateCharacters( strValue ) 
{
    /************************************************
    DESCRIPTION: Validates that a string doesnt have 
    numeric or special characters

    PARAMETERS:
    strValue - String to be tested for validity

    RETURNS:
    True if valid, otherwise false.

    *************************************************/
    //var objRegExp  = /^[\w\.\']{2,}([\s][\w\.\']{2,})+$/;
    //var objRegExp  = /(^-?\d\d*$)/
    //var objRegExp  = /[a-zA-Z]/;
 //[^a-zA-Z]+/; //[^d][a-zA-Z][^d]/
    
//    if(validateInteger(strValue)==false)
//    {
    var NewStrValue=strValue.replace(/[^a-zA-Z]/g,'');
    //alert('strValue=='+strValue);
    if(NewStrValue!=strValue)
    {
        return false;
    }
//    }
//    else
//        return false;
}

function validateUserName( strValue ) 
{
    /************************************************
    DESCRIPTION: Validates that a string doesnt have 
    numeric or special characters

    PARAMETERS:
    strValue - String to be tested for validity

    RETURNS:
    True if valid, otherwise false.

    *************************************************/
    var objRegExp  = /^[\w\d\_\.]{4,}$/;

    //check for valid US Zipcode
    return objRegExp.test(strValue);
}

function validateDate( 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}$/;
//  alert(1);
  //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) 
    var arrayDate = strValue.split(strSeparator); 
    //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]);
       if (intDay > 0 && intDay < 29) {
           return true;
       }
       else if (intDay == 29) {
         if ((intYear % 4 == 0) && (intYear % 100 != 0) || 
             (intYear % 400 == 0)) {
              // year div by 4 and ((not div by 100) or div by 400) ->ok
             return true;
         }   
       }
    }
  }  
  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,'') + ')';
      }
      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 formatPhoneNumber(_Control)
{
/************************************************
DESCRIPTION: Formats the Controls for the Phone Numbers

PARAMETERS:
  _Control - source string containing number.

RETURNS: nothing

USAGE:  Formats the _Control for the Phone Numbers
*************************************************/
    //alert('sdf');
    _Control.value = _Control.value.replace(/[^0-9]/g,'');
    if(_Control.value.length>15)
    {
        _Control.value=_Control.value.substring(0,15);
    }
    
    if(_Control.value.length<=4)
    {
        _Control.value = _Control.value.replace(/([0-9]{1})/, '()-$1');
    }
    else if(_Control.value.length>4 && _Control.value.length<=7)
    {
        _Control.value = _Control.value.replace(/([0-9]{3})([0-9]{4})/, '() $1-$2');
        _Control.value = _Control.value.replace(/([0-9]{2})([0-9]{4})/, '() $1-$2');
        _Control.value = _Control.value.replace(/([0-9]{1})([0-9]{4})/, '() $1-$2');
    }
    else if(_Control.value.length>7 && _Control.value.length<=10)
    {
        _Control.value = _Control.value.replace(/([0-9]{3})([0-9]{3})([0-9]{4})/, '($1) $2-$3');
        _Control.value = _Control.value.replace(/([0-9]{2})([0-9]{3})([0-9]{4})/, '($1) $2-$3');
        _Control.value = _Control.value.replace(/([0-9]{1})([0-9]{3})([0-9]{4})/, '($1) $2-$3');
    }
    else
    {
        _Control.value = _Control.value.replace(/([0-9]{3})([0-9]{3})([0-9]{4})([0-9]{5})/, '($1) $2-$3 $4');
        _Control.value = _Control.value.replace(/([0-9]{3})([0-9]{3})([0-9]{4})([0-9]{4})/, '($1) $2-$3 $4');
        _Control.value = _Control.value.replace(/([0-9]{3})([0-9]{3})([0-9]{4})([0-9]{3})/, '($1) $2-$3 $4');
        _Control.value = _Control.value.replace(/([0-9]{3})([0-9]{3})([0-9]{4})([0-9]{2})/, '($1) $2-$3 $4');
        _Control.value = _Control.value.replace(/([0-9]{3})([0-9]{3})([0-9]{4})([0-9]{1})/, '($1) $2-$3 $4');
    }
}


function formatSSN(_Control)
{
/************************************************
DESCRIPTION: Formats the Controls for the Phone Numbers

PARAMETERS:
  _Control - source string containing number.

RETURNS: nothing

USAGE:  Formats the _Control for the Phone Numbers
*************************************************/
    _Control.value = _Control.value.replace(/[^0-9]/g,'');
    if(_Control.value.length>=9)
    {
        _Control.value=_Control.value.substring(0,9);
    }
    
    if(_Control.value.length>3 && _Control.value.length<=5)
    {
        _Control.value = _Control.value.replace(/([0-9]{3})([0-9]{2})/, '$1-$2');
        _Control.value = _Control.value.replace(/([0-9]{3})([0-9]{1})/, '$1-$2');
    }
    else if(_Control.value.length>5 && _Control.value.length<=9)
    {
        _Control.value = _Control.value.replace(/([0-9]{3})([0-9]{2})([0-9]{4})/, '$1-$2-$3');
        _Control.value = _Control.value.replace(/([0-9]{3})([0-9]{2})([0-9]{3})/, '$1-$2-$3');
        _Control.value = _Control.value.replace(/([0-9]{3})([0-9]{2})([0-9]{2})/, '$1-$2-$3');
        _Control.value = _Control.value.replace(/([0-9]{3})([0-9]{2})([0-9]{1})/, '$1-$2-$3');
        
    }

}



function validateTags(strValue) 
{
    /************************************************
    DESCRIPTION: Validates that a string does not contain
    an html tag

    PARAMETERS:
    strValue - String to be tested for validity

    RETURNS:
    True if valid, otherwise false.

    *************************************************/
    //var objRegExp  = /(^[a-z]([a-z_\.]*)@([a-z_\.]*)([.][a-z]{3})$)|(^[a-z]([a-z_\.]*)@([a-z_\.]*)(\.[a-z]{3})(\.[a-z]{2})*$)/i;

    //check for valid string
    if((strValue.indexOf('<')>-1)||(strValue.indexOf('>')>-1))
        return false;
    else
        return true;
}

function validateAddress( strValue,objLabelErrorMessage ) 
{
    /************************************************
    DESCRIPTION: Validates that a string contains valid
    address.
    
    PARAMETERS:
    strValue - String to be tested for validity

    RETURNS:
    True if valid, otherwise false.
    
    History:
        Author: Surya
        Date:02-07-2008
    *************************************************/
    var objRegExp  = /[^#@!$&*()_+^=~']+$/i;

    //check for valid address
    var isValid = objRegExp.test(strValue);
    
    if(!isValid)
    {
       objLabelErrorMessage.innerHTML="Please! Enter the valid address.";
    }
   
    return isValid;
    
}

