/* 

how to use document....
Include this file in any form page, and before fields that you want to check, place a hidden field...
example:
<input type = "Hidden" name="First Name" value="mandatory_text">
<input type="text" name="firstName" value="" size="20" maxlength="40">

then at the bottom of the page place this value for an image:
<input type = "image" src="../../images/modify_button_link.gif" name="modifybutton" border = 0 onclick="return checkDocument();">

This will call the function....
*/

function validateForm(formName) {
	for(var i = 0; i < formName.elements.length; i++) {
		//Check for mandatory text fields
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "mandatory_Text") {
			if(formName.elements[i+1].value.length < 1) {
				alert("You must enter " + formName.elements[i].name + ".");
				formName.elements[i+1].focus();
				return false;
			}
		}
		//Mandatory SSN
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "mandatory_SSN") {
			if(formName.elements[i+1].value.length < 1) {
				alert("You must enter " + formName.elements[i].name + ".");
				formName.elements[i+1].focus();
				return false;
			}
			if(!checkSSN(formName.elements[i+1].value)) {
				alert("Please enter a valid Social Security Number. \n\n (ex. xxx-xx-xxxx)");
				formName.elements[i+1].focus();
				return false;
			}
		}
		//Optional SSN
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "optional_SSN") {
			if(!checkSSN(formName.elements[i+1].value)) {
				alert("Please enter a valid Social Security Number. \n\n (ex. xxx-xx-xxxx)");
				formName.elements[i+1].focus();
				return false;
			}
		}
		//Mandatory Email
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "mandatory_Email") {
			if(formName.elements[i+1].value.length < 1) {
				alert("You must enter " + formName.elements[i].name  + ".");
				formName.elements[i+1].focus();
				return false;
			}
			if(!checkEmail(formName.elements[i+1].value)) {
				alert("Please enter a valid email address.");
				formName.elements[i+1].focus();
				return false;
			}
		}
		//Optional Email
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "optional_Email") {
			if(!checkEmail(formName.elements[i+1].value)) {
				alert("Please enter a valid email address.");
				formName.elements[i+1].focus();
				return false;
			}
		}
		//Mandatory Zip
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "mandatory_Zip") {
			if(formName.elements[i+1].value.length < 1) {
				alert("You must enter " + formName.elements[i].name);
				formName.elements[i+1].focus();
				return false;
			}
			if(!checkZip(formName.elements[i+1].value)) {
				alert("Please enter a valid Zip Code. \n\n (ex. xxxxx or xxxxx-xxxx)");
				formName.elements[i+1].focus();
				return false;
			}
		}
		//Optional Zip
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "optional_Zip") {
			if(!checkZip(formName.elements[i+1].value)) {
				alert("Please enter a valid Zip Code. \n\n (ex. xxxxx or xxxxx-xxxx)");
				formName.elements[i+1].focus();
				return false;
			}
		}
		//Mandatory Phone
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "mandatory_Phone") {
			if(formName.elements[i+1].value.length < 1) {
				alert("You must enter " + formName.elements[i].name  + ".");
				formName.elements[i+1].focus();
				return false;
			}
			if(!checkPhone(formName.elements[i+1].value)) {
				alert("Please enter a valid " + formName.elements[i].name + ". \n\n (ex. xxx-555-1212)");
				formName.elements[i+1].focus();
				return false;
			}
		}
		//Optional Phone
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "optional_Phone") {
			if(!checkPhone(formName.elements[i+1].value)) {
				alert("Please enter a valid " + formName.elements[i].name + ". \n\n (ex. xxx-555-1212)");
				formName.elements[i+1].focus();
				return false;
			}
		}
		//This checks for a mandatory date in mm/dd/yyyy format
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "mandatory_Date") {
			if(formName.elements[i+1].value.length < 1) {
				alert("You must enter a " + formName.elements[i].name  + ".");
				formName.elements[i+1].focus();
				return false;
			}
			if(!checkDate(formName.elements[i+1].value)) {
				alert("Please enter a valid date for " + formName.elements[i].name + ". \n\n (ex. mm/dd/yyyy)");
				formName.elements[i+1].focus();
				return false;
			}
		}
		//This checks for a optional date in mm/dd/yyyy format
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "optional_Date") {
			if(!checkDate(formName.elements[i+1].value)) {
				alert("Please enter a valid date for " + formName.elements[i].name + ". \n\n (ex. mm/dd/yyyy)");
				formName.elements[i+1].focus();
				return false;
			}
		}
		//Check that a user has actually selected something from a drop down list
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "mandatory_Select") {
			if(formName.elements[i+1].options.selectedIndex < 1) {
				alert("You must select " + formName.elements[i].name  + ".");
				formName.elements[i+1].focus();
				return false;
			}
		}
		//Check that a user has actually selected something from a multi select list
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "mandatory_MultiSelect") {
			//alert(formName.elements[i+1].options.selectedIndex);
			if(formName.elements[i+1].options.selectedIndex < 0) {
				alert("You must select " + formName.elements[i].name  + ".");
				formName.elements[i+1].focus();
				return false;
			}
		}
		
		//Check that a user has actually selected something from a list of radio buttons
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "mandatory_Radio") {
			var radioName = formName.elements[i+1].name;
			var j = i+1;
			var radioSelected = false;
			while(formName.elements[j].name == radioName) {
				//alert(formName.elements[j].checked);
				if(formName.elements[j].checked) 
					radioSelected = true;
				j += 1;
			}
			//if(formName.elements[i+1]. < 1) {
			if(!radioSelected) {
				alert("You must select " + formName.elements[i].name  + ".");
				formName.elements[i+1].focus();
				return false;
			}
		}
		//Check a text field for a mandatory number
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "mandatory_num") {
			if(formName.elements[i+1].value.length < 1 || isNaN(formName.elements[i+1].value) || formName.elements[i+1].value < 0) {
				alert("You must enter a number greater than or equal to zero for " + formName.elements[i].name);
				formName.elements[i+1].focus();
				return false;
			}
		}
		//Check a text field for an optional number
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "optional_num") {
			if(formName.elements[i+1].value.length > 0) {
				var str1 = formName.elements[i+1].value;
				newNum = str1.replace(/,/g, "");
				if(isNaN(newNum)) {
					alert("You must enter a number for " + formName.elements[i].name  + ".");
					formName.elements[i+1].focus();
					return false;
				} else {
					formName.elements[i+1].value = newNum;
				}
			} else {
				formName.elements[i+1].value = "0.00";
			}
		}
		//This checks if From Date is greater than To Date
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "date_compare") {
			if(!DateCompare(formName.elements[i-3].value, formName.elements[i-1].value)) {
				alert("The From Date must be less than the To Date.");
				formName.elements[i-1].focus();
				return false;
			}
		}
		// This tests for size of field on textboxes so that they are not greater than 2500 characters
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "mandatory_Textarea") {
			if(formName.elements[i+1].value.length < 1) {
				alert(formName.elements[i].name  + " cannot be blank.");
				formName.elements[i+1].focus();
				return false;
			}
			if(formName.elements[i+1].value.length > 800) {
				alert("You can only enter " + formName.elements[i].name + " that are no more than 800 characters long(including spaces)\nYou entered " + formName.elements[i+1].value.length + " characters(including spaces) ! " );		
				formName.elements[i+1].focus();
				return false;
			}
		}
		
		// This tests for size of field on textboxes so that they are not greater than 2500 characters
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "long_Textarea") {
			if(formName.elements[i+1].value.length < 1) {
				alert(formName.elements[i].name  + " cannot be blank.");
				formName.elements[i+1].focus();
				return false;
			}
			if(formName.elements[i+1].value.length > 3500) {
				alert("You can only enter " + formName.elements[i].name + " that are no more than 3500 characters long(including spaces)\nYou entered " + formName.elements[i+1].value.length + " characters(including spaces) ! " );		
				formName.elements[i+1].focus();
				return false;
			}
		}
		// This tests for size of field on textboxes so that they are not greater than 2500 characters
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "optional_textarea") {
			if(formName.elements[i+1].value.length > 1200) {
				alert("You can only enter " + formName.elements[i].name + " that are no more than 1200 characters long(including spaces)\nYou entered " + formName.elements[i+1].value.length + " characters(including spaces) ! " );		
				formName.elements[i+1].focus();
				return false;
			}
		}
		//This checks if From Date is greater than To Date
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "date_compare") {
			if(!DateCompare(formName.elements[i-3].value, formName.elements[i-1].value)) {
				alert("The From Date must be less than the To Date");
				formName.elements[i-1].focus();
				return false;
			}
		}
		//This checks that one number isn't bigger then another
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "number_compare") {
			if(formName.elements[i-3].value > formName.elements[i-1].value) {
				alert("The Max value must be greater then the Min value.");
				formName.elements[i-1].focus();
				return false;
			}
		}
		//This makes sure confirm password is the same as password
		if(formName.elements[i].type == "hidden" && formName.elements[i].value == "confirm_password") {
			if(formName.elements[i+1].value != formName.elements[i-1].value) {
				alert(formName.elements[i+1].value + "The password and confirm password are not the same. Please fix and try again." + formName.elements[i-1].value);
				formName.elements[i-1].focus();
				return false;
			}
		}
	}
	return true;
}


