function load_page() {
  document.getElementById("algorithm").addEventListener("change",
                                                        algorithm_changed,
                                                        false);
  setup_options();
  algorithm_changed();
}

function algorithm_changed() {
  var algorithm = document.getElementById("algorithm").value;
  set_algorithm_options(algorithm);
}

function set_algorithm_options(algorithm) {
  var options = algorithm_options[algorithm];
  var parent = document.getElementsByClassName("details")[0];
  var labels = parent.getElementsByTagName("label");
  var controls = parent.getElementsByTagName("input");
  for (var i=0; i<labels.length; i++) {
    var option_applies = false;
    var label = labels[i];
    var control = controls[i];
    for (var j=0; j<options.length; j++) {
      if (options[j] == control.name) {
        option_applies = true;
        break;
      }
    }
    label.disabled = !option_applies;
    control.disabled = !option_applies;
    if (!option_applies) {
      control.checked = "true";
    }
  }
}


function setup_options() {
  var options = document.getElementsByClassName("details")[0];
  if (options.open === undefined) {
    var legend =  options.getElementsByClassName("legend")[0];
    legend.addEventListener("click", function() {toggle_options(options);},
                            false);
    var indicator = document.createElement("span");
    indicator.textContent = "▸";
    indicator.setAttribute("style", "margin-left:0.25em");
    legend.appendChild(indicator);
    options.setAttribute("data-open","true");
    toggle_options(options);
  }
}

function toggle_options(element) {
  var legend = element.getElementsByClassName("legend")[0];
  if (element.getAttribute("data-open") == "true") {
    var open = false;
  } else {
    var open = true;
  }
  for (var i=0; i<element.childNodes.length; i++) {
    if (element.childNodes[i].nodeType == document.ELEMENT_NODE &&
        element.childNodes[i] != legend) {
      element.childNodes[i].style.display = open ? "" : "none";
    }
  }
  legend.lastChild.textContent = open ? "▾" : "▸";
  element.setAttribute("data-open", open);
}