
var map;
var geocoder;
var zoom = 11;
var xml;
var maptype = G_NORMAL_MAP;
var geocode = false;
var gps = false;
var kml = false;
var lat = false;
var long = false;
var geolabel = false;
var gpsminictrl = false;
var allmarkers = new Array();
var allpolys = new Array();
var locatemarker = false;

var polycolors = new Array("#64abdd", "#ff4050", "#e550e5", "#5959ff", "#f2c40c", "#62d962", "#f2f261");
var polyint = -1;

function dump(theObj) {
        var tx="<table width='100'>";
        var props = new Array();
        for (var i in theObj) { props.push(i); }
        props.sort();
        for (var i=0; i<props.length; i++) {
                tx+= "<tr><td>"+props[i]+"</td><td>"+theObj[props[i]]+"</td></tr>";
        }
        tx+="</table>";
        document.write(tx);
}


function gotomap(response) {
  map.clearOverlays();
  if (!response || response.Status.code != 200) {
	if (geolabel) document.getElementById('mapresponse').style.display = 'none';
	else alert("Sorry, we were unable to geocode that address");
  } else {
	place = response.Placemark[0];
	point = new GLatLng(place.Point.coordinates[1],
						place.Point.coordinates[0]);

	map.setCenter(point);
	marker = new GMarker(point);
	map.addOverlay(marker);

	html = place.address.replace(",", "<br />") + '<br /><br /><b>Location:</b> ';
	if (geolabel) html = "<strong style=\"font-size:16px\">" + geolabel + "</strong><br /><br />" + html;
	marker.openInfoWindowHtml(html + place.Point.coordinates);

  }
}

function lookup() {
if (!lock) var lock = "";
	look = prompt("where do you want to go today?", lock);
	if (look && look.length > 0) {
		var geocoder = new GClientGeocoder();
		geocoder.getLocations(look, gotomap);
	}
}

function MLoad() {
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("webmap"));

		if (map) {

			geocoder = new GClientGeocoder();

			if (gps) {
				if (gps == "tour.xml") map.setMapType(G_PHYSICAL_MAP);
				mapit(false, gps, true);
			} else if (geocode) {
				map.setCenter(new GLatLng(0, 0), zoom, maptype);
				GTO(geocode);
			} else if (lat && long) {
				map.setCenter(new GLatLng(lat, long), zoom, maptype);
			}

			map.enableContinuousZoom();
			map.enableDoubleClickZoom();
//			map.enableScrollWheelZoom();
			new GKeyboardHandler(map);
			map.hideControls(); 
			map.setMapType(G_HYBRID_MAP);
			if (gpsminictrl) {
				map.addControl(new GSmallMapControl());
				map.addControl(new GMenuMapTypeControl());
				map.setMapType(G_NORMAL_MAP);
			} else {
				map.addControl(new GLargeMapControl());
				map.addControl(new GScaleControl());
				map.addControl(new GOverviewMapControl());
				map.addControl(new GMenuMapTypeControl());
			}
			map.addMapType(G_PHYSICAL_MAP);

			GEvent.addListener(map, "mouseover", function(){
				map.showControls();
			});

			GEvent.addListener(map, "mouseout", function(){
				map.hideControls(); 
			});

			if (document.getElementById('mapsaddr') && document.getElementById('mapsaddr').value && document.getElementById('mapsaddr').value.length > 0) {
				GEvent.addListener(map, "load", function(){
					reroute(true);
				});
			}

		}
	}
}

var baseIcon = new GIcon();
baseIcon.image = "/images/maps/marker.png";
baseIcon.shadow = "/images/maps/shadow50.png";
baseIcon.iconSize = new GSize(20, 34);
baseIcon.shadowSize = new GSize(37, 34);
baseIcon.iconAnchor = new GPoint(9, 34);
baseIcon.infoWindowAnchor = new GPoint(9, 2);
baseIcon.infoShadowAnchor = new GPoint(18, 25);

