
var map;
var geocoder;
var zoom = 14;
var xml;
var maptype = G_PHYSICAL_MAP;
var geocode = false;
var gps = false;
var kml = false;
var lat = false;
var long = false;
var geolabel = false;

// var polycolors = new Array("#d34ed3", "#FF9F00", "#ff00ff");
var polycolors = new Array("#1eb4dc", "#e550e5", "#f2c40c", "#ff4050", "#5959ff", "#62d962", "#f2f261");

var polyint = 0;

function jsloader(url) {
	var e = document.createElement("script");
	e.src = url;
	e.type="text/javascript";
	document.body.appendChild(e);
}

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) {
				map.setCenter(new GLatLng(0, 0), zoom, maptype);
				mapit(gps);
			} 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.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(); 
			});

		}
	}
}

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 iconcolors = new Array(baseIcon);
var iconint = 0;

var request = GXmlHttp.create();

function createMarker(gg, point, iconname, info, tabs) {

	function stripTags (t) {
		while (t.match(/<.*>/)) t = t.replace(/<[^>]*>/, "");
		return t;
	}

	function chktag(tag) {

		ret = false;
		if (info.getElementsByTagName(tag)[0] && info.getElementsByTagName(tag)[0].getAttribute("name")) ret = info.getElementsByTagName(tag)[0].getAttribute("name");
		if (ret) {
			switch (tag) {
				case "company": ret = '<b>'+ret+'</b><br />'; break;
				case "link": ret = '<a href="'+ret+'" target="_blank">'+ret+'</a>'; break;
				default: ret += '<br />'; break;
			}
		}
		return ret;
	}

	function chktab(tag) {

		ret = new Array()

		if (tabs && tabs.getElementsByTagName(tag) && tabs.getElementsByTagName(tag).length > 0) {
			for (t = 0; t < tabs.getElementsByTagName(tag).length; t++) {
				if (tabs.getElementsByTagName(tag)[t].getAttribute("name") && tabs.getElementsByTagName(tag)[t].getAttribute("value")) {
					if (tabs.getElementsByTagName(tag)[t].getAttribute("name") == "Anschrift") company = tabs.getElementsByTagName(tag)[t].getAttribute("value");
					else if (tabs.getElementsByTagName(tag)[t].getAttribute("name") == "Kontakt") contacts = tabs.getElementsByTagName(tag)[t].getAttribute("value");
					else ret.push(new GInfoWindowTab(tabs.getElementsByTagName(tag)[t].getAttribute("name"), "<div style=\"font-size:14px;font-family:verdana\">" + tabs.getElementsByTagName(tag)[t].getAttribute("value") + "</div>"));
				}
			}
		}

		ret.unshift(new GInfoWindowTab("Anschrift", "<div style=\"font-size:14px;font-family:verdana\">" + company + "</div>"));
		if (contacts.length > 0) ret.push(new GInfoWindowTab("Kontakt", "<div style=\"font-size:14px;font-family:verdana\">" + contacts + "</div>"));

		return ret;
	}

	var icon = new GIcon(baseIcon);
	var nuicon = iconname.getAttribute("image");
	var nuwidth = iconname.getAttribute("width");
	var nuheight = iconname.getAttribute("height");
	var nushadow = iconname.getAttribute("shadow");

	if (nuicon) {
		icon.image = nuicon;
		if (nuwidth && nuheight) icon.iconSize = new GSize(nuwidth, nuheight);
		if (nuwidth && nuheight) icon.shadow = "http://webpress.de/maps/" + nushadow;
	}

	var marker = new GMarker(point, { icon: icon, title: title });

	var company = chktag("company");
	var title = stripTags(company);
	if (company.length > 0) company += "<br />";
	if (tmp = chktag("street")) company += tmp;
	if (tmp = chktag("city")) company += tmp;
	link = chktag("link");

	var contacts = "";
	if (tmp = chktag("fon")) contacts += "Telefon: "+tmp;
	if (tmp = chktag("fax")) contacts += "Fax: "+tmp;
	if (tmp = chktag("mail")) contacts += "Mail: "+tmp;
	if (tmp = chktag("link")) contacts += "<br />Link: "+tmp;

	infoTabs = chktab("tab");

	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowTabsHtml(infoTabs);
	});

	gg++;

	ret = new Array();

	ret[0] = marker;
	ret[1] = infoTabs;

	return ret;
}

