﻿/**
* Scaled Down Data Validation Library
*/
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 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 isUSPhoneNumber (str){
	
	// +1 (xxx) xxx-xxxx
	// 1 (xxx) xxx-xxxx
	// (xxx) xxx-xxxx
	
	// eliminate US international code if present
	var isInternational = false;
	var plusSymbol = str.indexOf("+");
	var nextChar;
	if(plusSymbol > 0){
		return false;
	}else if(plusSymbol == 0){
		if(str.charAt(1) != "1"){
			return false;
		}
		isInternational = true;
		str = str.substr(2);
	}else if(str.charAt(0) == "1"){
		nextChar = str.charAt(1);
		if(isNaN(nextChar)){
			isInternational = true;
			if(nextChar=="("){
				str = str.substr(1);
			}else{
				str = str.substr(2);
			}
		}else{
			str = str.substr(1);
		}
	}
	
	var spcSpl = str.split(" ");
	var n = spcSpl.length;
	while(n-- >1){
		// disallow two consecutive spaces
		if(spcSpl[n].length == 0){
			return false;
		}
		if(!isNaN(spcSpl[n]) && spcSpl[n].length < 3){
			return false;
		}
	}
		
		
	str = spcSpl.join("");
	// str now contains no international code and no spaces
	
	nextChar = str.charAt(0);
	if(nextChar == "-"){
		// dash is permitted here only if there was an international code
		if(isInternational){
			str = str.substr(1);
		}else{
			return false;
		}
	}
	
	var foundArea = false;
	// parentheses permitted only around area code
	var firstParenthesis = str.indexOf("(");
	var closeParenthesis = str.indexOf(")");
	if(firstParenthesis != -1){
		if(firstParenthesis !=0 ){
			return false;
		}
		if(closeParenthesis-firstParenthesis != 4){
			return false;
		}
		foundArea = true;
		str = str.substr(closeParenthesis+1);
	}else if(closeParenthesis != -1){
		// close parenthesis not permitted without openening parenthesis
		return false;
	}
	
	var dashSpl = str.split("-");
	var n = dashSpl.length;
	// str can now be (not found area) xxx-xxx-xxxx / xxx-xxxxxxx / xxxxxx-xxxx / xxxxxxxxxx 
	// or (found area) xxx-xxxx / xxxxxxx 
	if(!hasValidChars(str, "-0123456789")){
		return false;
	}
	switch(n){
	case 1:
		if(foundArea){
			if(str.length == 7){
				return true;
			}
		}else{
			if(str.length == 10){
				return true;
			}
		}
		break;
	case 2:
		if(foundArea){
			if(dashSpl[0].length == 3 && dashSpl[1].length == 4){
				return true;
			}
		}else{
			if(dashSpl[0].length == 3 && dashSpl[1].length == 7){
				return true;
			}else if(dashSpl[0].length == 6 && dashSpl[1].length == 4){
				return true;
			}
		}
		break;
	case 3:
		if(dashSpl[0].length == 3 && dashSpl[1].length == 3 && dashSpl[2].length == 4){
			return true;
		}
		break;
	}
	
	return false;
}

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 isAlphaNumeric (str){
	return hasValidChars(str,"0123456789abcdefghijklmnopqrstuvwxyz")
}
	
	
function isLetterOrDigit (n){
	return (isLetter(n) || isDigit(n));
}
	
	
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 isIntegerInRange (n, mn, mx){
	var num = Number(n);
	if(isNaN(num)){
		return false;
	}
	if(num != Math.round(num)){
		return false;
	}
	return (num>=mn && num<=mx);
}
	
	
	
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;
}
	
