//Script for mapcoord.htm
//by Glenn Messersmith, GlennMessersmith.com
//licensed under Creative Commons GPL
//http://creativecommons.org/licenses/GPL/2.0/
//12/08 - fixed polyline drawing issues due to API change returning separate coords for map and overlay clicks
//        also removing empty overlay really causes an error now

  var map;				//Google map object
  var icon0;			//point icon definition
  var iconv;			//vertex icon definition
  var colist = "";		//coord list in text box
  var first = true;		//flag for first coord in text box
  var plstart = true;		//flag for polyline start
  var plverts = new Array();	//vertex coord array
  var oldpl;			//old polyline to remove
  var oldrb;			//old rubberband to remove
  var oldverts;			//previous polyline vertices used for dragging
  var iconb;			//black cross
  var cenicon;			//instance of center target marker
  var lenpl=0.0;			//length of current polyline
  var oldpt;			//start point of dragging marker
  //executed when page loads - setup map
  function load() {
    if (GBrowserIsCompatible()) {

      //setup map
      map = new GMap2(document.getElementById("map"), {draggableCursor: 'crosshair', draggingCursor: 'move'});
      map.setCenter(new GLatLng(39.2241764, -98.5420115),4);
      map.addControl(new GLargeMapControl());
      map.addControl(new GScaleControl());

      //define icons
      icon0 = new GIcon();		//an X marks the spot
      icon0.image = "pick.png";
      icon0.shadow = "pickshad.png";
      icon0.shadowSize = new GSize(26, 26);
      icon0.infoWindowAnchor = new GPoint(17, 6);
      icon0 = set2Anchors(icon0, 9, 16, 21, 26);

      iconv = new GIcon();		//little square vertex marker
      iconv.image = "node.png";
      iconv.shadow = "nodeshad.png";
      iconv.shadowSize = new GSize(16, 16);
      iconv.infoWindowAnchor = new GPoint(8, 7);
      iconv = set2Anchors(iconv, 4, 11, 10, 16);
      
      iconb = new GIcon();		//define black crosshair center target icon
      iconb.image = "xhairb.png";
      iconb.iconSize = new GSize(11, 11);
      iconb.iconAnchor = new GPoint(5, 5);
      iconb.infoWindowAnchor = new GPoint(5, 0);

      setCtrMark();					//set center mark

      //setup event listeners
      GEvent.addListener(map, "mousemove", function(ltlg) {
        rubband(ltlg);		//draw rubber band line if making pline
      });
      GEvent.addListener(map, "click", function(ovl, coo, cooo) {
        if (ovl){
          clicked(cooo);	//clicked on overlay
        }else{
          clicked(coo);		//clicked on map
        }
      });
      GEvent.addListener(map, "drag", function() {
        cenicon.setPoint(map.getCenter());	//keep center mark in center
      });
      GEvent.addListener(map, "moveend", function() {
        cenicon.setPoint(map.getCenter());	//keep center mark in center
        //get data from map view change
        var ctr = map.getCenter();
        var zoo = map.getZoom();
        document.getElementById("cent").innerHTML = "<textarea rows='1' cols='70'>map.setCenter(new GLatLng(" +
          ctr.toUrlValue() + ")," + zoo.toString() + ");<\/textarea>";
      });
    }//End If
  }//fn Load

  //sets iconSize, iconAnchor and dragCrossAnchor - assumes dragCrossImage offset is (7,8)
  //--pass ic as GIcon object, ax & ay as integers for iconAnchor offsets
  //  sx & sy as integers for iconSize
  function set2Anchors (ic, ax, ay, sx, sy) {
      ic.iconSize = new GSize(sx, sy);
      ic.iconAnchor = new GPoint(ax, ay);
      ic.dragCrossAnchor = new GPoint(7,8);//pre 2.60:(7-sx+ax, 8-sy+ay);
      return ic;
  }//fn set2Anchors

  //set or move center marker
  function setCtrMark() {
      var mctr = map.getCenter();
      if (!cenicon){
        cenicon = new GMarker(mctr, {icon: iconb, clickable: false});
        map.addOverlay(cenicon); 
      }else{
        cenicon.setPoint(mctr);
      }
  }//fn setCtrMark

 //display coordinates
 function displayCoo(coo){
  if (coo){
    colist = colist + (first ? "(" : ", (") + coo.toUrlValue() + ")";
  }else{}
    if (first){first = false};
    document.getElementById("coords").innerHTML ="<textarea id='ctxt' rows='3' cols='40'>" +
      colist + "<\/textarea>";
    //select coords
    document.Form1.ctxt.focus();
    document.Form1.ctxt.select();
}

 //when user clicks on map...
  function clicked(coo) {

    var polyline;
    var theone;

    //determine radio selection
    for (i=0;i<document.mode.entity.length;i++){	
      if (document.mode.entity[i].checked==true){
        theone=i;
        break; //exit from loop, as target acquired.
      }
    }

    displayCoo(coo);

    //action based on radio selection
    switch (theone){
      case 0:		//draw point
        var myMarker = new GMarker(coo, {icon: icon0, draggable: true});
        map.addOverlay(myMarker); 
        myMarker.enableDragging();
        GEvent.addListener(myMarker, "dragend", function() {
          displayCoo(myMarker.getPoint());
        });
        break;
      case 1:		//draw pline
	  if (plverts.length > 0){
          lenpl += coo.distanceFrom(plverts[plverts.length-1]);
        }
        document.getElementById("pllen").innerHTML = lenpl.toFixed(0);
        plverts.push(coo);
        if (plstart){	
          plstart = false;
        }else{
          map.removeOverlay(oldpl);		//remove old segments
        }
  	  polyline = new GPolyline(plverts, "#0000ff", 5, 0.50);
        map.addOverlay(polyline);		//redraw with new segment
        oldpl = polyline;
        //draw vertex
        var myMarker = new GMarker(coo, {icon: iconv, draggable: true});
        map.addOverlay(myMarker); 
        GEvent.addListener(myMarker, "dragstart", function() {
          oldpt = myMarker.getPoint();	//save start point
        });
        GEvent.addListener(myMarker, "dragend", function() {
          updatepl(oldpt,myMarker.getPoint());
        });
        break;
      default:
        alert("Should not be able to get here");
    }
  }//fn clicked

  //updates polyline if vertex dragged
  //only works for last pline drawn
  function updatepl(old, nu) {
    //find old coords in old vertex list
   for (i=0; i<oldverts.length; i++) {
      if (oldverts[i]==old) {
        //splice in new
        oldverts.splice(i, 1, nu);
        break;
      }
    }
    //oldverts now has the new vertices list
    map.removeOverlay(oldpl);		//remove old segments
    polyline = new GPolyline(oldverts, "#0000ff", 5, 0.50);
    map.addOverlay(polyline);		//redraw with new segment
    oldpl = polyline
  }

  //draws rubber band line from end of pline to cursor
  function rubband(ltlg) {
    var polyline;
    if (!plstart) {
      map.removeOverlay(oldrb);
    }
    polyline = new GPolyline([plverts[plverts.length-1], ltlg], "#888888", 2, 1.00);
    map.addOverlay(polyline);
    oldrb = polyline;
  }//fn rubband

  //Stop drawing current polyline
  function plstop() {
    plstart = true;
    lenpl = 0.0;
    oldverts = plverts;
    plverts = new Array();
    map.removeOverlay(oldrb);
    displayCoo(false);
  }//fn plstop

  //Clear all marks from map & coords from text box
  function clrmarks() {
    map.clearOverlays();
    document.getElementById("coords").innerHTML ="<textarea id='ctxt' rows='3' cols='40'><\/textarea>";
    colist = "";
    first = true;
    plstart = true;
  }//fn clrmarks

  //keypress handler
  function mapkeyed(e){
    var keynum;

    if(window.event) //IE
      {
        keynum = e.keyCode;
      }
      else if(e.which) //Netscape/Firefox/Opera
      {
        keynum = e.which;
      }
    if (keynum==27 || keynum==32 || keynum==13) {
      window.setTimeout('plstop()',100); //allow key handler to clear before setting focus
      e=false;
    }
    return e;
  }


