/**
*
*  This validate function works based on hidden fields defined within the form tags
*  and label tags wrapped around the text for each form field.  Please view the 
*  HTML page provided for more details.
*
*  Compatable with IE & FireFox
*
**/

// runs through all form elements
function check_required(form)
{
	var error = "";

	// look through all elements of the form for required fields
	for (var x=0; x < form.elements.length; x++)
	{ 
		var tempobj = form.elements[x];
		var message = "";
		
		var split_value = tempobj.value.split("|");
		
		if (tempobj.name == "required_field")
		{
			var field_type = eval("form." + tempobj.value + ".type");
			
			if (field_type == undefined)
			{
				field_type = eval("form." + tempobj.value + "[0].type");
				
				if (field_type == "radio")
				{
					message = check_radio(form, tempobj);
				}
				else if (field_type == "checkbox")
				{
					message = check_checkbox(form, tempobj);
				}
			}
			else
			{
				if ((field_type == "text") || (field_type == "textarea"))
				{
					message = check_text(form, tempobj);
				}
				else if ((field_type == "select-one") || (field_type == "select-multiple"))
				{
					message = check_select(form, tempobj);
				}
			}
		}
		else if ((tempobj.name == "required_email") && (!eval("form." + tempobj.value + ".disabled")))
		{
			message = check_email(form, tempobj);
		}
		else if ((tempobj.name == "required_date") && (!eval("form." + split_value[0] + ".disabled")))
		{
			message = check_date(form, tempobj);
		}
		else if ((tempobj.name == "required_number") && (!eval("form." + tempobj.value + ".disabled")))
		{
			message = check_number(form, tempobj);
		}
		else if (tempobj.name == "required_compare")
		{
			message = check_compare(form, tempobj);
		}
		else if ((tempobj.name == "required_minimum") && (!eval("form." + split_value[0] + ".disabled")))
		{
			message = check_minimum(form, tempobj);
		}
		
		// add message to error
		if (message)
		{
			error += " - " + message + "\n";
		}
	}
	
	// display any error that may have occured
	if (error)
	{
		alert ("___________________________________             \nThe following fields are not correctly filled in:\n\n" + 
			error + "___________________________________\nPlease re-enter values and submit again!");
		return false;
	}
	else
	{
		return true;
	}	
}

// gets the label for the field
function get_label (form, field)
{
	// look through all elements of the form for required fields
	for (var x=0; x < document.getElementsByTagName('label').length; x++)
	{ 
		if (field == document.getElementsByTagName('label')[x].htmlFor)
		{
			return document.getElementsByTagName('label')[x].innerHTML;
		}
	}
	
	alert("Setup Error: Unable to find Label for " + field);
	
	return;
}

// checks text fields
function check_text (form, field)
{
	if (eval("form." + field.value + ".value") == "")
	{
		return get_label(form, field.value);
	}
	
	return;
}

// checks text fields for a valid email format
function check_email (form, field)
{
	var email = eval("form." + field.value + ".value");
	
	// if email is not blank
	if (email)
	{
		// create regexp for email address
		if (! /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/.test(email))
		{
			return "Invalid " + get_label(form, field.value);
		}
	}
	
	return;
}

