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

var cObject = new aprsOBJECT();
var objectMarkers = new Array();
var objectSymbol = new Object();
var numObjects = 0;
var killObject = false;

/**
 * aprsOBJECT::Toggle
 * 
 * Toggle tools functionality.
 * 
 */
function toggleOBJECT() {
   
  if (!cObject.isON()) {
    if (killObject)
      toggleKILL();

    if (cRuler.isON())
      toggleRULER();

    if (!isHidden('viewOverlay'))
      toggleVIEW();

    doPause('openaprs_form_pause');
    changeById('toolStatusOverlayMessage', 'Click on the map to create an object');
    showWindow('toolsOverlay');
    showWindow('toolStatusOverlay');
    showControl('controlCREATE', 'on');
    cObject.ON();
    map.setOptions({ disableDoubleClickZoom: true });
  } // if  
  else {
    showControl('controlCREATE', 'off');
    createObject = false;

    if (!cRuler.isON())
      unPause('openaprs_form_pause');

    cObject.OFF();    
    map.setOptions({ disableDoubleClickZoom: false });
  } // else
  
  return;
} // toggleOBJECT

/**
 * aprsOBJECT::Toggle
 * 
 * Toggle tools functionality.
 * 
 */
function toggleKILL() {

  if (!killObject) {
    if (cObject.isON())
      toggleOBJECT();

    if (cRuler.isON())
      toggleRULER();

    showWindow('killObjectOverlay');
    showControl('controlKILL', 'on');
    killObject = true;
  } // if  
  else {
    showControl('controlKILL', 'off');
    hideWindow('killObjectOverlay');
    killObject = false;
  } // else
  
  return;
} // toggleOBJECT

/**
 * clearOBJECTS
 * 
 * Clears all created objects.
 * 
 */
function clearOBJECTS() {
  cObject.Clear();
  
  return;
} // clearOBJECTS

function aprsOBJECT() {
  this.markers = new Array();
  this.handles = new Array();
  this.on = false;
} // aprsOBJECT::Constructor

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

  this.on = true;
  var handle;

  handle = google.maps.event.addListener(map, 'click', function(event) {
    var pnt = event.latLng;

    if (!pnt)
      return;

    var objectIcon = new google.maps.MarkerImage(
      '/images/icons/object.png',	// url
      new google.maps.Size(32,32),	// size
      new google.maps.Point(0,0),	// origin
      new google.maps.Point(16,16),	// anchor
      new google.maps.Size(32,32)	// scaledSize
    );
//    baseIcon.infoWindowAnchor = new google.maps.Point(10,0);
//    baseIcon.shadow = "http://www.openaprs.net/images/icons/shadow.png";

    var marker = new google.maps.Marker({
      position: pnt,
      icon: objectIcon,
      draggable: true
    });
    var numObject = numObjects;

    google.maps.event.addListener(marker, "drag", function() {
      pnt = marker.getPosition();
      changeById('toolStatusOverlayMessage', 'DRAG OBJECT: ' +pnt.lat().toFixed(6)+','+pnt.lng().toFixed(6));
      //marker.closeInfoWindow();
    });

    google.maps.event.addListener(marker, "click", function() {
      //marker.openInfoWindowHtml(this.html);
      doIcons(marker, numObject);
      changeById('toolStatusOverlayMessage', 'OBJECT: CLICK ON A SYMBOL TO CONTINUE');
    });

    google.maps.event.addListener(marker, "dblclick", function() {
      var new_markers = new Array();
      for(m in objectMarkers) {
        if (objectMarkers[m] == marker)
          continue;

        new_markers.push(objectMarkers[m]);
      } // for

      numObjects--;
      marker.setMap(null);
      objectMarkers = new_markers;
      changeById('toolStatusOverlayMessage', 'OBJECT: CLEARED');
    });

    numObjects++;
    objectMarkers.push(marker)
    marker.setMap(map);

    changeById('toolStatusOverlayMessage', 'OBJECT: CLICK ON AN OBJECT TO SET SYMBOL AND SEND');

  }); // function

  this.handles.push(handle);

} // aprsOBJECT::ON

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

aprsOBJECT.prototype.Clear = function() {

  for(m in objectMarkers) {
     objectMarkers[m].setMap(null);
  } // for

  numObjects = 0;
  objectMarkers = new Array()

  return;
} // aprsOBJECT::Clear

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

  for(h in this.handles)
    google.maps.event.removeListener(this.handles[h]);

  this.handles = new Array();
  this.on = false;

  return true;
} // aprsOBJECT::OFF

