var strDigits = "0123456789";
var strLowercaseLetters = "abcdefghijklmnopqrstuvwxyz";
var strUppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var strWhitespace = " \t\n\r";
var strDecimalPointDelimiter = "."
var strPhoneNumberDelimiters = "()- ";
var strValidPhoneChars = strDigits + strPhoneNumberDelimiters;
var strSSNDelimiters = "- ";
var strValidSSNChars = strDigits + strSSNDelimiters;
var intDigitsInSocialSecurityNumber = 9;
var intDigitsInPhoneNumber = 10;
var strZIPCodeDelimiters = "-";
var strValidZIPCodeChars = strDigits + strZIPCodeDelimiters;
var intDigitsInZIPCode1 = 5;
var intDigitsInZIPCode2 = 9;
var strCreditCardDelimiters = "- ";
var STATE_CODE_DELIMETER = "|";
var STATE_CODES = "AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY|AE|AA|AE|AE|AP";
var bolDefaultEmptyOK = false;
var aintDaysInMonth = Array(12);
aintDaysInMonth[1] = 31;
aintDaysInMonth[2] = 29;
aintDaysInMonth[3] = 31;
aintDaysInMonth[4] = 30;
aintDaysInMonth[5] = 31;
aintDaysInMonth[6] = 30;
aintDaysInMonth[7] = 31;
aintDaysInMonth[8] = 31;
aintDaysInMonth[9] = 30;
aintDaysInMonth[10] = 31;
aintDaysInMonth[11] = 30;
aintDaysInMonth[12] = 31;

function isEmpty(strInput)
{
	return ((strInput == null) || (strInput.length == 0))
}

function isWhitespace (strInput)
{
	var intI;
	if (isEmpty(strInput)) return true;
	for (intI = 0; intI < strInput.length; intI++)
	{   
		var strChar = strInput.charAt(intI);
		if (strWhitespace.indexOf(strChar) == -1) return false;
	}
	return true;
}

function stripCharsInBag (strInput, strBag)
{
	var intI;
	var strReturnString = "";
	for (intI = 0; intI < strInput.length; intI++)
	{   
		var strChar = strInput.charAt(intI);
		if (strBag.indexOf(strChar) == -1) strReturnString += strChar;
	}
	return strReturnString;
}

function stripCharsNotInBag (strInput, strBag)
{
	var intI;
	var strReturnString = "";
	for (intI = 0; intI < strInput.length; intI++)
	{   
		var strChar = strInput.charAt(intI);
		if (strBag.indexOf(strChar) != -1) strReturnString += strChar;
	}
	return strReturnString;
}

function stripWhitespace (strInput)
{
	return stripCharsInBag (strInput, strWhitespace)
}

function charInString (strChar, strInput)
{
	var intI;
	for (intI = 0; intI < strInput.length; intI++)
	{
		if (strInput.charAt(intI) == strChar) return true;
	}
	return false;
}

function stripInitialWhitespace (strInput)
{
	var intI = 0;
	while ((intI < strInput.length) && charInString (strInput.charAt(intI), strWhitespace))
	intI++;
	return strInput.substring (intI, strInput.length);
}

function isLetter (strChar)
{
	return ( ((strChar >= "a") && (strChar <= "z")) || ((strChar >= "A") && (strChar <= "Z")) )
}

function isDigit (strChar)
{
	return ((strChar >= "0") && (strChar <= "9") || (strChar==","))
}

function isInteger (strInput)
{
	var intI;
	if (isEmpty(strInput)) 
		if (isInteger.arguments.length == 1) return bolDefaultEmptyOK;
		else return (isInteger.arguments[1] == true);
	for (intI = 0; intI < strInput.length; intI++)
	{   
		var strChar = strInput.charAt(intI);
		if (!isDigit(strChar)) return false;
	}
	return true;
}

function isSignedInteger (strInput)
{
	if (isEmpty(strInput)) 
		if (isSignedInteger.arguments.length == 1) return bolDefaultEmptyOK;
		else return (isSignedInteger.arguments[1] == true);
	else
	{
	var intStartPos = 0;
	var bolSecondArg = bolDefaultEmptyOK;
	if (isSignedInteger.arguments.length > 1)
		bolSecondArg = isSignedInteger.arguments[1];
	if ( (strInput.charAt(0) == "-") || (strInput.charAt(0) == "+") )
		intStartPos = 1;    
		return (isInteger(strInput.substring(intStartPos, strInput.length), bolSecondArg))
	}
}

function isPositiveInteger (strInput)
{
	var bolSecondArg = bolDefaultEmptyOK;
	if (isPositiveInteger.arguments.length > 1)
	bolSecondArg = isPositiveInteger.arguments[1];
	return (isSignedInteger(strInput, bolSecondArg)
		&& ( (isEmpty(strInput) && bolSecondArg)  || (parseInt (strInput, 10) > 0) ) );
}

