/*****************************************************************************************************************************************/
/*****************************************************************************************************************************************/
/*****************************************       HELPER FUNCTIONS      *******************************************************************/
/*****************************************************************************************************************************************/
/*****************************************************************************************************************************************/

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,'');
}


/*****************************************************************************************************************************************/
/*****************************************************************************************************************************************/
/*****************************************       CHECK FUNCTIONS      *******************************************************************/
/*****************************************************************************************************************************************/
/*****************************************************************************************************************************************/

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 isEmpty( strValue ) {
	/************************************************
	DESCRIPTION: Determines if a string is empty or not

	PARAMETERS:
	strValue - String to be tested

	RETURNS:
	True if empty string, otherwise false.
	*************************************************/
	var strTemp = strValue;
	strTemp = trimAll(strTemp);
	if(strTemp.length > 0) {
		return false;
	}
	return true;
}

function isUSDate( 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{2}(\-|\/|\.)\d{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 && intYear >= 1900) 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 && intYear >= 1900) return true; //Feb. had valid number of days
	}
	return false; //any other values, bad date
}

function isTime ( 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  isNumeric( 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 isInteger( 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 isPositiveNumeric( intValue ) {
	/************************************************
	DESCRIPTION: Validates that a number is always positive
	    
	PARAMETERS:
	strValue - Number to be tested for validity
	   
	RETURNS:
	True if valid, otherwise false.
	******************************************************************************/
	return (parseFloat(intValue) > 0);
}

function isGreaterEqualZero(p_Value) {
	/************************************************
	DESCRIPTION: Validates that a number is equal to or greater than 0
	    
	PARAMETERS:
	strValue - Number to be tested for validity
	   
	RETURNS:
	True if valid, otherwise false.
	******************************************************************************/
	return (parseFloat(p_Value) >= 0);
}

function isAllAlpha( strValue ) {
	/************************************************
	DESCRIPTION: Validates that a string contains only 
	valid alpha characters.

	PARAMETERS:
	strValue - String to be tested for validity

	RETURNS:
	True if valid, otherwise false.
	******************************************************************************/
	var objRegExp  = /(^[a-zA-Z\ ]*$)/;

	//check for integer characters
	return objRegExp.test(strValue);
}

function isAllAlphaNumeric( strValue ) {
	/************************************************
	DESCRIPTION: Validates that a string contains only 
	valid alpha numeric characters.

	PARAMETERS:
	strValue - String to be tested for validity

	RETURNS:
	True if valid, otherwise false.
	******************************************************************************/
	var objRegExp  = /(^[\w\ ]*$)/;

	//check for integer characters
	return objRegExp.test(strValue);
}

function isEmail(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;
	//check for valid email
	return objRegExp.test(strValue);
}

function isUrl(strValue) {
	/************************************************
	DESCRIPTION: Validates that a string contains a 
	valid web address url pattern. 

	PARAMETERS:
	strValue - String to be tested for validity

	RETURNS:
	True if valid, otherwise false.

	REMARKS: Just checks to see if the address starts
	with 'http://' or 'https://'

	*************************************************/
	var objRegExp  = /\bhttp[s]?:\/\/.*/i;
	//check for valid url
	return objRegExp.test(strValue);
}

function isUSPhone( strValue ) {
	/************************************************
	DESCRIPTION: Validates that a string contains valid
	US phone pattern. 

	This example below is for the RegExp commented out
	Ex. 999-999-9999

	The one used will only allow
	xxx-xxxx format

	PARAMETERS:
	strValue - String to be tested for validity

	RETURNS:
	True if valid, otherwise false.
	*************************************************/
	var objRegExp  = /^\d{3}\-\d{3}\-\d{4}$/;

	//check for valid us phone with or without space between 
	//area code
	if (strValue == "000-000-0000") return false
	else return objRegExp.test(strValue); 
}

function isSSN( 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 isUSZip( 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
	if (strValue == "00000" || strValue == "00000-0000" || strValue == "000000000")
		return false
	else
		return objRegExp.test(strValue);
}