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();
	if (isEmail(str)) {
		return false;
	}
	// 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("://");
	var domain;
	switch (protocolSpl[0]) {
		case "http" :
			domain = protocolSpl[1];
			break;
		case "https" :
			domain = protocolSpl[1];
			break;
		case "ftp" :
			domain = protocolSpl[1];
			break;
		default :
			if (str.substr(0, 4) != "www.") {
				return false;
			}
			domain = str;
	}
	domainSlash = domain.split("/");
	domain = domainSlash[0];
	domainParts = domain.split(".");
	var n = domainParts.length;
	if (n < 2) {
		return false;
	}
	if (n == 2) {
		if (domainParts[0] == "www") {
			return false;
		}
		if (domainParts[1].length>4) {
			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) {
	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[1].length>2 || parts[2].length>2) {
		return false;
	}
	if (parts[1].length<2) {
		return false;
	}
	if (parts[2].length<2) {
		return false;
	}
	var month, day;
	month = parts[1];
	day = parts[2]
	var year = Number(parts[0]);
	var yearLen = String(parts[0]).length;
	if (yearLen == 2) {
		year = 2000+year;
	} else if (yearLen != 4) {
		return false;
	}
	if (!isIntegerInRange(month, 1, 12)) {
		return false;
	}
	return true;
}
function isIntegerInRange(n, min, max) {
	var num = Number(n);
	if (isNaN(num)) {
		return false;
	}
	if (num != Math.round(num)) {
		return false;
	}
	return (num>=min && num<=max);
}