var map;

function load()
{
	map = new Map();

	getOptions();
	
	map.loadMap(markerData.geoLat, markerData.geoLng);
	
	var text =
		"<div class='infowindow' style='text-align: center;'>"+
		"Hier befindet sich die auf dieser Website vorgestellte Unterkunft.<br /><br />"+
		"<strong>"+markerData.name+" (Objektnummer "+markerData.nummer+")</strong><br /><br />"+
		"(Die Markierung stellt nur die ungefähre Lage dar.)"+
		"</div>";
	
	var mainMarker = map.addMarker(markerData.id, markerData.geoLat, markerData.geoLng, text, {"title": markerData.name, "category": "a", "zoom": [10, 15], "type": "static"}, {"typId": markerData.typId})
	map.highlightMarker(mainMarker, "#FF0000");
}

function getOptions()
{
	var typId = new Array();
	for(var i=1; i<=9; i++)
	{
		if(document.getElementById("mapOptionsObjektTyp"+i).checked == true)
		{
			typId.push(i);
		}
	}
	var personen = document.getElementById("mapOptionsPersonen").value;
	map.markerContainer.setOptions({typId: typId}, {}, {personen: personen});
}

function updateOptions()
{
	getOptions();
	map.markerContainer.refresh();
	map.update();
}

function toggleDynamicMarkers()
{
	var active = document.getElementById("mapToggleDynamicMarkers").checked;
	map.markerContainer.showDynamic = active;
	
	map.markerContainer.refresh();

	if(active == true)
	{
		for(var i=1; i<=9; i++)
		{
			document.getElementById("mapOptionsObjektTyp"+i).disabled = false;
		}
		document.getElementById("mapOptionsPersonen").disabled = false;
		//document.getElementById("mapOptionsPreis").disabled = false;
	}
	else
	{
		for(var i=1; i<=9; i++)
		{
			document.getElementById("mapOptionsObjektTyp"+i).disabled = true;
		}
		document.getElementById("mapOptionsPersonen").disabled = true;
		//document.getElementById("mapOptionsPreis").disabled = true;
	}
}

Array.prototype.copy = function () {
	return ((new Array()).concat(this));
};

if(!Array.indexOf)
{
	Array.prototype.indexOf = function(el)
	{
	    for(var i = 0; i < this.length; i++) if(el == this[i]) return i;
	}
}

