// This module requires /common.js

function doAjax()
{
  g_http = makeXMLHttpRequest();  // MSIE breaks if we don't re-create each time

  if(!g_http)
  {
    // Not using Ajax
    return;
  }

  var query = "";

  // Turn form into a query string
  var form = document.getElementById("form");
  for(var i = 0; i < form.elements.length; i++)
  {
    var elem = form.elements[i];
    switch(elem.type)
    {
      case 'radio':
      case 'checkbox':
        if(elem.checked)
        {
          query += '&' + elem.name + '=' + elem.value;
        }
        break;

      case 'text':
        query += '&' + elem.name + '=' + elem.value;
        break;
    }
  }

  // Change first '&' into a '?'
  query = "?" + query.substr(1);

  // Show password
  g_http.onreadystatechange = onReadyStateChange;
  g_http.open("GET", "/tools/metroid-pw/impl.php" + query, true);
  g_http.send(null);
}

function onReadyStateChange(evt) {
  if(g_http.readyState == 4 /* completed */)
  {
    if(g_http.status == 200)
    {
      // FIXME: innerHTML
      document.getElementById("password").innerHTML = g_http.responseText;
    }
    else
    {
      // FIXME: innerHTML
      document.getElementById("password").innerHTML =
        "<strong><p>" + g_http.status + " error; could not use Ajax!</p></strong>";
    }
  }
}

function validate(form)
{
  var missiles = form.missiles.value;
  var time = form.time.value;

  if(!isAllDigits(missiles) || missiles < 0 || missiles > 255)
  {
    alert("The number of missiles must be a number from 0 to 255.");
    return false;
  }

  if(!isAllDigits(time) || time < 0 || time > 3489661134)
  {
    alert("The amount of time must be a number from 0 to 3,489,661,134.");
    return false;
  }

  return true;
}

// Checks to see if a string is all digits
function isAllDigits(string)
{
  for(var i = 0; i < string.length; i++)
  {
    if(string.charAt(i) < '0' || string.charAt(i) > '9')
    {
      return false;
    }
  }
  return true;
}

function approxTime(time)
{
  time = time.value;
  var approx = document.getElementById("approx");
  if(!isAllDigits(time) || time < 0 || time > 3489661134)
  {
    // FIXME: innerHTML
    approx.innerHTML = "invalid";
  }
  else
  {
    var seconds = time*256/60;
    var minutes = seconds/60;
    seconds %= 60;
    var hours = minutes/60;
    minutes %= 60;

    seconds = parseInt(seconds, 10);
    minutes = parseInt(minutes, 10);
    hours = parseInt(hours, 10);

    if(seconds < 10)
    {
      seconds = "0" + seconds;
    }
    if(minutes < 10)
    {
      minutes = "0" + minutes;
    }

    // FIXME: innerHTML
    approx.innerHTML = hours + ':' + minutes + ':' + seconds;
  }
}

// The "old" version
//function setAll(node, is_checked)
//{
//  if(node.nodeType == 1 /* element */ &&
//     node.getAttribute("type") == "checkbox")
//  {
//    node.checked = is_checked;
//  }
//  else
//  {
//    // Recurse through children
//    for(var obj = node.firstChild; obj !== null; obj = obj.nextSibling)
//    {
//        setAll(obj, is_checked);
//    }
//  }
//}

function setAll(parent_id, is_checked)
{
  var elements = document.getElementById("form").elements;
  for(var i = 0; i < elements.length; i++)
  {
    var elem = elements[i];
    if(elem.type == 'checkbox')
    {
      if(parent_id === null || parent_id == elem.parentNode.getAttribute("id"))
      {
        elem.checked = is_checked;
      }
    }
  }
}


function clearAll()
{
  setAll(null, false);
  document.getElementById("brinstar").checked = true;
  document.getElementById("missiles").value = "0";
  document.getElementById("time").value = "0";
  doAjax();
}

function IWantItAll()
{
  setAll(null, true);
  document.getElementById("missiles").value = "255";
  document.getElementById("time").value = "0";
  doAjax();
}

function main()
{
  // Remove reset button (it's going to get replaced)
  var reset = document.getElementById("reset");
  reset.parentNode.removeChild(reset);

  // FIXME: change from innerHTML to DOM sometime
  var jslinks = document.getElementById("jslinks");
  jslinks.innerHTML += ' <input type="button" onclick="clearAll()" value="Clear all">';
  jslinks.innerHTML += ' <input type="button" onclick="setAll(\'items\', true); doAjax()" value="Items">';
  jslinks.innerHTML += ' <input type="button" onclick="setAll(\'etanks\', true); doAjax()" value="Energy">';
  jslinks.innerHTML += ' <input type="button" onclick="setAll(\'mtanks\', true); doAjax()" value="Missiles">';
  jslinks.innerHTML += ' <input type="button" onclick="setAll(\'doors\', true); doAjax()" value="Doors">';
  jslinks.innerHTML += ' <input type="button" onclick="IWantItAll()" value="I want it all!">';

  // Make it so that time approximation displays for initial state
  approxTime(document.getElementById("time"));


  // Assume no Ajax and print according message
  // (if we have Ajax, this will get overwritten)
  // FIXME: innerHTML
  document.getElementById("version").innerHTML = "You’re using the JavaScript version.";


  // Ajax stuff
  g_http = makeXMLHttpRequest();    // global!

  if(g_http)
  {
    // Submit button not needed with Ajax, so delete it
    var submit = document.getElementById("submit");
    submit.parentNode.removeChild(submit);

    // Show "You have Ajax" message
    // FIXME: innerHTML
    document.getElementById("version").innerHTML = "You’re using the Ajax version.";

    // Show initial password
    doAjax();
  }
}
