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

var cRuler = new aprsRULER();
var rulerMarkers = new Array();
var numRulers = 0;

/**
 * aprsRULER::Toggle
 * 
 * Toggle tools functionality.
 * 
 */
function toggleRULER() {

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

    if (killObject)
      toggleKILL();

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

    changeById('toolStatusOverlayMessage', 'RULER: Click map to start');
    showWindow('toolsOverlay');
    showWindow('toolStatusOverlay');
    showControl('controlMEASURE', 'on');
    doPause('openaprs_form_pause');
    cRuler.ON();
    map.setOptions({ disableDoubleClickZoom: true });
  } // if  
  else {
    showControl('controlMEASURE', 'off');

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

    cRuler.OFF();    
    map.setOptions({ disableDoubleClickZoom: false });
  } // else
  
  return;
} // toggleRULER

/**
 * clearRULERS
 * 
 * Clears all created objects.
 * 
 */
function clearRULERS() {
  cRuler.Clear();
  
  return;
} // clearRULERS

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

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

  this.on = true;
  var handle;
  var me = this;

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

    var startIcon = new google.maps.MarkerImage(
      "/images/start.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
    );

    var stopIcon = new google.maps.MarkerImage(
      "/images/stop.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 numRuler = numRulers;

//    var marker1 = new google.maps.Marker({ position: pnt, icon:startIcon, draggable: true });
//    var marker2 = new google.maps.Marker({ position: pnt, icon:stopIcon, draggable: true });

    var marker1 = new MarkerWithLabel({
      position: pnt,
      icon:startIcon,
      draggable: true,
      labelContent: '0',
      labelClass: 'rulerLabel',
      labelAnchor: new google.maps.Point(16, -20)
    });

    var marker2 = new MarkerWithLabel({
      position: pnt,
      icon: stopIcon,
      draggable: true,
      labelContent: '0',
      labelClass: 'rulerLabel',
      labelAnchor: new google.maps.Point(16, -20)
    });

    var numObject = numObjects;
    //marker1.enableDragging();
    //marker2.enableDragging();

/* FIXME
    var label1 = new ELabel(pnt, '0',"rulerLabel",new google.maps.Size(8,25), 60);
    var label2 = new ELabel(pnt, '0',"rulerLabel",new google.maps.Size(8,25), 60);

    label1.setMap(map);
    label2.setMap(map);
*/
    var label1;
    var label2;

    marker1.setMap(map);
    marker2.setMap(map);

    var line = [marker1.getPosition(),marker2.getPosition()];
    var poly = new google.maps.Polyline({
      clickable: false,
      path: line,
      strokeColor: '#FFFF00',
      strokeWeight: 8,
      strokeOpacity: 1
    });
    poly.setMap(map);

    ruler = {
      "marker1": marker1,
      "marker2": marker2,
//      "label1": label1,
//      "label2": label2,
      "poly": poly
    };

    rulerMarkers[numRuler] = ruler;
    numRulers++;

    google.maps.event.addListener(marker1, "drag", function() {
      me.Measure(marker1, true, numRuler);
    });

    google.maps.event.addListener(marker2, "drag", function() {
      me.Measure(marker2, false, numRuler);
    });

    google.maps.event.addListener(marker1, "dblclick", function() {
      me.Remove(marker1);
    });

    google.maps.event.addListener(marker2, "dblclick", function() {
      me.Remove(marker2);
    });

    changeById('toolStatusOverlayMessage', 'RULER: DRAG THE START OR END POINT TO MEASURE A DISTANCE');

  }); // function

  this.handles.push(handle);

} // aprsRULER::ON

aprsRULER.prototype.Measure = function(marker, isFirst, numRuler) {
  var units = document.getElementById("openaprs_form_units");
  var lat1;
  var lon1;
  var lat2;
  var lon2;
  var line;
  var bearing;
  var pnt;
  var marker1 = rulerMarkers[numRuler]["marker1"];
  var marker2 = rulerMarkers[numRuler]["marker2"];
//  var label1 = rulerMarkers[numRuler]["label1"];
//  var label2 = rulerMarkers[numRuler]["label2"];
  var poly = rulerMarkers[numRuler]["poly"];

  if (!marker1 || !marker2 || units == null) {
    changeById('toolStatusOverlayMessage', 'DRAG RULER: An unknown error occurred.');
    return;
  } // if

  line = [marker1.getPosition(),marker2.getPosition()];
  lat1 = marker1.getPosition().lat();
  lon1 = marker1.getPosition().lng();
  lat2 = marker2.getPosition().lat();
  lon2 = marker2.getPosition().lng();
  bearing = Math.round(LatLon.bearing(lat1, lon1, lat2, lon2));

  d = google.maps.geometry.spherical.computeDistanceBetween(
    marker1.getPosition(),
    marker2.getPosition()
  );
  dist = d.toFixed(0)+"m";
    
  if(parseInt(dist)>10000)  
    dist = (parseInt(dist)/1000).toFixed(1)+"km";

  if (units != null) {
    if (units.value == 'imperial') {
      d = d * 3.2808399;
      if (d > 5280)
        dist = (d/5280).toFixed(1)+"mi";
      else
        dist = d.toFixed(0)+"ft";
    } // if
    else if (units.value == 'nautical') {
      d = d * 3.2808399;
      if (d > 6076.11549)
        dist = (d/6076.11549).toFixed(1)+"knots";
      else
        dist = d.toFixed(0)+"ft";
    } // if
  } // if

  marker1.set('labelContent', dist+' '+bearing+'&deg;');
  marker2.set('labelContent', dist);
//  label1.setContents(dist+' '+bearing+'&deg;');
//  label2.setContents(dist); 
//  label1.setPoint(marker1.getPosition());
//  label2.setPoint(marker2.getPosition());

  poly.setMap(null);

  poly = new google.maps.Polyline({
    clickable: false,
    path: line,
    strokeColor: '#FFFF00',
    strokeWeight: 8,
    strokeOpacity: 1
  });
  poly.setMap(map);
  rulerMarkers[numRuler]["poly"] = poly;

  pnt = marker.getPosition();
  changeById('toolStatusOverlayMessage', 'DRAG RULER: ' +pnt.lat().toFixed(6)+','+pnt.lng().toFixed(6));
}

aprsRULER.prototype.Remove = function(marker) {
  var newMarkers = new Array();

  for(m in rulerMarkers) {
    if (rulerMarkers[m]["marker1"] == marker 
        || rulerMarkers[m]["marker2"] == marker) {
      numRulers--;
      rulerMarkers[m]["marker1"].setMap(null);
      rulerMarkers[m]["marker2"].setMap(null);
//      rulerMarkers[m]["label1"].setMap(null);
//      rulerMarkers[m]["label2"].setMap(null);
      rulerMarkers[m]["poly"].setMap(null);
      continue;
    } // if

    newMarkers[m] = rulerMarkers[m];
  } // for

  rulerMakers = newMarkers;

  changeById('toolStatusOverlayMessage', 'RULER: CLEARED');
} // aprsRULER::Remove

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

aprsRULER.prototype.Clear = function() {

  for(m in rulerMarkers) {
     rulerMarkers[m]["marker1"].setMap(null);
     rulerMarkers[m]["marker2"].setMap(null);
//     rulerMarkers[m]["label1"].setMap(null);
//     rulerMarkers[m]["label2"].setMap(null);
     rulerMarkers[m]["poly"].setMap(null);
  } // for

  rulerMarkers = new Array();
  numRulers = 0;

  return;
} // aprsRULER::Clear

aprsRULER.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;
} // aprsRULER::OFF



