/***************
 ** Variables **
 ***************/

var cFriends = new aprsFRIENDS();

/**
 * toggleFRIENDS
 * 
 * Toggle tools functionality.
 * 
 */
function toggleFRIENDS() {
   
  if (!cFriends.isON()) {
    changeById('toolStatusOverlayMessage', 'Friends Mode');
    showWindow('friendsOverlay');
    showControl('controlFRIENDS', 'on');
    windowControl('friendsOverlay');
    cFriends.ON();
    Drag.init(document.getElementById("friendsHandle"), document.getElementById("friendsOverlay"), null, null, null, null, true);
    changeById('miniFRIENDS', '');
  } // if  
  else {
    if (cFriends.isPAUSE())
      changeById('miniFRIENDS',
                 '<img src="/images/mini/off/friends.png" width="22" height="22" border="0" alt="Friend List is Paused" />');
    else
      changeById('miniFRIENDS',
                 '<img src="/images/mini/on/friends.png" width="22" height="22" border="0" alt="Friends List is Active" />');

    hideWindow('friendsOverlay');
    showControl('controlFRIENDS', 'off');
    cFriends.OFF();    
  } // else
  
  return;
} // toggleFRIENDS

/**
 * toggleFRIENDSPAUSE
 *
 * Toggle tools functionality.
 * 
 */
function toggleFRIENDSPAUSE() {

  if (cFriends.Pause())
    showControl('controlFRIENDSPAUSE', 'on');
  else
    showControl('controlFRIENDSPAUSE', 'off');

  return;
} // toggleFRIENDSPAUSE

function aprsFRIENDS() {
  this.on = false;
  this.loading = 0;
  this.pause = false;
  this.running = false;
} // aprsFRIENDS::Constructor

aprsFRIENDS.prototype.ON = function() {
  if (this.on)
    return;

  if (!this.running)
    this.Update();

  this.running = true;

  this.on = true;
} // aprsFRIENDS::ON

aprsFRIENDS.prototype.Message = function(callsign) {
  if (!cMessage.isON())
    toggleMESSAGING();

  changeFieldById('aprsMESSAGE:Form:Target', callsign);
} // aprsFRIENDS::Message

aprsFRIENDS.prototype.Pause = function() {

  if (this.pause) {
    this.pause = false;
    this.Refresh();
  } // if
  else
    this.pause = true;

  return this.pause;
} // aprsFRIENDS::ON

aprsFRIENDS.prototype.isPAUSE = function() {
  return this.pause;
} // aprsFRIENDS::isPAUSE

aprsFRIENDS.prototype.isON = function() {
  return this.on;
} // aprsFRIENDS::isON

aprsFRIENDS.prototype.OFF = function() {
  if (!this.on)
    return false;

  this.on = false;
} // aprsFRIENDS::OFF

/**
 * aprsFRIENDS::Update
 *
 * Update the currently displayed map.
 *
 */
aprsFRIENDS.prototype.Update = function(){
  // Load any new stations
  this.Refresh();

  // set the timer
  window.setTimeout('cFriends.Update()', 30000);
} // aprsFRIENDS::Update

/** 
 * aprsFRIENDS::Add
 *
 * Load's a help article into the help window.
 *
 */
aprsFRIENDS.prototype.Add = function() {
  var request = createXMLHttpRequest();
  var me = this;

  if (!loggedIn) {
    changeById('aprsFRIENDS:Error', 'You must be logged in to use this feature.');
    return;
  } // if

  // reset error fields
  changeById('aprsFRIENDS:Error', '');

  /**
   * Default Variables
   *
   * Span through the possible field values
   * and set our variable list accordingly.
   *
   */
  var ids = {
    "c": "aprsFRIENDS:Form:Callsign"
  }

  var dfts = {
    "c": ""
  }

  var var_list = createURI(document, false, ids, dfts);

  var queryString = "/ajax/friends/add.php?&h="
                    + seed
                    + var_list;

  disableField('aprsFRIENDS:Form:Add');
  
  request.open("GET", queryString, true);
  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      var xmlDoc = request.responseXML;
 

      var retData = new Array();
      xmlArray("/openaprs/reply", xmlDoc, retData);
      for (i=0; i < retData.length; i++) {
        if (retData[i]["done"] == "yes") {
          changeById('aprsFRIENDS:Error', retData[i]["response"]);
          ClearField('aprsFRIENDS:Form:Callsign');
        } // if
        else {
          if (retData[i]["field"] != 'aprsFRIENDS:Error')
            changeById('aprsFRIENDS:Error', 'There was an error processing your request.');

          changeById(retData[i]["field"], retData[i]["response"]);
        } // else
      } // for

      enableField('aprsFRIENDS:Form:Add');
      me.Refresh();
    } // if
  
  } // function()
    
  request.send(null);
} // aprsFRIENDS::Add

