var LastMarker;
var listeners;
var polyl;
var lineCounter_ = 0;
var shapeCounter_ = 0;
var markerCounter_ = 0;
var colorIndex_ = 0;
var featureTable_;
var map = null;
var geocoder = null;
var rmarkers = new Array();
var markers = new Array();
function roundNumber(num, dec) {
	var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
	return result;
}
function initialize() {

      if (GBrowserIsCompatible()) {

		map = new GMap2(document.getElementById("map_canvas"));
		
		 mini = new GOverviewMapControl();
		 
		 mapControl = new GHierarchicalMapTypeControl();

        map.setCenter(new GLatLng(38.6,-98), 4);

        mapControl.clearRelationships();
        mapControl.addRelationship(G_SATELLITE_MAP, G_HYBRID_MAP, "Labels", true);
        map.enableScrollWheelZoom();
        map.enableContinuousZoom();
        map.addControl(mapControl);
        map.addMapType(G_PHYSICAL_MAP);
        map.addControl(new GLargeMapControl3D());
        map.addControl(new GScaleControl());
        map.addControl(mini);

        var MapDiv = document.getElementById("map_canvas");

        var CopyrightDiv = MapDiv.firstChild.nextSibling;

        var CopyrightImg = MapDiv.firstChild.nextSibling.nextSibling;

        CopyrightDiv.style.display = "none";

        CopyrightImg.style.display = "none";

		geocoder = new GClientGeocoder();

        featureTable_ = document.getElementById("featuretbody");
              select("hand_b");
		gdir = new GDirections(null,document.getElementById("directions"));
		
      }

    }
    
var COLORS = [["red", "#ff0000"], ["orange", "#ff8800"], ["green","#008000"],
              ["blue", "#000080"], ["purple", "#800080"]];
var options = {};


function select(buttonId) {
  document.getElementById("hand_b").className="unselected";
  document.getElementById("shape_b").className="unselected";
  document.getElementById("line_b").className="unselected";
  document.getElementById("placemark_b").className="unselected";
  document.getElementById(buttonId).className="selected";
}

function stopEditing() {
if(listeners){GEvent.removeListener(listeners);}
   select("hand_b");
}

function getColor(named) {
  return COLORS[(colorIndex_++) % COLORS.length][named ? 0 : 1];
}

function getIcon(color) {
  var icon = new GIcon();
  icon.image = "http://google.com/mapfiles/ms/micons/" + color + ".png";
  icon.iconSize = new GSize(32, 32);
  icon.iconAnchor = new GPoint(15, 32);
  return icon;
}

function startShape() {
  select("shape_b");
  var color = getColor(false);
  var polygon = new GPolygon([], color, 2, 0.7, color, 0.2);
  startDrawing(polygon, "Shape " + (++shapeCounter_), function() {
    var cell = this;
    var area = polygon.getArea();
    cell.innerHTML = (Math.round(area / 10000) / 100) + "km<sup>2</sup>";
  }, color);
}

function startLine() {
  select("line_b");
  var color = getColor(false);
  var line = new GPolyline([], color);
  startDrawing(line, "Line " + (++lineCounter_), function() {
    var cell = this;
    var len = line.getLength();
    cell.innerHTML = (Math.round(len / 10) / 100) + "km";
  }, color);
}

function addFeatureEntry(name, color) {
  currentRow_ = document.createElement("tr");
  var colorCell = document.createElement("td");
  currentRow_.appendChild(colorCell);
  colorCell.style.backgroundColor = color;
  colorCell.style.width = "1em";
  var nameCell = document.createElement("td");
  currentRow_.appendChild(nameCell);
  nameCell.innerHTML = name;
  var descriptionCell = document.createElement("td");
  currentRow_.appendChild(descriptionCell);
  featureTable_.appendChild(currentRow_);
  return {desc: descriptionCell, color: colorCell};
}

function startDrawing(poly, name, onUpdate, color) {
  map.addOverlay(poly);
  poly.enableDrawing(options);
  poly.enableEditing({onEvent: "mouseover"});
  poly.disableEditing({onEvent: "mouseout"});
  GEvent.addListener(poly, "endline", function() {
    select("hand_b");
    var cells = addFeatureEntry(name, color);
    GEvent.bind(poly, "lineupdated", cells.desc, onUpdate);
    GEvent.addListener(poly, "click", function(latlng, index) {
      if (typeof index == "number") {
        poly.deleteVertex(index);
      } else {
        var newColor = getColor(false);
        cells.color.style.backgroundColor = newColor
        poly.setStrokeStyle({color: newColor, weight: 4});
      }
    });
  });
}

