/************************************************
DESCRIPTION: Removes leading and trailing spaces.
************************************************/
function Trim(sValue) {
	var objRegExp = /^(\s*)$/;
	if(objRegExp.test(sValue)) {
		sValue = sValue.replace(objRegExp, '');
		if(sValue.length == 0) {
			return sValue;
		}
	}
	objRegExp = /^(\s*)([\W\w]*)(\b\s*$)/;
	if(objRegExp.test(sValue)) {
		sValue = sValue.replace(objRegExp, '$2');
	}
	return sValue;
}

/************************************************
DESCRIPTION: Validates that a string contains only valid integer number.
*************************************************/
function validateInteger(strValue) {
	var objRegExp  = /(^-?\d\d*$)/;
	return objRegExp.test(strValue);
}

/************************************************
DESCRIPTION: Validates that a string contains only Positive integers.
*************************************************/
function validatePosInteger(strValue) {
	var objRegExp  = /(^\d*$)/;
	return objRegExp.test(strValue);
}

/************************************************
DESCRIPTION: Email Address Checking Function.
	Applies all ANSI and ASCII standards for Email validity.
EXPECTS: A Valid String
RETURNS: Message containg the problem or empty string if all is OK.
************************************************/
function checkEmail(sEmail) {
	if (sEmail != "" ) {
		var validChars = "\[^\\s\\(\\)<>@,;:\\\\\\\"\\.\\[\\]\]+"
		var quotedUser = "(\"[^\"]*\")"
		var atom = validChars
		var word = "(" + atom + "|" + quotedUser + ")"
		var userPat = new RegExp("^" + word + "(\\." + word + ")*$")
		var domainPat = new RegExp("^" + atom + "(\\." + atom +")*$")
		var emailPat = /^(.+)@(.+)$/
		var matchArray = sEmail.match(emailPat)
		if (matchArray == null) {
			return "Your Email Address seems incorrect (check @ AND .'s)"
		}
		var user = matchArray[1]
		var domain = matchArray[2]
		if (user.match(userPat) == null) {
			return "Your Email Address doesn't seem to be valid."
		}
		var ipDomainPat = /^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
		var IPArray = domain.match(ipDomainPat)
		if (IPArray != null) {
			for (var i=1;i<=4;i++) {
				if (IPArray[i] > 255) {
					return "Destination IP address is invalid."
				}
			}
			return ""
		}
		var domainArray = domain.match(domainPat)
		if (domainArray == null) {
			 return "The domain name doesn't seem to be valid."
		}
		var atomPat = new RegExp(atom,"g")
		var domArr = domain.match(atomPat)
		var len = domArr.length
		if (domArr[domArr.length-1].length<2 || domArr[domArr.length-1].length>3) {
			return "The address must end in a three-letter domain, or two letter country."
		}
		if (len<2) {
			return "This address is missing a hostname."
		}
	}
	return ""
}

/************************************************
DESCRIPTION: Phone Number Checking Function.
EXPECTS: A Valid String
RETURNS: Message containg the problem or empty string if all is OK.
************************************************/
function checkPhone( PhoneStr ) {
	var PhonePat = /^(((\d)-)?(\((\d{3})\)-?|(\d{3})-))?(\d{3})-(\d{4})$/
	var PhoneMatchArray = PhoneStr.match(PhonePat)
	if (PhoneMatchArray == null) {
		return " number should be in N-(NNN)-NNN-NNNN format."
	} 
	return ""
}

/************************************************
DESCRIPTION: Zip Code Checking Function.
EXPECTS: A Valid String
RETURNS: Message containg the problem or empty string if all is OK.
************************************************/
function checkZip ( ZipStr ) {
	var ZipPat = /^(\d{5})(-(\d{4}))?$/
	var ZipMatchArray = ZipStr.match(ZipPat)
	if (ZipMatchArray == null) {
		return " should be in NNNNN-NNNN format."
	} 
	return ""
}