function isNonnegativeInteger (strInput)
{
	var bolSecondArg = bolDefaultEmptyOK;
	if (isNonnegativeInteger.arguments.length > 1)
		bolSecondArg = isNonnegativeInteger.arguments[1];
	return (isSignedInteger(strInput, bolSecondArg)
		&& ( (isEmpty(strInput) && bolSecondArg)  || (parseInt (strInput, 10) >= 0) ) );
}

function isNegativeInteger (strInput)
{
	var bolSecondArg = bolDefaultEmptyOK;
	if (isNegativeInteger.arguments.length > 1)
		bolSecondArg = isNegativeInteger.arguments[1];
	return (isSignedInteger(strInput, bolSecondArg)
		&& ( (isEmpty(strInput) && bolSecondArg)  || (parseInt (strInput, 10) < 0) ) );
}

function isNonpositiveInteger (strInput)
{
	var bolSecondArg = bolDefaultEmptyOK;
	if (isNonpositiveInteger.arguments.length > 1)
		bolSecondArg = isNonpositiveInteger.arguments[1];
	return (isSignedInteger(strInput, bolSecondArg)
		&& ( (isEmpty(strInput) && bolSecondArg)  || (parseInt (strInput, 10) <= 0) ) );
}

function isFloat (strInput)
{
	var intI;
	var bolSeenDecimalPoint = false;
	if (isEmpty(strInput)) 
	if (isFloat.arguments.length == 1) return bolDefaultEmptyOK;
		else return (isFloat.arguments[1] == true);
	if (strInput == strDecimalPointDelimiter) return false;
	for (intI = 0; intI < strInput.length; intI++)
	{   
		var strChar = strInput.charAt(intI);
		if ((strChar == strDecimalPointDelimiter) && !bolSeenDecimalPoint) bolSeenDecimalPoint = true;
		else if (!isDigit(strChar)) return false;
	}
	return true;
}

function isSignedFloat (strInput)
{
	if (isEmpty(strInput)) 
		if (isSignedFloat.arguments.length == 1) return bolDefaultEmptyOK;
		else return (isSignedFloat.arguments[1] == true);
	else {
		var intStartPos = 0;
		var bolSecondArg = bolDefaultEmptyOK;
		if (isSignedFloat.arguments.length > 1)
			bolSecondArg = isSignedFloat.arguments[1];
		if ( (strInput.charAt(0) == "-") || (strInput.charAt(0) == "+") )
			intStartPos = 1;    
		return (isFloat(strInput.substring(intStartPos, strInput.length), bolSecondArg))
	}
}

function stripCurrencySymbol(strValue)
{
	return(strValue.replace(/\s|[$]/g, "")); // get rid of all white spaces and dollar signs
}

function stripPercentageSymbol(strValue)
{
	return(strValue.replace(/\s|[%]/g, "")); // get rid of all white spaces and percentage signs
}

function isMoney(strValue)
{
	strValue = stripCurrencySymbol(strValue); 
	if(isSignedFloat(strValue)) return(true); else return(false);
}

function isPercentage(strValue)
{
    strValue = stripPercentageSymbol(strValue); 
	if(isSignedFloat(strValue)) return(true); else return(false);
}

function isAlphabetic (strInput)
{
	var intI;
	if (isEmpty(strInput)) 
		if (isAlphabetic.arguments.length == 1) return bolDefaultEmptyOK;
	else return (isAlphabetic.arguments[1] == true);
	for (intI = 0; intI < strInput.length; intI++)
	{   
		var strChar = strInput.charAt(intI);
		if (!isLetter(strChar))
		return false;
	}
	return true;
}

function isAlphanumeric (strInput)
{
	var intI;
	if (isEmpty(strInput)) 
		if (isAlphanumeric.arguments.length == 1) return bolDefaultEmptyOK;
		else return (isAlphanumeric.arguments[1] == true);
	for (intI = 0; intI < strInput.length; intI++)
	{   
		var strChar = strInput.charAt(intI);
		if (! (isLetter(strChar) || isDigit(strChar) ) )
		return false;
	}
	return true;
}

function reformat (strInput)
{
	var strArg;
	var intPos = 0;
	var strResultString = "";
	for (var intI = 1; intI < reformat.arguments.length; intI++) {
		strArg = reformat.arguments[intI];
		if (intI % 2 == 1) strResultString += strArg;
		else {
			strResultString += strInput.substring(intPos, intPos + strArg);
			intPos += strArg;
		}
	}
	return strResultString;
}

function isSSN (strInput)
{
	if (isEmpty(strInput)) 
		if (isSSN.arguments.length == 1) return bolDefaultEmptyOK;
		else return (isSSN.arguments[1] == true);
	return (isInteger(strInput) && strInput.length == intDigitsInSocialSecurityNumber)
}

