// Form Validation Functions  v1.0
// http://www.dithered.com/javascript/form_validation/index.html
// code by Chris Nott (chris@dithered.com)

var intError = 0;
var strError = "Warning! You need to correct the following:\n\n";
var strMulti = "\nPlease correct these issues before submitting the page again.";
var strSingle = "\nPlease correct this issue before submitting the page again.";
var now = new Date();
var dt = new Date(now.getFullYear(), now.getMonth(), now.getDate());

function checkError()
{
	if(intError > 0) 
	{
		if(intError > 1)
			alert(strError + strMulti);
		else
			alert(strError + strSingle);
		strError = "Warning! You need to correct the following:\n\n";
		intError = 0;
		return false;
	}
	else
		return true;
}

// Add error text to string error.
// Use addError(false) to reset to default values.
function addError(input)
{
	if (!input)
	{
		intError = 0;
		strError = "Warning! You need to correct the following:\n\n";
	}
	else 
	{
		intError++;
		strError += intError + ": " + input;
	}
}

function fetch(elementname) {
	return trimWhitespace(document.getElementById(elementname).value);
}

function checkDates() {	
	var vEffDate = new Date(fetch("Edit_Date_Effective"));
	var vExpDate = new Date(fetch("Edit_Date_Expiration"));
	var vAFDate = new Date(fetch("Edit_Date_Filed"));
	//var vASFDate = new Date(fetch("Edit_Date_Filed_Date"));
	var vstrExpDate = fetch("Edit_Date_Expiration");

	if (vEffDate.getFullYear() > "1899" && vEffDate.getFullYear() < "1910")
		vEffDate.setFullYear(vEffDate.getFullYear() + 100);
	
	if (vExpDate.getFullYear() > "1899" && vExpDate.getFullYear() < "1910")
		vExpDate.setFullYear(vExpDate.getFullYear() + 100);
		
	if (vAFDate.getFullYear() > "1899" && vAFDate.getFullYear() < "1910")
		vAFDate.setFullYear(vAFDate.getFullYear() + 100);
	
	//if (vASFDate.getFullYear() > "1899" && vASFDate.getFullYear() < "1910")
	//	vASFDate.setFullYear(vASFDate.getFullYear() + 100);	
			
	if (vEffDate == "NaN" || vEffDate.getFullYear() > "2099")
		addError("You must provide a valid Effective Date.\n");
	else if (vEffDate < dt)
		addError("You cannot back-date the Effective Date.\n");
	// else if (vEffDate > dt)
	//	addError("You cannot set the Effective Date in the future.\n");
		
	if (vExpDate != "NaN" && vEffDate != "NaN" && vExpDate < vEffDate)
		addError("The Expiration Date must occur later than the Effective Date.\n");
	else if (vExpDate.getFullYear() > "2099" || (vstrExpDate.length > 0 && vExpDate == "NaN"))
		addError("The Expiration Date does not appear to be a valid Date.\n");
}

function FileDates() {
	var effdate = new Date(document.getElementById("Edit_Date_Effective").value);
	var expdate = new Date(document.getElementById("Edit_Date_Expiration").value);

	if (effdate == "NaN") {
		alert("You must provide a valid Effective Date.");
		return false;
	}
	
	if (effdate != "NaN" && effdate >= dt) {
		if ((expdate != "NaN" && expdate > effdate) || expdate == "NaN") {
			return true;
		}
		else {
			alert("The Expiration Date must occur later than the Effective Date.");
			return false;
		}
	}
	else {
		alert("You cannot back-date the Effective Date!");
		return false;
	}
}

function inSelectBox(box, passvalue)
{
	var hit = false;
	for (var i = box.options.length - 1; i >= 0; i--)
	{
		if (box.options[i].value == passvalue)
		{
			i = -1;	
			hit = true;
		}
	}	
	return hit;
}

// Check that the number of characters in a string is between a max and a min
function isValidLength(string, min, max) {
  var newString  = '';
	var substring  = '';
	beginningFound = false;
	
	// copy characters over to a new string
	// retain whitespace characters if they are between other characters
	for (var i = 0; i < string.length; i++) {
		
		// copy non-whitespace characters
		if (string.charAt(i) != ' ' && string.charCodeAt(i) != 9) {
			
			// if the temporary string contains some whitespace characters, copy them first
			if (substring != '') {
				newString += substring;
				substring = '';
			}
			newString += string.charAt(i);
			if (beginningFound == false) beginningFound = true;
		}
		
		// hold whitespace characters in a temporary string if they follow a non-whitespace character
		else if (beginningFound == true) substring += string.charAt(i);
	}
	if (newString.length < min || newString.length > max) return false;
	else return true;
}

// Check that a credit card number is valid based using the LUHN formula (mod10 is 0)
function isValidCreditCard(number) {
	number = '' + number;
	
	if (number.length > 16 || number.length < 13 ) return false;
	else if (getMod10(number) != 0) return false;
	else if (arguments[1]) {
		var type = arguments[1];
		var first2digits = number.substring(0, 2);
		var first4digits = number.substring(0, 4);
		
		if (type.toLowerCase() == 'visa' && number.substring(0, 1) == 4 &&
			(number.length == 16 || number.length == 13 )) return true;
		else if (type.toLowerCase() == 'mastercard' && number.length == 16 &&
			(first2digits == '51' || first2digits == '52' || first2digits == '53' || first2digits == '54' || first2digits == '55')) return true;
		else if (type.toLowerCase() == 'american express' && number.length == 15 && 
			(first2digits == '34' || first2digits == '37')) return true;
		else if (type.toLowerCase() == 'diners club' && number.length == 14 && 
			(first2digits == '30' || first2digits == '36' || first2digits == '38')) return true;
		else if (type.toLowerCase() == 'discover' && number.length == 16 && first4digits == '6011') return true;
		else if (type.toLowerCase() == 'enroute' && number.length == 15 && 
			(first4digits == '2014' || first4digits == '2149')) return true;
		else if (type.toLowerCase() == 'jcb' && number.length == 16 &&
			(first4digits == '3088' || first4digits == '3096' || first4digits == '3112' || first4digits == '3158' || first4digits == '3337' || first4digits == '3528')) return true;
		else return true;
	}
	else return true;
}