/************************************************
DESCRIPTION: Date Checking Function.
EXPECTS: A Valid String
RETURNS: Message containg the problem or empty string if all is OK.
************************************************/
	function checkDate (DateStr) {
		var DatePat = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/
		var DateMatchArray = DateStr.match(DatePat)
		if (DateMatchArray == null) {
			return " must be in MM/DD/YYYY format."
		}
		var Month = RegExp.$1
		var Day = RegExp.$2
		var Year = RegExp.$3
		var Months = new Array()
		Months[Months.length] = "January"
		Months[Months.length] = "February"
		Months[Months.length] = "March"
		Months[Months.length] = "April"
		Months[Months.length] = "May"
		Months[Months.length] = "June"
		Months[Months.length] = "July"
		Months[Months.length] = "August"
		Months[Months.length] = "September"
		Months[Months.length] = "October"
		Months[Months.length] = "November"
		Months[Months.length] = "December"
		var Thirty1DayMthPat = /1|3|5|7|8|10|12/
		var MthMatchArray = Month.match(Thirty1DayMthPat)
		if (MthMatchArray != null) {
			if ( Day < 1 || Day > 31 ) {
				return " is not valid. (" + Day + " days)"
			}
		}
		var ThirtyDayMthPat = /4|6|11|9/
		MthMatchArray = Month.match(ThirtyDayMthPat)
		if (MthMatchArray != null) {
			if ( Day < 1 || Day > 30 ) {
				return " is not valid. (" + Day + " days)"
			}
		}
		if (Month == 2) {
			var DaysInFeb = 28
			var factor = Year/4
			if (factor.toFixed(0)==factor){
				factor = Year/100
				if (factor.toFixed(0)==factor){
					factor = Year/400
					if (factor.toFixed(0)==factor){
						DaysInFeb = 29
					} else {
						DaysInFeb = 28
					}
				} else {
				DaysInFeb = 29
				}
			}
			if ( Day < 1 || Day > DaysInFeb ) {
				return " is not valid. (" + Day + " days)"
			}
		}
		if (Month > 12) {
			return " month is not valid."
		}
		return ""
	}
/************************************************
DESCRIPTION: Credit Card Validation Function.
EXPECTS: A Valid String - Containing only numerics AND Type of Credit Card
RETURNS: TRUE/FALSE
************************************************/
function validateCC(cardNum, cardType) {
    var regex = /^/;
    var ccn = "";
    var nums = "0123456789";
    var checksum = 0;
    
    if (cardType == "" || cardNum == "") {
		return false;
	}
    for(var i=0;i<cardNum.length;i++) {
        if (nums.indexOf(cardNum.substring(i,i+1)) != -1) {
			ccn += cardNum.substring(i,i+1);
		}
    }
    //Card Type Check
    //ONLY first 4 Card Types have been verified as Correct
    if (cardType == "Amex") {
		regex = /^3[4,7]\d{13}$/;
	} else if (cardType == "Discover") {
		regex = /^6011\d{12}$/;
	} else if (cardType == "Mastercard") {
		regex = /^5[1-5]\d{14}$/;
	} else if (cardType == "VISA") {
		regex = /^4(\d{12}|\d{15})$/;
	} else if (cardType == "Card Blanche") {
		regex = /^389\d{11}$/;
	} else if (cardType == "Diners") {
		regex = /(^38[0-8]\d{11})|(^3[0,6]\d{12})$/;
	} else if (cardType == "JCB") {
		regex = /^3((5[3-8][0-9][0-9][0-9])|(33[7-9][0-9][0-9])|(34[0-9][0-9][0-9])|(528[0-9][0-9])|(15[8,9][0-9][0-9])|(11[2-9][0-9][0-9])|(120[0-9][0-9])|(10[0-2][0-9][0-9])|(09[6-9][0-9][0-9])|(09[0-4][0-9][0-9])|(08[8-9][0-9][0-9]))\d{10}$/;
	} else {
		return false;
	}
	if (!regex.test(cardNum)) {
		return false;
	}
	//Modulus 10 Check
    for (var i=(2-(ccn.length % 2)); i<=ccn.length; i+=2) {
		checksum += parseInt(ccn.charAt(i-1));
	}
    for (var i=(ccn.length % 2) + 1; i<ccn.length; i+=2) {
        var digit = parseInt(ccn.charAt(i-1)) * 2;
        checksum += (digit < 10)?digit:(digit-9);
    }
    if ((checksum % 10) != 0) {
		return false;
	}
    return true;
}