gUseMetric = false;
distanceMarkersOn = true;
distance_markers = new Array();
gIcons = new Array();

function showDistanceMarkers(zoom_level)
{
  if (distanceMarkersOn == false) { return; }

  interval = 5;
  if (zoom_level < 7) { interval = 50; }
  if (zoom_level >= 7 && zoom_level < 9) { interval = 20; }
  if (zoom_level >= 9 && zoom_level < 10) { interval = 10; }
  if (zoom_level >= 10 && zoom_level < 12) { interval = 5; }
  if (zoom_level >= 12 && zoom_level < 14) { interval = 2; }
  if (zoom_level >= 14) { interval = 1; }

  for (var i in distance_markers)
  {
    for (var j in distance_markers[i])
    {
      if (distance_markers[i][j] != undefined)
      {
        if (j % interval == 0)
          distance_markers[i][j].show();
        else
	  distance_markers[i][j].hide();
      }
    }
  }
}

function turn_on_distance_markers()
{
  distanceMarkersOn = true;
  showDistanceMarkers(map.getZoom());
}

function turn_off_distance_markers()
{
  for (var i in distance_markers)
  {
    for (var j in distance_markers[i])
    {
      distance_markers[i][j].hide();
    }
  }
  distanceMarkersOn = false;
}

function turn_on_segment_markers(which, zoom_level)
{
  interval = 5;
  if (zoom_level < 7) { interval = 50; }
  if (zoom_level >= 7 && zoom_level < 9) { interval = 20; }
  if (zoom_level >= 9 && zoom_level < 10) { interval = 10; }
  if (zoom_level >= 10 && zoom_level < 12) { interval = 5; }
  if (zoom_level >= 12 && zoom_level < 14) { interval = 2; }
  if (zoom_level >= 14) { interval = 1; }

  for (var j in distance_markers[which])
  {
    if (distance_markers[which][j] != undefined)
    {	
      if (j % interval == 0)
        distance_markers[which][j].show();
    }
  }
}

function turn_off_segment_markers(which)
{
    for (var j in distance_markers[which])
    {
      if (distance_markers[which][j] != undefined)
      {	
        distance_markers[which][j].hide();
      }
    }
}

// Color is not currently used
function createDistanceMarkers(points, distance, color, segmentID, units)
{
    total_distance = 0.0;
    distance_interval = Math.floor(distance)
    last_mile_marker = 0;
    marker_count = 0;

    if ( points.length < 2 ) { return; }

    if (units == "kilometers")
    {
      gUseMetric = true;
    }
    else
    {
      gUseMetric = false;
    }

    distance_markers[segmentID] = new Array();
    for (var i = 1; i < points.length; i++)
    {
      // get the distance for this segment
      segment_distance = m2mi(points[i - 1].distanceFrom(points[i]));
      previous_distance = total_distance;
      total_distance += segment_distance;
      
      // If the previous total distance after this point is added
      // takes us past the next marker, then we'll set up the markers
      if ( total_distance > (last_mile_marker + distance_interval) )
      {
	while (last_mile_marker + distance_interval < total_distance) 
	{
	  var number = last_mile_marker + distance_interval;
	  var options = new Object;
	  options.draggable = false;
	  options.icon = 
	    GetDistanceIcon(last_mile_marker + distance_interval);
	  last_mile_marker += distance_interval;
	  var point = 
	    CalculateDistanceMarkerLatLng(points[i - 1], 
					  points[i],
					  previous_distance,
					  last_mile_marker);
	  distance_markers[segmentID][number] = new GMarker(point, options);
	  map.addOverlay(distance_markers[segmentID][number]);
	  distance_markers[segmentID][number].hide();
	}
      }
    }
}

function CalculateDistanceMarkerLatLng(point0, point1, startDistance, number)
{
    var latDelta = point1.lat() - point0.lat();
    var lngDelta = point1.lng() - point0.lng();
    var segmentDistance = m2mi(point0.distanceFrom(point1));
    
    var distanceToMarker = number - startDistance;
    var percentageOfSegment = distanceToMarker / segmentDistance;
    
    latDelta = latDelta * percentageOfSegment;
    lngDelta = lngDelta * percentageOfSegment;
    
    var point = 
	new GLatLng(point0.lat() + latDelta,
		    point0.lng() + lngDelta);
    return point;
}
    
function GetDistanceIcon(number)
{
  if ( gIcons["Distance" + number] == undefined )
  {
    var Icon = new GIcon();
    Icon.image = "http://www.onemillionrevolutions.org/maps/images/distance/marker" + number + ".png";
    //Icon.shadow = "/images/balloons/shadow.png";
    //Icon.shadowSize = new GSize(22, 20);
    Icon.shadow = "http://www.onemillionrevolutions.org/maps/images/distance/mile_shadow.png";
    Icon.shadowSize = new GSize(34.0, 26.0);
    Icon.iconSize = new GSize(20.0, 26.0);
    //Icon.iconAnchor = new GPoint(10.0, 13.0);
    Icon.iconAnchor = new GPoint(10.0, 23.0);
    Icon.infoWindowAnchor = new GPoint(10.0, 13.0);
    Icon.infoShadowAnchor = new GPoint(18, 25);
    Icon.transparent = "http://www.onemillionrevolutions.org/maps/images/distance/markerTransparent.png";
    gIcons["Distance" + number] = Icon;
  }
  var distanceIcon = gIcons["Distance" + number];
  return distanceIcon;
}


function m2mi(meters)
{
    var miles = 0.0
    if ( gUseMetric == false ) {
	miles = (meters / 1000) * 0.621371192;
    }
    else {
	miles = (meters / 1000);
    }
    return miles;
}

function show_route(points, color, size)
{
  if (points.length > 0)
  {
    var chunk = 200; 
    if (points.length > chunk)
    {
      show_route(points.slice(0, chunk), color, size);
      show_route(points.slice(chunk), color, size);
    }
    else
    {
      map.addOverlay(new GPolyline(points, color, size));
    }
  }
}

// This function is from Google's polyline utility.
function decodeLine (encoded)
{
  var len = encoded.length;
  var index = 0;
  var array = [];
  var lat = 0;
  var lng = 0;

  while (index < len)
  {
    var b;
    var shift = 0;
    var result = 0;
    do 
    {
      b = encoded.charCodeAt(index++) - 63;
      result |= (b & 0x1f) << shift;
      shift += 5;
    } while (b >= 0x20);
    var dlat = ((result & 1) ? ~(result >> 1) : (result >> 1));
    lat += dlat;

    shift = 0;
    result = 0;
    do
    {
      b = encoded.charCodeAt(index++) - 63;
      result |= (b & 0x1f) << shift;
      shift += 5;
    } while (b >= 0x20);
    var dlng = ((result & 1) ? ~(result >> 1) : (result >> 1));
    lng += dlng;

    //array.push([lat * 1e-5, lng * 1e-5]);
    array.push(new GLatLng(lat * 1e-5, lng * 1e-5));
  }

  return array;
}