var rknIcon = new GIcon(); 
rknIcon.image = '/images/maps/mm_20_rkn.png';
rknIcon.shadow = "/images/maps/mm_20_shadow.png";
rknIcon.iconSize = new GSize(12, 20);
rknIcon.shadowSize = new GSize(22, 20);
rknIcon.iconAnchor = new GPoint(6, 20);
rknIcon.infoWindowAnchor = new GPoint(5, 1);

var purpleIcon = new GIcon(); 
purpleIcon.image = '/images/maps/mm_20_purple.png';
purpleIcon.shadow = "/images/maps/mm_20_shadow.png";
purpleIcon.iconSize = new GSize(12, 20);
purpleIcon.shadowSize = new GSize(22, 20);
purpleIcon.iconAnchor = new GPoint(6, 20);
purpleIcon.infoWindowAnchor = new GPoint(5, 1);

var orangeIcon = new GIcon(); 
orangeIcon.image = '/images/maps/mm_20_orange.png';
orangeIcon.shadow = "/images/maps/mm_20_shadow.png";
orangeIcon.iconSize = new GSize(12, 20);
orangeIcon.shadowSize = new GSize(22, 20);
orangeIcon.iconAnchor = new GPoint(6, 20);
orangeIcon.infoWindowAnchor = new GPoint(5, 1);

var redIcon = new GIcon(); 
redIcon.image = '/images/maps/mm_20_red.png';
redIcon.shadow = "/images/maps/mm_20_shadow.png";
redIcon.iconSize = new GSize(12, 20);
redIcon.shadowSize = new GSize(22, 20);
redIcon.iconAnchor = new GPoint(6, 20);
redIcon.infoWindowAnchor = new GPoint(5, 1);

var blueIcon = new GIcon(); 
blueIcon.image = '/images/maps/mm_20_blue.png';
blueIcon.shadow = "/images/maps/mm_20_shadow.png";
blueIcon.iconSize = new GSize(12, 20);
blueIcon.shadowSize = new GSize(22, 20);
blueIcon.iconAnchor = new GPoint(6, 20);
blueIcon.infoWindowAnchor = new GPoint(5, 1);

var greenIcon = new GIcon(); 
greenIcon.image = '/images/maps/mm_20_green.png';
greenIcon.shadow = "/images/maps/mm_20_shadow.png";
greenIcon.iconSize = new GSize(12, 20);
greenIcon.shadowSize = new GSize(22, 20);
greenIcon.iconAnchor = new GPoint(6, 20);
greenIcon.infoWindowAnchor = new GPoint(5, 1);

var yellowIcon = new GIcon(); 
yellowIcon.image = '/images/maps/mm_20_yellow.png';
yellowIcon.shadow = "/images/maps/mm_20_shadow.png";
yellowIcon.iconSize = new GSize(12, 20);
yellowIcon.shadowSize = new GSize(22, 20);
yellowIcon.iconAnchor = new GPoint(6, 20);
yellowIcon.infoWindowAnchor = new GPoint(5, 1);

var blackIcon = new GIcon(); 
blackIcon.image = '/images/maps/mm_20_black.png';
blackIcon.shadow = "/images/maps/mm_20_shadow.png";
blackIcon.iconSize = new GSize(12, 20);
blackIcon.shadowSize = new GSize(22, 20);
blackIcon.iconAnchor = new GPoint(6, 20);
blackIcon.infoWindowAnchor = new GPoint(5, 1);

var whiteIcon = new GIcon(); 
whiteIcon.image = '/images/maps/mm_20_white.png';
whiteIcon.shadow = "/images/maps/mm_20_shadow.png";
whiteIcon.iconSize = new GSize(12, 20);
whiteIcon.shadowSize = new GSize(22, 20);
whiteIcon.iconAnchor = new GPoint(6, 20);
whiteIcon.infoWindowAnchor = new GPoint(5, 1);

var iconcolors = new Array(rknIcon, redIcon, purpleIcon, blueIcon, orangeIcon, greenIcon, yellowIcon);
var iconint = -1;

