// Download GPX data and load it on the map.
function loadGpxFileList() {
  addStatus( 'searching for available GPX files' );
  loadJsonData( "json.listGPX.callback=addGpxFilesToOptions" );
  return false;
}

function addGpxFilesToOptions(json) {
  var optionsDiv = document.getElementById("gpx-name");
  optionsDiv.innerHTML = "";
  for (var i = 0; i < json.names.length; i++) {
    var name = json.names[i];
    optionsDiv.innerHTML += '<option value="' + name + '">' + name + '</option>';
  }
  addStatus( 'updated GPX list' );
}

// Download GPX data and load it on the map.
function loadGPX(name) {
  if (name == null || name.length == 0) {
    setStatus( '<font color="red">error: GPX data name required</font>' );
  } else {
    addStatus( 'loading GPX data for ' + name );
    loadJsonData( "json.getGPX.callback=addGpxToMap&name="+name );
  }
  return false;
}

function setStatus(msg) {
  var statusDiv = document.getElementById("status");
  statusDiv.innerHTML = msg;
}

function addStatus(msg) {
  var statusDiv = document.getElementById("status");
  statusDiv.innerHTML += "<br/>" + msg;
}

function clearStatus() {
  setStatus("");
}

function addGpxToMap(gpx) {
  if (gpx.error != null) {
    setStatus( '<font color="red">error loading gpx: ' + gpx.error + '</font>' );
  } else {
    addStatus( 'loaded it - now adding data' );

  // first re-center the map:
  if (gpx.center != null && gpx.bounds != null) {
    addStatus( 're-centering map' );
    var swPoint = new GLatLng(gpx.bounds.minlat, gpx.bounds.minlon);
    var nePoint = new GLatLng(gpx.bounds.maxlat, gpx.bounds.maxlon);
    var bounds  = new GLatLngBounds(swPoint, nePoint);
    var zoom    = map.getBoundsZoomLevel(bounds);
    map.setCenter(new GLatLng(gpx.center.lat, gpx.center.lon), zoom);
  }

  // then add any tracks as poly-lines
  if (gpx.tracks != null) {
    addStatus( 'adding ' + gpx.tracks.length + ' tracks' );
    for (var i = 0; i < gpx.tracks.length; i++) {
      var track = gpx.tracks[i];
      var linePoints = new Array();
      for (var j = 0; j < track.segments.length; j++) {
        var seg = track.segments[j];
        for (var k = 0; k < seg.points.length; k++) {
          var point = seg.points[k];
          linePoints.push(new GLatLng(point.lat, point.lon));
        }
      }
      var geoLine = new GPolyline(linePoints);
      map.addOverlay(geoLine);
    }
  }

  // then add any waypoints as markers
  if (gpx.waypoints != null) {
    addStatus( 'adding ' + gpx.waypoints.length + ' waypoints' );
    for (var i = 0; i < gpx.waypoints.length; i++) {
      var point    = gpx.waypoints[i];
      var geoPoint = GLatLng(point.lat, point.lon);
      var marker   = new GMarker(geoPoint);
      map.addOverlay(marker);
    }
  }
  }
}

function loadJsonData(url, callback) {
  var xmlhttp;
  if (window.XMLHttpRequest) {
    // Mozilla et al:
    xmlhttp = new XMLHttpRequest();
  } else if (window.ActiveXObject) {
    // code for IE
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  }

  if (xmlhttp!=null) {
    xmlhttp.open("GET", url, true);
    xmlhttp.onreadystatechange = function() {
      if (xmlhttp.readyState == 4) {
        // no error handling for now...
        // alert( xmlhttp.responseText );
        if (callback != null) {
          callback( xmlhttp );
        } else {
          eval( xmlhttp.responseText );
        }
      }
    }
    xmlhttp.send(null);
  } else {
    alert("Your browser does not support XML HTTP Requests.");
  }
}