// checks text fields a valid date format
function check_date (form, field)
{
	var split_value = field.value.split("|");
	
	// figure out how to parse date
	var date_delimiter = split_value[1];
	date_delimiter = date_delimiter.replace(/d/gi, "");
	date_delimiter = date_delimiter.replace(/m/gi, "");
	date_delimiter = date_delimiter.replace(/y/gi, "");
	
	var delimiter = date_delimiter.split("");
	var date_format = split_value[1].split(delimiter[0]);
	
	// parse field value
	var date = eval("form." + split_value[0] + ".value");
	var date_values = date.split(delimiter[0]);
	
	// if date is not blank
	if (date)
	{	
		// based on format make look for intger values
		if (isNaN(date_values[0]))
		{
			return get_label(form, split_value[0]) + " must be " + split_value[1];
		}
		else if ((date_format.length > 1) && (isNaN(date_values[1])))
		{
			return get_label(form, split_value[0]) + " must be " + split_value[1];
		}
		else if ((date_format.length > 2) && (isNaN(date_values[2])))
		{
			return get_label(form, split_value[0]) + " must be " + split_value[1];
		}

		// based on format check character length
		else if (date_values[0].length != date_format[0].length)
		{
			return get_label(form, split_value[0]) + " must be " + split_value[1];
		}
		else if ((date_format.length > 1) && (date_values[1].length != date_format[1].length))
		{
			return get_label(form, split_value[0]) + " must be " + split_value[1];
		}
		else if ((date_format.length > 2) && (date_values[2].length != date_format[2].length))
		{
			return get_label(form, split_value[0]) + " must be " + split_value[1];
		}

		// based on format check to see if valid date values
		else 
		{
			for (var x = 0; x < date_format.length; x++)
			{
				if (date_format[x].match(/d/i))
				{
					if ((date_values[x] > 31) || (date_values[x] < 1))
					{
						return get_label(form, split_value[0]) + " day is out of range";
					}
				}
				else if (date_format[x].match(/m/i))
				{
					if ((date_values[x] > 12) || (date_values[x] < 1))
					{
						return get_label(form, split_value[0]) + " month is out of range";
					}
				}
				else if ((date_format[x].match(/y/i)) && (date_format[x].length == 4))
				{
					if (date_values[x] < 1900)
					{
						return get_label(form, split_value[0]) + " year is out of range";
					}
				}
			}
		}
	}
	
	return;
}

// checks field is a number
function check_number (form, field)
{
	var number = eval("form." + field.value + ".value");
	number.replace(".","");
	
	if (isNaN(number))
	{
		return get_label(form, field.value) + " must be numeric";
	}
	
	return;
}

// checks select field to see if it's selected and if what is selected has a value
function check_select (form, field)
{
	var option_selected = eval("form." + field.value + ".selectedIndex");

	if (option_selected == -1)
	{
		return get_label(form, field.value);
	}
	else if (eval("form." + field.value + ".options[" + option_selected + "].value") == "")
	{
		return get_label(form, field.value);
	}
	
	return;
}

// checks radio field for a check button
function check_radio (form, field)
{
	var not_checked = 1;

	if (eval("form." + field.value +".length") > 1)
	{
		for (var x=0; x < eval("form." + field.value +".length"); x++)
		{
			if (eval("form." + field.value +"[x].checked"))
			{
				not_checked = 0;
			}
		}
	}
	else
	{
		if (eval("form." + field.value +".checked"))
		{
			not_checked = 0;
		}
	}
	
	if (not_checked)
	{
		return get_label(form, field.value);
	}
	
	return;
}

// checks checkbox field for a check button
function check_checkbox (form, field)
{
	var not_checked = 1;

	for (var x=0; x < eval("form." + field.value +".length"); x++)
	{
		if (eval("form." + field.value +"[x].checked"))
		{
			not_checked = 0;
		}
	}
	
	if (not_checked)
	{
		return get_label(form, field.value);
	}
	
	return;
}

// checks 2 text fields to make sure they are the same
// good for password verification
function check_compare (form, field)
{
	var field_names = field.value.split("|");
	
	if (eval("form." + field_names[0] +".value") != eval("form." + field_names[1] +".value"))
	{
		return get_label(form, field_names[0]) + " must match " + get_label(form, field_names[1]);
	}
	
	return;
}

// checks field for minimum number of characters
// good for password fields
function check_minimum (form, field)
{
	var split_value = field.value.split("|");
	var minimum = eval("form." + split_value[0] + ".value");
	
	// if minimum is not blank
	if (minimum)
	{
		if (eval("form." + split_value[0] +".value.length") < split_value[1])
		{
			return get_label(form, split_value[0]) + " must be at\n   least " + split_value[1] + " characters long";
		}
	}
	
	return;
}