var isCompatible = false;
var map, route, trav;
var cDists = new Array();
var markers = new Array();
var routePoints = new Array();
var numNodes = 0;
var MaxNodes = 200;
var metres = 0;
var loadR = "";

function showLoad() {
  document.getElementById("trav").value = m;
  document.getElementById("dist").firstChild.nodeValue = metres;
  var tempRoute = new Array();
  var tempMarks = new Array();
  var tempDists = new Array();
  var j = 0;
  for (var k=0; k<savedRoute.length; k+=2) {
    tempRoute[j] = new GLatLng(parseFloat(savedRoute[k]), parseFloat(savedRoute[k+1]));
    var mark = new GMarker(tempRoute[j], {draggable: true, title: numNodes});
    GEvent.addListener(mark, "dragend", function() {
      if (route) {
        map.removeOverlay(route);
      }
      for (i=0; i<numNodes; i++) {
        routePoints[i] = markers[i].getPoint();
      }
      route = new GPolyline(routePoints, "#3B6671", 8, 0.75);
      map.addOverlay(route);
      calcDist();
    });
    tempMarks[numNodes] = mark;
    numNodes++;
    j++;
  }
  tempDists[0] = 0;
  for (var i=1; i<tempRoute.length; i++) {
    metres += tempRoute[i].distanceFrom(tempRoute[i-1]);
    tempDists[i] = metres;
  }
  cDists = tempDists;
  routePoints = tempRoute;
  markers = tempMarks;
  route = new GPolyline(routePoints, "#3B6671", 8, 0.75);
  map.addOverlay(route);
  document.getElementById("loading").firstChild.nodeValue = String.fromCharCode(160);
  document.getElementById("dist").firstChild.nodeValue = Math.round(metres);
  if (metres>0) {
    showDist();
  }
  window.setTimeout(zoom2Points, 500);
}

function showDist() {
  if ((document.getElementById("trav").value!=0) && !isNaN(document.getElementById("trav").value)) {
    if (trav) {
      map.removeOverlay(trav);
    }
    var t = document.getElementById("trav").value*1;
    var z = -204;
    var col = "#800000";
    var travPoints = new Array();
    travPoints[0] = routePoints[0];
    for (i=1; i<cDists.length; i++) {
      if (cDists[i]<t) {
        travPoints[i] = routePoints[i];
        if (i==cDists.length-1) {
          col = "#CCCC00";
        }
      }
      else {
        if (z==-204) {
          travPoints[i] = new GLatLng(routePoints[i-1].lat()+(t-cDists[i-1])*(routePoints[i].lat()-routePoints[i-1].lat())/(routePoints[i].distanceFrom(routePoints[i-1])),
                                                  routePoints[i-1].lng()+(t-cDists[i-1])*(routePoints[i].lng()-routePoints[i-1].lng())/(routePoints[i].distanceFrom(routePoints[i-1])));
          z=i;
        }
      }
    }
    trav = new GPolyline(travPoints, col, 6, 0.75);
    map.addOverlay(trav);
  }
}

function zoom2Points() {
  if (numNodes>0) {
    var mnx = routePoints[0].lat();
    var mny = routePoints[0].lng();
    var mxx = routePoints[0].lat();
    var mxy = routePoints[0].lng();
    for (i=1; i<routePoints.length; i++) {
      if (routePoints[i].lat()<mnx) mnx=routePoints[i].lat();
      if (routePoints[i].lng()<mny) mny=routePoints[i].lng();
      if (routePoints[i].lat()>mxx) mxx=routePoints[i].lat();
      if (routePoints[i].lng()>mxy) mxy=routePoints[i].lng();
    }
    var bounds = new GLatLngBounds(new GLatLng(mnx, mny), new GLatLng(mxx, mxy));
    var zoom = map.getBoundsZoomLevel(bounds);
    map.setCenter(bounds.getCenter(bounds));
    map.setZoom(zoom);
  }
}