function isPhoneNumber (strInput)
{
	if (isEmpty(strInput)) 
		if (isPhoneNumber.arguments.length == 1) return bolDefaultEmptyOK;
		else return (isPhoneNumber.arguments[1] == true);
	return (isInteger(strInput) && strInput.length == intDigitsInPhoneNumber)
}

function isInternationalPhoneNumber (strInput)
{
	if (isEmpty(strInput)) 
		if (isInternationalPhoneNumber.arguments.length == 1) return bolDefaultEmptyOK;
		else return (isInternationalPhoneNumber.arguments[1] == true);
	return (isPositiveInteger(strInput))
}

function isZipCode (strInput)
{
	if (isEmpty(strInput)) 
		if (isZipCode.arguments.length == 1) return bolDefaultEmptyOK;
		else return (isZipCode.arguments[1] == true);
	return (isInteger(strInput) && 
		((strInput.length == intDigitsInZIPCode1) ||
		(strInput.length == intDigitsInZIPCode2)))
}

function isStateCode(strInput)
{
	if (isEmpty(strInput)) 
		if (isStateCode.arguments.length == 1) return bolDefaultEmptyOK;
		else return (isStateCode.arguments[1] == true);
	return ((STATE_CODES.indexOf(strInput) != -1) &&
	(strInput.indexOf(STATE_CODE_DELIMETER) == -1) )
}

function isEmail (strInput)
{
	if (isEmpty(strInput)) 
		if (isEmail.arguments.length == 1) return bolDefaultEmptyOK;
		else return (isEmail.arguments[1] == true);
	if (isWhitespace(strInput)) return false;
	var intI = 1;
	var intLength = strInput.length;
	while ((intI < intLength) && (strInput.charAt(intI) != "@"))
	{
		intI++
	}
	if ((intI >= intLength) || (strInput.charAt(intI) != "@")) return false;
	else intI += 2;
	while ((intI < intLength) && (strInput.charAt(intI) != "."))
	{
		intI++
	}
	if ((intI >= intLength - 1) || (strInput.charAt(intI) != ".")) return false;
	else return true;
}

function isYear (strInput)
{
	if (isEmpty(strInput)) 
		if (isYear.arguments.length == 1) return bolDefaultEmptyOK;
		else return (isYear.arguments[1] == true);
	if (!isNonnegativeInteger(strInput)) return false;
	return ((strInput.length == 2) || (strInput.length == 4));
}

function isIntegerInRange (strInput, intLower, intUpper)
{
	if (isEmpty(strInput))
	{ 
		if (isIntegerInRange.arguments.length == 1) return bolDefaultEmptyOK;
		else return (isIntegerInRange.arguments[1] == true);
	}
	if (!isInteger(strInput, false)) return false;
	var intNum = parseInt (strInput, 10);
	return ((intNum >= intLower) && (intNum <= intUpper));
}

function isMonth (strInput)
{
	if (isEmpty(strInput))
	{
		if (isMonth.arguments.length == 1) return bolDefaultEmptyOK;
		else return (isMonth.arguments[1] == true);
	}
	return isIntegerInRange (strInput, 1, 12);
}

function isDay (strInput)
{
	if (isEmpty(strInput)) 
	{
		if (isDay.arguments.length == 1) return bolDefaultEmptyOK;
		else return (isDay.arguments[1] == true);   
	}
	return isIntegerInRange (strInput, 1, 31);
}

function daysInFebruary (intYear)
{
	return (  ((intYear % 4 == 0) && ( (!(intYear % 100 == 0)) || (intYear % 400 == 0) ) ) ? 29 : 28 );
}

function isDate (intYear, intMonth, intDay)
{
	if (! (isYear(intYear, false) && isMonth(intMonth, false) && isDay(intDay, false))) return false;
	intYear = parseInt(intYear, 10);
	intMonth = parseInt(intMonth, 10);
	intDay = parseInt(intDay, 10);
	if (intDay > aintDaysInMonth[intMonth]) return false; 
	if ((intMonth == 2) && (intDay > daysInFebruary(intYear))) return false;
	return true;
}

function isCreditCard(strCardNumber) {
	// Encoding only works on cards with less than 19 digits
	if (strCardNumber.length > 19)
		return (false);
	var intSum = 0;
	var intMul = 1;
	var intLength = strCardNumber.length;
	var strDigit; 
	for (intI = 0; intI < intLength; intI++)
	{
		strDigit = strCardNumber.substring(intLength-intI-1,intLength-intI);
		intProduct = parseInt(strDigit, 10) * intMul;
		if (intProduct >= 10)
			intSum += (intProduct % 10) + 1;
		else
			intSum += intProduct;
		if (intMul == 1)
			intMul++;
		else
			intMul--;
	}
	if ((intSum % 10) == 0)
		return (true);
	else
	return (false);
}

