/************************************************
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 " email address seems incorrect (check @ AND .'s)"
		}
		var user = matchArray[1]
		var domain = matchArray[2]
		if (user.match(userPat) == null) {
			return " 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 " 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 " email address must end in a three-letter domain, or two letter country."
		}
		if (len<2) {
			return " email address is missing a hostname."
		}
	}
	return ""
}

/************************************************
DESCRIPTION: Phone Number Checking Function.
EXPECTS: A Valid String
RETURNS: TRUE if validation passes, FALSE if validation fails.
************************************************/
function checkPhone(PhoneStr) {
	//This needs Cleanup
	var PhonePat = /^(((\d)-)?(\((\d{3})\)-?|(\d{3})-))?(\d{3})-(\d{4})$/
	var PhoneMatchArray = PhoneStr.match(PhonePat)
	if (PhoneMatchArray == null) {
		PhonePat = /^(\d{10})$/
		PhoneMatchArray = PhoneStr.match(PhonePat)
		if (PhoneMatchArray == null) {
			return false;
		}
	} 
	return true;
}

/************************************************
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;
}

/************************************************
DESCRIPTION: Opens Popup window.
TO USE: <a href="javascript:;" onClick="javascript:popup('name', '#link', 0, 0, 300, 150, 0, 0, 1, 1, 1); return false;"></a>
RETURNS: TRUE/FALSE
************************************************/
function popup(name, url, left, top, width, height, toolbar, menubar, statusbar, scrollbar, resizable){
	var wint = (screen.height - height) / 2;
	var winl = (screen.width - width) / 2;
	toolbar_str = toolbar ? 'yes' : 'no';
	menubar_str = menubar ? 'yes' : 'no';
	statusbar_str = statusbar ? 'yes' : 'no';
	scrollbar_str = scrollbar ? 'yes' : 'no';
	resizable_str = resizable ? 'yes' : 'no';
	window.open(url, name, 'left='+winl+',top='+wint+',width='+width+',height='+height+',toolbar='+toolbar_str+',menubar='+menubar_str+',status='+statusbar_str+',scrollbars='+scrollbar_str+',resizable='+resizable_str);
}

function openNew(url, winname) {
	var win = window.open(url, winname,"menubar=yes,location=yes,resizable=yes,scrollbars=yes,status=yes,height=300,width=650");
}

function Get_Elem(sName) {
	if (document.all) {
		var oOBJ = document.all[sName];
	} else {
		var oOBJ = document.getElementById(sName);
	}
	return oOBJ;
}