function loadRoute2() {
  if (isCompatible) {
    if (route) {
      map.removeOverlay(route);
    }
    if (trav) {
      map.removeOverlay(trav);
    }
    for (i=0; i<markers.length; i++) {
      map.removeOverlay(markers[i]);
    }
    numNodes = 0;
    var tempRoute = new Array();
    var tempMarks = new Array();
    var tempDists = new Array();
    var request = GXmlHttp.create();
    request.open("GET", loadR+".xml", true);
    request.onreadystatechange = function() {
      if (request.readyState==4) {
        var xml = request.responseXML;
        var tempM = xml.documentElement.getElementsByTagName("marker");
        metres = 0;
        for (var i=0; i<tempM.length; i++) {
          tempRoute[i] = new GLatLng(parseFloat(tempM[i].getAttribute("lat")), parseFloat(tempM[i].getAttribute("lng")));
          var mark = new GMarker(tempRoute[i], {draggable: true, title: numNodes});
          GEvent.addListener(mark, "dragend", function() {
            if (route) {
              map.removeOverlay(route);
            }
            for (i=0; i<numNodes; i++) {
              routePoints[i] = markers[i].getPoint();
            }
            route = new GPolyline(routePoints, "#3B6671", 8, 0.75);
            map.addOverlay(route);
            calcDist();
          });
          tempMarks[numNodes] = mark;
          numNodes++;
        }
        tempDists[0] = 0;
        for (var i=1; i<tempM.length; i++) {
          metres += tempRoute[i].distanceFrom(tempRoute[i-1]);
          tempDists[i] = metres;
        }
        cDists = tempDists;
        routePoints = tempRoute;
        markers = tempMarks;
        route = new GPolyline(routePoints, "#3B6671", 8, 0.75);
        map.addOverlay(route);
        document.getElementById("loading").firstChild.nodeValue = String.fromCharCode(160);
        document.getElementById("dist").firstChild.nodeValue = Math.round(metres);
        sr = true;
        showDist();
        zoom2Points();
      }
    }
    request.send(null);
  }
}

function loadRoute(r) {
  document.getElementById("loading").firstChild.nodeValue = "Loading...";
  loadR = r;
  window.setTimeout(loadRoute2, 500);
}

function saveRoute() {
  if (!ds) {
    return false;
  }
  if (isCompatible) {
    if (metres==0) {
      alert("You need to create a route first");
      return false;
    }
    else {
      var r = "";
      for (i=0; i<numNodes; i++) {
        r = r + Math.round(routePoints[i].lat()*100000)/100000 + "," + Math.round(routePoints[i].lng()*100000)/100000 + ",";
      }
      document.getElementById("route").value = r+Math.round(document.getElementById("trav").value*10)/10;
      return true;
    }
  }
  else {
    return false;
  }
}

function progMode() {
  if (isCompatible) {
    if (numNodes>0) {
      for (i=0; i<numNodes; i++) {
        map.removeOverlay(markers[i]);
      }
      sr =true;
    }
  }
}

function editMode() {
  if (isCompatible) {
    if (numNodes>0) {
      for (i=0; i<numNodes; i++) {
        map.addOverlay(markers[i]);
      }
      sr =false;
    }
  }
}

function calcDist() {
  if (isCompatible) {
    metres = 0;
    var tempDists = new Array();
    tempDists[0] = 0;
    for (i=1; i<numNodes; i++) {
      metres += routePoints[i].distanceFrom(routePoints[i-1]);
      tempDists[i] = metres;
    }
    cDists = tempDists;
    document.getElementById("dist").firstChild.nodeValue = Math.round(metres);
    if (numNodes>1) {
      showDist();
    }
  }
}

function delNode() {
  if (isCompatible && !sr) {
    if (numNodes>0) {
      var tempRoute = new Array();
      var tempMarks = new Array();
      numNodes--;
      map.removeOverlay(markers[numNodes]);
      map.removeOverlay(route);
      for (i=0; i<numNodes; i++) {
        tempRoute[i] = routePoints[i];
        tempMarks[i] = markers[i];
      }
      routePoints = tempRoute;
      markers = tempMarks;
      route = new GPolyline(routePoints, "#3B6671", 8, 0.75);
      map.addOverlay(route);
    }
    calcDist();
  }
}

function clearAll() {
  if (isCompatible && !sr) {
    var tempRoute = new Array();
    var tempMarks = new Array();
    map.removeOverlay(route);
    map.removeOverlay(trav);
    for (i=0; i<numNodes; i++) {
      map.removeOverlay(markers[i]);
    }
    routePoints = tempRoute;
    markers = tempMarks;
    metres = 0;
    document.getElementById("dist").firstChild.nodeValue = 0;
    numNodes = 0;
  }
}

function reloadRoute() {
  history.go(0);
}

function load() {
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById("map"));
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    GEvent.addListener(map, "click", function(marker, point) {
      if (!marker && numNodes<MaxNodes && !sr) {
        if (route) {
          map.removeOverlay(route);
        }
        var mark = new GMarker(point, {draggable: true, title: numNodes});
        markers[numNodes] = mark;
        map.addOverlay(mark);
        routePoints[numNodes] = point;
        GEvent.addListener(mark, "dragend", function() {
          if (route) {
            map.removeOverlay(route);
          }
          for (i=0; i<numNodes; i++) {
            routePoints[i] = markers[i].getPoint();
          }
          route = new GPolyline(routePoints, "#3B6671", 8, 0.75);
          map.addOverlay(route);
          calcDist();
        });
        numNodes++;
        route = new GPolyline(routePoints, "#3B6671", 8, 0.75);
        map.addOverlay(route);
        calcDist();
      }
    });
    isCompatible = true;
    map.setCenter(new GLatLng(20.0000, 0.0000), 1);
    if (sr) {
      showLoad();
    }
  }
}