/** 
 * doIcons
 *
 * Load's a help article into the help window.
 *
 */   
aprsOBJECT.prototype.setIcon = function(id, icon, icon_id) {
  var objectIcon = new google.maps.MarkerImage(
    icon,				// url
    new google.maps.Size(32,32),	// size
    new google.maps.Point(0,0),		// origin
    new google.maps.Point(16,16),	// anchor
    new google.maps.Size(32,32)		// scaledSize
  );

  objectMarkers[id].setIcon(icon);
  objectSymbol[id] = icon_id;

  hideWindow('objectICONS'+id);
  showWindow('objectFORM'+id);

  changeById('toolStatusOverlayMessage', 'OBJECT: FILL OUT FORM AND CLICK CREATE OBJECT');

  return;
} // aprsOBJECT::setIcon

/** 
 * doIcons
 *
 * Load's a help article into the help window.
 *
 */   
function doIcons(marker, numObject) {
  var request = createXMLHttpRequest();
  var html = "<div id=\"markerMessage"+numObject+"\" class=\"markerMessage\"><b>Loading Icons</b><br /><br /><img src=\"http://www.openaprs.net/images/updating.gif\" width=\"24\" height=\"24\" /></div>";

  var infoWindow = new google.maps.InfoWindow({
    content: html
  });
  infoWindow.open(map, marker);

  var queryString = "/ajax/object/icons.php?q="+numObject;
  
  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++) {
        var html = "<div id=\"markerMessage"+numObject+"\" class=\"markerMessage\">"+retData[i]["message"]+"</div>";

        google.maps.event.addListener(marker, "click", function() {
          var infoWindow = new google.maps.InfoWindow({
            content: html
          });
          infoWindow.open(map, marker);
        });

        changeById('markerMessage'+numObject, retData[i]["message"]);
      } // for
    } // if
  
  } // function()
    
  request.send(null);
} // doIcons

/** 
 * doCreateObject
 *
 * Load's a help article into the help window.
 *
 */
function doCreateObject(id) {
  var request = createXMLHttpRequest();

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

  // reset error fields
  changeById('aprsOBJECT:Error:'+id, '');
  changeById('aprsOBJECT:Error:Name:'+id, '');
  changeById('aprsOBJECT:Error:Destination:'+id, '');
  changeById('aprsOBJECT:Error:ASC:'+id, '');
  changeById('aprsOBJECT:Error:Beacon:'+id, '');
  changeById('aprsOBJECT:Error:Life:'+id, '');
  changeById('aprsOBJECT:Error:Status:'+id, '');

  /**
   * Default Variables
   *
   * Span through the possible field values
   * and set our variable list accordingly.
   *
   */
  var ids = {
    "n": "aprsOBJECT:Form:Name:"+id,
    "d": "aprsOBJECT:Form:Destination:"+id,
    "c": "aprsOBJECT:Form:Course:"+id,
    "spd": "aprsOBJECT:Form:Speed:"+id,
    "a": "aprsOBJECT:Form:Altitude:"+id,
    "b": "aprsOBJECT:Form:Beacon:"+id,
    "o": "aprsOBJECT:Form:Overlay:"+id,
    "bl": "aprsOBJECT:Form:Life:"+id,
    "s": "aprsOBJECT:Form:Status:"+id
  }

  var dfts = {
    "n": "",
    "d": "APRS",
    "c": "0",
    "spd": "0",
    "a": "0",
    "b": "0",
    "o": "",
    "bl": "0",
    "s": ""
  }

  pnt = objectMarkers[id].getPosition();

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

  var queryString = "/ajax/object/do.php?m="+id+"&h="+seed+"&lat="+pnt.lat()+"&lon="+pnt.lng()+"&sym="+objectSymbol[id]+var_list;

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

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

      enableField('aprsOBJECT:Form:Submit:'+id);
    } // if
  
  } // function()
    
  request.send(null);
} // doCreateObject

/** 
 * doKillObject
 *
 * Load's a help article into the help window.
 *
 */
function doKillObject(id) {
  var request = createXMLHttpRequest();

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

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

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

  var dfts = {
    "n": ""
  }

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

  var queryString = "/ajax/object/kill.php?h="+seed+var_list;

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

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

      enableField('aprsOBJECT:Form:Submit');
    } // if
  
  } // function()
    
  request.send(null);
} // doKillObject


