
function validate() {
  var form = document.getElementById("submission_form");
  var data = new Object();
  var menus = form.getElementsByTagName("select");
  for (var i = 0; i < menus.length; i++) {
    var m = menus[i];
    m.parentNode.parentNode.className = "";

    if (m.selectedIndex >= 0)
      data[m.name] = m.options[m.selectedIndex].value;
  }
  
  var inputs = form.getElementsByTagName("input");
  for (var i = 0; i < inputs.length; i++) {
    var input = inputs[i];
    var ancestorBase = (input.tagName == "INPUT" && input.getAttribute("type") == "checkbox") ? $("suggested_sessions") : input;
    ancestorBase.parentNode.parentNode.className = "";

    if (input.getAttribute("type").toLowerCase() == "checkbox" && !input.checked)
      continue;

    var name = input.name;
    var isMulti = false;
    if (name.indexOf("[]") == name.length - 2) {
      name = name.substr(0, name.length - 2);
      isMulti = true;
    }
    
    if (isMulti) {
      if (data[name] === undefined)
        data[name] = [input.value];
      else
        data[name].push(input.value);
    } else {
      data[name] = input.value;
    }
  }

  xmlRequest(form.getAttribute("base-uri") + "/xmlrpc.php", "validate", [data], makeHandler(function (res) {
    if (res.error) {
      var block = $("error-block");
      var msgs = [];
      if (res.required) {
        msgs.push("Please enter all required fields.");

        for (var j in res.required) {
          var elt = document.getElementById(res.required[j]);
          var ancestorBase = (elt.tagName == "INPUT" && elt.getAttribute("type") == "checkbox") ? $("suggested_sessions") : elt;
          ancestorBase.parentNode.parentNode.className = "error";
        }       
      }

      if (res.fields) {
        msgs = msgs.concat(mapObject(function(k, v) { return v; }, res.fields, true));

        for (var id in res.fields) {
          var elt = document.getElementById(id);
          var ancestorBase = (elt.tagName == "INPUT" && elt.getAttribute("type") == "checkbox") ? $("suggested_sessions") : elt;
          ancestorBase.parentNode.parentNode.className = "error";
        }
      }

      var ul = dom(["ul", {"class": "note"}, map(function (x) { return ["li", {}, [x]]; }, msgs)]);


      while (block.firstChild)
        block.removeChild(block.firstChild);
      window.scroll(0, 0);
      block.appendChild(ul);
      block.throb(5);
    } else {
      form.submit();
    }
  }));
}