var request = GXmlHttp.create();

function GTO(gt) {
	geocoder.getLocations(gt, gotomap);
}

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"));
 } else {                     // kein bounds-Eintrag
  var minlat = 90;
  var minlon = 180;
  var maxlat = -90;
  var maxlon = -180;
  var aktlat = 0;
  var aktlon = 0;
  if (!gpsminictrl) {
	  var trackpoints = xmlDoc.documentElement.getElementsByTagName("trkpt");
	  if (trackpoints.length > 0) {
	   for (var i = 0; i < trackpoints.length; i++) {
	    aktlat=parseFloat(trackpoints[i].getAttribute("lat"));
	    aktlon=parseFloat(trackpoints[i].getAttribute("lon"));
	    if (aktlat<minlat) {minlat=aktlat};
	    if (aktlat>maxlat) {maxlat=aktlat};
	    if (aktlon<minlon) {minlon=aktlon};
	    if (aktlon>maxlon) {maxlon=aktlon};
	   }
	  }
	  var routepoints = xmlDoc.documentElement.getElementsByTagName("rtept");
	  if (routepoints.length > 0) {
	   for (var i = 0; i < routepoints.length; i++) {
	    aktlat=parseFloat(routepoints[i].getAttribute("lat"));
	    aktlon=parseFloat(routepoints[i].getAttribute("lon"));
	    if (aktlat<minlat) {minlat=aktlat};
	    if (aktlat>maxlat) {maxlat=aktlat};
	    if (aktlon<minlon) {minlon=aktlon};
	    if (aktlon>maxlon) {maxlon=aktlon};
	   }
	  }
  }
	  var waypoints = xmlDoc.documentElement.getElementsByTagName("wpt");
	  if (waypoints.length > 0) {
	   for (var i = 0; i < waypoints.length; i++) {
	    aktlat=parseFloat(waypoints[i].getAttribute("lat"));
	    aktlon=parseFloat(waypoints[i].getAttribute("lon"));
	    if (aktlat<minlat) {minlat=aktlat};
	    if (aktlat>maxlat) {maxlat=aktlat};
	    if (aktlon<minlon) {minlon=aktlon};
	    if (aktlon>maxlon) {maxlon=aktlon};
	   }
	  }
 }

	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);
	zoom = zoom - 5;
	map.setCenter(center, zoom);
}


function plottracks(xmlDoc, el) {
 var maxtrkpoints = 2000;
 var tracks = xmlDoc.documentElement.getElementsByTagName("trk");
// alert("Anzahl Tracks: " + tracks.length);
 for (var k = 0; k < tracks.length; k++) {
  var tracksegs = tracks[k].getElementsByTagName("trkseg");
// alert("Anzahl Tracksegmente: " + tracksegs.length);
  for (var j = 0; j < tracksegs.length; j++) {
   var trackpoints = tracksegs[j].getElementsByTagName("trkpt");
// alert("Anzahl Trackpunkte: " + trackpoints.length);
   if (trackpoints.length > 0) {
    if (trackpoints.length > maxtrkpoints) {
     alert("Maximal erlaubte Trackpoints: "+maxtrkpoints+ "; Rest wird abgeschnitten");
    }
    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==1000 && i < trackpoints.length && i < maxtrkpoints) {
      map.addOverlay(new GPolyline(points,"#ff00ff",4,1));
      points=Array();
      points.push(point);
     }
    }
    if (el) {
	allpolys[el] = new GPolyline(points,polycolors[polyint],8,0.75);
	map.addOverlay(allpolys[el]);
    }
   }
  }
 }
}


