/**
 * Global Variables
 *
 */
var showingLoggedIn = false;
var hasSeed = false;
var loggedIn = false;
var seed = '';
var seed_id = 0;
var onLogout = new Array();

/**
 * getSeed
 *
 * Attempt to login.
 *
 */
function getSeed() {
  var request = createXMLHttpRequest();

  // only get a seed if we're not logged in or don't have one
  if (loggedIn || hasSeed)
    return false;

  var queryString = "/ajax/login.php?stage=seed";

  request.open("GET", queryString, true);
  request.onreadystatechange = function() {

    if (request.readyState == 4) {
      var xmlDoc = request.responseXML;
      var locations = xmlDoc.documentElement.getElementsByTagName("login");

      // No locations returned, error out.
      if (locations.length < 1) {
        logById('logContainer', 'logTable', 'LOGIN: No seed available');
        changeById('loginBox', 'Error no seed available.');
        return 0;
      } // if

      for (var i = 0; i < locations.length; i++) {
        seed_id = parseInt(locations[i].getAttribute("id"));
        seed = locations[i].getAttribute("seed");
        hasSeed = true;

        //logById('logContainer', 'logTable', 'LOGIN: Initialized (seed:'+seed+');
        //changeById('debug', 'Seed: '+seed+','+seed_id);
      } // for

      // since we found a seed if we already have a username
      // and password in cookies try and use them.
      var username = readCookie('myUsername');
      var password = readCookie('myPassword');
      if (username.length > 0 && password.length > 0) {
        logById('logContainer', 'logTable', 'LOGIN: Found cookies, attempting to authenticate automatically (YUM!  COOKIES!)');
        requestLogin(username, password);
      } // if

      enableField('openaprs_form_username');
      enableField('openaprs_form_password');
      enableField('openaprs_form_login');
    } // if
  } // function()

  request.send(null);
} // getSeed

/**
 * loginClicked
 *
 * Attempt to login.
 *
 */
function loginClicked() {
  var request = createXMLHttpRequest();
  var username = document.getElementById("openaprs_form_username");
  var password = document.getElementById("openaprs_form_password");
  var hash;

  if (loggedIn == true) {
    logById('logContainer', 'logTable', 'LOGIN: Already authenticated');
    changeById('loginBox', 'You are already logged in');
    return false;
  } // if

  if (username == null || password == null) {
    logById('logContainer', 'logTable', 'LOGIN: Username or password missing, unable to authenticate');
    changeById("loginBox", "Please enter a username and password");
    return false;
  } // if

  if (username.value.length < 1) {
    logById('logContainer', 'logTable', 'LOGIN: Username is not specified');
    changeById("loginBox", "Please enter a username");
    return false;
  } // if

  if (password.value.length < 1) {
    logById('logContainer', 'logTable', 'LOGIN: Password is not specified');
    changeById("loginBox", "Please enter a password");
    return false;
  } // if

  changeById("loginBox", "<i>updating</i>");

  hash = hex_md5(hex_md5(password.value) + seed);

  disableField('openaprs_form_login');

  requestLogin(username.value, password.value);
} // loginClicked

/**
 * requestLogin
 *
 * Attempt to login.
 *
 */
function requestLogin(username, password) {
  var request = createXMLHttpRequest();
  var start_date;
  var end_date;
  var diff;

  //logById('logContainer', 'logTable', 'LOGIN: Attempting to authenticate');
  changeById("loginBox", "updating");

  hash = hex_md5(hex_md5(password) + seed);

  disableField('openaprs_form_login');

  var queryString = "/ajax/login.php?stage=check&id="+seed_id+"&username=" + encodeURIComponent(username) + "&password=" + hash;

  // ### PROFILING: START
  start_date = new Date();

  request.open("GET", queryString, true);
  request.onreadystatechange = function() {

    if (request.readyState == 4) {
      var xmlDoc = request.responseXML;

      // ### PROFILING: END 
      var end_date = new Date();
      var diff = parseFloat((end_date.getTime()/1000) - (start_date.getTime()/1000));

      // try and save username and password if there are
      // in the cookies
      if (processLogin(xmlDoc, diff.toRound(3)) == true) {
        createCookie('myUsername', username, 365);
        createCookie('myPassword', password, 365);
      } // if

    } // if
  } // function()

  request.send(null);
} // requestLogin