function placeMarker() {
  select("placemark_b");
    var listener = GEvent.addListener(map, "click", function(overlay, latlng) {
    listeners = listener;
    if (latlng) {
      var color = getColor(true);
      var marker = new GMarker(latlng, {icon: getIcon(color), draggable: true});
      rmarkers.push(marker);
      var points = marker.getLatLng();
      var spot = markers.push(points);
      map.addOverlay(marker);
      var cells = ++markerCounter_;
      updateMarker(marker);
      GEvent.addListener(marker, "dragend", function() {
        updateMarker(marker, false, spot);
      });
      GEvent.addListener(marker, "click", function() {
        updateMarker(marker, true);
      });
    }
  });
}

function updateMarker(marker, opt_changeColor, moved) {
  if (moved){markers[moved-1] = marker.getLatLng();}
  if (opt_changeColor) {
    var color = getColor(true);
    marker.setImage(getIcon(color).image);
  }else{
    if(markerCounter_ > 1 && markerCounter_ <= 25){GetDistance();}
  }
}

function GetDistance() {
if(polyl){map.removeOverlay(polyl)}
var var_name = $("input[name='legDraw']:checked").val();
switch(var_name) {
	case "fly":
	polyl = new GPolyline(markers);
	map.addOverlay(polyl);
	LoadDistance();
	break;
	case "drive":
	gdir.loadFromWaypoints(markers,{getPolyline:true,travelMode:G_TRAVEL_MODE_DRIVING});
	break;
	case "run":
	gdir.loadFromWaypoints(markers,{getPolyline:true,travelMode:G_TRAVEL_MODE_WALKING});
	break;
}
GEvent.addListener(gdir, "load", onGDirectionsLoad);
}
function onGDirectionsLoad() {
polyl = gdir.getPolyline();
map.addOverlay(polyl); 
LoadDistance();
}

function LoadDistance() {
var var_name = $("input[name='units']:checked").val();
var var_name2 = $("input[name='legDraw']:checked").val();

if(markerCounter_ > 1)
{
	if(var_name2 == "fly") {
	var dist = polyl.getLength();
}else{
	var dist = gdir.getDistance().meters;
}
if (var_name == "1")
{
$("input#mileage").val(roundNumber((dist / 1000),2));
}else{
$("input#mileage").val(roundNumber((dist / 1609.344),2));
}
}else{$("input#mileage").val('0');}
}
function RemoveLast() {
if(markerCounter_){
--markerCounter_;
markers.pop();
map.removeOverlay(rmarkers.pop());
GetDistance();
LoadDistance();
}
}
function eC(M){
	if(M=='METRIC'){
		document.getElementById("dstUnits1").innerHTML="km";
		
		}else if(M=='ENGLISH'){
			document.getElementById("dstUnits1").innerHTML="miles";
			
			}
		LoadDistance();
}
function handleUnitToggle(M){
	//hl(M);
	eC(M); //change units on table
	//bz();
	//aq(o);
	//elevationSwitch(bg);
}
function completeThereAndBackCourse() {
	var tmpMarkers = markers;
	var tmpMarkersR = markers;
	tmpMarkersR.reverse();
	markers = tmpMarkers.concat(tmpMarkersR);
	GetDistance();
	markers = tmpMarkers;
}
function ResetAll() {
	markers = null;
	rmarkers = null;
	polyl = null;
	markerCounter_ = 0;
	$("input#mileage").val('0');
	map.clearOverlays();
	rmarkers = new Array();
    markers = new Array();
	map.setCenter(new GLatLng(38.6,-98), 4);
}
function CenterMap(address) {
      if (geocoder) {
        geocoder.getLatLng(
          address,
          function(point) {
            if (!point) {
              alert(address + " not found");
            } else {
              map.setCenter(point, 13);
            }
          }
        );
      }
    }
function GeoPoint(address) {
      if (geocoder) {
        geocoder.getLatLng(
          address,
          function(point) {
            if (!point) {
              alert(address + " not found");
            } else {
	  map.setCenter(point, 13);
      var color = getColor(true);
      var marker = new GMarker(point, {icon: getIcon(color), draggable: true});
      rmarkers.push(marker);
      var points = marker.getLatLng();
      var spot = markers.push(points);
      map.addOverlay(marker);
      var cells = ++markerCounter_;
      updateMarker(marker);
      GEvent.addListener(marker, "dragend", function() {
        updateMarker(marker, false, spot);
      });
      GEvent.addListener(marker, "click", function() {
        updateMarker(marker, true);
      });
            }
          }
        );
      }
    }