/// Functions /////////////////////////


function checkZip(zip) {
    if (zip.length == 0)
        return true;
		
    if (zip.length != 5 && zip.length != 10)
        return false;

	// make sure first 5 digits are a valid integer
	if (zip.charAt(0) == "-" || zip.charAt(0) == "+")
        return false;

	if (isNaN(zip.substring(0,5)))
		return false;

	if (zip.length == 5)
		return true;
	
	// make sure

	// check if separator is either a'-' or ' '
	if (zip.charAt(5) != "-" && zip.charAt(5) != " ")
        return false;

	// check if last 4 digits are a valid integer
	if (zip.charAt(6) == "-" || zip.charAt(6) == "+")
        return false;

	if(isNaN(zip.substring(6,10)))
		return false;
		
	return true;
}


	
function checkEmail(str){
	if(str.length == 0) {
		return true;
	}
	//var filter="/^(\w+(?:\.\w+)*)@((?:\w+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i";
	var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9])+$/;
	if (filter.test(str)) {
		return true;
	} else {
		return false;
	}
}

function checkPhone(str) {
    if (str.length == 0)
        return true;
		
    if (str.length != 12) 
        return false;

	// check if first 3 characters represent a valid area code
    if (isNaN(str.substring(0,3))) {
		return false;
	} else 	if (!numberRange((eval(str.substring(0,3))), 100, 1000)) {
		return false;
	}

	// check if area code/exchange separator is either a'-' or ' '
	if (str.charAt(3) != "-" && str.charAt(3) != " ")
        return false

	// check if  characters 5 - 7 represent a valid exchange
    if (isNaN(str.substring(4,7)))
		return false;
    else
	if (!numberRange((eval(str.substring(4,7))), 100, 1000))
		return false;

	// check if exchange/number separator is either a'-' or ' '
	if (str.charAt(7) != "-" && object_value.charAt(7) != " ")
        return false;

	// make sure last for digits are a valid integer
	if (isNaN(str.substring(8,12)))
		return false
	
	return true
}