function Map()
{
	this.centerLat = 0;
	this.centerLng = 0;
	this.mapDefaultZoomLevel = 11;
	
	this.mapElementID = 'map';
	
	this.map;
	
	this.markerContainer = new MarkerContainer();
	
	this.markersUrl = "/katalog/getResults.php";
	
	this.loadMap = function(centerLat, centerLng)
	{
		var that = this;
		
		this.centerLat = centerLat;
		this.centerLng = centerLng;
		
		if(GBrowserIsCompatible())
		{
			this.map = new GMap2(document.getElementById(this.mapElementID));
			
			this.map.addControl(new GLargeMapControl());
			this.map.addControl(new GScaleControl());
			this.map.addControl(new GHierarchicalMapTypeControl());
			this.map.enableContinuousZoom();
			this.map.addMapType(G_PHYSICAL_MAP);
			//this.map.enableScrollWheelZoom();
			var center = new GLatLng(parseFloat(this.centerLat), parseFloat(this.centerLng));
			this.map.setCenter(center, that.mapDefaultZoomLevel, G_PHYSICAL_MAP);
			
			this.markerContainer.setMap(this.map);
			
			var mgrOptions = { borderPadding: 50, maxZoom: 15, trackMarkers: true };
			
			var size = this.map.getSize();
						
			GEvent.addListener(this.map, "moveend", function() {
				that.update();
			});
			
			GEvent.addListener(this.map, "zoomend", function() {
				for(var i=0; i<that.markerContainer.markers.length; i++)
				{
					if(that.markerContainer.markers[i]._highlightCircle != null)
					{
						that.map.removeOverlay(that.markerContainer.markers[i]._highlightCircle);
						that.highlightMarker(that.markerContainer.markers[i], that.markerContainer.markers[i]._highlightColor);
					}
				}
			});
		}
	}
	
	this.update = function()
	{
		var bounds = this.map.getBounds();
		var southWest = bounds.getSouthWest();
		var northEast = bounds.getNorthEast();
		
		this.loadMarkers(southWest, northEast);
		
	}
	
	this.loadMarkers = function(southWest, northEast)
	{
		var that = this;
		
		var url = 
			that.markersUrl+
			'?left='+southWest.lng()+
			'&top='+northEast.lat()+
			'&right='+northEast.lng()+
			'&bottom='+southWest.lat()+
			'&output=xml'+
			'&objektTyp='+that.markerContainer.optionsSelection.typId.join(',')+
			'&personen='+that.markerContainer.optionsMinValues.personen;
		
		GDownloadUrl(url, function(data)
		{
			var xml = GXml.parse(data);
			var regionName = xml.documentElement.getAttribute("region"); 
			
			var xmlRegions = xml.documentElement.getElementsByTagName("regions")[0].getElementsByTagName("region");
			
			for (var i = 0; i < xmlRegions.length; i++) {
				
				var id = xmlRegions[i].getElementsByTagName("id")[0].firstChild.nodeValue;
				
				var regionName = xmlRegions[i].getElementsByTagName("name")[0].firstChild.nodeValue;
				
				var regionLat = xmlRegions[i].getElementsByTagName("geo")[0].getElementsByTagName("lat")[0].firstChild.nodeValue;
				var regionLng = xmlRegions[i].getElementsByTagName("geo")[0].getElementsByTagName("lng")[0].firstChild.nodeValue;
				
				var regionText =
					"<strong>Name</strong><br />"+
					regionName+"<br /><br />";
				
				that.addMarker(id, regionLat, regionLng, regionText, {"title": regionName, "category": "r", "zoom": [0, 9]}, {});
			}
			
			var xmlResults = xml.documentElement.getElementsByTagName("e");
			
			for (var i = 0; i < xmlResults.length; i++) {
				
				var id = xmlResults[i].getElementsByTagName("i")[0].firstChild.nodeValue;
				
				var name = xmlResults[i].getElementsByTagName("name")[0].firstChild.nodeValue;
				var nummer = xmlResults[i].getElementsByTagName("nummer")[0].firstChild.nodeValue;
				var lage = xmlResults[i].getElementsByTagName("lage")[0].firstChild.nodeValue;
				var personen = xmlResults[i].getElementsByTagName("personenmax")[0].firstChild.nodeValue;
				var schlafzimmer = xmlResults[i].getElementsByTagName("schlafzimmer")[0].firstChild.nodeValue;
				var preis = xmlResults[i].getElementsByTagName("preismin")[0].firstChild.nodeValue;
				
				var lat = xmlResults[i].getElementsByTagName("geo")[0].getElementsByTagName("lat")[0].firstChild.nodeValue;
				var lng = xmlResults[i].getElementsByTagName("geo")[0].getElementsByTagName("lng")[0].firstChild.nodeValue;
				
				var typId = xmlResults[i].getElementsByTagName("typId")[0].firstChild.nodeValue;
				var typ = xmlResults[i].getElementsByTagName("typ")[0].firstChild.nodeValue;
				
				var link = xmlResults[i].getElementsByTagName("url")[0].firstChild.nodeValue;
				
				var text =
					"<div class='infowindow'>"+
					"<strong>"+nummer+" - "+name+"</strong><br />"+
					//"<strong>Lage:</strong> "+lage+"<br />" +
					"<strong>Unterkunft:</strong> "+typ+"<br />" +
					"<strong>Personen:</strong> max. "+personen+"<br />" +
					"<strong>Schlafzimmer:</strong> "+schlafzimmer+"<br />" +
					"<strong>Preis:</strong> ab "+preis+" Euro<br />" +
					"<a href='"+link+"' title='zur Website wechseln'>mehr Informationen...</a><br />"+
					"(Die Markierung stellt nur die ungefähre Lage dar.)"+
					"</div>";
								
				that.addMarker(id, lat, lng, text, {"title": name, "category": "a", "zoom": [10, 15]}, {"typId": typId, "personen": personen});
			}
			
			that.markerContainer.refresh();
			
		});
		
	}
	
	this.addMarker = function(id, lat, lng, text, options, markerOptions)
	{
		var that = this;
		
		var existingMarker = that.markerContainer.markerExists(id, options["category"]);
		
		if(existingMarker == null)
		{
			var marker = that.createMarker(id, lat, lng, text, options, markerOptions);
			
			//that.markerContainer[options["type"]][id] = that.createMarker(id, lat, lng, options["content"], tooltip);
			//that.map.addOverlay(marker);
			that.markerContainer.addMarker(marker, options["zoom"][0], options["zoom"][1]);
			//that.markers.push(marker);
			if(markerData.id == id) GEvent.trigger(marker, "click"); 
			//that.markerIds.push(id);
			//alert("Marker "+id+" wird erzeugt bei "+lat+" und "+lng+"!");
			return marker;
		}
		else
		{
			//if(existingMarker.isHidden() == true) existingMarker.show();
			//that.hiddenMarkerIds.splice(exists, 1);
			//alert("Marker "+id+" existier bereits bei "+lat+" und "+lng+"!");
			//that.showMarkerContainer();
			return existingMarker;
		}
	}
	
	this.createMarker = function(id, lat, lng, text, options, markerOptions)
	{
		var that = this;
		
		if(options["category"] == "a")
		{
			var icon = new GIcon();
			icon.image = "/katalog/images/"+markerOptions["typId"]+".png";
			icon.iconSize = new GSize(25, 26);
			icon.iconAnchor = new GPoint(12, 14);
			icon.infoWindowAnchor = new GPoint(12, 13);
			var marker = new GMarker(new GLatLng(lat, lng), {title: options["title"], icon: icon});
		}
		else
		{
			var marker = new GMarker(new GLatLng(lat, lng), {title: options["title"], icon: icon});
		}
		
		var type = options["type"];
		if(!type) type = "dynamic";
		marker._options = new Object();
		marker._options["id"] = id;
		marker._options["type"] = type;
		marker._options["category"] = options["category"];
		marker._optionsSelection = new Object();
		marker._optionsSelection.typId = markerOptions["typId"];
		marker._optionsMinValues = new Object();
		marker._optionsMinValues.personen = markerOptions["personen"];
		marker.bindInfoWindowHtml(text);
		
		return marker;
	}
	
	this.highlightMarker = function(marker, color)
	{
		if(marker.getPoint)
		{
			var markerPoint = marker.getPoint();
			var polyPoints = Array();
			
			var mapNormalProj = G_NORMAL_MAP.getProjection();
			var mapZoom = this.map.getZoom();
			var clickedPixel = mapNormalProj.fromLatLngToPixel(markerPoint, mapZoom);
			
			var polySmallRadius = 40;
			
			var polyNumSides = 20;
			var polySideLength = 18;
			
			for (var a = 0; a<(polyNumSides+1); a++) {
				var aRad = polySideLength*a*(Math.PI/180);
				var polyRadius = polySmallRadius; 
				    var pixelX = clickedPixel.x + polyRadius * Math.cos(aRad);
				var pixelY = clickedPixel.y + polyRadius * Math.sin(aRad);
				var polyPixel = new GPoint(pixelX,pixelY);
				var polyPoint = mapNormalProj.fromPixelToLatLng(polyPixel,mapZoom);
				polyPoints.push(polyPoint);
			}
			//"#FFE51F"
			//"#007A3E"
			var highlightCircle = new GPolygon(polyPoints,"#000000",2,0.0,color,0.5);
			if(highlightCircle != null)
			{
				this.map.addOverlay(highlightCircle);
			}
			marker._highlightCircle = highlightCircle;
			marker._highlightColor = color;
		}
	}
}

