// Google Maps Routinen; Anzeige der Tourengruppen
// 2006 auf www.gpswandern.de
// 2009 Ergänzung OSM  

var map;



// Google-Maps handling

function centerandzoom(xmlDoc) {
 var raender = xmlDoc.documentElement.getElementsByTagName("bounds");
 if (raender.length > 0) {
  var minlat = parseFloat(raender[0].getAttribute("minlat"));
  var minlon = parseFloat(raender[0].getAttribute("minlon"));
  var maxlat = parseFloat(raender[0].getAttribute("maxlat"));
  var maxlon = parseFloat(raender[0].getAttribute("maxlon"));
  var center = new GLatLng(((minlat+maxlat)/2),((minlon+maxlon)/2));
  var bounds = new GLatLngBounds(new GLatLng(minlat,minlon),
                                 new GLatLng(maxlat,maxlon));
  var zoom = map.getBoundsZoomLevel(bounds)-1;
  map.setCenter(center, zoom, G_PHYSICAL_MAP);
 } else {
  map.setCenter(new GLatLng(48,11), 1, G_PHYSICAL_MAP);
 }
}


function plotroutes(xmlDoc) {
 var maxrtepoints = 200;
 var routes = xmlDoc.documentElement.getElementsByTagName("rte");
 for (var j = 0; j < routes.length; j++) {
  var routepoints = routes[j].getElementsByTagName("rtept");
//GLog.write("Anzahl Routenpunkte: " + routepoints.length);
  if (routepoints.length > 0) {
   var points=Array();
   for (var i = 0; (i < routepoints.length); i++) {
    var point = new GLatLng(parseFloat(routepoints[i].getAttribute("lat")),
                            parseFloat(routepoints[i].getAttribute("lon")));
    points.push(point);
   }
   map.addOverlay(new GPolyline(points,"#FF9F00",4,1));
  }
 }
}


function plottracks(xmlDoc) {
 var maxtrkpoints = 500;
 var tracks = xmlDoc.documentElement.getElementsByTagName("trk");
//GLog.write("Anzahl Tracks: " + tracks.length);
 for (var k = 0; k < tracks.length; k++) {
  var tracksegs = tracks[k].getElementsByTagName("trkseg");
//GLog.write("Anzahl Tracksegmente: " + tracksegs.length);
  for (var j = 0; j < tracksegs.length; j++) {
   var trackpoints = tracksegs[j].getElementsByTagName("trkpt");
//GLog.write("Anzahl Trackpunkte: " + trackpoints.length);
   if (trackpoints.length > 0) {
    var points=Array();
    for (var i = 0; (i < trackpoints.length && i < maxtrkpoints); i++) {
     var point = new GLatLng(parseFloat(trackpoints[i].getAttribute("lat")),
                             parseFloat(trackpoints[i].getAttribute("lon")));
     points.push(point);
     if (points.length==200 && i < trackpoints.length && i < maxtrkpoints) {
      map.addOverlay(new GPolyline(points,"#ff00ff",4,1));
      points=Array();
      points.push(point);
     }
    }
    map.addOverlay(new GPolyline(points,"#ff00ff",4,1));
//GLog.write(tracksegs[j].getElementsByTagName("time")[0].firstChild.nodeValue);
   }
  }
 }
}


// Creates a marker at the given point with the given number label
function createMarker(point, wptext) {
  var marker = new GMarker(point);
  GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowHtml(wptext);
  });
  return marker;
}


