﻿// JScript File

/****************************************************************
FILE: RegExpValidate.js

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
    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 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;

  //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) 
    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 (bugfix 20050322)
    //bugfix  for parseInt kevin
    //bugfix  biss year  O.Jp Voutat
    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 isValidURL(url){
    var RegExp = /^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/;
    if(RegExp.test(url)){
        return true;
    }else{
        return false;
    }
} 
    
function js_EmailValidate(emailAdress)
{
    var regInvalid = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/; 
    var regValid = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/;    
    if (regValid.test(emailAdress)&& !regInvalid.test(emailAdress) ) return true;
    return false;
}
function js_ValidationEmailList(txt_s_EmailList)
{	
	var emailList = txt_s_EmailList.value.split(/[,;]/);	
	var invalidEmails="";
	var commas  = "";
	if(emailList.length < 0) return invalidEmails;		
	for(var i=0; i<emailList.length; i++)
	{	    		
		if(js_EmailValidate(emailList[i])==false)
		{
		    if( i>0 && invalidEmails.length > 0) commas = " ,";
		    invalidEmails = invalidEmails + commas + emailList[i];		   
		}
	}	
	return invalidEmails;
}
function PreventScriptInput()
{
    var arrInput = document.getElementsByTagName("input");
    for (var i = 0; i < arrInput.length; i++) {
        if(arrInput[i].type == "text" )
        {
            //arrInput[i].style.backgroundColor = '';                                                                            
        }                      
    }         
    for (var i = 0; i < arrInput.length; i++) {
        if(arrInput[i].type == "text" )
        {
            if(arrInput[i].value.indexOf('<script') > -1 || arrInput[i].value.indexOf('</script>') > -1)                                                   
            {
                alert('Please do not include script tag in your input');
                //arrInput[i].style.backgroundColor = 'yellow';
                try{
                    arrInput[i].focus();
                }
                catch( exc ){
                }
                return false;   
            }                           
        }                      
    }  
    
    
    var arrTextarea = document.getElementsByTagName("textarea");
    for (var i = 0; i < arrTextarea.length; i++) {
        //arrTextarea[i].style.backgroundColor = 'white';                                                                                                  
    }         
    for (var i = 0; i < arrTextarea.length; i++) {
        if(arrTextarea[i].value.indexOf('<script') > -1 || arrTextarea[i].value.indexOf('</script>') > -1)                                                   
        {
            alert('Please do not include script tag in your input');
            //arrTextarea[i].style.backgroundColor = 'yellow';
            
            try{
                arrTextarea[i].focus();
            }
            catch( exc ){
            }
            return false;   
        }                                                
    }  
    
     return true;         
}

function preventScriptForEvent(tagId, eventName){
//    var fnEventHandler = eval('getDocumentObject(tagId).' + eventName);
//    
//    eval('getDocumentObject("'+tagId+'").' + eventName + '=function(){if( PreventScriptInput()){fnEventHandler(e);}}');
}
function preventScriptForClick(clickedTagId){
    var fnOriginClick = getDocumentObject(clickedTagId).onclick;
    getDocumentObject(clickedTagId).onclick = function(e){
        if( PreventScriptInput()){
            fnOriginClick(e);
        }
    }
//      preventScriptForEvent( clickedTagId, 'onclick');
}

function preventScriptForHref(){
    // need the solution if don
}

// don't use for submit button, just intevene to onclick event of tag(id:submitTagId) call form.submit() 
function preventScriptForSubmit(submitTagId){
//    preventScriptForEvent( submitTagId, 'submit');
//    var fnOriginClick = getDocumentObject(submitTagId).submit;
//    getDocumentObject(submitTagId).submit = function(){
//        if( PreventScriptInput()){
//            fnOriginClick();
//        }
//    }
    
}
function checkReplaceScript(id1, id2)
{
   
    if(document.getElementById(id1).value.indexOf('<script') >=0)
    {
        document.getElementById(id1).value = document.getElementById(id1).value.replace('<script>','');
        document.getElementById(id1).value = document.getElementById(id1).value.replace('</script>','');
       
        
        
    }
    var charlist = new Array('%','@','!','#','$','(',')','\'','<','>','\""','_');
    
    for(var i = 0; i < charlist.length; i++)
    {
        while(document.getElementById(id1).value.indexOf(charlist[i]) >=0)
        {
                alert("You can not insert " + charlist[i]);
                document.getElementById(id1).value = document.getElementById(id1).value.replace(charlist[i],'');
         }   
         while(document.getElementById(id2).value.indexOf(charlist[i]) >=0)
        {
                alert("You can not insert " + charlist[i]);
                document.getElementById(id2).value = document.getElementById(id2).value.replace(charlist[i],'');
         }   
         
            
    }
  
    if(document.getElementById(id2).value.indexOf('<script') >=0)
    {
        document.getElementById(id2).value = document.getElementById(id2).value.replace('<script>','');
        document.getElementById(id2).value = document.getElementById(id2).value.replace('</script>','');
       
    }
}
function checkInputString(id1)
{
    
        var charlist = new Array('%','@','!','#','$','(',')','\'','<','>','\""','_');
    
    for(var i = 0; i < charlist.length; i++)
    {
        while(document.getElementById(id1).value.indexOf(charlist[i]) >=0)
        {
                alert("You can not insert " + charlist[i]);
                document.getElementById(id1).value = document.getElementById(id1).value.replace(charlist[i],'');
                }
        
         
            
    }

}
function validateSearchString(str)
{
    
        var charlist = new Array('%','@','!','#','$','(',')','\'','<','>','\""','_');
    
    for(var i = 0; i < charlist.length; i++)
    {
        while(str.indexOf(charlist[i]) >=0)
        {
                alert("You can not insert " + charlist[i]);
                str = str.replace(charlist[i],'');
                }
        
         
            
    }

}
  
