var brk = (navigator.userAgent.indexOf('Win') != -1) ? "\r\n" : "\r";
var crlf = "" + brk;
var crlf2 = "" + brk + brk;
var crlf3 = "" + brk + brk + brk;
var crlf_length = crlf.length;
var tab = "" + "\t";
var tab_length = tab.length;
var today = new Date();
today = today.getMonth() + 1 + "/" + today.getDate() + "/" + today.getYear();

function uncomply(x) {
	x = replace(x,"&lt;BR&gt;",brk);
	x = replace(x,"&lt;br&gt;",brk);
	x = replace(x,"&gt;",">");
	x = replace(x,"&lt;","<");
	x = replace(x,"&#34;","\"");
	x = replace(x,"&#39;","'");
	return x;
}
function trimmer(val) {
	var tmp = val + "";
	tmp = replace(tmp," •",crlf+"•");
	tmp = replace(tmp,tab," ");
	tmp = trim(tmp);
	tmp = replace(tmp,"  "," ");
	tmp = replace(tmp,crlf+" ",crlf);
	tmp = replace(tmp," "+crlf,crlf);
	tmp = replace(tmp,crlf3,crlf2);
 	return tmp;
}
function trimmest(val) {
	var tmp = "" + trimmer(val);
	tmp = replace(tmp,crlf," ");
	return tmp;
}
function trim(val) {
	var tmp = "" + val;
	var str = "";
	while(left(tmp,crlf_length) == crlf || left(tmp,1) == " " || right(tmp,crlf_length) == crlf || right(tmp,1) == " ") {
		if (left(tmp,crlf_length) == crlf) {
			tmp = tmp.substring(tmp.indexOf(crlf)+crlf_length,tmp.length);
		}
		if (left(tmp,1) == " ") {
			tmp = tmp.substring(1,tmp.length);
		}
		if (right(tmp,crlf_length) == crlf) {
			tmp = tmp.substring(0,tmp.length-crlf_length);
		}
		if (right(tmp,1) == " ") {
			tmp = tmp.substring(0,tmp.length-1);
		}
	}
	return tmp;
}
function nospaces(val) {
	var tmp = trimmer(val);
	tmp = replace(tmp,crlf,"");
	tmp = replace(tmp," ","");
	return tmp;
}
function isNumeric(val) {
	var validChars = "0123456789";
	for (var x=0; x<val.length; x++) {
		if (!(validChars.indexOf(val.charAt(x)) != -1)) {
			return false;
			break;
		}
	}
	return true;
}
function isANumeric(val) {
	var validChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	val = val.toUpperCase();
	for (var x=0; x<val.length; x++) {
		if (!(validChars.indexOf(val.charAt(x)) != -1)) {
			return false;
			break;
		}
	}
	return true;
}
function isAlphaNumeric(val) {
	var validChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ";
	val = val + "";
	val = val.toUpperCase();
	for (var x=0; x<val.length; x++) {
		if (!(validChars.indexOf(val.charAt(x)) != -1)) {
			return false;
			break;
		}
	}
	return true;
}
function isNumericAndANumeric(val) {
	var validChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	val = val + "";
	val = val.toUpperCase();
	for (var x=0; x<val.length; x++) {
		if (!(validChars.indexOf(val.charAt(x)) != -1)) {
			return false;
			break;
		}
	}
	return true;
}
function isPassword(val) {
	var validChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ *%$&,.-\;:_@#\/!~?=<>()";
	val = val + "";
	val = val.toUpperCase();
	for (var x=0; x<val.length; x++) {
		if (!(validChars.indexOf(val.charAt(x)) != -1)) {
			return false;
			break;
		}
	}
	return true;
}
function isValidDrivePath(val) {
	val = val + "";
	val = val.toUpperCase();
	if (val.indexOf(":\/") == -1) return false;
	if (!isANumeric(val.substring(0,val.indexOf(":\/")))) return false;
	return true;
}
function isValidChars(val) {
	var validChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ %$&,.-\;:_@#\/!~?=<>\'()\*\^";
	val = val + "";
	val = val.toUpperCase();
	for (var x=0; x<val.length; x++) {
		if (!(validChars.indexOf(val.charAt(x)) != -1)) {
			return false;
			break;
		}
	}
	return true;
}
function both(val) {
	var validChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ +-";
	val = val + "";
	val = val.toUpperCase();
	for (var x=0; x<val.length; x++) {
		if (!(validChars.indexOf(val.charAt(x)) != -1)) {
			return false;
			break;
		}
	}
	return true;
}
function isURL(val) {
	var validChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ _.!~?=&\/-:#";
	val = val + "";
	val = val.toUpperCase();
	for (var x=0; x<val.length; x++) {
		if (!(validChars.indexOf(val.charAt(x)) != -1)) {
			return false;
			break;
		}
	}
	return true;
}
function isHost(val) {
	var validChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_.-";
	val = val + "";
	val = val.toUpperCase();
	for (var x=0;x<val.length;x++) {
		if (!(validChars.indexOf(val.charAt(x)) != -1)) {
			return false;
			break;
		}
	}
	return true;
}
function isDate(date) {
	// requires date in format MM/DD/YYYY
	// returns false for 2-digit years
	var str = date;
	var validChars = "0123456789/";
	if (str.length < 5) return false;
	if (str.indexOf("/") < 1) return false;
	if (str.indexOf("/")+1 == str.lastIndexOf("/")) return false;
	for (var i=0; i<str.length; i++) {
		var ch = str.substring(i,i+1);
		if (!(validChars.indexOf(ch) != -1)) return false;
	}
	i = str.indexOf("/",0);
	var j = str.substring(0,i);
	var mo = parseInt(j,10);
	if (!isNumeric(mo) || mo < 1 || mo > 12) return false;
	j = str.indexOf("/",i+1);
	if (str.indexOf("/",j+1) != -1) return false;
	i = str.substring(i+1,j);
	if (parseInt(i,10) > 31 || parseInt(i,10) < 1) return false;
	if (mo == 4 || mo == 6 || mo == 9 || mo == 11) {
		// 31 is too high for months 4,6,9,11
		if (parseInt(i,10) > 30) return false;
	}
	if (mo == 2) {     
		if (isLeapYear(str)) {
			// 30 is too high for month 2 in leap years
			if (parseInt(i,10) > 29) return false;
		} else if (parseInt(i,10) > 28) {
			// 29 is too high for month 2 in non-leap years
			return false;
		}
	}
	j = str.substring(j+1,str.length);
	if (j.length != 2) return false;
//	if (parseInt(j,10)<1900) return false;
	return true;
}
function isLeapYear(dt) {
	// Assumes valid Date (dt)
    var yyyy = dt.substring(dt.lastIndexOf("/")+1,dt.length);
	return (((yyyy%4==0) && (yyyy%100!=0)) || (yyyy%400==0)) ? true : false;
}
//+----------------------------------------------------------------------------------
//|
//| Function:           isDate()
//|
//| Description:        Generic client-side validation routine to validate the format
//|                     of any date. Returns true if the date is valid and false if
//|                     invalid. This is a duplicate of the CheckDate() function. The
//|                     difference is isDate() does not use alert commands. This
//|                     function can be used to validate the fields on submit.
//|                     
//| Input Parameters:   
//|             date -  mm/dd/yyyy or mm/dd/yy
//|
//| Valid Range(date)   1    <= mm   <= 12
//|                     1    <= dd   <= 31
//|                     0    <= yy   <= 99
//|                     1997 <= yyyy <= 2099
//|
//| Output Parameters:  Boolean
//|
//| Example:            
//|             <SERVER>
//|                     is_my_date_valid = isDate("09/13/1997"); 
//|                                        // is_my_date_valid contains false as
//|                                        // month(mm) is invalid.
//|             </SERVER>
//|
//+----------------------------------------------------------------------------------
function isOldDate(date)
{
        var str = date;
		var validChars = "0123456789/";
            if(str.length < 5) {
                return false;
            }
            if(str.indexOf("/",0)<1) {
                return false;
            }
            if(str.indexOf("/",0)+1 == str.lastIndexOf("/")) {
				return false;
			}
            for (var i = 0; i < str.length; i++) {
                    var ch = str.substring(i, i + 1);
                    if (!(validChars.indexOf(ch) != -1)) {
                            return false;
                    }
            }
            i = str.indexOf("/",0);
            var j = str.substring(0,i);
            var mo = parseInt(j,10);
            if (mo > 12) {
                    return false;
            }
            j = str.indexOf("/", i + 1);
            if(str.indexOf("/", j+1) != -1){
                    return false;
            }
            i = str.substring(i + 1,j);
            if (parseInt(i,10) > 31 || parseInt(i,10) < 1) {
                    return false;
            }
            if (mo == 4 || mo == 6 || mo == 9 || mo == 11) {     
                                // 31 is too high for months 4,6,9,11
                    if (parseInt(i,10) > 30) {
                            return false;
                    }
            }
            if (mo == 2) {     
              if(isLeapYear(str)){
                 if(parseInt(i,10) > 29) { // 30 is too high for month 2 in leap years
                            return false;
                    }
              }
              else if (parseInt(i,10) > 28) {// 29 is too high for month 2 in non-leap years
                 return false;
              }
            }
            j = str.substring(j + 1,str.length);
            if(j.length == 4) {
            if (parseInt(j,10) >2099 || parseInt(j,10) <1996) {
                    return false;
                }
            }
            if(j.length == 2||j.length ==1) {
                if(parseInt(j,10) >99 || parseInt(j,10) <0) {
                    return false;
                }
            }
            if(j.length==3) {
                return false;
            }
            if(j.length >4){
                return false;
            }   
            return true;
}
//+----------------------------------------------------------------------------------
//|
//| Function:           formatDate(val);
//|
//| Description:        Client-side routine to address Y2K issues
//|                     
//| Input Parameters:   
//|             val -	a valid date
//|
//| Output Parameters:  Y2K compliant date valid through 2070
//|
//| Example:            
//|     
//+----------------------------------------------------------------------------------
function formatDate(val) {
	if (!isDate(val)) {
		return val;
	} else {
		var myMonth = val.substring(0,val.indexOf("/"));
		var myDay = val.substring(val.indexOf("/")+1,val.lastIndexOf("/"));
		var myYear = val.substring(val.lastIndexOf("/")+1,val.length);
	//	if(myYear >= 90) { yr = "19"; } else { yr = "20"; }
		return right("00" + myMonth,2) + "/" + right("00" + myDay,2) + "/" + myYear;
	}
}
//+----------------------------------------------------------------------------------
//|
//| Function:           isCurrency() && formatCurrency(val,decimalPlaces)
//|
//| Description:        Generic client-side validation routine to validate numbers that
//|                     may contain decimal places
//|                     
//| Input Parameters:   
//|             number -  a number that may contain decimal places
//|
//| Output Parameters:  Boolean
//|
//| Example:            
//|     
//+----------------------------------------------------------------------------------
function formatCurrency(val,dec) {
	var str = "" + nospaces(val);
	var newVal = "";
	var tempVal = "";
	var leftSide = "";
	var rightSide = "";
	var decStr = "";
	var roundUpOrDown;
	var roundVar;
	var temp;
	for (var i=0;i<str.length;i++) {
		if (!(str.charAt(i) == "$" || str.charAt(i) == ",")) {
			tempVal = tempVal + str.charAt(i);
		}
	}
	if (dec > 0) {
		for (i=0;i<dec;i++) {
			decStr = decStr + "0";
		}
		if (tempVal.indexOf('.') != -1) {
			leftSide = tempVal.substring(0,tempVal.indexOf('.'));
			rightSide = tempVal.substring(tempVal.indexOf('.')+1,tempVal.length) + decStr;
			roundUpOrDown = eval(rightSide.charAt(dec));
			if (roundUpOrDown > 4) {
				roundVar = 1;
			} else {
				roundVar = 0;
			}
			rightSide = (eval(rightSide.substring(0,dec)) + roundVar) + "";
			if (rightSide.length < dec) {
				rightSide = "0" + rightSide;
			}
		} else {
			leftSide = tempVal;
			rightSide = decStr;
		}
		if (leftSide.charAt(0) == "0") {
			while (leftSide.charAt(0) == "0") {
				temp = leftSide.substring(1,leftSide.length);
				leftSide = temp;
			}
		}
		if (leftSide.length == 0) leftSide = "0";
		str = "" + leftSide + "." + rightSide;
	} else {
		str = "" + parseInt(tempVal);
	}
	return str;
}
function isCurrency(val) {
	var str = "" + nospaces(val);
	var newVal = "";
	var tempVal = "";
	var tempStr = "";
	var validChars = "0123456789$,.-";
	var foundXtraChars = false;
	if (str.indexOf('$') != -1) {
		if (!(str.indexOf('$') == str.lastIndexOf('$'))) {
			return false;
		}
		if (str.indexOf('-') != -1) {
			if (!(str.indexOf('$') == 1)) {
				return false;
			}
		} else {
			if (!(str.indexOf('$') == 0)) {
				return false;
			}
		}
	}
	for (var i=0;i<str.length;i++) {
		if (!(validChars.indexOf(str.charAt(i)) != -1)) {
			return false;
			break;
		} else {
			if (!(str.charAt(i) == "$" || str.charAt(i) == ",")) {
				tempVal = tempVal + str.charAt(i);
			}
			if (!(str.charAt(i) == "$" || str.charAt(i) == "," || str.charAt(i) == "." || str.charAt(i) == "-")) {
				tempStr = tempStr + str.charAt(i);
			} else {
				foundXtraChars = true;
			}
		}
	}
	if (foundXtraChars && tempStr == "") {
		return false;
	}
	if (tempVal.indexOf('-') != -1) {
		if (!(tempVal.indexOf('-') == tempVal.lastIndexOf('-'))) {
			return false;
		}
		if (!(tempVal.indexOf('-') == 0)) {
			return false;
		}
	}
	if (tempVal.indexOf('.') != -1) {
		if (tempVal.indexOf('.') == tempVal.lastIndexOf('.')) {
			tempVal = "" + tempVal + "00";
			tempVal = tempVal.substring(0,tempVal.indexOf('.')+3);
			if (!(tempVal.indexOf('.') > 0)) {
				return false;
			}
		} else {
			return false;
		}
	}
	return true;
}
function lpad(val,pad,len) {
	var tempVal = "";
	for (var i=0;i<len;i++) {
		tempVal = tempVal + pad;
	}
	tempVal = tempVal + val;
	val = tempVal.substring(tempVal.length-len,tempVal.length);
	return val;
}
function rpad(val,pad,len) {
	var tempVal = "";
	for (var i=0;i<len;i++) {
		tempVal = tempVal + pad;
	}
	tempVal = val + tempVal;
	val = tempVal.substring(0,len);
	return val;
}
function left(val,len) {
	return val.substring(0,len);
}
function right(val,len) {
	return val.substring(val.length-len,val.length);
}
function replace(val,ostr,nstr) {
	var str = "";
	while(val.indexOf(ostr) != -1) {
		str = str + val.substring(0,val.indexOf(ostr)) + nstr;
		val = val.substring(val.indexOf(ostr)+ostr.length,val.length);
	}
	return str + val;
}
function reverse(x) {
	var str = trimmer(x);
	if (str.length < 2) return x;
	str = "";
	for (var i=x.length-1;i>=0;i--) str += x.charAt(i);
	return str;
}
function caps(x) {
	x = trimmer(x);
	if (x.length == 0) return x;
	if (!(x.indexOf(" ") != -1)) return x.substring(0,1).toUpperCase() + x.substring(1,x.length);
	x = x.substring(0,1).toUpperCase() + x.substring(1,x.length);
	for (var i=x.indexOf(" ");i<x.lastIndexOf(" ")+1;i++) {
		if (x.charAt(i) == " ") {
			x = x.substring(0,i+1) + x.substring(i+1,i+2).toUpperCase() + x.substring(i+2,x.length);
		}
	}
	return x;
}
var cc_msg = "";
function isCC(w,x,y,z) {
	/*
	w : Card Type
	x : Card Number
	y : Card Expiration Month (MM)
	z : Card Expiration Year (YYYY)
	
	ASSUMES:
	- American Express	: "1"
	- Discover			: "2"
	- MasterCard		: "3"
	- VISA				: "4"
	*/
	w = nospaces(w);
	x = nospaces(x);
	y = nospaces(y);
	z = nospaces(z);
	var now = new Date();
	var this_year = now.getYear();
	if (("" + this_year).length < 4) this_year += 1900;
	if (!(parseInt(w) >= 1 && parseInt(w) <= 4)) return false;
	if (x == "" || !isNumeric(x) || (x.length < 13 || x.length > 16)) return false;
	if (!(parseInt(y) >= 1 && parseInt(y) <= 12)) return false;
	if (!(parseInt(z) >= this_year)) return false;
	var exp = new Date(y+"/01/"+z);
	var bom = new Date((now.getMonth()+1)+"/01/"+this_year);
	if (exp<bom) return false;
	if (w == "1") {
		if (x.length != 15) return false;
		if (!(left(x,2) == "34" || left(x,2) == "37")) return false;
	} else if (w == "2") {
		if (x.length != 16) return false;
		if (!(left(x,4) == "6011")) return false;
	} else if (w == "3") {
		if (x.length != 16) return false;
		if (!(left(x,2) == "51" || left(x,2) == "52" || left(x,2) == "53" || left(x,2) == "54" || left(x,2) == "55")) return false;
	} else if (w == "4") {
		if (x.length != 13 && x.length != 16) return false;
		if (!(left(x,1) == "4")) return false;
	} else {
		return false;
	}
	var sum = 0;
	x = reverse(x);
	for (var i=0;i<x.length;i++) sum += ((i%2)>0) ? ((x.charAt(i)*2)>9) ? ((x.charAt(i)*2)-9) : (x.charAt(i)*2) : (x.charAt(i)*1);
	if ((sum%10)>0) return false;
	return true;
}
function isTime(val) {
	val = "" + nospaces(val).toUpperCase();
	var military = true;
	var myHours;
	var myMinutes;
	var mySeconds;
	var myTemp;
	if (!(val.indexOf(':') != -1)) {
		return false;
	}
	if (val.substring(val.length-2,val.length) == "AM" || val.substring(val.length-2,val.length) == "PM") {
		military = false;
		val = val.substring(0,val.length-2);
	}
	myHours = val.substring(0,val.indexOf(':'));
	myTemp = val.substring(val.indexOf(':')+1,val.length);
	if (myTemp.indexOf(':') != -1) {
		myMinutes = myTemp.substring(0,myTemp.indexOf(':'));
		myTemp = myTemp.substring(myTemp.indexOf(':')+1,myTemp.length);
		if (myTemp.length > 0) {
			mySeconds = myTemp;
		} else {
			mySeconds = 0;
		}
	} else {
		myMinutes = myTemp;
		mySeconds = 0;
	}
	if (!isNumeric(myHours) || !isNumeric(myMinutes) || !isNumeric(mySeconds)) {
		return false;
	}
	if (military) {
		if(eval(myHours) < 1 || eval(myHours) > 23) {
			return false;
		}
	} else {
		if (eval(myHours) < 1 || eval(myHours) > 12) {
			return false;
		}
	}
	if (eval(myMinutes) < 0 || eval(myMinutes) > 59) {
		return false;
	}
	if (eval(mySeconds) < 0 || eval(mySeconds) > 59) {
		return false;
	}
	return true;
}
function formatDB2Time(val) {
	if (!isTime(val)) return false;
	var morningFactor = 0;
	val = nospaces(val).toUpperCase();
	var myHours;
	var myMinutes;
	var mySeconds;
	var myTemp;
	if (val.indexOf('AM') != -1 || val.indexOf('PM') != -1) {
		if (val.indexOf('PM') != -1) {
			morningFactor = 12;
		}
		val = val.substring(0,val.length-2);
	}
	myHours = eval(val.substring(0,val.indexOf(':'))) + morningFactor;
	myTemp = val.substring(val.indexOf(':')+1,val.length);
	if (myTemp.indexOf(':') != -1) {
		myMinutes = myTemp.substring(0,myTemp.indexOf(':'));
		myTemp = myTemp.substring(myTemp.indexOf(':')+1,myTemp.length);
		if (myTemp.length > 0) {
			mySeconds = myTemp;
		} else {
			mySeconds = "00";
		}
	} else {
		myMinutes = myTemp;
		mySeconds = "00";
	}
	if (eval(myHours) < 10) myHours = "0" + myHours;
	return myHours + "." + myMinutes + "." + mySeconds + ".000000";
}
function formatDB2Date(val) {
	if (!isDate(val)) return false;
	var myDate = new Date(val);
	var myYear = myDate.getFullYear();
	if (myYear < 1970) myYear = myYear + 100;
	var myMonth = myDate.getMonth() + 1;
	var myDay = myDate.getDate();
	if (myMonth < 10) myMonth = "0" + myMonth;
	if (myDay < 10) myDay = "0" + myDay;
	return myYear + "-" + myMonth + "-" + myDay;
}
function isIP(val) {
	if (val.length == 0) return false;
	var validChars = "0123456789.";
	var periods = 0;
	var i = 0;
	for (i=0;i<val.length;i++) {
		if (!(validChars.indexOf(val.charAt(i)) != -1)) {
			return false;
			break;
		}
	}
	for (i=0;i<val.length;i++) {
		if (val.charAt(i) == ".") periods++;
	}
	if (periods < 3 || periods > 4) return false;
	if (val.indexOf('..') != -1) return false;
	if (val.charAt(0) == ".") return false;
	if (val.charAt(val.length-1) == ".") return false;
	var ip1 = val.substring(0,val.indexOf('.'));
	val = val.substring(val.indexOf('.')+1,val.length);
	var ip2 = val.substring(0,val.indexOf('.'));
	val = val.substring(val.indexOf('.')+1,val.length);
	var ip3 = val.substring(0,val.indexOf('.'));
	val = val.substring(val.indexOf('.')+1,val.length);
	if (periods == 3) {
		var ip4 = val;
		val = "";
	} else {
		var ip4 = val.substring(0,val.indexOf('.'));
		val = val.substring(val.indexOf('.')+1,val.length);
	}
	if (parseInt(ip1) > 255) return false;
	if (parseInt(ip2) > 255) return false;
	if (parseInt(ip3) > 255) return false;
	if (parseInt(ip4) > 255) return false;
	if (!(val == "")) {
		if (parseInt(val) > 255) return false;
	}
	return true;
}
function isValidEmailChars(val) {
	var validChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\.\_\-";
	val = val.toUpperCase();
	for (var x=0; x<val.length; x++) {
		if (!(validChars.indexOf(val.charAt(x)) != -1)) {
			return false;
			break;
		}
	}
	return true;
}
function isEmail(val) {
	val = val.toUpperCase();
	var validChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\.\_\-";
	var invalidChars = "\@\.\-\_";
	var checkstart = val.substring(0,val.indexOf('\@'));
	var checkmiddle = val.substring(val.indexOf('\@')+1,val.lastIndexOf('\.'));
	var checkend = val.substring(val.lastIndexOf('\.')+1,val.length);
	if (checkstart == "" || checkstart == val || !isValidEmailChars(checkstart) || invalidChars.indexOf(checkstart.substring(0,1)) != -1 || invalidChars.indexOf(checkstart.substring(checkstart.length-1,checkstart.length)) != -1) {
		return false;
	}
	if (checkmiddle == "" || checkmiddle == val || !isValidEmailChars(checkmiddle) || invalidChars.indexOf(checkmiddle.substring(0,1)) != -1 || invalidChars.indexOf(checkmiddle.substring(checkmiddle.length-1,checkmiddle.length)) != -1) {
		return false;
	}
	if (checkend == "" || checkend == val || (checkend.length != 1 && checkend.length != 2 && checkend.length != 3) || (!isNumeric(checkend) && !isANumeric(checkend)) || (checkend.length == 1 && !isNumeric(checkend))) {
		return false;
	}
	return true;
}
function isEmailOld(val) {
	var exclude = /[^@\-\.\w]|^[_@\.\-]|[\._\-]{2}|[@\.]{2}|(@)[^@]*\1/;
	var check = /@[\w\-]+\./;
	var checkend = /\.[a-zA-Z]{2,3}$/;
	if (((val.search(exclude) != -1) || (val.search(check)) == -1) || (val.search(checkend) == -1)) {
		return false;
	} else {
		return true;
	}
	/* Notes: 'exclude' checks 5 conditions:
	a) characters that should not be in the address
	b) characters that should not be at the start
	c) &
	d) characters that shouldn't be together
	e) there's not more than one '@' 'check' checks there's at least one '@', later followed by at least one '.' 'checkend' checks the address ends with a period followed by 2 or 3 alpha characters
	*/
}
function isDomain(x) {
	if (x.length == 0) return false;
	x = x.toUpperCase();
	var validChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-";
	var i = 0;
	if (!(x.indexOf(".") != -1)) return false;
	if (x.indexOf("..") != -1) return false;
	if (x.indexOf(".") != x.lastIndexOf(".")) return false;
	if (left(x,1) == "." || right(x,1) == ".") return false;
	if (!isDomainExtension(x.substring(x.indexOf(".")+1,x.length))) return false;
	for (i=0;i<x.substring(0,x.indexOf(".")).length;i++) {
		if (!(validChars.indexOf(x.charAt(i)) != -1)) {
			return false;
			break;
		}
	}
	return true;
}
function isFullDomain(x) {
	if (x.length == 0) return false;
	x = x.toUpperCase();
	var validChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-.";
	var i = 0;
	if (!(x.indexOf(".") != -1)) return false;
	if (x.indexOf("..") != -1) return false;
	if (x.indexOf(".") == x.lastIndexOf(".")) return false;
	if (left(x,1) == "." || right(x,1) == ".") return false;
	var y = reverse(x);
	var tmp = y.substring(0,y.indexOf("."));
	y = y.substring(y.indexOf(".")+1,y.length);
	tmp += "." + y.substring(0,y.indexOf("."));
	if (!isDomain(reverse(tmp))) return false;
	for (i=0;i<x.length;i++) {
		if (!(validChars.indexOf(x.charAt(i)) != -1)) {
			return false;
			break;
		}
	}
	return true;
}
function isDomainExtension(x) {
	x = x.toUpperCase();
	var i = 0;
	var validExtensions = new Array();
	validExtensions[0] = "CO";
	validExtensions[0] = "COM";
	validExtensions[1] = "NET";
	validExtensions[2] = "US";
	validExtensions[3] = "BIZ";
	validExtensions[4] = "INFO";
	validExtensions[5] = "TV";
	validExtensions[6] = "ORG";
	validExtensions[7] = "WS";
	validExtensions[8] = "CC";
	validExtensions[9] = "BZ";
	validExtensions[10] = "VG";
	validExtensions[11] = "MS";
	validExtensions[12] = "NU";
	validExtensions[13] = "GS";
	validExtensions[14] = "TC";
/*	for (i=0;i<validExtensions.length;i++) 
	{
		if (validExtensions[i] == x) 
		{
			return true;
			break;
		}
	}*/
	return true;
//	return false;
}
function isDomainURL(x) {
	if (x.length == 0) return false;
	x = x.toLowerCase();
	if (!(left(x,7) == "http://" || left(x,8) == "https://")) return false;
	if (left(x,7) == "http://") {
		x = right(x,x.length-7);
	} else if (left(x,8) == "https://") {
		x = right(x,x.length-8);
	}
	if (x == "") return false;
	if (!(isDomain(x) || isFullDomain(x) || isIP(x))) return false;
	return true;
}
function isValidColor(x) {
	x = x.toUpperCase();
	if (!(x.length == 6)) return false;
	var vChars = "ABCDEF0123456789";
	var i = 0;
	for (i=0;i<x.length;i++) {
		if (!(vChars.indexOf(x.charAt(i)) != -1)) {
			return false;
			break;
		}
	}
	return true;
}
function isPhone(val) {
	var validChars = "0123456789-().";
	val = "" + nospaces(val);
	for (var x=0;x<val.length;x++) {
		if (!(validChars.indexOf(val.charAt(x)) != -1)) {
			return false;
			break;
		}
	}
	return true;
}
function qsort(ary,lo,hi) {
	if (lo >= hi) return;
	var mid = qpartition(ary,lo,hi);
	qsort(ary,lo,mid-1);
	qsort(ary,mid+1,hi);
}
function qpartition(ary,lo,hi) {
	var median = ary[hi];
	var i = lo, j = hi-1;
	while (true) {
		while (ary[i] < median) i++;
		while (ary[j] > median && j > lo) j--;
		if (i >= j) break;
		qswap(ary,i,j);
	}
	qswap(ary,i,hi);
	return i;
}
function qswap(ary,i,j) {
	var tmp;
	tmp = ary[i];
	ary[i] = ary[j];
	ary[j] = tmp;
	return;
}
var monthNames = new Array();
monthNames[0] = "January";
monthNames[1] = "February";
monthNames[2] = "March";
monthNames[3] = "April";
monthNames[4] = "May";
monthNames[5] = "June";
monthNames[6] = "July";
monthNames[7] = "August";
monthNames[8] = "September";
monthNames[9] = "October";
monthNames[10] = "November";
monthNames[11] = "December";
function monthName(val) {
	if (!isNumeric(val)) return false;
	if (val > 0 && val < 13) {
		return monthNames[val-1];
	} else if (val > -1 && val < 12) {
		return monthNames[val];
	} else {
		return val;
	}
}
