var myMap, _GET;
var _debug = 0;
var _maxIcons = 25;
function searchPar() {
  var s = '', c, p, delim = '?+&'; 
  var hStr=unescape(self.location.search) + '?'; 
  for (p = 0; p < hStr.length; p++) { 
    c = hStr.charAt(p); 
    if (delim.indexOf(c) == -1) s += c; 
    else { 
      eq = s.indexOf('='); 
      if (eq!=-1) this[s.substring(0,eq)] = s.substring(++eq); 
      s = ''; 
    } 
  } 
} 

function initmap(){
	myMap = new rhhMap($("map"));
	_GET = new searchPar();
}
function rhhMap(mapElement){
	if (GBrowserIsCompatible()) {
		this.setPoints = new Object();
		//Karte initialisieren
		this.map = new GMap2(mapElement);
		_mPreferMetric = 1;
		this.setStartPosition();
		with(this.map){
			var control1 = new GLargeMapControl();
			addControl(control1);
			addControl(new GMapTypeControl());
			addControl(new GOverviewMapControl());
			var scale = new GScaleControl();
			addControl(scale);
			if(scale && scale.fpsLbl)
			{
				scale.fpsLbl.style.visibility="hidden";
				scale.fpsBar.style.visibility="hidden"; 
			}
			enableDoubleClickZoom();
			enableContinuousZoom();
			// setMapType(G_HYBRID_MAP);
		}
		var myThis = this;
		setTimeout(function() {
			for(var i = 0; i < myThis.map.getContainer().childNodes.length; ++i){
				if(myThis.map.getContainer().childNodes[i].innerHTML.indexOf(String.fromCharCode(169)) !== -1){
					myThis.map.getContainer().childNodes[i].style.fontSize = '7px';
					break;
				}
			}
/*
// ####### Drucken Button ############ //
			var a = document.createElement('a');
			a.appendChild(document.createTextNode("Drucken"));
			with(a.style){
				zIndex = 3;
				position = "absolute";
				right = "229px";
				top = "7px";
				display = "block";
				width = "61px";
				background = "#FFFFFF";
				border = "1px solid #000000";
				padding = "2px";
				textAlign = "center";
				cursor = "pointer";
			}
			a.title = "Karte Drucken";
			a.onclick = function(){printpage(); return false;};
			myThis.map.getContainer().appendChild(a);
*/
		}, 1500);
	}
}
rhhMap.prototype.setStartPosition = function() {
	//Die Karte auf Hamburg zentrieren, mit dem Zoomfaktor 10
	this.map.setCenter(new GLatLng(53.549839, 9.973259), 10);
}

