addEvent(window, 'load', init, false);

function init() {
  if (!Sarissa || !document.getElementById) return false;

  var formElements = document.getElementsByTagName('form');
  for (var i = 0; i < formElements.length; i++) {
    addEvent(formElements[i], 'submit', submitLogin, false);
  }
}

function submitLogin(e) {
  /* Cancel the submit event, and find out which form was submitted */
  knackerEvent(e);
  var target = window.event ? window.event.srcElement : e ? e.target : null;
  if (!target) return false;

  /* Fix for Firefox Issues */
  if (target.type != undefined)
    target = this;

  /* Check if this form is already in the process of being submitted.
   * If so, don't allow it to be submitted again. */
  if (target.ajaxInProgress) return false;

  /* Set up the request */
  var xmlhttp =  new XMLHttpRequest();
  if (target.name == 'currMemb' || target.name == 'newMemb')
    xmlhttp.open('POST', '/login/', true);
  else if (target.name == 'forgot')
    xmlhttp.open('POST', '/login/forgot/', true);
  else if (target.name == 'reset')
    xmlhttp.open('POST', '/login/forgot/' + target.elements['code'].value + '/', true);
  else
    return false;


  /* The callback function */
  xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4) {
      if (xmlhttp.status == 200)
        handleResponse(xmlhttp.responseXML, target);
      else
        alert("I'm sorry, an error has occured.");
    }
  }

  /* Send the POST request */
  xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  if (target.name == 'currMemb')
    xmlhttp.send('email=' + escape(target.elements['email'].value) + '&password=' + escape(target.elements['password'].value) + '&xml=1');
  else if (target.name == 'newMemb')
    xmlhttp.send('invite=' + escape(target.elements['invite'].value) + '&xml=1');
  else if (target.name == 'forgot')
    xmlhttp.send('email=' + escape(target.elements['email'].value) + '&xml=1');
  else if (target.name == 'reset')
    xmlhttp.send('pass1=' + escape(target.elements['pass1'].value) + '&pass2=' + escape(target.elements['pass2'].value) + '&xml=1');
  else
    return false;

  /* Add temporary feedback that the request has been sent */
  var loadingImg = document.createElement('img');
  loadingImg.src = '/images/working.gif';
  target.getElementsByTagName('span')[0].appendChild(loadingImg);

  /* Remove any error message. */
  var formElements = target.getElementsByTagName('div');
  for (var i = 0; i < formElements.length; i++) {
    if (formElements[i].className == 'login_error')
      formElements[i].innerHTML = '';
  }

  /* Disable form inputs. */
  var formElements = target.getElementsByTagName('input');
  for (var i = 0; i < formElements.length; i++) {
    if (formElements[i].className == 'button')
      formElements[i].className = 'button_disabled';
  }

  target.ajaxInProgress = true;
  
  return false;
}

function handleResponse(responseXML, target) {
    // Remove the loading image
    var loadingImg = target.getElementsByTagName('img')[0];
    loadingImg.parentNode.removeChild(loadingImg);

    // Check if it is valid
    if (responseXML.getElementsByTagName('valid')[0].firstChild.data == '1') {
      if (target.name == 'currMemb')
        window.location = '/';
      else if (target.name == 'newMemb')
        window.location = '/join/';
    } else {
      // Show error message.
      var formElements = target.getElementsByTagName('div');
      for (var i = 0; i < formElements.length; i++) {
        if (formElements[i].className == 'login_error')
          formElements[i].innerHTML = responseXML.getElementsByTagName('message')[0].firstChild.data;
      }

      // Enable form inputs
      var formElements = target.getElementsByTagName('input');
      for (var i = 0; i < formElements.length; i++) {
        if (formElements[i].className == 'button_disabled')
          formElements[i].className = 'button';
      }
    }

    // Free up the form to go again
    target.ajaxInProgress = false;
}