function hasValidChars(str, chars, caseSensitive) {
	if (!str.length) {
		return false;
	}
	if (!chars.length) {
		return false;
	}
	if (!caseSensitive) {
		str = str.toLowerCase();
		chars = chars.toLowerCase();
	}
	var cArr = str.split("");
	var len = cArr.length;
	var valid;
	for (var i = 0; i<len; i++) {
		if (chars.indexOf(cArr[i]) == -1) {
			return false;
		}
	}
	return true;
}
function isURL(str) {
	str = str.toLowerCase();
	// ignore anything after the query or anchor
	var querySpl = str.split("?");
	str = querySpl[0];
	var anchorSpl = str.split("#");
	str = anchorSpl[0];
	if (!hasValidChars(str, "0123456789abcdefghijklmnopqrstuvwxyz-.:%/@_")) {
		return false;
	}
	var protocolSpl = str.split("://");
	switch (protocolSpl[0]) {
	case "http" :
	case "https" :
	case "ftp" :
		str = protocolSpl[1];
		break;
	default :
		if (str.substr(0, 4) != "www.") {
			return false;
		}
	}
	var userPassSpl = str.split("@");
	if (userPassSpl.length>2) {
		return false;
	}
	if (userPassSpl == 2) {
		var passSpl = userPassSpl[0].split(":");
		if (passSpl.length>2) {
			return false;
		}
		str = userPassSpl[1];
	}
	if (!isLetterOrDigit(str.charAt(0))) {
		return false;
	}
	var firstSlashInd = str.indexOf("/");
	var percentInd = str.indexOf("%");
	var uScroreInd = str.indexOf("_");
	if ((percentInd>-1 && percentInd<firstSlashInd) || (uScroreInd>-1 && uScroreInd<firstSlashInd)) {
		return false;
	}
	var domain;
	var domainParts;
	if (firstSlashInd == -1) {
		domain = str;
	} else {
		domain = str.substr(0, firstSlashInd);
	}
	trace(domain);
	if (isIP(domain)) {
		return true;
	}
	domainParts = domain.split(".");
	var n = domainParts.length;
	if (domainParts[--n].length<2) {
		return false;
	}
	while (n--) {
		if (domainParts[n].length<1) {
			return false;
		}
	}
	return true;
}
function isEmail(str) {
	str = str.toLowerCase();
	if (!hasValidChars(str, "0123456789abcdefghijklmnopqrstuvwxyz-_.@")) {
		return false;
	}
	var parts = str.split("@");
	if (parts.length != 2) {
		return false;
	}
	if (parts[0].length<1) {
		return false;
	}
	var domain = parts[1].split(".");
	if (domain.length<2) {
		return false;
	}
	var ext = String(domain.pop());
	if (ext.length<2) {
		return false;
	}
	var i = domain.length;
	while (i--) {
		if (String(domain[i]).length<1) {
			return false;
		}
	}
	return true;
}
function isDigit(n) {
	return !isNaN(Number(n)) && String(n).length == 1;
}
function isLetter(n) {
	if (n.length != 1) {
		return false;
	}
	return "abcdefghijklmnopqrstuvwxyz".indexOf(n.toLowerCase()) != -1;
}
function isNotEmpty(str, allowWhite) {
	if (!allowWhite) {
		// faster than stipping out all white chars
		return parseInt(str+"1") != 1 || parseInt(str) == 1;
	}
	return (str.length>0);
}
function isNotDefault(str, allowWhite) {
	if(str == "0"){
		return false;
	} else {
		return true;
	}
}
function isDate(str, dayFirst) {
	if (!hasValidChars(str, "0123456789-/.")) {
		return false;
	}
	var dash = (str.indexOf("-") != -1);
	var slash = (str.indexOf("/") != -1);
	var period = (str.indexOf(".") != -1);
	var parts;
	if (dash && !slash && !period) {
		parts = str.split("-");
	} else if (slash && !dash && !period) {
		parts = str.split("/");
	} else if (period && !dash && !slash) {
		parts = str.split(".");
	} else {
		return false;
	}
	if (parts.length != 3) {
		return false;
	}
	if (parts[0].length>2 || parts[1].length>2) {
		return false;
	}
	var month, day;
	if (dayFirst == true) {
		day = Number(parts[0]);
		month = Number(parts[1]);
	} else {
		month = Number(parts[0]);
		day = Number(parts[1]);
	}
	var year = Number(parts[2]);
	var yearLen = String(parts[2]).length;
	if (yearLen == 2) {
		year = 2000+year;
	} else if (yearLen != 4) {
		return false;
	}
	if (!isIntegerInRange(month, 1, 12)) {
		return false;
	}
	var dt = new Date(year, month-1, day);
	if (dt.getMonth() != month-1) {
		return false;
	}
	return true;
}