/**
 * processLogin
 *
 *  Process the login response.
 *
 */
function processLogin(xmlDoc, diff) {
  var retData = new Array();

  xmlArray("/openaprs/user", xmlDoc, retData);
  for (i=0; i < retData.length; i++) {
    loggedIn = true;
    disableField('openaprs_form_username');
    disableField('openaprs_form_password');
    disableField('openaprs_form_login');
    enableField('openaprs_form_logout');
    showWindow('saveBox');
    logById('logContainer', 'logTable', 'LOGIN: Authentication successful, hello '+retData[i]["first"]+' (XML:'+diff+' seconds)');
    changeById('loginBox', 'Authentication successful, hello '+retData[i]["first"]);
    refreshSavedTracks();
    break;
  } // for

  if (retData.length < 1) {
    xmlArray("/openaprs/error", xmlDoc, retData);
    for (i=0; i < retData.length; i++) {
      logById('logContainer', 'logTable', 'LOGIN: Could not log you in (error:'+retData[i]['message']+' XML:'+diff+' seconds)');
      changeById('loginBox', retData[i]['message']);
    } // for

    enableField('openaprs_form_login');

    return false;
  } // else

  createCookie('myHash', seed, 1);
  return true;
} // processLogin

/**
 * resetLogin
 *
 * Resets login.
 *
 */
function resetLogin() {
  loggedIn = false;
  hasSeed = false;
  seed = '';
  seed_id = 0;
  getSeed();

  // perform onlogout functions
  for(f in onLogout)
    onLogout[f]()
} // resetLogin

/**
 * logout
 *
 * Logout of current session.
 *
 */
function logout() {
  var request = createXMLHttpRequest();
  var password = document.getElementById("openaprs_form_password");
  var username = document.getElementById("openaprs_form_username");

  eraseCookie('myHash');

  if (username == null || password == null)
    return;

  if (loggedIn == false)
    return;

  var queryString = "/ajax/login.php?stage=logout&hash="+seed;

  eraseCookie('myUsername');
  eraseCookie('myPassword');
  eraseCookie('myHash');

  resetLogin();

  request.open("GET", queryString, true);
  request.onreadystatechange = function() {

    if (request.readyState == 4) {
      var xmlDoc = request.responseXML;
      enableField('openaprs_form_username');
      enableField('openaprs_form_password');
      disableField('openaprs_form_logout');
      hideWindow('saveBox');
      hideWindow('savedTracksDisplay');
      logById('logContainer', 'logTable', 'LOGIN: You have been logged out');
      changeById('loginBox', 'You have been logged out');
    } // if
  } // function()

  request.send(null);
} // logout

/**
 * setupLogin
 *
 * To be called on page load, sets up the login script.
 *
 */
function setupLogin() {
  disableField('openaprs_form_username');
  disableField('openaprs_form_password');
  disableField('openaprs_form_logout');
  disableField('openaprs_form_login');

  getSeed();
} // setupLogin

/**
 * addEvent
 *
 * Function to add events to the page in a cross-browser manner.
 *
 */
function addEvent(objObject, strEventName, fnHandler) { 
  // DOM-compliant way to add an event listener 
  if (objObject.addEventListener) {
    objObject.addEventListener(strEventName, fnHandler, false); 
  } // if
  // IE/windows way to add an event listener 
  else if (objObject.attachEvent) {
    objObject.attachEvent('on' + strEventName, fnHandler); 
  } // else if
} // addEvent

addEvent(window,'load',setupLogin);
//addEvent(window,'unload',logout);

