/***************************************************************************************************************************
	Notes
***************************************************************************************************************************/
/*
	BOI = beginning of input
	EOI = end of input
	... = followed by (in reference to regular expression patterns

	The source for the all of the regular expression patterns except for the email expression are at...

		http://developer.netscape.com/docs/examples/javascript/regexp/overview.html

	The source for the email expression is at...

		http://www.xs4all.nl/~ppk/js/mailcheck.html
*/


/***************************************************************************************************************************
	Functions
***************************************************************************************************************************/
function isAlphabetic(p_value) {
	// BOI... one or more lower or uppercase English letters... EOI
	var pattern = /^[a-zA-Z]+$/;

	return pattern.test(p_value);
}

function isAlphanumeric(p_value) {
	// BOI... one or more lower or uppercase English letters or digits... EOI
	var pattern = /^[a-zA-Z0-9]+$/;

	return pattern.test(p_value);
}

function isDigit(p_value) {
	// BOI... one digit... EOI.
	var pattern = /^\d/;

	return pattern.test(p_value);
}

function isEmailAddress(p_value) {
	var pattern = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;

	return pattern.test(p_value);
}

function isFloat(p_value) {
	// one of these two patterns:
	// (a) BOI... one or more digits... zero or more digits... EOI
	// (b) BOI... zero or more digits... one or more digits... EOI
	var pattern = /^((\d+(\.\d*)?)|((\d*\.)?\d+))$/;

	return pattern.test(p_value);
}

function isInteger(p_value) {
	// BOI... one or more digits... EOI
	var pattern = /^\d+$/;

	return pattern.test(p_value);
}

function isIntegerInRange(p_value, p_lower, p_upper) {
	if (isInteger(p_value))
		if (p_value >= p_lower && p_value <= p_upper)
			return true;

	return false;
}

function isLetter(p_value) {
	// BOI... one lower or uppercase English letter... EOI
	var pattern = /^[a-zA-Z]$/;

	return pattern.test(p_value);
}

function isLetterOrDigit(p_value) {
	// BOI... one lower or uppercase English letter or digit... EOI
	var pattern = /^([a-zA-Z]|\d)$/;

	return pattern.test(p_value);
}

function isNegativeInteger(p_value) {
	return (isSignedInteger(p_value) && parseInt(p_value) < 0);
}

function isNonNegativeInteger(p_value) {
	return (isSignedInteger(p_value, secondArg) && parseInt(p_value) >= 0);
}

function isNonPositiveInteger(p_value) {
	return (isSignedInteger(p_value, secondArg) && parseInt(p_value) <= 0);
}

function isNumber(p_value) {
	return (!isNaN(p_value));
}

function isObject(p_object) {
	return (typeof(p_object).toLowerCase() == "object");
}

function isPositiveInteger(p_value) {
	return (isSignedInteger(p_value, secondArg) && parseInt(p_value) > 0);
}

function isSignedFloat(p_value) {
	// one of these two patterns:
	// (a) BOI... an optional + or -... one or more digits... zero or more digits... EOI
	// (b) BOI... an optional + or -... zero or more digits... one or more digits... EOI
	var pattern = /^(((\+|-)?\d+(\.\d*)?)|((\+|-)?(\d*\.)?\d+))$/;

	return pattern.test(p_value);
}

function isSignedInteger(p_value) {
	// BOI... an optional + or -... one or more digits... EOI.
	var pattern = /^(\+|-)?\d+$/;

	return pattern.test(p_value);
}

function isString(p_value) {
	return (typeof(p_value).toLowerCase() == "string");
}

function isWhitespace(p_value) {
	// BOI... one or more whitespace characters... EOI
	var pattern = /^\s+$/;

	return pattern.test(p_value);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////
// STRING MANIPULATION FUNCTIONS
//////////////////////////////////////////////////////////////////////////////////////////////////////

function rtrim(p_value) 
{
	return p_value.replace(/(\s+)$/, "");
}
function ltrim(p_value) 
{
	return p_value.replace(/^(\s+)/, "")
}
function trim(p_value) 
{
	return rtrim(ltrim(p_value));
}
function textLimitTrimmer(field, maxlimit) 
{
	if (field.value.length > maxlimit)
		field.value = field.value.substring(0, maxlimit);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////
// DATE VALIDATION FUNCTIONS
//////////////////////////////////////////////////////////////////////////////////////////////////////
var dtCh= "/";
var minYear=1900;
var maxYear=2100;

function isValidDate(dtStr)
{
	if (trim(dtStr).length==0) return false;
	
	var daysInMonth = DaysArray(12)
	var pos1=dtStr.indexOf(dtCh)
	var pos2=dtStr.indexOf(dtCh,pos1+1)
	var strMonth=dtStr.substring(0,pos1)
	var strDay=dtStr.substring(pos1+1,pos2)
	var strYear=dtStr.substring(pos2+1)
	strYr=strYear
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
	}
	month=parseInt(strMonth)
	day=parseInt(strDay)
	year=parseInt(strYr)
	
	if (pos1==-1 || pos2==-1){
		alert("The date format should be : mm/dd/yyyy")
		return false
	}
	if (strMonth.length<1 || month<1 || month>12){
		alert("Please enter a valid month")
		return false
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		alert("Please enter a valid day")
		return false
	}
	if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
		alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear)
		return false
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		alert("Please enter a valid date")
		return false
	}
	return true
}

function isInteger(s)
{
	var i;
    for (i = 0; i < s.length; i++){   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function stripCharsInBag(s, bag)
{
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}

function DaysArray(n) 
{
	for (var i = 1; i <= n; i++) {
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// END DATE VALIDATION FUNCTIONS
//////////////////////////////////////////////////////////////////////////////////////////////////////