
var map;
var geocoder;
var zoom = 17;
var xml;
var maptype = G_HYBRID_MAP;
var geocode = false;
var gps = false;
var lat = false;
var long = false;

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

var polyint = 0;

function gotomap(response) {
  map.clearOverlays();
  if (!response || response.Status.code != 200) {
	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 /><b>Location:</b> ';
	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 GMapTypeControl());
			map.addControl(new GScaleControl()) ;
			map.addControl(new GOverviewMapControl());

			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 rknIcon = new GIcon(); 
rknIcon.image = '/images/maps/rkn-blue.png';
rknIcon.shadow = "/images/maps/mm_20_shadow.png";
rknIcon.iconSize = new GSize(20, 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 iconcolors = new Array(rknIcon, purpleIcon, orangeIcon, redIcon, blueIcon, greenIcon, yellowIcon);
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);
}


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 = waypoints[i].getElementsByTagName("name")[0].firstChild.nodeValue;
			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 /><br />" + waypoints[i].getElementsByTagName("desc")[0].firstChild.nodeValue;
			wpttext = wpttext + "<br />";
			map.addOverlay(gpscreateMarker(point, wpttext));
		}
	}
}


function plotpolygons() {
	var mensa = new GPolygon([
		new GLatLng(51.31609357882318,6.569878688770771,0),
		new GLatLng(51.31596303701487,6.569949276534388,0),
		new GLatLng(51.31604197944704,6.570311911978195,0),
		new GLatLng(51.31604681564723,6.570309313229245,0),
		new GLatLng(51.31609923602679,6.570543155571713,0),
		new GLatLng(51.31631259773609,6.570425081591495,0),
		new GLatLng(51.31626241875866,6.570194750297688,0),
		new GLatLng(51.31626889070006,6.570189546354555,0),
		new GLatLng(51.31624138791867,6.570064105242835,0),
		new GLatLng(51.31622278950793,6.569980079389566,0),
		new GLatLng(51.31621167095496,6.5699851210736,0),
		new GLatLng(51.31619825823736,6.569991622249503,0),
		new GLatLng(51.31618722971876,6.569993219591495,0),
		new GLatLng(51.31617107299481,6.569992016584848,0),
		new GLatLng(51.31615815066267,6.569988208558414,0),
		new GLatLng(51.31614442367649,6.569980526307276,0),
		new GLatLng(51.31613069968138,6.569966379832238,0),
		new GLatLng(51.31612182109954,6.569954794126588,0),
		new GLatLng(51.31611132974843,6.569936755262248,0),
		new GLatLng(51.31610164679525,6.569908371203184,0),
		new GLatLng(51.31609357882318,6.569878688770771,0)
	], "#000080", 1, 1, "#000080", 0.2);

	var polygon = new GPolygon([
		new GLatLng(51.31670095492186,6.569877071059977,0),
		new GLatLng(51.31679539930166,6.57032247218261,0),
		new GLatLng(51.31755577452272,6.569902984504552,0),
		new GLatLng(51.31745787497871,6.569457193399998,0),
		new GLatLng(51.31670095492186,6.569877071059977,0)
	], "#000080", 1, 1, "#000080", 0.2);

	var fb09 = new GPolygon([
		new GLatLng(51.31725212836154,6.568659381010562,0),
		new GLatLng(51.31674147165043,6.568947460424653,0),
		new GLatLng(51.31680929305325,6.56924987849537,0),
		new GLatLng(51.31731851734438,6.568962711182223,0),
		new GLatLng(51.31725212836154,6.568659381010562,0)
	], "#000080", 1, 1, "#000080", 0.2);

	var lib = new GPolygon([
		new GLatLng(51.31667288810339,6.568963788046787,0),
		new GLatLng(51.31646556229354,6.569077466491378,0),
		new GLatLng(51.31658191413639,6.569611091383536,0),
		new GLatLng(51.31679032955589,6.569490907530181,0),
		new GLatLng(51.31667288810339,6.568963788046787,0)
	], "#000080", 1, 1, "#000080", 0.2);

	var ask = new GPolygon([
		new GLatLng(51.31642918770631,6.570868283580054,0),
		new GLatLng(51.31634916231325,6.570502548248882,0),
		new GLatLng(51.31622899579167,6.570568875230478,0),
		new GLatLng(51.31623891076178,6.570612437232611,0),
		new GLatLng(51.31613389841515,6.570670954234785,0),
		new GLatLng(51.31619568215281,6.570949221769482,0),
		new GLatLng(51.31630439956808,6.570888765630016,0),
		new GLatLng(51.3163136609957,6.570932573048836,0),
		new GLatLng(51.31642918770631,6.570868283580054,0)
	], "#000080", 1, 1, "#000080", 0.2);

	var hv = new GPolygon([
		new GLatLng(51.31701987739851,6.570979851894421,0),
		new GLatLng(51.31663929829706,6.571194606547992,0),
		new GLatLng(51.31668875982385,6.571421547199165,0),
		new GLatLng(51.31707025116261,6.571206761224218,0),
		new GLatLng(51.31701987739851,6.570979851894421,0)
	], "#000080", 1, 1, "#000080", 0.2);

	var spz = new GPolygon([
		new GLatLng(51.31682175720428,6.571091686592084,0),
		new GLatLng(51.31656834697687,6.569939088961731,0),
		new GLatLng(51.31638281422583,6.570039267583907,0),
		new GLatLng(51.31663927208331,6.571194667780688,0),
		new GLatLng(51.31682175720428,6.571091686592084,0)
	], "#000080", 1, 1, "#000080", 0.2);

	var dvz = new GPolygon([
		new GLatLng(51.31663930535929,6.57119460431251,0),
		new GLatLng(51.31652364392318,6.571255966811023,0),
		new GLatLng(51.31651012326912,6.571192888098381,0),
		new GLatLng(51.31627729851192,6.571326546928873,0),
		new GLatLng(51.31635484662272,6.571679862089867,0),
		new GLatLng(51.31658667692359,6.571545325839267,0),
		new GLatLng(51.31657443926754,6.57148649484013,0),
		new GLatLng(51.31668875982385,6.571421547199165,0),
		new GLatLng(51.31663930535929,6.57119460431251,0)
	], "#000080", 1, 1, "#000080", 0.2);

	var studis = new GPolygon([
		new GLatLng(51.31709097446367,6.571300258069229,0),
		new GLatLng(51.31724805954615,6.571213401594278,0),
		new GLatLng(51.31722728699478,6.571121295833095,0),
		new GLatLng(51.31734314769902,6.571056679680069,0),
		new GLatLng(51.31729288732724,6.570827352116297,0),
		new GLatLng(51.3170199003094,6.570979925880366,0),
		new GLatLng(51.31709097446367,6.571300258069229,0)
	], "#000080", 1, 1, "#000080", 0.2);

	var bla = new GPolygon([
		new GLatLng(51.31647520279159,6.569390995131101,0),
		new GLatLng(51.31646717261196,6.56935296845225,0),
		new GLatLng(51.31645810828717,6.569358040887067,0),
		new GLatLng(51.31642074724034,6.569327531269252,0),
		new GLatLng(51.31640736559178,6.569266932936031,0),
		new GLatLng(51.31590205827891,6.569544308740063,0),
		new GLatLng(51.3158806639557,6.569448195320192,0),
		new GLatLng(51.3157548016919,6.569518111367316,0),
		new GLatLng(51.31580967272024,6.569770011102407,0),
		new GLatLng(51.31584641432458,6.569748697000875,0),
		new GLatLng(51.31585296892695,6.569778247726545,0),
		new GLatLng(51.31588913309326,6.569757116515902,0),
		new GLatLng(51.31589581973904,6.569786659547418,0),
		new GLatLng(51.31593262087524,6.569765551344645,0),
		new GLatLng(51.3159412210717,6.569805477148421,0),
		new GLatLng(51.31646227152805,6.569515379362386,0),
		new GLatLng(51.31644906187031,6.56945195193002,0),
		new GLatLng(51.31646697393624,6.569395667393479,0),
		new GLatLng(51.31647520279159,6.569390995131101,0)
	], "#f33f00", 1, 1, "#ff0000", 0.2);

	map.addOverlay(mensa);
	map.addOverlay(polygon);
	map.addOverlay(fb09);
	map.addOverlay(lib);
	map.addOverlay(ask);
	map.addOverlay(hv);
	map.addOverlay(spz);
	map.addOverlay(dvz);
	map.addOverlay(studis);
	map.addOverlay(bla);

}

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);
				plotpolygons();
			}
		}
		request.send(null);
	}
}

