/// <AUTHOR>
/// </AUTHOR>
/// 
/// <MODIFICATIONS>
/// 05/09/2007 - Joe Kalinowski - Added code to initialize the variable that indicates whether or not
///		any of the controls in the OR list are valid
/// </MODIFICATIONS>
/// 
/// <DESCRIPTION>
/// - this function takes a form name, a comma delimited list of values, and a comma delimited
///		list of values to be validated numerically
/// - in the list of values, a value can be a pipe (|) delimited list of grouped controls
///		which means that at least one of the controls in the group must be filled
/// - if the argument error_message is not supplied, the default error message will be used
/// </DESCRIPTION>
/// 
/// <ARGUMENTS>
/// </ARGUMENTS>
/// 
/// <EXAMPLES>
/// return validate('my_form,'my_input,another_input,state,zip','my_input,my_number','Please fill out all required fields!','You must fill out <FIELD>.')
/// </EXAMPLES>
function validate(form,list,numeric,error_message,field_aliases) {
	var e = "";
	var aliases = "";
	var error_message_specific, error_message_generic;
	var either_aliases;
	var either;	
	var i,j,k,x;
	var temp_error_message = "";
	var doc="document."+form;
	// VARIABLE THAT INDICATES WHETHER OR NOT ANY OF THE CONTROLS IN AN OR LIST ARE VALID
	var boolIsAtLeastOneValidOrField = false;
	
	// SPLIT THE FIELDS TO BE VALIDATED IF THEY ARE SUPPLIED
	if (list != "" && list != null)
		e = list.split(",");

	// SPLIT THE FIELD ALIASES IF THEY ARE SUPPLIED
	if (field_aliases != null && field_aliases != "")
		aliases = field_aliases.split(",")

	error_message_generic = "You must fill in all required fields.";
	error_message_specific = "You must supply the '<FIELD>' field.";	
	if (error_message == null || error_message == "" ||
		(error_message.indexOf("<FIELD>") != -1 && 
		(field_aliases == null || field_aliases == ""))) {
		if (field_aliases == "" || 
			field_aliases == null || 
			error_message.indexOf("<FIELD>") != -1) {
			error_message = error_message_generic;
		} else {
			error_message = error_message_specific;		
		}
	}

	for (i=0; i<e.length; i++) {
		// checks to see if a group is sent
		if (e[i]!="" && e[i].indexOf("|")>=0) {

			// INITIALIZE VARIABLE THAT INDICATES WHETHER OR NOT ANY OF THE CONTROLS IN THE OR LIST ARE VALID
			boolIsAtLeastOneValidOrField = false;
			
			// array of controls for which at least one needs to be filled
			either = e[i].split("|")
			empty=true
			for (x=0; x<either.length; x++) {
				// IF THE CONTROL EXISTS AND IT'S NOT DISABLED
				if (eval(doc+"."+either[x]) && !eval(doc+"."+either[x]).disabled) {

					// THIS FIELD IS NOT DISABLED, SO THERE IS AT LEAST 1 VALID OR FIELD
					boolIsAtLeastOneValidOrField = true;
					
					// uses need [0] if the control is a radio button or checkbox group
					switch (eval(doc+"."+either[x]).type || eval(doc+"."+either[x])[0].type) {
						// text box
						case "text":
						case "textarea":
						case "password":
							if (eval(doc+"."+either[x]).value != "" &&
								!eval(doc+"."+either[x]).value.match(/^ *$/) ) {
								empty=false
							}
						break
						
						// control is a drop down
						case "select-one":
							if (eval(doc+"."+either[x]).options[eval(doc+"."+either[x]).selectedIndex].value != "" &&
								  eval(doc+"."+either[x]).options[eval(doc+"."+either[x]).selectedIndex].value != "-1" &&
								  !eval(doc+"."+either[x]).options[eval(doc+"."+either[x]).selectedIndex].value.match(/^ *$/) ) {
								empty=false
							}
						break
							
						case "select-multiple":
							for (j=0; j<eval(doc+"."+either[x]).length; j++) {
								if (eval(doc+"."+either[x])[j].selected) {
									empty=false
								}
							}							
						break
						
						// control is a group of radio buttons or checkboxes
						case "radio":
						case "checkbox":

							//IF THE RADIO BUTTONS OR CHECKBOXES ARE IN A GROUP
							if (eval(doc+"."+either[x]).length) {
								for (j=0; j<eval(doc+"."+either[x]).length; j++) {
									if (eval(doc+"."+either[x])[j].checked &&
										!eval(doc+"."+either[x])[j].value.match(/^ *$/)) {
										empty=false
									}
								}
							//IF THERE IS ONLY ONE CHECKBOX	
							} else {
								if (eval(doc+"."+either[x]).checked) {
									empty=false
								}								
							}

						break
					}
				}
			}

			// IF THERE ARE NO VALID OR FIELDS, SET EMPTY TO FALSE
			if (!boolIsAtLeastOneValidOrField) {
				empty=false;
			}

			// if none of the grouped fields was filled in, send alert, return false
			if (empty) {
				// DISPLAY ERROR MESSAGE
				if (aliases[i] && aliases[i] != "") {
					either_aliases = aliases[i].split("|")
					temp_error_message = ""
					for (j=0; j<either_aliases.length; j++) {
						temp_error_message += 
							error_message.replace("<FIELD>", either_aliases[j]);
						if (j<either_aliases.length-1)
							temp_error_message += "\n\nOR\n\n";
					}
					error_message = temp_error_message;
				}
				alert(error_message)
				
				// FOCUS ON FIRST CONTROL OF THE GROUP IF IT IS ENABLED
				if (eval(doc+"."+either[0]) && eval(doc+"."+either[0]).type && !eval(doc+"."+either[0]).disabled) 
					eval(doc+"."+either[0]).focus() 
				else if (eval(doc+"."+either[0]) && !eval(doc+"."+either[0])[0].disabled)	
					eval(doc+"."+either[0])[0].focus()
				return false;						
			}

		
		// if control is not part of a group (didn't come with a "|"), checks to see if control is enabled
		} else if (e[i]!="" && eval(doc+"."+e[i]) && !eval(doc+"."+e[i]).disabled) {
			// uses need [0] if the control is a radio button or checkbox group
			switch (eval(doc+"."+e[i]).type || eval(doc+"."+e[i])[0].type) {
				// text box
				case "text":
				case "textarea":
				case "password":
					if (eval(doc+"."+e[i]).value == "" ||
						eval(doc+"."+e[i]).value.match(/^ *$/) ) {

						// DISPLAY ERROR MESSAGE
						if (aliases[i] && aliases[i] != "") {
							temp_error_message = error_message.replace("<FIELD>", aliases[i]);
							error_message = temp_error_message;
						}

						alert(error_message)
						eval(doc+"."+e[i]).focus()
						eval(doc+"."+e[i]).select()
						return false;
					}
				break
				
				// control is a drop down
				case "select-one":
				case "select-multiple":
					if (eval(doc+"."+e[i]).options[eval(doc+"."+e[i]).selectedIndex].value == "" ||
						eval(doc+"."+e[i]).options[eval(doc+"."+e[i]).selectedIndex].value.match(/^ *$/)) {

						// DISPLAY ERROR MESSAGE
						if (aliases[i] && aliases[i] != "") {
							temp_error_message = error_message.replace("<FIELD>", aliases[i]);
							error_message = temp_error_message;
						}

						alert(error_message)
						eval(doc+"."+e[i]).focus()
						return false;			
					}
				break
				
				// control is a group of radio buttons or checkboxes
				case "radio":
				case "checkbox":
					is_checked=false

					if (eval(doc+"."+e[i]).length) {
						for (j=0; j<eval(doc+"."+e[i]).length; j++) {
							if (eval(doc+"."+e[i])[j].checked &&
								!eval(doc+"."+e[i])[j].value.match(/^ *$/)) {
								is_checked=true
							}
						}
					} else {
						if (eval(doc+"."+e[i]).checked &&
							!eval(doc+"."+e[i]).value.match(/^ *$/)) {
							is_checked=true
						}					
					}

					// if no buttons were checked, returns false
					if (!is_checked) {	

						// DISPLAY ERROR MESSAGE
						if (aliases[i] && aliases[i] != "") {
							temp_error_message = error_message.replace("<FIELD>", aliases[i]);
							error_message = temp_error_message;
						}

						alert(error_message)

						if (eval(doc+"."+e[i])[0] && !eval(doc+"."+e[i])[0].disabled)
							eval(doc+"."+e[i])[0].focus()
						else if (!eval(doc+"."+e[i]).length && eval(doc+"."+e[i]) && 
							!eval(doc+"."+e[i]).disabled)
							eval(doc+"."+e[i]).focus()

						return false
					}
				break
			}
		}
	}

	// takes care of numeric fields; must be text boxes
	if (numeric != "") {
		var n = numeric.split(",")
		for (i=0; i<n.length; i++) {
			if (eval(doc+"."+n[i]).value && isNaN(eval(doc+"."+n[i]).value)) {
				alert("This field requires a numerical value.");

				eval(doc+"."+n[i]).focus()
				eval(doc+"."+n[i]).select()
				return false
			}
		}
	}

	return true
}