rhhMap.prototype.showPoint = function(Placemark, pointType){
	debug(Placemark, 'rhhMap.prototype.showPoint');
	var iconKl;
	// var iconGr;
	// var mgr = new GMarkerManager(this.map);

	//Testen ob ein bestimmtest Symbol angezeigt werden soll
	if(Placemark.symbol && Placemark.symbol != undefined){
		//Herausfinden welches Symbol angezeigt werden soll und dieses dann als icon object zurueck geben
		iconKl = getSymbol(Placemark.symbol, 20);
		// iconGr = getSymbol(Placemark.symbol, 40);
	}
	//document.getElementById("debug").value += objToString(icon);
	var point = new GLatLng(Placemark.Point.coordinates[1], Placemark.Point.coordinates[0]);
	var markerKl = new GMarker(point, iconKl);
	// var markerGr = new GMarker(point, iconGr);
	if(Placemark.text){
		GEvent.addListener(markerKl, "mouseover", function() {
			markerKl.openInfoWindowHtml(Placemark.text, {maxWidth: 200});
		});
		/*
		GEvent.addListener(markerGr, "mouseover", function() {
			markerGr.openInfoWindowHtml(Placemark.text, {maxWidth: 200});
		});
		*/
		GEvent.addListener(markerKl, "dblclick", function() {
			location.href = '?webseiteID=' + _GET['webseiteID'] + ((_GET['webcontainerID'] != undefined && _GET['webcontainerID'] != '') ? '&webcontainerID=' +_GET['webcontainerID'] : '') + '&point='+point.toUrlValue()+'&zoom=14';
		});
	}
	this.map.addOverlay(markerKl);
	debug(point, '----rhhMap.prototype.showPoint point----');
	debug(markerKl, '----rhhMap.prototype.showPoint markerKL----');
	// mgr.addMarker(markerKl, 8, 13);
	// mgr.addMarker(markerGr, 14);
	if(this.setPoints[pointType] == undefined){
		this.setPoints[pointType] = new Array();
	}
	this.setPoints[pointType].push(markerKl);
	// this.setPoints[pointType].push(markerGr);
	
	// mgr.refresh();


	function getSymbol(symbol, size){
		var icon = new GIcon();

		if(size == undefined){
			var size = 20;
		}
		switch(size){
			case 20:
			case 40:
				break;
			default:
				return;
		}
		switch(symbol){
			case 'gesperrt':
				symbol = 'verbot';
				break;
			case 'bauarbeiten':
				symbol = 'baustelle';
				break;
			case 'unfall':
				symbol = 'achtung';
				break;
			case 'geräumt':
				symbol = 'aufgehoben';
				break;
			case 'kreis_gr':
				symbol = 'kreis_gr';
				break;
			case 'kreis_mi':
				symbol = 'kreis_mi';
				break;
			case 'kreis_kl':
				symbol = 'kreis_kl';
				break;
			case 'baustelle':
			case 'achtung':
			case 'fussgaenger':
			case 'schnee':
			case 'stau':
			case 'stockender':
			case 'ampel':
			case 'tiere':
			case 'verbot':
			case 'blitzer':
			case 'aufgehoben':
			case 'party':
			case 'cafe':
			case 'restaurant':
			case 'geldhaus':
			case 'baustelle_blau':
			case 'aussicht':
				break;
			default:
				return;
		}

		switch(symbol){
			case 'blitzer':
				icon.image = '/extension/site_radiohamburg/design/radioHH/images/gmap/' + size + '/' + symbol +'.gif';
				break;
			default:
				icon.image = '/extension/site_radiohamburg/design/radioHH/images/gmap/' + size + '/' + symbol +'.png';
		}
		
		icon.shadow = '/extension/site_radiohamburg/design/radioHH/images/gmap/' + size + '/' + symbol +'_s.png';

		switch(symbol){
			case 'baustelle':
			case 'achtung':
			case 'fussgaenger':
			case 'schnee':
			case 'stau':
			case 'ampel':
			case 'tiere':
			case 'unfall':
			case 'stockender':
			case 'party':
			case 'cafe':
			case 'restaurant':
			case 'geldhaus':
			case 'baustelle_blau':
			case 'aussicht':
				if(size == 20){
					icon.iconSize = new GSize(21,19);
					icon.shadowSize = new GSize(25, 20);
					icon.iconAnchor = new GPoint(10, 19);
					icon.infoWindowAnchor = new GPoint(10, 0);
				}else if(size == 40){
					icon.iconSize = new GSize(41,36);
					// icon.shadowSize = new GSize(50, 39);
					icon.iconAnchor = new GPoint(20, 36);
					icon.infoWindowAnchor = new GPoint(20, 0);
				}
				break;
			case 'verbot':
			case 'aufgehoben':
				if(size == 20){
					icon.iconSize = new GSize(21,21);
					icon.shadowSize = new GSize(30, 21);
					icon.iconAnchor = new GPoint(10, 21);
					icon.infoWindowAnchor = new GPoint(10, 0);
				}else if(size == 40){
					icon.iconSize = new GSize(41,41);
					// icon.shadowSize = new GSize(60, 41);
					icon.iconAnchor = new GPoint(30, 41);
					icon.infoWindowAnchor = new GPoint(30, 0);
				}
				break;
			case 'blitzer':
				if(size == 20){
					icon.iconSize = new GSize(16,22);
					icon.shadowSize = new GSize(31, 22);
					icon.iconAnchor = new GPoint(8, 22);
					icon.infoWindowAnchor = new GPoint(10, 0);
				}else if(size == 40){
					icon.iconSize = new GSize(23,30);
					icon.shadowSize = new GSize(48, 33);
					icon.iconAnchor = new GPoint(11, 30);
					icon.infoWindowAnchor = new GPoint(21, 0);
				}
				break;
			case 'kreis_gr':
				if(size == 20){
					icon.iconSize = new GSize(75,75);
					icon.shadowSize = new GSize(110, 75);
					icon.iconAnchor = new GPoint(37, 37);
					icon.infoWindowAnchor = new GPoint(10, 30);
				}else if(size == 40){
					icon.iconSize = new GSize(23,30);
					icon.shadowSize = new GSize(48, 33);
					icon.iconAnchor = new GPoint(11, 30);
					icon.infoWindowAnchor = new GPoint(21, 0);
				}
				break;
			case 'kreis_mi':
				if(size == 20){
					icon.iconSize = new GSize(50,50);
					icon.shadowSize = new GSize(80, 50);
					icon.iconAnchor = new GPoint(25, 30);
					icon.infoWindowAnchor = new GPoint(25, 0);
				}else if(size == 40){
					icon.iconSize = new GSize(23,30);
					icon.shadowSize = new GSize(48, 33);
					icon.iconAnchor = new GPoint(11, 30);
					icon.infoWindowAnchor = new GPoint(21, 0);
				}
				break;
			case 'kreis_kl':
				if(size == 20){
					icon.iconSize = new GSize(36,36);
					icon.shadowSize = new GSize(50, 36);
					icon.iconAnchor = new GPoint(15, 15);
					icon.infoWindowAnchor = new GPoint(15, 0);
				}else if(size == 40){
					icon.iconSize = new GSize(23,30);
					icon.shadowSize = new GSize(48, 33);
					icon.iconAnchor = new GPoint(11, 30);
					icon.infoWindowAnchor = new GPoint(21, 0);
				}
				break;
		}

		return icon;
	}
	this.getManager = function(){
		return mgr;
	}
}
rhhMap.prototype.showZoomedPoint = function(Placemark){
	var zoom = 1;
	var point = new GLatLng(Placemark.Point.coordinates[1], Placemark.Point.coordinates[0]);
	switch(Placemark.AddressDetails.Accuracy){
		case 0:
			zoom = 1;
			break;		
		case 1:
			zoom = 6;
			break;
		case 2:
			zoom = 8;
			break;
		case 3:
			zoom = 7;
			break;
		case 4:
			zoom = 11;
			break;
		case 5:
			zoom = 12;
			break;
		case 6:
			zoom = 15;
			break;
		case 7:
			zoom = 15;
			break;
		case 8:
			zoom = 17;
			break;
	}
	this.map.setCenter(point, zoom);
}
rhhMap.prototype.removePoints = function(pointType){
	if(this.setPoints[pointType] != undefined){
		for(var i=0; i<this.setPoints[pointType].length; i++){
			var marker = this.setPoints[pointType][i];
			this.map.removeOverlay(marker);
		}
		delete(this.setPoints[pointType]);
	}
}
rhhMap.prototype.removeThisPoint = function(pointType, pointNr){
	if(this.setPoints[pointType] != undefined){
		var marker = this.setPoints[pointType][pointNr];
		this.map.removeOverlay(marker);
		this.setPoints[pointType][pointNr] = undefined;
	}
}