function gpscreateMarker(point, wptext, icon) {
	if (icon) icon = eval(icon + "Icon");
	if (!icon) icon = iconcolors[iconint];
	var gpsmarker = new GMarker(point, icon);
	GEvent.addListener(gpsmarker, "click", function() {
		gpsmarker.openInfoWindowHtml(wptext);
	});
	return gpsmarker;
}

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")));
			wptext = ""; 
			var markerIcon = false;
			if (waypoints[i] && waypoints[i].getElementsByTagName("name")[0]) wpttext = waypoints[i].getElementsByTagName("name")[0].firstChild.nodeValue;
			if (waypoints[i] && waypoints[i].getElementsByTagName("cmt")[0]) wpttext = wpttext + "<br /><br />" + waypoints[i].getElementsByTagName("cmt")[0].firstChild.nodeValue;
			if (waypoints[i] && waypoints[i].getElementsByTagName("desc")[0]) wpttext = wpttext + "<br />" + waypoints[i].getElementsByTagName("desc")[0].firstChild.nodeValue;
			if (waypoints[i] && waypoints[i].getElementsByTagName("marker")[0]) markerIcon = waypoints[i].getElementsByTagName("marker")[0].firstChild.nodeValue;
			wpttext = wpttext + "<br />";
			allmarkers.push(gpscreateMarker(point, wpttext, markerIcon));
			map.addOverlay(allmarkers[allmarkers.length-1]);
		}
	}
}

function switchmarkers() {
	sma = document.getElementsByTagName('INPUT');
	if (sma && sma.length > 0) {
		for (si = 0; si < sma.length; si++) {
			if (sma[si].name == "switchmarker" && allmarkers && allmarkers.length > 0) {
				for (ai = 0; ai < allmarkers.length; ai++) {
					sma[si].checked = false;
					allmarkers[ai].hide();
				}
			}
		}
	}
}

function switchmarker(sm) {
	if (sm && allmarkers && allmarkers.length > 0) {
		for (ai = 0; ai < allmarkers.length; ai++) {
			if (allmarkers[ai].getIcon().image == "/images/maps/mm_20_" + sm.value + ".png") {
				if (sm.checked) allmarkers[ai].show();
				else allmarkers[ai].hide();
			}
		}
	}
}

function mapit(el, url, zoomit) {
	if (map) {
		if (el) {
			el.focus();
			el.blur();
		}
		var request = GXmlHttp.create();
		request.open("GET", "/gps/" + url, true);
		request.onreadystatechange = function() {
			if (request.readyState == 4) {
				var xmlDoc = request.responseXML;
				iconint++;
				polyint++;
				if (iconint >= iconcolors.length) iconint = 1;
				if (polyint >= polycolors.length) polyint = 1;
				if (el) el.style.color = polycolors[polyint];
				if (zoomit) centerandzoom(xmlDoc);
				if (el && el.id) plottracks(xmlDoc, el.id.substring(8));
				else plottracks(xmlDoc, "m");
				plotwaypoints(xmlDoc);
				loopkml();
			}
		}
		request.send(null);
	}
}

function mapmoreinfo() {
	if (document.getElementById('headinfo')) {
		document.getElementById('headinfo').innerHTML = "";
		var inforequest = GXmlHttp.create();
		url = 'industrie-und-mehr';
		inforequest.open("GET", "/gpsinfo/" + url, true);
		inforequest.onreadystatechange = function() {
			if (inforequest.readyState == 4) {
				document.getElementById('headinfo').innerHTML = inforequest.responseText;
			}
		}
		inforequest.send(null);
	}
}


function locateit() {
	if (map) {
		marker = new GMarker(map.getCenter(), { draggable: true });
		map.addOverlay(marker);
	}
}

function kmlroute(k) {
	if (map && k) {
		if (k.mapping) {
			if (k.mapping.isHidden()) {
				k.mapping.show();
				k.checked = true;
			} else {
				k.mapping.hide();
				k.checked = false;
			}
		} else {
			k.checked = true;

			var kmlrequest = GXmlHttp.create();
			k.mapping = new GGeoXml("http://tour.wfgrkn.de/gps/" + k.value + ".kml");
//			mapmoreinfo();
			map.addOverlay(k.mapping);
			k.mapping.gotoDefaultViewport(map);
		}
	}
}


