// var minlat = 90;
// var maxlat = -90;
// var minlon = 180;
// var maxlon = -180;
//
// function setInitialView(map) {
//   var bounds = GBounds(minlat, minlon, maxlat, maxlon);
// }

function makeBalloonHtml(baseurl, tag) {
  var html = "<img src=\"" + absolutifyURL(baseurl, tag.getAttribute("img2")) + "\" width=" +
    tag.getAttribute("w2") + " height=" + tag.getAttribute("h2")
    + "><br><div class=caption>"
    + tag.getAttribute("caption") + "</div>";
  return html;
}


function createMarker(baseurl, tag) {
  var icon = new GIcon(null, absolutifyURL(baseurl, tag.getAttribute("img1")));
  var width = tag.getAttribute("w1");
  var height = tag.getAttribute("h1");
  icon.iconSize = new GSize(width, height);
  icon.shadowSize = new GSize(1, 1);
  icon.iconAnchor = new GPoint(1, height);
  icon.infoWindowAnchor = new GPoint(width, 1);
  
  var lon = parseFloat(tag.getAttribute("lon"));
  var lat = parseFloat(tag.getAttribute("lat"));
  
  var point = new GLatLng(lat,lon);
  var marker = new GMarker(point, icon);
  
  var html = makeBalloonHtml(baseurl, tag);
  GEvent.addListener(marker, "click", function() {
                       marker.openInfoWindowHtml(html);
                     });
  return marker;
}

// This is getting pretty gross.  I need to find another way.
function makeHtmlForSideImage(map, baseurl, tag, marker) {
  var url = absolutifyURL(baseurl, tag.getAttribute("img2"));
  var width = tag.getAttribute("w2");
  var height = tag.getAttribute("h2");
  var lat = parseFloat(tag.getAttribute("lat"));
  var lon = parseFloat(tag.getAttribute("lon"));
  var point = new GPoint(lon,lat);
  if ( height > 200 ) {
    width *= 200/height;
    height *= 200/height;
  }
  var html = "<img src=\"" + url + "\" width=" + width + " height=" + height
    + "><br><div class=caption>" + tag.getAttribute("caption") + "</div>";
  return html;
}

// function initSideDoc(doc) {
//   doc.write("<HTML><HEAD><SCRIPT src=\"maplib.js\"></HEAD><BODY>");
// }

function mapPhotos(baseurl, imagefile, map, imgdoc) {
  if (GBrowserIsCompatible()) {
    var request = GXmlHttp.create();
    request.open("GET", absolutifyURL(baseurl, imagefile), true);
    request.onreadystatechange = function() {
      if (request.readyState == 4) {
//         initSideDoc(imgdoc);
        var xmlDoc = request.responseXML;
        var tags = xmlDoc.documentElement.getElementsByTagName("marker");
        for (var i = 0; i < tags.length; ++i) {
          var marker = createMarker(baseurl, tags[i]);
          map.addOverlay(marker);
          if (imgdoc) {
            imgdoc.write(makeHtmlForSideImage(map, baseurl, tags[i], marker))
          }
        }
      }
    }
    request.send(null);
  }
}

function mapTrack(trackfile, map)
{
  if (GBrowserIsCompatible()) {
    var request = GXmlHttp.create();
    request.open("GET", trackfile, true);
    request.onreadystatechange = function() {
      if (request.readyState == 4) {
        mapTrackData(getPoints(request.responseXML), map);
      }
    }
    request.send(null);
  }
}

// function computeStats(points) 
// {
//   stats = new Object();
//   if ( points.length == 0 )
//     return stats;
  
//   stats.maxlat = parseFloat(points[0].y);
//   stats.minlat = parseFloat(points[0].y);
//   stats.maxlon = parseFloat(points[0].x);
//   stats.minlon = parseFloat(points[0].x);

//   for (var i = 1; i < points.length; ++i) {
//     lat = parseFloat(points[i].y);
//     lon = parseFloat(points[i].x);
//     if ( lat > stats.maxlat )
//       stats.maxlat = lat;
//     else if ( lat < stats.minlat )
//       stats.minlat = lat;
//     if ( lon > stats.maxlon )
//       stats.maxlon = lon;
//     else if ( lon < stats.minlon )
//       stats.minlon = lon;
//   }
  
//   stats.midlat = (stats.maxlat + stats.minlat) / 2.0;
//   stats.midlon = (stats.maxlon + stats.minlon) / 2.0;  // don't ever cross the dateline
//   return stats;
// }


function getPoints(xmldata)
{
  if ( !xmldata ) {
    throw "asked to plot nothing!";
  }
  var trackpoints = xmldata.documentElement.getElementsByTagName("trkpt");
  var points = new Array(trackpoints.length);
  for (var i = 0; i < trackpoints.length; ++i) {
    var lon = trackpoints[i].getAttribute("lon");
    var lat = trackpoints[i].getAttribute("lat");
    points[i] = new GLatLng(lat, lon);
  }
  return points;
}


function mapTrackData(points, map) 
{
  map.addOverlay(new GPolyline(points));
  return points;
}

function centerAndZoomToPoints(points, map)
{
  var bounds = new GLatLngBounds();
  for ( var i=0; i < points.length; ++i ) {
    bounds.extend(points[i]);
  }
  map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
}



// For now this assumes that urls are directory-relative.  No leading
// protocol and no leading slash.
function absolutifyURL(base, url) {
  lastslash = base.lastIndexOf('/');
  if ( lastslash < 0 || lastslash == base.length-1 )
    return base + url;
  return base.substring(0,lastslash+1) + url;
}