rhhMap.prototype.getVerkehrsInfo = function(){
	var myThis = this;
	var verkehrsInfo;

	this.pruefeVerkehrMeldungen();

	var request = GXmlHttp.create();
	request.open("GET", "/var/data/verkehr/meldungen.txt?" + Math.random(), true);
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			if(request.responseText.length > 0){
				myThis.verkehrsInfo = eval('(' + request.responseText + ')');
				if(myThis.verkehrsInfo.Placemark.length > 0){
					if(!_GET['zoom']){
						var zusatztext = "<br /><strong class=\"info\">Detailansicht: Doppelklick</strong>";
						for(var i = 0; i < myThis.verkehrsInfo.Placemark.length; i++){
							myThis.verkehrsInfo.Placemark[i].text += zusatztext;
						}
					}
					myThis.verarbeiteVerkehrsInfo();
					if($('firstHelp')){
						$('firstHelp').setStyle({'display': 'block'})
					}
				}else{
					myThis.setStartPosition();
					myThis.infoFenster('Keine Verkehrsst&ouml;rungen gemeldet.');
				}
			}
		}
	}
	GEvent.addListener(this.map, "movestart", function() {
		myThis.removePoints('verkehr');
	});
	GEvent.addListener(this.map, "moveend", function() {
		myThis.verarbeiteVerkehrsInfo();
	});
	request.send(null);
}
rhhMap.prototype.verarbeiteVerkehrsInfo = function(){
	var angezeigeteIcons = 0;
	this.removePoints('verkehr');
	this.map.closeInfoWindow();
	if(!this.verkehrsInfo) return;
	if(this.verkehrsInfo.Placemark.length > 0){
		// anzeige bereich bestimmen
		var bounds = this.map.getBounds();
		var southWest = bounds.getSouthWest();
		var northEast = bounds.getNorthEast();
		var sw_lng = southWest.lng();
		var sw_lat = southWest.lat();
		var ne_lng = northEast.lng();
		var ne_lat = northEast.lat();
	 	for(var i=0; i<this.verkehrsInfo.Placemark.length; i++){
			if(this.verkehrsInfo.Placemark[i].Point == undefined){
				continue;
			}
			var myLngPoint = this.verkehrsInfo.Placemark[i].Point.coordinates[0];
			var myLatPoint = this.verkehrsInfo.Placemark[i].Point.coordinates[1];
			if(sw_lng < myLngPoint && ne_lng > myLngPoint &&
				sw_lat < myLatPoint && ne_lat > myLatPoint){
		 		this.showPoint(this.verkehrsInfo.Placemark[i], 'verkehr');
				angezeigeteIcons++;
			}
			if(angezeigeteIcons >= _maxIcons){
				break;
			}
	 	}
		if(angezeigeteIcons == 0){
			// es werden in diesem bereich keine icons/marker angezeigt
			// this.keineVerkehrsInfo();
		}else{
			// es werden in diesem bereich icons/marker angezeigt
/*
	var myThis = this;
	var myDiv = document.createElement("div");
	myDiv.setAttribute("id", "keineMeldung");
	var myP = document.createElement("p");
	var myTextNode = document.createTextNode("Es werden " + angezeigeteIcons + " von " + this.verkehrsInfo.Placemark.length + " Meldungen angezeigt.");
	myP.appendChild(myTextNode);
	var myBR = document.createElement("br");
	myP.appendChild(myBR);
	var myA = document.createElement("a");
	var myTextNode_A = document.createTextNode("OK");
	myA.appendChild(myTextNode_A);
	myA.onclick=function(){myThis.map.getContainer().removeChild($('keineMeldung'));};
	myA.style.cursor = "pointer";
	myA.style.textAlign = "center";
	myA.style.display = "block";
	myA.style.marginTop = "5px";
	myA.style.border = "2px outset #808080";
	// myA.focus();
	myP.appendChild(myA);
	myDiv.appendChild(myP);
	this.map.getContainer().appendChild(myDiv);
	var keineMeldungListener = GEvent.addListener(this.map, "move", function() {
		if($('keineMeldung'))	myThis.map.getContainer().removeChild($('keineMeldung'));
		GEvent.removeListener(keineMeldungListener);
		GEvent.removeListener(keineMeldungListener2);
		}
	);
	var keineMeldungListener2 = GEvent.addListener(this.map, "addoverlay", function() {
		if($('keineMeldung'))	myThis.map.getContainer().removeChild($('keineMeldung'));
		GEvent.removeListener(keineMeldungListener);
		GEvent.removeListener(keineMeldungListener2);
		}
	);
*/
		}
	}
}
//rhhMap.prototype.keineVerkehrsInfo = function(){
rhhMap.prototype.infoFenster = function(text){
	var myThis = this;
	if(!$('keineMeldung')){
		var myDiv = document.createElement("div");
		myDiv.setAttribute("id", "keineMeldung");
		var myP = document.createElement("p");
		myDiv.appendChild(myP);
		this.map.getContainer().appendChild(myDiv);
		var keineMeldungListener = GEvent.addListener(this.map, "move", function() {
			myThis.map.getContainer().removeChild(document.getElementById('keineMeldung'));
			GEvent.removeListener(keineMeldungListener);
			GEvent.removeListener(keineMeldungListener2);
			}
		);
		var keineMeldungListener2 = GEvent.addListener(this.map, "addoverlay", function() {
			myThis.map.getContainer().removeChild(document.getElementById('keineMeldung'));
			GEvent.removeListener(keineMeldungListener);
			GEvent.removeListener(keineMeldungListener2);
			}
		);
	}else{
		var myP = $('keineMeldung').getElementsByTagName("p")[0];
	}
	//var myTextNode = document.createTextNode("Keine Verkehrsstörungen gemeldet.");
	//myP.appendChild(myTextNode);
	myP.innerHTML = text;
}
rhhMap.prototype.pruefeVerkehrMeldungen = function(){
	var myMd5_file = this.md5_file;
	var myThis = this;
	var request = GXmlHttp.create();
	var sec = (60 + Math.floor(Math.random()*10)) * 1000;
	request.open("GET", "/source/getmd5map.php?" + Math.random(), true);
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			if(request.responseText.length > 0){
				obj = eval('(' + request.responseText + ')');
				myThis.md5_file = obj.md5_file;
				if(myThis.md5_file != myMd5_file && myMd5_file != undefined){
					// es gibt neue Meldungen!
					var jetzt = new Date();
					var Std = jetzt.getHours();
					var Min = jetzt.getMinutes();
					var StdAusgabe = ((Std < 10) ? "0" + Std : Std);
					var MinAusgabe = ((Min < 10) ? "0" + Min : Min);

					$('meldungen_refresh').innerHTML = '<strong>' + StdAusgabe + ':' + MinAusgabe + ' Uhr:</strong> ';
					$('meldungen_refresh').innerHTML += 'Neue Meldungen sind eingetroffen, bitte <a href="?webseiteID=' + _GET['webseiteID'] + ((_GET['webcontainerID'] != undefined && _GET['webcontainerID'] != '') ? '&webcontainerID=' +_GET['webcontainerID'] : '') + '">aktualisieren</a>';
					$('meldungen_refresh').style.backgroundColor = "#FF0";
					$('meldungen_refresh').style.display = "block";
				}else if(myMd5_file != undefined){
					// keine neuen meldungen
				}
				window.setTimeout(pruefeInterval, sec);
			}
		}
	};
	request.send(null);
	var pruefeInterval = function(){
		myThis.pruefeVerkehrMeldungen();
	}
}
rhhMap.prototype.infoHelp = function(){
	var myThis = this;
	var myDiv = document.createElement("div");
	myDiv.setAttribute("id", "infoHelp");
	var myP = document.createElement("p");
	myP.innerHTML = "<strong>Tipp: </strong>Klicken und ziehen Sie mit der Maus auf der Karte um diese zu bewegen.<br />";
	var myA = document.createElement("a");
	var myTextNode_A = document.createTextNode("schließen");
	myA.onclick=function(){myThis.map.getContainer().removeChild($('infoHelp'));};	
	myA.appendChild(myTextNode_A);
	myP.appendChild(myA);
	myDiv.appendChild(myP);
	with(myDiv.style){
		position = "relative";
		zIndex = "2";
		top = "25px";
		left = "80px";
		fontSize = "9px";
		padding = "0";
		margin = "0";
		border = "1px solid #F00";
		backgroundColor = "#FFF";
		width = "120px";
	}
	with(myP.style){
		padding = "0";
		margin = "2px";
		backgroundColor = "transparent";
	}
	with(myA.style){
		cursor = "pointer";
	}
	this.map.getContainer().appendChild(myDiv);
}
rhhMap.prototype.addressToPoint = function(address, pointType) {
	this.geocoder = new GClientGeocoder();
	var lastResponse;
	var myThis = this;
	this.geocoder.getLocations(address, function(response) {
		if (!response || response.Status.code != 200) {
			myThis.infoFenster("Adresse \"" + address + "\" wurde nicht gefunden!");
		} else {
			var point = new GLatLng(response.Placemark[0].Point.coordinates[1], response.Placemark[0].Point.coordinates[0]);
			// myThis.map.setCenter(point, 17);
			myThis.showZoomedPoint(response.Placemark[0]);

			lastResponse = response;
			for(var i = 0; i < response.Placemark.length; i++){
				myThis.showPoint(response.Placemark[i], pointType);
			}
		}
	});
	this.getLastResponse = function(){
		return lastResponse;
	}
}
function objToString(anObj, level) {
	if(!level) level = 0;
	if(level > 20) return 'error';
	var st = '';
	if(level > 0) st += '\n';
	for(var i=0; i<level; i++) st += '\t';
	st += 'object(\n';
	for(var prop in anObj) {
		if ((prop.charAt(0) == '$') || ((typeof anObj[prop]) == 'function')) continue;
		for(var i=0; i<=level; i++) st += '\t';
		if((typeof anObj[prop]) == 'object'){
			st += '[' + prop + '] => ' + objToString(anObj[prop], (level+1)) + '\n';
		}else{
			st += '[' + prop + '] => ' + anObj[prop] + '\n';
		}
	}
	for(var i=0; i<level; i++) st += '\t';
	st += ')';
	--level;
	return st;
}
function debug(data, ueberschrift){
	try{
		if(_debug == 1 && data != undefined){
			var debug = $("debug");
			if(debug == undefined){
				try{
					debug = document.createElement("textarea");
					debug.setAttribute("id", "debug");
					debug.setAttribute("name", "debug");
					debug.style.width = '300px';
					debug.style.height = '300px';
					
					$('maincontent').appendChild(debug);
					debug = $(debug);
				}catch(e){
					alert("Konnte das debug Element nicht anlegen.\n" + $H(e).inspect());
					return;
				}
			}
			if(ueberschrift != undefined){
				debug.value += "\n" + ueberschrift + ":\n";
			}
			debug.value += $H(data).inspect();
		}else if(_debug == 1 && data == undefined){
			$("debug") = "";
		}
	}catch(e){
		try{
			alert(e['name'] + ': ' + e['message'] + '\nNumber: ' + e['number'] + '\nDescription: ' + e['description']);
		}catch(e){
			alert($H(e).inspect());
		}
	}
}
//http://maps.google.com/maps/geo?q=Hamburg&output=xml&key=ABQIAAAAcH78LBR23N4mH2kRu81nyBQAztqFvPzEv0vRtUPqtmay57DUwxR_xt0bBbYu3QXbEH5Jodrsnxdh6g
//http://maps.google.com/maps/geo?q=Hamburg&output=xml&key=ABQIAAAAXXKbTPCObJJv2FYxX8PFuRQewV7lNddg8dpIqBTTHDYnPDpoNxSK6oCBGLvYax5XFMcVKir72TX1HA