// Check that an email address is valid based on RFC 821 (?)
function isValidEmail(address) {
	if (address.indexOf('@') < 3) return false;
	var name = address.substring(0, address.indexOf('@'));
	var domain = address.substring(address.indexOf('@') + 1);
	if (name.indexOf('(') != -1 || name.indexOf(')') != -1 || name.indexOf('<') != -1 || name.indexOf('>') != -1 || name.indexOf(',') != -1 || name.indexOf(';') != -1 || name.indexOf(':') != -1 || name.indexOf('\\') != -1 || name.indexOf('"') != -1 || name.indexOf('[') != -1 || name.indexOf(']') != -1 || name.indexOf(' ') != -1) return false;
	if (domain.indexOf('(') != -1 || domain.indexOf(')') != -1 || domain.indexOf('<') != -1 || domain.indexOf('>') != -1 || domain.indexOf(',') != -1 || domain.indexOf(';') != -1 || domain.indexOf(':') != -1 || domain.indexOf('\\') != -1 || domain.indexOf('"') != -1 || domain.indexOf('[') != -1 || domain.indexOf(']') != -1 || domain.indexOf(' ') != -1) return false;
	return true;
}


// Check that a US zip code is valid
function isValidZipcode(zipcode) {
	zipcode = removeSpaces(zipcode);
	if (!(zipcode.length == 5) || !isNumeric(zipcode)) return false;
	return true;
}


// Check that a Canadian postal code is valid
function isValidPostalcode(postalcode) {
	if (postalcode.search) {
		postalcode = removeSpaces(postalcode);
		if (postalcode.length == 6 && postalcode.search(/^\w\d\w\d\w\d$/) != -1) return true;
		else if (postalcode.length == 7 && postalcode.search(/^\w\d\w\-d\w\d$/) != -1) return true;
		else return false;
	}
	return true;
}

// Check that a string contains only letters and numbers
function isAlphanumeric(string, ignoreWhiteSpace) {
	if (string.search) {
		if ((ignoreWhiteSpace && string.search(/[^\w\s]/) != -1) || (!ignoreWhiteSpace && string.search(/\W/) != -1)) return false;
	}
	return true;
}

// Check that a string contains only letters
function isAlphabetic(string, ignoreWhiteSpace) {
	if (string.search) {
		if ((ignoreWhiteSpace && string.search(/[^a-zA-Z\s]/) != -1) || (!ignoreWhiteSpace && string.search(/[^a-zA-Z]/) != -1)) return false;
	}
	return true;
}

// Check that a string contains only numbers
function isNumeric(string, ignoreWhiteSpace) {
	if (string.search) {
		if ((ignoreWhiteSpace && string.search(/[^\d\s]/) != -1) || (!ignoreWhiteSpace && string.search(/\D/) != -1) || trimWhitespace(string) == "") return false;
	}
	return true;
}

// Remove characters that might cause security problems from a string 
function removeBadCharacters(string) {
	if (string.replace) {
		string.replace(/[<>\"\'%;\)\(&\+]/, '');
	}
	return string;
}

// Remove all spaces from a string
function removeSpaces(string) {
	var newString = '';
	for (var i = 0; i < string.length; i++) {
		if (string.charAt(i) != ' ') newString += string.charAt(i);
	}
	return newString;
}

// Remove leading and trailing whitespace from a string
function trimWhitespace(string) {
	var newString  = '';
	var substring  = '';
	beginningFound = false;
	
	// copy characters over to a new string
	// retain whitespace characters if they are between other characters
	for (var i = 0; i < string.length; i++) {
		
		// copy non-whitespace characters
		if (string.charAt(i) != ' ' && string.charCodeAt(i) != 9) {
			
			// if the temporary string contains some whitespace characters, copy them first
			if (substring != '') {
				newString += substring;
				substring = '';
			}
			newString += string.charAt(i);
			if (beginningFound == false) beginningFound = true;
		}
		
		// hold whitespace characters in a temporary string if they follow a non-whitespace character
		else if (beginningFound == true) substring += string.charAt(i);
	}
	return newString;
}

// Returns a checksum digit for a number using mod 10
function getMod10(number) {
	
	// convert number to a string and check that it contains only digits
	// return -1 for illegal input
	number = '' + number;
	number = removeSpaces(number);
	if (!isNumeric(number)) return -1;
	
	// calculate checksum using mod10
	var checksum = 0;
	for (var i = number.length - 1; i >= 0; i--) {
		var isOdd = ((number.length - i) % 2 != 0) ? true : false;
		digit = number.charAt(i);
		
		if (isOdd) checksum += parseInt(digit);
		else {
			var evenDigit = parseInt(digit) * 2;
			if (evenDigit >= 10) checksum += 1 + (evenDigit - 10);
			else checksum += evenDigit;
		}
	}
	return (checksum % 10);
}