function MarkerContainer()
{
	this.map;
	
	this.markers = new Array();
	
	this.optionsSelection = new Object();
	
	this.optionsProperty = new Object();
	
	this.optionsMinValues = new Object();
	
	this.showDynamic = true;
		
	this.setMap = function(map)
	{
		this.map = map;
	}
	
	this.addMarker = function(marker, minZoom, maxZoom)
	{
		this.markers.push(marker);
		this.map.addOverlay(marker);
		marker.hide();
	}
	
	this.setOptions = function(selection, property, minValues)
	{
		this.optionsSelection = selection;
		
		this.optionsProperty = property;
		
		this.optionsMinValues = minValues;
	}
	
	this.refresh = function()
	{
		for(var i=0; i<this.markers.length; i++)
		{
			var visible = true;
			if(this.markers[i]._options["type"] == "dynamic")
			{
				if(this.showDynamic == true)
				{
					for (var selection in this.optionsMinValues)
					{
						if(this.markers[i]._optionsMinValues[selection] < this.optionsMinValues[selection])
						{
							visible = false;
						}
					}
					for (var selection in this.optionsSelection)
					{
						if(this.optionsSelection[selection].indexOf(this.markers[i]._optionsSelection[selection]) == -1)
						{
							visible = false;
						}
					}
				}
				else
				{
					visible = false;
				}
			}
			else
			{
				visible = true;
			}
			
			if(visible == false)
			{
				this.markers[i].hide();
			}
			else
			{
				this.markers[i].show();
			}
		}
	}
	
	this.markerExists = function(id, category)
	{
		for(var i=0; i<this.markers.length; i++)
		{
			if(this.markers[i]._options["id"] == id & this.markers[i]._options["category"] == category) return this.markers[i];
		}
		
		return null;
	}
	
	/*
	this.showMarkerContainer = function()
	{
		var that = this;
		var outStr = "";
		
		for (var type in that.markerContainer)
		{
			outStr += type + ": " + that.markerContainer[type] + "\n";
			for (var marker in that.markerContainer[type])
			{
				outStr += " - "+marker + ": " + that.markerContainer[type][marker] + "\n";
				
			}
		}
		alert(outStr);
	}*/
}