var map;
var firstTravesalFunction;

function onLoad() {
  map = new GMap2(document.getElementById("map"));
  map.addControl(new GLargeMapControl());
  map.addControl(new GMapTypeControl());
  map.addControl(new GScaleControl());
  map.setCenter(new GLatLng(40.784430,-73.950000),13);
  addTraversals();
  firstTravesalFunction();
}

function addTraversal(intersection1,point1,intersection2,point2,distance) {
  var ol = document.getElementById('menuList');
  var li = document.createElement('li');
  var a = document.createElement('a');
  a.href = '#';
  a.innerHTML = intersection1 + ' &rarr; ' + intersection2;
  li.appendChild(a);
  ol.appendChild(li);
  a.onclick = newOnclickFunction(intersection1,point1,intersection2,point2);
  if (!firstTravesalFunction) firstTravesalFunction = a.onclick;
}

function newOnclickFunction(intersection1,point1,intersection2,point2) {
  var _intersection1 = intersection1;
  var _point1 = point1;
  var _intersection2 = intersection2;
  var _point2 = point2;
  return function(e) {
    map.clearOverlays();
    var f = addPointToMap(_intersection1,_intersection2,_point1,_point2);
    addPointToMap(_intersection2,_intersection1,_point2,_point1);
    var latlngs = new Array(_point1,_point2);
    map.addOverlay(new GPolyline(latlngs,'#000077'));
    var midpoint = new GLatLng((_point1.lat()+point2.lat())/2,
                               (_point1.lng()+point2.lng())/2);
    map.panTo(midpoint);
    f();
  }
}

function deg2rad(angle) {
  return (angle/180)*Math.PI;
}

function coordsToMiles(point1,point2) {
  var lat1 = point1.lat();
  var lng1 = point1.lng();
  var lat2 = point2.lat();
  var lng2 = point2.lng();
  var deg2mile = 69.09;
  var dist = Math.sqrt(Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2))
                       * Math.pow(lng1-lng2,2) + Math.pow(lat1-lat2,2));
  return dist * deg2mile;
} 

function newOpenFunction(marker,addr1,addr2,p1,p2) {
  var _marker = marker;
  var _addr1  = addr1;
  var _addr2  = addr2;
  var _p1     = p1;
  var _p2     = p2;
  return function() {
    var str = "<br/><b>" + _addr1 + "</b> &rarr; <b>" + _addr2 + "</b><br/>" 
      +     coordsToMiles(_p1,_p2).toFixed(6) + " miles";
    _marker.openInfoWindowHtml(html(str));
  };
}

function addPointToMap(addr,addr2,p,p2) {
  var marker = new GMarker(p);
  var f = newOpenFunction(marker,addr,addr2,p,p2);
  GEvent.addListener(marker, 'click', f);
  map.addOverlay(marker);
  return f;
}

function html(txt) {
  return htmlStart() + txt + htmlEnd();
}

function htmlStart() {
  return "<div id='mainInfoDiv' style='padding: 2px; white-space: nowrap;' >";
}
	
function htmlEnd() {
  return "</div>";
}