function plotwaypoints(xmlDoc) {
 var wpttext = "";
 var waypoints = xmlDoc.documentElement.getElementsByTagName("wpt");
 if (waypoints.length > 0) {
  for (var i = 0; i < waypoints.length; i++) {
   var point = new GLatLng(parseFloat(waypoints[i].getAttribute("lat")),
                           parseFloat(waypoints[i].getAttribute("lon")));
   if (waypoints[i].getElementsByTagName("cmt")[0]) {
    wpttext='<b>'
           +'<a href="'
           +waypoints[i].getElementsByTagName("cmt")[0].firstChild.nodeValue
           +'">'
           +waypoints[i].getElementsByTagName("name")[0].firstChild.nodeValue
           +'</a>'
           +'</b>';
   } else {
    wpttext='<b>'
            +waypoints[i].getElementsByTagName("name")[0].firstChild.nodeValue
            +'</b>';
   }
   if (waypoints[i].getElementsByTagName("desc")[0]) {
    wpttext=wpttext+'<br />'
           +waypoints[i].getElementsByTagName("desc")[0].firstChild.nodeValue;
   }
   map.addOverlay(createMarker(point, wpttext));
  }
 }
}




// Initialisierung und erste Anzeige
function initKarte() {
 if (!GBrowserIsCompatible()) {
  document.getElementById("Karte").innerHTML = '<h4 style="color:red">Die Kartendarstellung ist leider fehlgeschlagen. Eine m&ouml;gliche Ursache k&ouml;nnte sein, dass diese Seite nicht vom Originalserver aufgerufen wurde. Bitte versuchen Sie folgenden Link: </h4><a href="http://www.gpswandern.de">http://www.gpswandern.de</a>';
 } else {
  var copyOSM = new GCopyrightCollection("<a href=\"http://www.openstreetmap.org/\">OpenStreetMap</a>");
  copyOSM.addCopyright(new GCopyright(1, new GLatLngBounds(new GLatLng(-90,-180), new GLatLng(90,180)), 0, " "));
  var copyOsmCycle = new GCopyrightCollection("<a href=\"http://www.opencyclemap.org/\">OpenCycleMap</a> - <a href=\"http://www.openstreetmap.org/\">OpenStreetMap</a>");
  copyOsmCycle.addCopyright(new GCopyright(1, new GLatLngBounds(new GLatLng(-90,-180), new GLatLng(90,180)), 0, " "));
  var tilesMapnik     = new GTileLayer(copyOSM, 1, 17, {tileUrlTemplate: 'http://tile.openstreetmap.org/{Z}/{X}/{Y}.png'});
  var tilesOsmCycle = new GTileLayer(copyOsmCycle, 1, 17, {tileUrlTemplate: 'http://andy.sandbox.cloudmade.com/tiles/cycle/{Z}/{X}/{Y}.png'});
  var mapMapnik   = new GMapType([tilesMapnik],  G_NORMAL_MAP.getProjection(), "OSM");
  var mapOsmCycle = new GMapType([tilesOsmCycle], G_NORMAL_MAP.getProjection(), "OSM Cycle");
  map = new GMap2(document.getElementById("Karte"));
  map.addMapType(G_PHYSICAL_MAP);
  map.addMapType(mapMapnik);
  map.addMapType(mapOsmCycle);
  map.addControl(new GLargeMapControl());
  map.addControl(new GMapTypeControl());
  map.enableScrollWheelZoom();
// map.setCenter(new GLatLng(48,11), 1, G_HYBRID_MAP);
  var request = GXmlHttp.create();
  var url = "routen.xml";
  request.open("GET", url, true);
  request.onreadystatechange = function() {
   if (request.readyState == 4) {
    var xmlDoc = request.responseXML;
    centerandzoom(xmlDoc)      // Center und Zoomlevel setzen

    var publisher_id = "pub-0522741294342289";
    var adsManagerOptions = {
     maxAdsOnMap : 2,
     style: 'adunit',
     channel: '9576616700'
    };
    adsManager = new GAdsManager(map, publisher_id, adsManagerOptions);
    adsManager.enable();

//    plotroutes(xmlDoc);        // alle Routen
//    plottracks(xmlDoc);        // alle Tracks
    plotwaypoints(xmlDoc);     // alle Waypoints
   }
  }
  request.send(null);
 }
}
