function validate(form_name, req_elts, req_err, addl_checks, addl_err, silent) {
  var o_form
  var o_elt
	var o_other_elt
	var o_other_elt_name
  var req_elts_arr
  var req_err_arr
  var addl_checks_arr
  var addl_err_arr
  var value
  var is_valid
	var num_radio_buttons
  var j
	var k
	
  o_form = document.forms[form_name]
  if (!o_form) {
    if (!silent) alert("Form '" + form_name + "' not found.")
    return false
  }

  req_elts_arr = req_elts.split("|")
  req_err_arr = req_err.split("|")
  addl_checks_arr = addl_checks.split("|")
  addl_err_arr = addl_err.split("|")
    
  for (j = 0; j < req_elts_arr.length; j++) {
    if (req_elts_arr[j] != "") { 
      o_elt = o_form[req_elts_arr[j]]
	    if (!o_elt) {
	      if (!silent) alert("Field '" + req_elts_arr[j] + "' not found.")
	      return false
	    } 
	 
	    value = ""
	 
	   // alert(j + ": "+ req_elts_arr[j] + "\n"  + o_elt + "\n" + typeof(o_elt.length) + "\n" + o_elt.name + "\n" + o_elt.type)
     	
			if ( (typeof(o_elt.length) != "undefined")  && (o_elt.type != "select-one") && (o_elt.type != "select-multiple") ) { 
			  // radio button
				num_radio_buttons = o_elt.length
				for (k = 0; k < num_radio_buttons; k++) {
				  if (o_elt[k].checked) {
				    value = o_elt[k].value
						break
					}
				}
				if (value == "") {
					if (!silent) alert(req_err_arr[j])
					// radio button apparently can't get focus
					// o_elt.focus() 
					return false
				}
				
			} else {
				if ( (o_elt.type == "text") ||  (o_elt.type == "password") || (o_elt.type == "textarea") ) {
					value = o_elt.value
					if (value == "") {
						if (!silent) alert(req_err_arr[j])
						o_elt.focus() 
						return false
					}
				}
			 
				if (o_elt.type == "select-one") {
					if ( (o_elt.selectedIndex == -1) ||  (o_elt.selectedIndex == 0) ) {
						if (!silent) alert(req_err_arr[j])
						o_elt.focus() 
						return false
					}
			 
					value = o_elt.options[o_elt.selectedIndex].value
				}
	
				// +if 08/16/2006 
				if (o_elt.type == "select-multiple") {
					// if none selected, then selectedIndex property will be set to -1
					if (o_elt.selectedIndex == -1) {
						if (!silent) alert(req_err_arr[j])
						o_elt.focus() 
						return false
					}
			 
					// this is the last selected value. At least for now, any additional checks will be run on
					// the last selected value only.
					value = o_elt.options[o_elt.selectedIndex].value
				}
		 	}
			 
	    is_valid = true
	 
	    if (addl_checks_arr[j] == 1) {
	      // run email validation
        is_valid = is_valid_email(value)
	   	   
	    } else {
	      if (addl_checks_arr[j] == 2) {
	        // run phone number validation
	        is_valid = is_valid_phone(value)
        } else {
	        if (addl_checks_arr[j] == 3) {
		        // run zipcode validation
            is_valid = is_valid_zip_code(value)			
		      } else {
	          if (addl_checks_arr[j].substr(0,2) == "4*") {
		          // check that this value is equal to the value of the specified field
							o_other_elt_name = addl_checks_arr[j].substr(0,2)
							if (o_other_elt_name.length > 0) {
							  o_other_elt = o_form[o_other_elt_name.length]
								if (o_other_elt) is_valid = (value == o_other_elt.value)
						  }			
				    } 
				  }
	      }
	    }
	 
	    if (!is_valid) {
	      if (!silent) alert(addl_err_arr[j])
	      o_elt.focus()
	      return false
      } 	   
    }
  }

  // +1 08/16/2006
  handle_multiple_select(o_form)
		
  return true 
}

function validate_require_nonempty(form_name, req_elts, req_err, silent) {
  var o_form
  var o_elt
	var o_first_elt
  var req_elts_arr
	var value
	var num_radio_buttons
  var j
  var k
			
  o_form = document.forms[form_name]
  if (!o_form) {
    if (!silent) alert("Form '" + form_name + "' not found.")
    return false
  }
  
	if (req_elts == "") {
	  req_elts_arr = o_form.elements
	} else {
    req_elts_arr = req_elts.split("|")
	}
    
  for (j = 0; j < req_elts_arr.length; j++) {
    if (req_elts_arr[j] != "") { 
		  if (req_elts == "") { 
        o_elt = req_elts_arr[j]
			} else {
        o_elt = o_form[req_elts_arr[j]]			
			}
			
	    if (!o_elt) {
	      if (!silent) alert("Field '" + req_elts_arr[j] + "' not found.")
	      return false
	    } 
	 
	    if (j == 0) o_first_elt = o_elt
	    // alert(j + ": "+ req_elts_arr[j] + "\n"  + o_elt.type + "\n" + typeof(o_elt.length))

      value = ""
			
			if ( (typeof(o_elt.length) != "undefined") && (o_elt.type != "select-one") && (o_elt.type != "select-multiple") ) { 
			  // radio button
				num_radio_buttons = o_elt.length
				for (k = 0; k < num_radio_buttons; k++) {
				  if (o_elt[k].checked) {
						handle_multiple_select(o_form)
						return true
					}
				}
				
			} else {				 
				if ( (o_elt.type == "text") ||  (o_elt.type == "password") || (o_elt.type == "textarea") ) {
					value = o_elt.value
					if (value != "")  {
						handle_multiple_select(o_form)
						return true
					}
				}
			 
				if (o_elt.type == "select-one") {
					if (o_elt.selectedIndex > 0) {
						handle_multiple_select(o_form)
						return true
					}
				}
	
				if (o_elt.type == "select-multiple") {
					// if none selected, then selectedIndex property will be set to -1
					if (o_elt.selectedIndex > 0)  {
						handle_multiple_select(o_form)
						return true
					}
				}	   
      }
    }
  }

	if (!silent) { 
	  alert(req_err)	
	  if (o_first_elt) o_first_elt.focus()	
	}
	
  return false 
}

function handle_multiple_select(o_form) {
  var o_elt
	var o_elt_hidden
  var o_option_elt
	var is_first_selected
	var k
  var j
	
	for (j = 0; j < o_form.length; j++) {
	  o_elt = o_form.elements[j]
		if (o_elt) {
		  if (o_elt.type == "select-multiple") {
		    // for multiple selections need to copy all selected values to a hidden field, if it's present
	      o_elt_hidden = o_form[o_elt.name + "_hidden"]
			  if (o_elt_hidden) {
			    o_elt_hidden.value = ""
				  is_first_selected = true
	        // alert(o_elt.name + ":" + o_elt.type + ":" + o_elt.selectedIndex + "!" + o_elt.options.length)
				  for (k = 0; k < o_elt.options.length; k++) {
				    o_option_elt = o_elt.options[k]
					  if ( (o_option_elt) && (o_option_elt.selected) ) {
					    if (is_first_selected) {
					      o_elt_hidden.value = o_option_elt.value
							  is_first_selected = false
						  } else {  
					      o_elt_hidden.value = o_elt_hidden.value + "|" + o_option_elt.value
						  }
						}
					}
					// alert(o_elt_hidden.value)
				}
      }
		}
	}
	
	return
}