function checkSSN(ssn) {
	var white_space = " -+.";
	var ssc_string="";
	var check_char;

    if (ssn.length == 0)
        return true;

    if (ssn.length != 11)
        return false;

	// make sure white space is valid
	if (ssn.charAt(3) != "-" && ssn.charAt(3) != " ")
        return false;

	if (ssn.charAt(6) != "-" && ssn.charAt(6) != " ")
        return false;

	if (isNaN(ssn.substring(0,3))) 
		return false;
	
	
	if (isNaN(ssn.substring(4,6))) 
		return false;
	
	
	if (isNaN(ssn.substring(7,11))) 
		return false;
	
	
	return true;

}

function checkDate(val)  {
    //Returns true if value is a date format or is NULL
    //otherwise returns false	

    if (val.length == 0)
        return true;

	if (val.length != 10)
        return false;
		
    //Returns true if value is a date in the mm/dd/yyyy format
	isplit = val.indexOf('/');

	if (isplit == -1 || isplit == val.length)
		return false;

    sMonth = val.substring(0, isplit);

	if (sMonth.length == 0)
        return false;

	isplit = val.indexOf('/', isplit + 1);

	if (isplit == -1 || (isplit + 1 ) == val.length)
		return false;

    sDay = val.substring((sMonth.length + 1), isplit);

	if (sDay.length == 0)
        return false;

	sYear = val.substring(isplit + 1);

	var theDate = new Date();
	var theYear = theDate.getYear();
	if(theYear < 1000) 
		theYear+=1900;
	var theDay=theDate.getDay();
	var theMonth=theDate.getMonth();
	
	if (isNaN(sMonth)) //check month
		return false;
	else if (!numberRange(sMonth, 1, 12)) //check month
		return false;
	else if (isNaN(sYear)) //check year
		return false;
	else if (!numberRange(sYear, 1850, 2050)) //check year
		return false;
	else if (isNaN(sDay)) //check day
		return false;
	else if (!checkDay(sYear, sMonth, sDay)) // check day
		return false;
	else 
		return true;
		
}

function checkDay(checkYear, checkMonth, checkDay) {

	maxDay = 31;

	if (checkMonth == 4 || checkMonth == 6 ||
			checkMonth == 9 || checkMonth == 11)
		maxDay = 30;
	else
	if (checkMonth == 2)
	{
		if (checkYear % 4 > 0)
			maxDay =28;
		else if (checkYear % 100 == 0 && checkYear % 400 > 0)
			maxDay = 28;
		else
			maxDay = 29;
	}

	return numberRange(checkDay, 1, maxDay); //check day
}


function numberRange(num, min_value, max_value) {
    // check minimum
    if (min_value != null)
	{
        if (num < min_value)
		return false;
	}

    // check maximum
    if (max_value != null)
	{
	if (num > max_value)
		return false;
	}
	
    //All tests passed, so...
    return true;
}



