var map = null;
function initMap() {
    if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("map"));
        map.addControl(new GLargeMapControl());
        map.addControl(new GMapTypeControl());
        map.enableDoubleClickZoom();
        map.enableContinuousZoom();
        map.setCenter(new GLatLng(52, 8.5), 13);
    }
    GDownloadUrl('/cgi-bin/gpsbook.cgi?q=tracklist', function(data, responseCode) {
        if (responseCode == 200) {
            var html = '';
            var xml = GXml.parse(data);
            var tracks = xml.documentElement.getElementsByTagName("track");
            for (var i = 0; i < tracks.length; i++) {
                html += '<li><a href="javascript:showTrack('
                    +tracks[i].getAttribute("id")
                    +')">'
                    +tracks[i].getAttribute("start")
                    +' ('
                    +tracks[i].getAttribute("length")
                    +' km)</a> '
                    +tracks[i].getAttribute("name")+'</li>';
            }
            document.getElementById('list').innerHTML = '<ul>'+html+'</ul>';
        }
    });
}

function showTrack(tid) {
    map.clearOverlays();
    GDownloadUrl('/cgi-bin/gpsbook.cgi?q=track&num='+tid, handleShowTrack);
    GDownloadUrl('/cgi-bin/gpsbook.cgi?q=geonames&num='+tid, handleShowGeonames);
}

function handleShowTrack(data, responseCode) {
    if (responseCode == 200) {
        var bounds = new GLatLngBounds();
        var xml = GXml.parse(data);

        // extract track data
        var info = xml.documentElement.getElementsByTagName("info")[0];
        document.getElementById('t_start').innerHTML = info.getAttribute("start");
        document.getElementById('t_end').innerHTML = info.getAttribute("end");
        document.getElementById('length').innerHTML = info.getAttribute("length");
        document.getElementById('speed').innerHTML = info.getAttribute("speed");
        document.getElementById('alt_min').innerHTML = info.getAttribute("altmin");
        document.getElementById('alt_max').innerHTML = info.getAttribute("altmax");

        // extract track points and display as path
        var tpoints = xml.documentElement.getElementsByTagName("tpoint");
        var points = [];
        for (var i = 0; i < tpoints.length; i++) {
            var point = new GLatLng(parseFloat(tpoints[i].getAttribute("lat")),
                                    parseFloat(tpoints[i].getAttribute("lon")));
            points.push(point);
            bounds.extend(point);
        }
        map.addOverlay(new GPolyline(points));
        map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
    }
}

function handleShowGeonames(data, responseCode) {
    if (responseCode == 200) {
        var xml = GXml.parse(data);
        var geonames = xml.documentElement.getElementsByTagName("geoname");
        for (var i = 0; i < geonames.length; i++) {
            var point = new GLatLng(parseFloat(geonames[i].getAttribute("lat")),
                                    parseFloat(geonames[i].getAttribute("lon")));
            map.addOverlay(createMarker(point,geonames[i].getAttribute("name")));
        }
    }
}

function createMarker(point,data) {
    var marker = new GMarker(point);
    GEvent.addListener(marker, "click", function() {
        marker.openInfoWindow(data);
    });
    return marker;
}

