var geocoder = new GClientGeocoder();

function Map(mapmodus, textmodus, root, engine)
{
	this.mode = mapmodus;
	
	this.textmode = textmodus;
	
	this.root = root;
	
	this.engine = engine;
	
	this.mapDefaultZoomLevel = 13;
	
	this.mapElementID = 'map';
	
	this.mapIsLoaded = false;
	
	this.map;
	
	this.markers = new Array();
	
	this.markerIds = new Array();
	
	this.markerIdsHide = new Array();
	
	this.markerOpened = null;
	
	this.highlightCircle;
	
	this.highlightedMarker;
	
	this.results = new Array();
	
	this.url;
	
	this.regionId;
	
	this.regionLinkName;
	
	this.lastlinkid = "";
	
	this.loadingBackground;
	
	this.loadingBar;
	
	this.loadMap = function(regionId, regionLinkName, regionName, regionLat, regionLong)
	{
		var that = this;
		
		if(GBrowserIsCompatible())
		{
			this.map = new GMap2(document.getElementById(this.mapElementID));
			
			if(that.mode=="large") {
				this.map.addControl(new GLargeMapControl());
				this.map.addControl(new GScaleControl());
			} else {
				this.map.addControl(new GSmallMapControl());
			}
			this.map.addControl(new GHierarchicalMapTypeControl ());
			this.map.enableContinuousZoom();
			this.map.addMapType(G_PHYSICAL_MAP);
			this.map.enableScrollWheelZoom();
			
			var size = this.map.getSize();
			this.loadingBackground = new GScreenOverlay(that.engine+'images/loading/map-background.gif',
				new GScreenPoint((size.width-250)/2, (size.height-57)/2, 'pixels', 'pixels'),  // screenXY
				new GScreenPoint(0, 0),  // overlayXY
				new GScreenSize(250, 57)  // size on screen
			);
			
			this.map.addOverlay(this.loadingBackground);
			//this.loadingBackground.hide();
			
			this.loadingBar = new GScreenOverlay(that.engine+'images/loading/map-big.gif',
				new GScreenPoint((size.width-220)/2, ((size.height-19)/2)-5, 'pixels', 'pixels'),  // screenXY
				new GScreenPoint(0, 0),  // overlayXY
				new GScreenSize(220, 19)  // size on screen
			);
			this.map.addOverlay(this.loadingBar);
			//this.loadingBar.hide();
			
			this.regionId = regionId;
			this.regionLinkName = regionLinkName;
			var center = new GLatLng(parseFloat(regionLat), parseFloat(regionLong));
			this.map.setCenter(center, that.mapDefaultZoomLevel);
			
			GEvent.addListener(this.map, "zoomend", function() {
				var marker = that.map.getFirstMarker();
				while (marker != null)
				{
					marker.closeDetailWin();
					marker = that.map.getNextMarker();
				}
			});
			
			GEvent.addListener(this.map, "extinfowindowclose", function() {
				that.markerOpened.setImage(that.engine+"images/icons/marker2.png");
				that.markerOpened = null;
			});
			
			this.mapIsLoaded = true;
			
			this.update(true, false);
		}
	}
	
	this.update = function(map, results)
	{
		var that = this;
		
		var minMonthlyRent = document.getElementById("priceMin")[document.getElementById("priceMin").selectedIndex].value;
		var maxMonthlyRent = document.getElementById("priceMax")[document.getElementById("priceMax").selectedIndex].value;
		var minRoomSize = document.getElementById("roomSizeMin")[document.getElementById("roomSizeMin").selectedIndex].value;
		var maxRoomSize = document.getElementById("roomSizeMax")[document.getElementById("roomSizeMax").selectedIndex].value;
		var earliestRentalStart = document.getElementById("earliestRentalStart").value;
		var latestRentalStart = document.getElementById("latestRentalStart").value;
		
		that.url = that.engine+'php/getResults.php?region='+that.regionLinkName+'&mode='+that.textmode+'&minMonthlyRent='+minMonthlyRent+'&maxMonthlyRent='+maxMonthlyRent+'&minRoomSize='+minRoomSize+'&maxRoomSize='+maxRoomSize+'&earliestRentalStart='+earliestRentalStart+'&latestRentalStart='+latestRentalStart;
		
		if(results == true) this.updateResults();
		if(map == true) this.updateMap();
		/*
		var newmode;
		if(that.mode=="large") newmode="text";
		if(that.mode=="small") newmode="map";
		updateSwitchModeLink(that.regionLinkName, newmode);
		*/
	}
	
	this.updateMap = function(){
		var that = this;
		
		var output;
		
		var entry;
		
		that.loadingBar.show();
		that.loadingBackground.show();
				
		that.markerIdsHide = that.markerIds.copy();
		
		that.results.clear();
		
		GDownloadUrl(that.url+'&output=xml', function(data)
		{
			var xml = GXml.parse(data);
			var regionName = xml.documentElement.getAttribute("region"); 
			
			var xmlResults = xml.documentElement.getElementsByTagName("e");
			
			for (var i = 0; i < xmlResults.length; i++) {
				
				var id = xmlResults[i].getElementsByTagName("i")[0].firstChild.nodeValue;
				
				var lat = xmlResults[i].getElementsByTagName("la")[0].firstChild.nodeValue;
				var lng = xmlResults[i].getElementsByTagName("lo")[0].firstChild.nodeValue;
				
				var street = xmlResults[i].getElementsByTagName("s")[0].firstChild.nodeValue;
				var zip = xmlResults[i].getElementsByTagName("z")[0].firstChild.nodeValue;
				var city = xmlResults[i].getElementsByTagName("c")[0].firstChild.nodeValue;
				
				var roomSize = xmlResults[i].getElementsByTagName("rs")[0].firstChild.nodeValue;
				var monthlyRent = xmlResults[i].getElementsByTagName("mr")[0].firstChild.nodeValue;
				
				var personsTotal = xmlResults[i].getElementsByTagName("r")[0].getElementsByTagName("t")[0].firstChild.nodeValue;
				var roomMatesFemale = xmlResults[i].getElementsByTagName("r")[0].getElementsByTagName("f")[0].firstChild.nodeValue;
				var roomMatesMale = xmlResults[i].getElementsByTagName("r")[0].getElementsByTagName("m")[0].firstChild.nodeValue;
				var minAge = xmlResults[i].getElementsByTagName("r")[0].getElementsByTagName("m")[0].firstChild.nodeValue;
				var maxAge = xmlResults[i].getElementsByTagName("r")[0].getElementsByTagName("m")[0].firstChild.nodeValue;
				
				var searchFemale = xmlResults[i].getElementsByTagName("x")[0].getElementsByTagName("f")[0].firstChild.nodeValue;
				var searchMale = xmlResults[i].getElementsByTagName("x")[0].getElementsByTagName("m")[0].firstChild.nodeValue;
				var searchWhatever = xmlResults[i].getElementsByTagName("x")[0].getElementsByTagName("w")[0].firstChild.nodeValue;
				
				var rentalStart = "";
				var rentalEnd = "";
				
				if (xmlResults[i].getElementsByTagName("rst")[0].firstChild) {
					rentalStart = xmlResults[i].getElementsByTagName("rst")[0].firstChild.nodeValue;
				}
				if (xmlResults[i].getElementsByTagName("ret")[0].firstChild) {
					rentalEnd = xmlResults[i].getElementsByTagName("ret")[0].firstChild.nodeValue;
				}
				
				var links = xmlResults[i].getElementsByTagName("lk");
				var urls = "";
				for (var u = 0; u < links.length; u++) {
					urls += "<a href=\""+links[u].getElementsByTagName("u")[0].firstChild.nodeValue+"\" target=\"_blank\">Kontakt aufnehmen über "+links[u].getElementsByTagName("p")[0].firstChild.nodeValue+"</a><br />";
				}
				
				var text =
					"<strong>Adresse</strong><br />"+
					street+"<br />"+zip+" "+city+"<br />"+
					"<strong>Angaben zur "+personsTotal+"er WG</strong><br />"+
					"Bewohner: "+roomMatesFemale+" weiblich, "+roomMatesMale+" männlich<br />"+
					"Raumgröße: "+roomSize+" qm<br />"+
					"Gesamtmiete: "+monthlyRent+" Euro/Monat<br />";
				if(rentalStart != "") text += "Einzug ab: "+rentalStart+"<br />";
				if(rentalEnd != "") text += "Einzug bis: "+rentalEnd+"<br />";
				text += "<br />"+urls;
				
				var tooltip = "<strong>"+personsTotal+"er WG</strong><br />Klicken für mehr Infos<br />und Kontaktdaten...";
				
				that.xmlToMarker(id, text, lat, lng, tooltip);
			}
			
			that.loadingBar.hide();
			that.loadingBackground.hide();
			
			// delete markers on the map which are not in result set
			that.markerIdsHide.each(function(markerId) {
				if (typeof(markerId) != "undefined") {
					that.markers[markerId].hide();
				}
			});
		});
		
	}
	
	this.updateResults = function()
	{
		var that = this;
		
		document.getElementById('results').innerHTML = "<div class=\"loading_outer\"><div class=\"loading_inner\">Lade Ergebnisse...<br /><br /><img src=\""+that.engine+"images/loading/results.gif\" height=\"16\" width=\"16\" alt=\"...\" /></div></div>";
		// build results list
		new Ajax.Updater('results', that.url+'&output=list');	
	}
	
	this.xmlToMarker = function(id, text, lat, lng, tooltip)
	{
		var that = this;
		
		var exists = -1;
		
		marker = that.createMarker(id, text, lat, lng, tooltip);
		
		exists = that.markerIdsHide.indexOf(id);
		
		if(exists == -1) {
			that.markers[id] = marker;
			that.map.addOverlay(that.markers[id]);
			that.markerIds.push(id);
		}
		else {
			that.markers[id].show();
			that.markerIdsHide.splice(exists, 1);
		}
	}
	
	this.createMarker = function(id, text, lat, lng, tooltip)
	{
		var that = this;
		
		var icon = new GIcon();
		icon.image = that.engine+"images/icons/marker2.png";
		icon.iconSize = new GSize(30, 34);
		icon.iconAnchor = new GPoint(15, 17);
		icon.infoWindowAnchor = new GPoint(0, 0);
		
		var marker = new PdMarker(new GLatLng(lat, lng), icon, {icon:icon, title:"Klicken für Infos"});
		//marker.setHoverImage(that.engine+"images/icons/marker2-selected.png");
		marker.setOpacity(80);
		//marker.setDetailWinHTML(text);
		marker.setTooltip(tooltip);
		//marker.setName("Klick!");
		
		var linkid = "marker_"+id;
		
		GEvent.addListener(marker, 'click', function()
		{
			marker.openExtInfoWindow(
				that.map,
				"infoBubble",
				text,
				{beakOffset: 3, paddingX: 100, paddingY: 75}
			);
			that.markerOpened = marker;
			marker.setImage(that.engine+"images/icons/marker2-selected.png");
			//marker.openInfoWindowHtml(text);
			/*
			if(that.lastlinkid != "")
			{
				if(document.getElementById(that.lastlinkid).className=='althover')
				{
					document.getElementById(that.lastlinkid).className='alt';
				}
				else
				{
					document.getElementById(that.lastlinkid).className='normal';
				}
			}
			that.lastlinkid=linkid;
			if(document.getElementById(linkid).className=='alt')
			{
				document.getElementById(linkid).className='althover';
			}
			else
			{
				document.getElementById(linkid).className='normalhover';
			}*/
			
			//that.markerMouseOver(id);
		});
		
		
		GEvent.addListener(marker, 'mouseover', function()
		{
		/*
			if(document.getElementById(linkid).className=='alt')
			{
				document.getElementById(linkid).className='althover';
			}
			else
			{
				document.getElementById(linkid).className='normalhover';
			}*/
			marker.setImage(that.engine+"images/icons/marker2-selected.png");
          	that.lastlinkid=linkid;
			marker.topMarkerZIndex();
		});
		
		GEvent.addListener(marker, 'mouseout', function()
		{
			/*
			if(document.getElementById(linkid).className=='althover')
			{
				document.getElementById(linkid).className='alt';
			}
			else
			{
				document.getElementById(linkid).className='normal';
			}*/
			if(that.markerOpened != marker) marker.setImage(that.engine+"images/icons/marker2.png");
			that.markers[id].restoreMarkerZIndex();
          		that.lastlinkid="";
		});
				
		return marker;
	}
	
	this.entryMouseOver = function(id) {
		
		var that = this;
		
		var linkid = "marker_"+id;
		
		that.lastlinkid=linkid;
		/*
		if(document.getElementById(linkid).className=='alt')
		{
			document.getElementById(linkid).className='althover';
		}
		else
		{
			document.getElementById(linkid).className='normalhover';
		}*/
		if(that.markers[id] != null)
		{
			that.markers[id].setImage(that.engine+"images/icons/marker2-selected.png");
			that.markers[id].topMarkerZIndex();
			that.highlightMarker(that.markers[id]);
			//that.markers[id].showTooltip();
		}
	}
	
	this.entryMouseOut = function(id) {
		
		var that = this;
		
		var linkid = "marker_"+id;
		/*
		if(document.getElementById(linkid).className=='althover')
		{
			document.getElementById(linkid).className='alt';
		}
		else
		{
			document.getElementById(linkid).className='normal';
		}*/
		if(that.markers[id] != null)
		{
			if(that.markerOpened != that.markers[id]) that.markers[id].restoreImage();
			that.markers[id].restoreMarkerZIndex();
			that.markers[id].hideTooltip();
			that.map.removeOverlay(that.highlightCircle);
		}
	}
	
	this.mapBlowUp = function(id) {
		
		var that = this;
		
		that.markers[id].showMapBlowup();
	}
	
	this.showInfoWindow = function(id) {
		
		var that = this;
		//this.map.panTo(that.markers[id].getLatLng());
		GEvent.trigger(that.markers[id], "click");  
	}
	
	this.moveTo = function(id) {
		
		var that = this;
		this.map.panTo(that.markers[id].getLatLng());
	}
	
	this.highlightMarker = function(marker) {
	
		var that = this;
	
		var markerPoint = marker.getPoint();
		var polyPoints = Array();
		
		if (that.highlightCircle) {
			that.map.removeOverlay(that.highlightCircle);
			that.highlightedMarker = null;
		}
		
		var mapNormalProj = G_NORMAL_MAP.getProjection();
		var mapZoom = that.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);
		}
		that.highlightCircle = new GPolygon(polyPoints,"#000000",2,0.0,"#FFE51F",.75);
		that.map.addOverlay(that.highlightCircle);
		that.highlightedMarker = marker;
	}
}