function rpcreq(xml, noclear) {
	if (xml) {
	request.open("GET", xml, true);
	request.onreadystatechange = function() {
		if (request.readyState == 4) { 
			var xmlDoc = request.responseXML;
			if (xmlDoc && xmlDoc.documentElement) {

				var points = xmlDoc.documentElement.getElementsByTagName("point");
				var icons = xmlDoc.documentElement.getElementsByTagName("icon");
				var info = xmlDoc.documentElement.getElementsByTagName("info");
				var tabs = xmlDoc.documentElement.getElementsByTagName("tabs");

  				if (!noclear) map.clearOverlays();

				for (var i = 0; i < points.length; i++) {
					var point = new GLatLng(points[i].getAttribute("lng"),points[i].getAttribute("lat"));
					var marker = createMarker(i, point, icons[i], info[i], tabs[i]);
					map.addOverlay(marker[0]);
					marker[0].openInfoWindowTabsHtml(marker[1]);
				}

				map.setCenter(point);
			}
		}
	}

	request.send(null);

	}

}

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


function plotroutes(xmlDoc) {
 var maxrtepoints = 2500;
 var routes = xmlDoc.documentElement.getElementsByTagName("rte");
 for (var j = 0; j < routes.length; j++) {
  var routepoints = routes[j].getElementsByTagName("rtept");
//  alert("Anzahl Routenpunkte: " + routepoints.length);
  if (routepoints.length > 0) {
   if (routepoints.length > maxrtepoints) {
    alert("Maximal erlaubte Routenpoints: "+maxrtepoints+ "; Rest wird abgeschnitten");
   }
   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 = 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);
     }
    }
    map.addOverlay(new GPolyline(points,polycolors[polyint],4,1));
// alert(tracksegs[j].getElementsByTagName("time")[0].firstChild.nodeValue);
   }
  }
 }
}


function gpscreateMarker(point, wptext) {
	
	var gpsmarker = new GMarker(point, iconcolors[iconint]);
	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 = "";
			if (waypoints[i] && waypoints[i].getElementsByTagName("name")[0]) wpttext = "<b>" + waypoints[i].getElementsByTagName("name")[0].firstChild.nodeValue + "</b>";
//			if (waypoints[i] && waypoints[i].getElementsByTagName("cmt")[0]) wpttext = wpttext + " (<b>" + waypoints[i].getElementsByTagName("cmt")[0].firstChild.nodeValue + "</b>)";
			if (waypoints[i] && waypoints[i].getElementsByTagName("desc")[0]) wpttext = wpttext + "<br />" + waypoints[i].getElementsByTagName("desc")[0].firstChild.nodeValue;
			wpttext = wpttext + "<br /><br />";
			map.addOverlay(gpscreateMarker(point, wpttext));
		}
	}
}

function mapit(url, noclear) {
	if (map) {
		var request = GXmlHttp.create();
		request.open("GET", "/" + url , true);
		request.onreadystatechange = function() {
			if (request.readyState == 4) {
				var xmlDoc = request.responseXML;
  				if (noclear) {
					iconint++;
					polyint++;
					if (iconint >= iconcolors.length) iconint = 0;
					if (polyint >= polycolors.length) polyint = 0;
				} else {
					iconint = 0;
					polyint = 0;
					map.clearOverlays();
				}
				centerandzoom(xmlDoc);
				plotroutes(xmlDoc);
				plottracks(xmlDoc);
				plotwaypoints(xmlDoc);
				loopkml();
			}
		}
		request.send(null);
	}
}

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;
			k.mapping = new GGeoXml("http://www.carmant.de/touren/" + k.value + ".kmz");
			map.addOverlay(k.mapping);
			k.mapping.gotoDefaultViewport(map);
		}
	}
}

function kmlit(url) {
	if (map) {
		var thiskml = new GGeoXml(url);
		map.addOverlay(thiskml);
		thiskml.gotoDefaultViewport(map);
	}
}


