/*
  VALIDATION FUNCTIONS:
  
  validateEmail.....checks format of email address
  validateNumeric...checks for valid numeric value
  validateInteger...checks for valid integer value
  validateNotEmpty..checks for blank form field
  validateSADate....checks for valid date in SA 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) {
/*==============================================================
 This function checks for a valid email pattern. 
  
 Input:  strValue - (String)  
 Output: a Boolean value indicating the functions success
   
 
 ==============================================================*/
 	if (strValue.search(/^\w+((-\w+)|(\.\w+))*\@\w+((\.|-)\w+)*\.\w+$/) != -1)
        return true;
    else
        return false;
}

function  validateNumeric( strValue ) {
/*==============================================================
 This function checks that a strings contains only numbers. 
  
 Input:  strValue
 Output: a Boolean value indicating the functions success
 ==============================================================*/

 var objRegExp  =  /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/; 
 return objRegExp.test(strValue);
}

function validateInteger( strValue ) {
/*==============================================================
 This function checks that a strings contains a valid integer. 
  
 Input:  strValue
 Output: a Boolean value indicating the functions success
 ==============================================================*/
  
  var objRegExp  = /(^-?\d\d*$)/;
  return objRegExp.test(strValue);
}

function validateNotEmpty( strValue ) {
/*==============================================================
 Validates that a string is not all blank (whitespace) characters. 
  
 Input:  strValue
 Output: a Boolean value indicating the functions success
 ==============================================================*/
   
   var strTemp = strValue;
   strTemp = trimAll(strTemp);
   if(strTemp.length > 0){
     return true;
   }  
   return false;
}

function validateSADate( 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. dd/mm/yyyy or dd-mm-yyyy or dd.mm.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 = "/" //find date separator
    var arrayDate = strValue.split("/"); //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 = arrayDate[0]; 
	if ((arrayDate[1] > 12) || (arrayDate[1] < 1)) {     	
	 return false; //month out of range
    } 
	
	//check if month value and day value agree
    if(arrayLookup[arrayDate[1]] != null) {
      if(intDay <= arrayLookup[arrayDate[1]] && intDay != 0)        		
		return true; //found in lookup table, good date
    }
    
    //check for February
    var intYear = parseInt(arrayDate[2]);
    var intMonth = parseInt(arrayDate[1]);
    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, MinLength ) {
/************************************************
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.
   MinLength - strValue must contain MinLength or > characters
      
RETURNS:
   True if valid, otherwise false.
*************************************************/
 var strMatchPattern = '^[a-zA-Z0-9()\f\n\r\t\v()\'--,.+?!:@#$%^&*//<> ]+$';
 var objRegExp = new RegExp( strMatchPattern);
 
 if(trimAll(strValue).length<MinLength){return false}; 
	
 if(strValue.length>0) {
 	if(!objRegExp.test(strValue)){return false}; }

 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,'') + ')';
      }
      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 validateTels(TelNo) {
/**********************************************
 This function validates a supplied Telphone
 number for known chrs ie 0-9 and ()-+ and space
***********************************************/
	var boxLength=TelNo.length 
	var SpecChar="-()+ "
	var VerifyChar
	if(boxLength==0) {return false };
	for(var i=0; i!=boxLength; i++) {
		aChar=TelNo.substring(i,i+1) 
		VerifyChar=SpecChar.indexOf(aChar) 
		if(VerifyChar==-1 && aChar < "0" || aChar > "9") {
			return false }
	}
	return true
}


 
