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

var cMessage = new aprsMESSAGE();
blinkTimer["messaging"] = Array("Mini:Messaging:Image", 0, true);

/**
 * toggleMESSAGING
 * 
 * Toggle tools functionality.
 * 
 */
function toggleMESSAGING() {
   
  if (!cMessage.isON()) {
    changeById('toolStatusOverlayMessage', 'Messaging Mode');
    showWindow('messagingOverlay');
    showControl('controlMESSAGING', 'on');
    windowControl('messagingOverlay');
    cMessage.ON();
    Drag.init(document.getElementById("messagingHandle"), document.getElementById("messagingOverlay"), null, null, null, null, true);

    if (blinkTimer["messaging"][1] > 0) {
      clearTimeout(blinkTimer["messaging"][1]);
      blinkTimer["messaging"][1] = 0;
    } // if

    changeById('miniMESSAGING',
               '');
  } // if  
  else {
    if (cMessage.isPAUSE())
      changeById('miniMESSAGING',
                 '<img id="Mini:Messaging:Image" src="/images/mini/off/messaging.png" width="22" height="22" border="0" alt="APRS Messaging is Paused" />');
    else
      changeById('miniMESSAGING',
                 '<img id="Mini:Messaging:Image" src="/images/mini/on/messaging.png" width="22" height="22" border="0" alt="APRS Messaging is Active" />');

    hideWindow('messagingOverlay');
    showControl('controlMESSAGING', 'off');
    cMessage.OFF();
  } // else
  
  return;
} // toggleMESSAGE

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

  if (cMessage.Pause())
    showControl('controlMSGPAUSE', 'on');
  else
    showControl('controlMSGPAUSE', 'off');

  return;
} // toggleMSGPAUSE

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

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

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

  this.running = true;

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

aprsMESSAGE.prototype.Pause = function() {

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

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

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

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

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

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

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

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

/** 
 * aprsMESSAGE::Click
 *
 * Load's a help article into the help window.
 *
 */
aprsMESSAGE.prototype.Click = function() {
  this.Create();
} // aprsMESSAGE::Click

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

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

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

  /**
   * Default Variables
   *
   * Span through the possible field values
   * and set our variable list accordingly.
   *
   */
  var ids = {
    "t": "aprsMESSAGE:Form:Target",
    "m": "aprsMESSAGE:Form:Message"
  }

  var dfts = {
    "t": "",
    "m": ""
  }

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

  var queryString = "/ajax/messaging/create.php?&h="
                    + seed
                    + var_list;

  disableField('aprsMESSAGE:Form:Submit');
  
  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('aprsMESSAGE:Error', retData[i]["response"]);
        else {
          if (retData[i]["field"] != 'aprsOBJECT:Error')
            changeById('aprsMESSAGE:Error', 'There was an error processing your request.');

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

      ClearField('aprsMESSAGE:Form:Message');
      enableField('aprsMESSAGE:Form:Submit');
      me.Refresh();
    } // if
  
  } // function()
    
  request.send(null);
} // aprsMESSAGE::Create

/**
 * aprsMESSAGE::Refresh
 *
 * Redraws the current list of stations.
 *
 */
aprsMESSAGE.prototype.Refresh = function() {
  var request = createXMLHttpRequest();
  var t = document.getElementById("aprsMESSAGE:Form:Timestamp");
  var l = 30;
  var now = new Date();
  var me = this;

  if (t == null)
    return;

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

  if (!loggedIn) {
    changeById('aprsMESSAGE: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('messagingSTATUS', 'Paused');
    return;
  } // if

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

  // set timezone information
  var tz = escape(readCookie('myTimezone'));

  if (tz.length < 1)
    tz = "America/Los_Angeles";

  if (l > 1000)
    l = 100;

  var queryString = "/ajax/messaging/view.php?h="
                    + seed
                    + "&t=" 
                    + t.value 
                    + "&l=" 
                    + l 
                    + "&tz=" 
                    + tz;

  changeById('messagingSTATUS', '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 call = "";

      var retData = new Array();
      xmlArray("/openaprs/messages/packet", xmlDoc, retData);

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

        if (retData[i]["action"] == "TO") {
          call = retData[i]["source"];
          call = retData[i]["link"];
          myClass = "from";
        } // if
        else {
          call = retData[i]["addressee"];
          call = retData[i]["link"];
          myClass = "to";
        } // else

        var aCell = new cellStruct;
        aCell.text = "<b>" + call + "</b>:";
        aCell.css_class = myClass;
        chatArray.push(aCell);

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

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

        var chatArray = [];

        var aCell = new cellStruct;
        aCell.text = "<i>(sent: " + retData[i]["date"] + ")</i>";
        aCell.colspan = 2;
        chatArray.push(aCell);

        addRow2('messagingTable', chatArray.reverse());
      } // for

      var numMessages = retData.length;

      maxScroll('messagingContainer');
      limitRows('messagingTable', 107);

      /**
       * Update the status window.
       *
       */
      var retData = new Array();
      xmlArray("/openaprs/reply", xmlDoc, retData);

      for (i=0; i < retData.length; i++) {  
        // Change chat menu bottom background color.
        //if (retData[i]["sequence"] > document.form_chat.chat_sequence.value && blinkTimerId == 0)
        if (numMessages > 0) {
          changeTopMESSAGE('<span style="color: red">Unread APRS Messages</span>');
          if (!me.isON())
            blinkIMG("messaging", 800, "/images/mini/on/messaging.png", "/images/mini/blink/blank.png");
        } // if

        if (retData[i]["timestamp"] != undefined)
          changeFieldById('aprsMESSAGE:Form:Timestamp', retData[i]["timestamp"]);
      } // for

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

      logById('logContainer', 'logTable', 'aprsMESSAGE: UPDATED (xml:'+diff.toRound(3)+' seconds)');
      changeById("messagingSTATS", "Results " + numMessages +" messages (" + diff.toRound(3) +" secs)");
      changeById('messagingSTATUS', 'Idle');
      me.loading = 0;
    } // if
  } // function()

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

