function Legende(){
	
	/* Attribute */
	this.container = document.getElementById('Legende');
	this.hidden = true;
	this.selectedTP = new Array();
	this.selectedBB = new Array();
	this.menue = "tp";
	this.GListeners = new Array();
	this.markers = new Array();
	this.currZoom = DEFZOOM;
	
	/* Methodendefinitionen */
	this.show = show;
	this.hide = hide;
	this.showHide = showHide;
	this.restoreSelected = restoreSelected;
	this.loadContent = loadContent;
	this.addSelection = addSelection;
	this.remSelection = remSelection;
	this.checkOpt = checkOpt;
	this.setContainerContent = setContainerContent;
	this.addListeners = addListeners;
	this.remListeners = remListeners;
	this.createMarker = createMarker;
	this.firmenInfoWindow = firmenInfoWindow;
	this.marinaInfoWindow = marinaInfoWindow;
	this.poiInfoWindow = poiInfoWindow;
	this.loadMarkers = loadMarkers;
	this.displayGroup = displayGroup;
	
	/* Initialisierung */
	this.container.style.backgroundColor = "white";
	this.container.style.border = "1px solid #000000";
	this.container.style.position = "absolute";
	this.container.style.top = "210px";
	this.container.style.left = "266px";
	
	
	
	/* Methoden */
	function show(){
		setTimeout("Effect.Appear('Legende', {from: 0.0, to: 0.9, duration: 0.5 })",250, 'JavaScript');
		Legende.loadContent(Legende.menue);
		Legende.hidden = false;
		if(Legende.GListeners.length == 0){
			Legende.addListeners();
			new Draggable('Legende');
		}
	}
	
	
	function hide(){
		Effect.DropOut('Legende');
		Legende.hidden = true;
		//this.remListeners();
	}
	
	
	function showHide(){
		if(this.hidden)
			this.show();
		else
			this.hide();
	}
	
	//Stellt den alten Zustand der checkboxen in der Legende beim Umschalten 
	//zwischen tp und bb her.
	function restoreSelected(){
		
		if(this.menue == "bb"){
			for(var i = 0; i < this.selectedBB.length; i++){
				try{
					var t = this.selectedBB[i];
					document.getElementById(t).checked = true;
				}catch(e){
					alert("Keine Warengruppen im Branchenbuch");
				};
			}
		}else{
			for(var i = 0; i < this.selectedTP.length; i++){
				try{
					var t = this.selectedTP[i];
					document.getElementById(t).checked = true;
				}catch(e){
					alert("Keine Warengruppen im Toernplaner");
				};
			}
		}
	}
	
	
	/*
	* siehe Legende::getWarengruppen()
	*/
	function loadContent(menue){
		
		if(Legende.selectedBB.length > 0 || Legende.selectedTP.length > 0)
			(menue=="bb")?loadMarkers(Legende.selectedBB.join("#")):loadMarkers(Legende.selectedTP.join("#"));
		this.menue = menue;
		
		var url = BASEURL+"data/karte.legende.php?menue="+menue;
		
		
		var aj = new Ajax.Request(url,{
				asynchronous: false,
				onCreate: ajaxLoading('Legende',100),
				onComplete: Legende.setContainerContent,
				onFailure: ajaxError,
				method:'get'
				});
		
	 	
	}
	
	//Wenn eine Warengruppe An- oder Abgewählt wurde, werden die Marker aktualisiert
	function checkOpt(onOff, gruppe){
		
		if(onOff == true){
			this.addSelection(gruppe);
			$(gruppe).checked = true;
		}else{
			this.remSelection(gruppe);
			$(gruppe).checked = false;
		}
		
		(this.menue=="bb")?loadMarkers(Legende.selectedBB.join("#")):loadMarkers(Legende.selectedTP.join("#"));
	}
	
	//Fügt eine Warengruppe zum Anzeigen auf der Karte hinzu
	function addSelection(gruppe){
		
		if(this.menue == "bb"){
			this.selectedBB.push(gruppe);
		}else{
			this.selectedTP.push(gruppe);
		}
	}
	
	
	
	//Entfernte eine Warengruppe aus der Karte
	function remSelection(gruppe){
		
		if(this.menue == "bb"){
			for(var i = 0; i < this.selectedBB.length; i++){
				if(this.selectedBB[i] == gruppe){
					//Entfernt das element aus dem array das und von der anzeige
					this.selectedBB.splice(i, 1);
				}
			}
		}else{
			for(var i = 0; i < this.selectedTP.length; i++){
				if(this.selectedTP[i] == gruppe){
					//Entfernt das element aus dem array das und von der anzeige
					this.selectedTP.splice(i, 1);
				}
			}
		}
		
	}



	function setContainerContent(c){
		
		if(c.responseText){
			Legende.container.innerHTML = c.responseText;
		}else
			Legende.container.innerHTML = c;
		
		Legende.restoreSelected();
		
	}
	
	
	function addListeners(){
		//Event Listener
		var t = GEvent.addListener(map, "dragend", function(){
			if(Legende.currZoom >= OVERVIEWZOOM)
				(Legende.menue=="bb")?Legende.loadMarkers(Legende.selectedBB.join("#")):Legende.loadMarkers(Legende.selectedTP.join("#"));
		});
		this.GListeners.push(t);
		
		
		var t = GEvent.addListener(map, "moveend", function(){
			pageTracker._trackPageview("/WTG_Karte_bewegt" );
		});
		
		t = GEvent.addListener(map, "zoomend", function(altZoom,neuZoom){
			
			//Herauszoomen
			if(neuZoom < altZoom)
				if(neuZoom < OVERVIEWZOOM && altZoom >= OVERVIEWZOOM){
					Legende.loadMarkers("overview");
				}else if(neuZoom >= OVERVIEWZOOM && altZoom < OVERVIEWZOOM){
					(Legende.menue=="bb")?Legende.loadMarkers(Legende.selectedBB.join("#")):Legende.loadMarkers(Legende.selectedTP.join("#"));
				}
			//Hereinzoomen	
			else if(neuZoom > altZoom){
				if(altZoom < OVERVIEWZOOM && neuZoom >= OVERVIEWZOOM){
					(Legende.menue=="bb")?Legende.loadMarkers(Legende.selectedBB.join("#")):Legende.loadMarkers(Legende.selectedTP.join("#"));
				}
			}
			Legende.currZoom = neuZoom;
		});
		
		this.GListeners.push(t);
		
	}
	
	
	
	function remListeners(){
		for(var i = 0; i < this.GListeners.length; i++){
			GEvent.removeListener(this.GListeners[i]);
		}
		this.GListeners = new Array();
	}
	
	
	
	
	
	
	//TODO prototype AJAX-aufruf einbauen.
	function loadMarkers(warengruppenString){
		
		var url = BASEURL+"data/karte.marker.php";
		var gruppen = "gruppen="+warengruppenString;
		var bounds = "bounds="+map.getBounds();
		var zoom = "zoom="+map.getZoom();
		var params = gruppen+"&"+bounds+"&"+zoom;
		
		
		if(warengruppenString != undefined)	
		if(warengruppenString.length > 6){
			xmlHttp = new XMLHttpRequest();
			
			xmlHttp.open("POST", url, true);
			//Send the proper header information along with the request
			//TODO Security
			xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			xmlHttp.setRequestHeader("Content-length", params.length);
			xmlHttp.setRequestHeader("Connection", "close");
			
			xmlHttp.onreadystatechange = function() {//Call a function when the state changes.
				if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {
					
					
					var markers = new Array();
					Kartenliste.clearList();
					var tempmarkers = new Array();
					
					eval(xmlHttp.responseText); //füllt markers array
					
					/* 
					*	markers elemente:
					*	idx, x, y, name, bild, paketnr, has_url, has_pdf, has_biler, adr, wg_icons
					*/
					for(var i = 0; i < markers.length; i++){
						if(markers[i].idx > 0){
							tempmarkers.push(createMarker(markers[i]));
						}else
							alert(unescape("Es wurden mehr Eintr%E4ge gefunden als angezeigt werden.Durch heranzoomen k%F6nnen alle Eintr%E4ge angezeigt werden."));
						
					}
					Legende.markers = tempmarkers;
					refreshMapMarkers();
				}
			}
			
			xmlHttp.send(params);
			
		}else{
			Legende.markers = new Array();
			Kartenliste.clearList();
			refreshMapMarkers();
			
		}
		
		
	}
	
	
	
	/*
	*	markerdata: {idx, x, y, name, bild, typ}
	*				[typ:poi noch revier, typ:fi_ma => noch adr und paketnr]
	*	index: index im markers array
	*/
	function createMarker(markerdata, index){
		
		var pos = new GPoint(markerdata.x, markerdata.y);
		if(markerdata.typ == "ovw") stdIcon.iconSize = new GSize(32,32);
		else stdIcon.iconSize = new GSize(20,20);
		var ic = new GIcon(stdIcon, markerdata.bild, null, '');
		var marker = new GMarker(pos, {draggable: false, title: markerdata.name, clickable: true, icon: ic});
		marker.wtgIdx = markerdata.idx;
		try{
			marker.wtgAdr = markerdata.adr;
			marker.wtgRevier = markerdata.revier;
			marker.wtgPaket = markerdata.paketnr;
			marker.wtgLogo = markerdata.logo;
		}catch(e){};
		
		marker.wtg_i = index;
		marker.wtgTyp = markerdata.typ;
		marker.wtgName = markerdata.name;
		
		if(markerdata.typ == "fir"){
			//Firmen
			Kartenliste.addFirma(marker.wtgName, marker.getLatLng());
			
			marker.hasURL = markerdata.has_url;
			marker.hasPDF = markerdata.has_pdf;
			marker.hasBilder = markerdata.has_bilder;
			marker.wgIcons = markerdata.wg_icons;
			GEvent.addListener(marker, "click", function (){
				pageTracker._trackPageview("/WTG_Karte_Firmendetails_klein_"+marker.wtgName);
				var maxContentDiv = document.createElement('div');
	          	maxContentDiv.style.textAlign = "left";
	          	maxContentDiv.innerHTML = 'Inhalte werden geladen...';
	          	
	          	marker.openInfoWindowHtml(firmenInfoWindow(marker),{maxContent: maxContentDiv,maxTitle: '<a onclick="map.getInfoWindow().restore();">'+marker.wtgName+'</a>'});
				//marker.openInfoWindowTabsHtml([new GInfoWindowTab("Lab1","html"), new GInfoWindowTab("Lab2","html2")], {maxContent: maxContentDiv,maxTitle: '<a onclick="map.getInfoWindow().restore();">'+marker.wtgName+'</a>'});
				
				var iw = map.getInfoWindow();
				iw.loadIdx = marker.wtgIdx
				iw.maxWidth = 750;
	          	GEvent.addListener(iw, "maximizeclick", function() {
	            	GDownloadUrl(BASEURL+"data/wtg.firmendetails.php?id="+iw.loadIdx+"&typ="+marker.wtgTyp, function(data) {
	              		
	              		maxContentDiv.innerHTML = data;
	            	});
	            	autohide();
	          	});
	          	
	          	GEvent.addListener(iw, "restoreclick", function(){
	            	autoshow();
	            });
			});
			
		}else if(markerdata.typ == "mar"){
			//Marinas
			marker.hasURL = markerdata.has_url;
			marker.hasPDF = markerdata.has_pdf;
			marker.hasBilder = markerdata.has_bilder;
			marker.isBS = markerdata.is_bs;
			marker.isGW = markerdata.is_gw;
			marker.wgIcons = markerdata.wg_icons;
			
			Kartenliste.addMarina(marker.wtgName, marker.getLatLng());
			GEvent.addListener(marker, "click", function (){
				pageTracker._trackPageview("/WTG_Karte_Firmendetails_klein_"+marker.wtgName);
				var maxContentDiv = document.createElement('div');
	          	maxContentDiv.style.textAlign = "left";
	          	maxContentDiv.innerHTML = 'Inhalte werden geladen...';
	          	
	          	marker.openInfoWindowHtml(marinaInfoWindow(marker),{maxContent: maxContentDiv,maxTitle: '<a onclick="map.getInfoWindow().restore();">'+marker.wtgName+'</a>'});
				
				var iw = map.getInfoWindow();
				iw.loadIdx = marker.wtgIdx
				iw.maxWidth = 900;
	          	GEvent.addListener(iw, "maximizeclick", function() {
	            	GDownloadUrl(BASEURL+"data/wtg.firmendetails.php?id="+iw.loadIdx+"&typ="+marker.wtgTyp, function(data) {
	              		maxContentDiv.innerHTML = data;
	            	});
	            	autohide();
	          	});
	          	
	          	GEvent.addListener(iw, "restoreclick", function(){
	            	autoshow();
	            });
			});
			
		}else if(markerdata.typ == "poi"){
			//POIs
			
			Kartenliste.addPOI(marker.wtgName, marker.getLatLng());
			GEvent.addListener(marker, "click", function (){
				var maxContentDiv = document.createElement('div');
				maxContentDiv.style.textAlign = "left";
	          	maxContentDiv.innerHTML = 'Inhalte werden geladen...';
	          	
	          	marker.openInfoWindowHtml(poiInfoWindow(marker),{maxContent: maxContentDiv,maxTitle: '<a onclick="map.getInfoWindow().restore();">'+marker.wtgName+'</a>'});
				
				var iw = map.getInfoWindow();
				iw.loadIdx = marker.wtgIdx
				iw.maxWidth = 900;
	          	GEvent.addListener(iw, "maximizeclick", function() {
	            	GDownloadUrl(BASEURL+"data/wtg.karte.poidetails.php?id="+iw.loadIdx, function(data) {
	              		maxContentDiv.innerHTML = data;
	            	});
	            	autohide();
	          	});
	          	
	          	GEvent.addListener(iw, "restoreclick", function(){
	            	autoshow();
	            });
			});
			
		}else if(markerdata.typ == "perma"){
			
			Kartenliste.addPerma(marker.wtgName, marker.getLatLng());
			GEvent.addListener(marker, "click", function (){
				var maxContentDiv = document.createElement('div');
				maxContentDiv.style.textAlign = "left";
	          	maxContentDiv.innerHTML = 'Inhalte werden geladen...';
	          	
	          	marker.openInfoWindowHtml(poiInfoWindow(marker),{maxContent: maxContentDiv,maxTitle: '<a onclick="map.getInfoWindow().restore();">'+marker.wtgName+'</a>'});
				
				var iw = map.getInfoWindow();
				iw.loadIdx = marker.wtgIdx
				iw.revier = marker.wtgRevier;
				iw.maxWidth = 900;
	          	GEvent.addListener(iw, "maximizeclick", function() {
	            	GDownloadUrl(BASEURL+"data/karte.permadetails.php?id="+iw.loadIdx+"&revier="+iw.revier, function(data) {
	              		maxContentDiv.innerHTML = data;
	            	});
	            	autohide();
	          	});
	          	GEvent.addListener(iw, "restoreclick", function(){
	            	autoshow();
	            });
			});
		}else if(markerdata.typ == "ovw"){
			GEvent.addListener(marker, "click", function (glatlng){
				Legende.displayGroup("01.01.02", glatlng, 11);
			});
		}
		
		return marker;
	
		
	}
	
	
	
	
	
	
	/* Aussehen kleiner Googlemaps-Sprechblasen bestimmen für Firmen */
	function firmenInfoWindow(marker){
		pageTracker._trackPageview("/WTG_Karte_Firmendetails_gross_"+marker.wtgName);
		
		var str = '<div style="margin-top:5px;font-size:small;"><span>'
				+'<a onclick="map.getInfoWindow().maximize();" style="font-weight:bold;">'+marker.wtgName+'</a>';
		//if(marker.wtgLogo != "")str += ' <img src="'+BASEURL+'img/logos/'+marker.wtgLogo+'" alt="'+marker.wtgName+'" />';
		
		var ausstIcons = ''
		if(marker.hasPDF) var pdficon = '<img src="'+BASEURL+'img/layout/pdf.png" alt="PDF" title="PDF Informationen" />';
		else var pdficon = '';
		
		if(marker.hasURL) var urlicon = '<img src="'+BASEURL+'img/layout/url.png" alt="URL" title="Internetseite" />';
		else var urlicon = '';
		
		if(marker.hasBilder) var bildericon = '<img src="'+BASEURL+'img/layout/legende/bilder.png" alt="Bilder" title="Umgebungsbilder" />';
		else var bildericon = '';
		
		var wgIcons = '';
		if(marker.wgIcons.length > 1){
			wgIcons += unescape("T%E4tigkeitsbereiche:")+'<br/>';
			for(var i = 0; i < marker.wgIcons.length; i++){
				wgIcons += '<img src="'+marker.wgIcons[i]+'" alt="warengruppe'+i+'" title="Bedeutung siehe Legende" /> ';
			}
		}
		ausstIcons = pdficon+' '+urlicon+' '+bildericon;
		if(ausstIcons.length > 5)
			ausstIcons = 'Hinterlegt:<br/>'+ausstIcons;
		
		str += '</span><br/><div><span style="float:left;font-size:smaller;">'+ausstIcons+'</span>'
				+'<span style="float:right;text-align:right;font-size:smaller;">'+wgIcons+'</span></div>';
				+'</div>';
		return str;
		
	}
	
	
	
	/* Aussehen kleiner Googlemaps-Sprechblasen bestimmen für Marinas */
	function marinaInfoWindow(marker){
		pageTracker._trackPageview("/WTG_Karte_Firmendetails_gross_"+marker.wtgName);
		
		var str = '<div style="margin-top:5px;font-size:small;"><span>'
				+'<a onclick="map.getInfoWindow().maximize();" style="font-weight:bold;">'+marker.wtgName+'</a>';
		//if(marker.wtgLogo != "")str += ' <img src="'+BASEURL+'img/logos/'+marker.wtgLogo+'" alt="'+marker.wtgName+'" />';
		
		var ausstIcons = ''
		if(marker.hasPDF) var pdficon = '<img src="'+BASEURL+'img/layout/pdf.png" alt="PDF" title="PDF Informationen" />';
		else var pdficon = '';
		
		if(marker.hasURL) var urlicon = '<img src="'+BASEURL+'img/layout/url.png" alt="URL" title="Internetseite" />';
		else var urlicon = '';
		
		if(marker.hasBilder) var bildericon = '<img src="'+BASEURL+'img/layout/legende/bilder.png" alt="Bilder" title="Umgebungsbilder" />';
		else var bildericon = '';
		
		if(marker.isBS > 0) var BSicon = '<img src="'+BASEURL+'img/layout/legende/blauesterne.png" alt="BSterbe" title="Blauesterne" />';
		else var BSicon = '';
		
		if(marker.isGW > 0) var GWicon = '<img src="'+BASEURL+'img/layout/legende/gelbewelle.png" alt="Gelbewelle" title="Gelbewelle" />';
		else var GWicon = '';
		
		var wgIcons = '';
		if(marker.wgIcons.length > 1){
			wgIcons += unescape("T%E4tigkeitsbereiche:")+'<br/>';
			for(var i = 0; i < marker.wgIcons.length; i++){
				wgIcons += '<img src="'+marker.wgIcons[i]+'" alt="warengruppe'+i+'" title="Bedeutung siehe Legende" /> ';
			}
		}
		ausstIcons = pdficon+' '+urlicon+' '+bildericon+' '+BSicon+' '+GWicon;
		if(ausstIcons.length > 5)
			ausstIcons = 'Merkmale:<br/>'+ausstIcons;
		
		str += '</span><br/><div><span style="float:left;font-size:smaller;">'+ausstIcons+'</span>'
				+'<span style="float:right;text-align:right;font-size:smaller;">'+wgIcons+'</span></div>';
				+'</div>';
		return str;
		
	}
	
	
	/* Aussehen kleiner Googlemaps-Sprechblasen bestimmen für Point of Interest */
	function poiInfoWindow(marker){
		pageTracker._trackPageview("/WTG_Karte_Poi_gross_"+marker.wtgName);
		var str = '<div style="margin-top:5px;font-size:small;"><span>'
				+'<a onclick="map.getInfoWindow().maximize();" style="font-weight:bold;">'+marker.wtgName+'</a>';
		str += '</div>';
		return str;
	}
	
	
	
	//	Lädt marker einer Warengruppe bei geschlossenem Legende-Fenster:
	//	wg: warengruppe - wenn warenguppe leer ist, wird die karten zentriert und der zoom gesetzt
	//	glatlng_center: new GLatLng()
	//	zoom: zoomstufe - autom. gesetzt wenn leer. default 11 
	function displayGroup(wg, glatlng_center, zoom){
		
		
		if(typeof glatlng_center == "object")
			map.setCenter(glatlng_center);
		
		if(typeof zoom != "number")
			zoom = 11;
		map.setZoom(zoom);
		
		if(typeof wg == "string"){
			
			
			if (wg=="02.01.00"  || wg=="02.04.00"  || wg=="02.08.00"  || wg=="01.01.02" || wg=="02.02.00" || wg=="02.03.00" || wg=="02.06.00") {
				this.selectedTP = new Array();
				this.selectedTP.push(wg);
				Legende.loadContent('tp');
			} else {
				this.selectedBB = new Array();
				this.selectedBB.push(wg)
				Legende.loadContent('bb');
			}
			
		}
		
	}
}
