var prev_req_fields = new Array();
var submit_started = false;

function checkRequiredFields(form){
  if (submit_started) {
    alert('You have already submitted the form. Please wait...');
    return false;
  }
  submit_started = true;
  
  if (form.getAttribute) {
    var elems = form.elements;
    var errors = '';
    var first_error = null;
    var radio_selected;
    var field_bad;
    var group_start;
    var next_req;
        
    for (var e = 0; e < elems.length; e++) {
      if (!elems[e].offsetParent) {
        continue;
      }
      group_start = e;
      req = elems[e].getAttribute('required_field');
      if (req != null && req != '') {
        field_bad = false;
        if (req == "E-mail" && elems[e].value != "") {
          re=/\s+/g;
          elems[e].value = elems[e].value.replace(re, "");
          re = /^(?:[\''\w\-\.]+@[\w\-\.]+?\.\w+|\[\w+\])$/;
          if (!elems[e].value.match(re)) {
            field_bad = true;
            req += ' in format: username@domain';
          }
        } else if (elems[e].type.indexOf('select') > -1) {
          field_bad = (elems[e].selectedIndex < 0 || elems[e].options[elems[e].selectedIndex].value=='');
        } else if (elems[e].type == 'radio') {
          radio_selected = elems[e].checked;
          while (elems[e + 1] && elems[e + 1].name == elems[e].name) {
            ++e;
            if (!radio_selected) {
              radio_selected = elems[e].checked;
            }
          }
          field_bad = !radio_selected;
        } else if (elems[e].type == 'checkbox') {
          field_bad = !elems[e].checked;
          if (elems[e+1]) {
            next_req = elems[e+1].getAttribute('required_field');
            while (next_req == req) {
              ++e;
              if (next_req == req && elems[e].checked) {
                field_bad = false;
              }
              if (elems[e+1]) {
                next_req = elems[e+1].getAttribute('required_field');
              } else {
                next_req = '';
              }
            }
            if (next_req == 'IGNORE' && field_bad) {
              --e;
            }
          }
        } else {
          field_bad = (elems[e].value == '');
        }
        if (field_bad) {
          errors += '* ' + req + "\n";
          prev_req_fields[elems[e].name] = new Array(elems[e].offsetParent.style.border, elems[e].offsetParent.style.backgroundColor);
          for (var i=group_start; i<=e; i++) {
            if (elems[i].offsetParent) {
              elems[i].offsetParent.style.border="1px #fa7 solid";
              elems[i].offsetParent.style.backgroundColor="#ffd";
            }
          }
          if (first_error == null) {
            first_error = elems[group_start];
          }
        } else if (prev_req_fields[elems[e].name]) {
          for (var i=group_start; i<=e; i++) {
            if (elems[i].offsetParent) {
              elems[i].offsetParent.style.border=prev_req_fields[elems[e].name][0];
              elems[i].offsetParent.style.backgroundColor=prev_req_fields[elems[e].name][1];
            }
          }
        }
      }
    }
    if (errors != '') {
      alert("Please enter or correct these fields and click submit again:\n" + errors);
      if (first_error.focus) {
        first_error.focus();
      }
      submit_started = false;
      return false;
    }
  }
  return true;
}