/** 
 * aprsFRIENDS::Remove
 *
 * Load's a help article into the help window.
 *
 */
aprsFRIENDS.prototype.Remove = function(callsign) {
  var request = createXMLHttpRequest();
  var me = this;

  if (!loggedIn) {
    changeById('aprsFRIENDS:Error', 'You must be logged in to use this feature.');
    return;
  } // if

  // reset error fields
  changeById('aprsFRIENDS:Error', '');

  var queryString = "/ajax/friends/remove.php?&h="
                    + seed
                    + "&c="
                    + encodeURIComponent(callsign);

  disableField('aprsFRIENDS:Form:Add');

  request.open("GET", queryString, true);
  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      var xmlDoc = request.responseXML;
 

      var retData = new Array();
      xmlArray("/openaprs/reply", xmlDoc, retData);
      for (i=0; i < retData.length; i++) {
        if (retData[i]["done"] == "yes")
          changeById('aprsFRIENDS:Error', retData[i]["response"]);
        else {
          if (retData[i]["field"] != 'aprsFRIENDS:Error')
            changeById('aprsFRIENDS:Error', 'There was an error processing your request.');

          changeById(retData[i]["field"], retData[i]["response"]);
        } // else
      } // for

      enableField('aprsFRIENDS:Form:Add');
      me.Refresh();
    } // if
  
  } // function()
    
  request.send(null);
} // aprsFRIENDS::Remove

/**
 * aprsFRIENDS::Refresh
 *
 * Redraws the current list of stations.
 *
 */
aprsFRIENDS.prototype.Refresh = function() {
  var request = GXmlHttp.create();
  var now = new Date();
  var me = this;

  // reset error messages
  //changeById('aprsFRIENDS:Error', '');

  if (!loggedIn) {
    clearRows('friendsTable');
    changeById('aprsFRIENDS:Error', 'You must be logged in to use this feature.');
    return;
  } // if

  // pause check must be before loading or it will never
  // unpause.
  if (this.pause) {
    changeById('friendsSTATUS', 'Paused');
    return;
  } // if

  if (this.loading)
    return;
  else
    this.loading = now.getTime();

  var queryString = "/ajax/friends/view.php?h="
                    + seed;

  changeById('friendsSTATUS', 'Updating');

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

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

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

      var retData = new Array();
      xmlArray("/openaprs/friends/friend", xmlDoc, retData);

      clearRows('friendsTable');

      for (i=0; i < retData.length; i++) {  
        var chatArray = [];

        var aCell = new cellStruct;
        aCell.text = retData[i]["image"];
        chatArray.push(aCell);

        var aCell = new cellStruct;
        aCell.text = retData[i]["link"];
        chatArray.push(aCell);

        var aCell = new cellStruct;
        aCell.text = retData[i]["remove"];
        chatArray.push(aCell);

        addRow2('friendsTable', chatArray.reverse());

      } // for

      var numFriends = retData.length;

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

      logById('logContainer', 'logTable', 'aprsFRIENDS: UPDATED (xml:'+diff.toRound(3)+' seconds)');
      changeById("friendsSTATS", numFriends +" friends (" + diff.toRound(3) +" secs)");
      changeById('friendsSTATUS', 'Idle');
      me.loading = 0;
    } // if
  } // function()

  request.send(null);
} // aprsFRIENDS::Refresh
