function validate() {
  var f = document.f;
  var alerts = new Array(), i=0;

  if(frozen) return; // because mozilla doesn't recognize disabled A elements

  // validate form fields
  if(bad(f.first_name) & bad(f.last_name)) alerts[i++] = "Please tell us your <u>first</u> and <u>last</u> name.";
  else if(bad(f.first_name)) alerts[i++] = "Please tell us your <u>first</u> name.";
  else if(bad(f.last_name)) alerts[i++] = "Please tell us your <u>last</u> name.";
  if(bad(f.phone)) alerts[i++] = "Please give us a <u>phone number</u> we can reach you at.";
  if(bad(f.email)) alerts[i++] = "Please enter your <u>email address</u> so we can reply.";
  if(bad(f.subject)) alerts[i++] = "Please provide a <u>subject</u> for this email.";
  if(blank(f['body'])) alerts[i++] = "You forgot to type a <u>message</u>.";

  // display problem box if necessary
  var oProblem = document.getElementById("problem");
  var oUL = oProblem.childNodes[2];
  oUL.innerHTML = ""; // clear alerts
  if(alerts.length) { // if necessary, show alerts in problem box
    for(i=0; i<alerts.length; i++)
      oUL.innerHTML += "<li>"+alerts[i]+"</li>\n"; // add alerts
    oProblem.style.display = "block"; // show problem box
    oProblem.scrollIntoView();
    return;
  } else oProblem.style.display = "none"; // hide problem box

  // the data is OK
  goTo(document.f, 'contact_submit.php'); // submit the form
  freeze(document.f); // prevent user from changing form data
  return;
}