var mapa;
var mapData = mapData || new Array();
var polygons = new Array();
var markers = new Array();

// Algorithm written by http://alienryderflex.com/polygon/
GPolygon.prototype.Contains = function(point) {
	var j = 0;
	var oddNodes = false;
	var x = point.lng();
	var y = point.lat();
	for (i=0; i<this.getVertexCount(); i++) {
		j++;
		if (j == this.getVertexCount()) {j = 0;}
		if (((this.getVertex(i).lat() < y) && (this.getVertex(j).lat() >= y)) || ((this.getVertex(j).lat() < y) && (this.getVertex(i).lat() >= y))) {
			if (this.getVertex(i).lng() + (y - this.getVertex(i).lat()) /  (this.getVertex(j).lat() - this.getVertex(i).lat()) * (this.getVertex(j).lng() - this.getVertex(i).lng()) < x) {
				oddNodes = !oddNodes;
			}
		}
	}
	return oddNodes;
}

function loadMap(mapContent)
{
	var mapParams = {
		lat     : 52.0500,
		lng     : 18.9511,
		zoom    : 6
	};
	// mapa.addControl(new GSmallMapControl());

	var icon3 = new GIcon();
	icon3.image = "/images/map/point_1b.png";
	icon3.iconSize = new GSize(41, 22);
	icon3.infoWindowAnchor = new GPoint(13,0);
	icon3.iconAnchor = new GPoint(13,18);

	mapa = new GMap2(document.getElementById(mapContent));
	mapa.setUIToDefault();
	mapa.setCenter(
		new GLatLng(
			mapParams.lat,
			mapParams.lng
		),
		mapParams.zoom
	);

	// umiesc obiekty
	if(mapData.length > 0) {
		for(i in mapData) {
			if(mapData[i].coords) {
				addPolygon(i);
			}
			else {
				addPoint(i);
			}
		}
	}

	function addPolygon(num) {
		var coordsStr = mapData[num].coords;
		var coordsStrArr = coordsStr.split(/\s*,\s*/);
		var latLngPoints = new Array();

		for(j=0; j<coordsStrArr.length;) {
			coordY = coordsStrArr[j++];
			coordX = coordsStrArr[j++];
			latLngPoints.push(new GLatLng(coordY, coordX));
		}

		polygons[num] = new GPolygon(latLngPoints, mapData[num].view[0], mapData[num].view[1], mapData[num].view[2], mapData[num].view[3], mapData[num].view[4]);

		GEvent.addListener(polygons[num], "mouseover", function() {
			if (mapData[num].centerY && mapData[num].centerX) {
				mapa.openInfoWindowHtml(new GLatLng(mapData[num].centerY, mapData[num].centerX), mapData[num].info);
			}
			else {
				mapa.openInfoWindowHtml(polygons[num].getBounds().getCenter(), mapData[num].info);
			}
			polygons[num].cursor = "pointer";
		});

		GEvent.addListener(polygons[num], "mouseout", function() {
			mapa.panTo(new GLatLng(mapParams.lat, mapParams.lng));
			mapa.closeInfoWindow();
		});

		mapa.addOverlay(polygons[num]);
	}

	function addPoint(num) {
		var customIcon;

		switch(mapData[num].icon) {
			case 3:
				customIcon = icon3;
				break;
			default:
				customIcon = G_DEFAULT_ICON;
		}

		markers[num] = new GMarker(new GLatLng(mapData[num].centerY, mapData[num].centerX), {icon: customIcon});

		GEvent.addListener(markers[num], "click", function() {
			markers[num].openInfoWindowHtml(mapData[num].info);
		});

		mapa.addOverlay(markers[num]);
	}

	function displaySearchResult(point, mapData) {
		switch(mapData.icon) {
		case 3:
			marker = new GMarker(point, {icon:icon3});
			break;
		default:
			marker = new GMarker(point);
		}

		mapa.addOverlay(marker);
		marker.openInfoWindowHtml(mapData.info);
		GEvent.addListener(marker, "infowindowclose", function() {
			mapa.removeOverlay(marker);
			mapa.panTo(new GLatLng(mapParams.lat, mapParams.lng));
		});
	}

	document.getElementById('map-search-form').onsubmit = function()
	{
		var marker;
		geocoder = new GClientGeocoder();
		address = document.getElementById('query').value;

		geocoder.getLatLng(
			address,
			function(point)
			{
				if (!point)
				{
					alert('Nie znaleziono wyników spełniających kryteria');
				}
				else
				{
					if(marker) {
						mapa.removeOverlay(marker);
					}
					if(polygons.length > 0) { // obszary
						for(j=0; j<polygons.length; j++) {
							if(polygons[j].Contains(point)) {
								displaySearchResult(point, mapData[j]);
							}
						}
					}
					else if(mapData.length > 0) { // punkty
						for(j=0; j<mapData.length; j++) {
							p2 = new GLatLng(mapData[j].centerY, mapData[j].centerX);
							if(point.distanceFrom(p2) < 10000) { // blizej niz 10 km
								displaySearchResult(point, mapData[j]);
								return;
							}
						}
						alert('Nie znaleziono wyników spełniających kryteria');
					}
				}
			}
		);
		return false;
	}
}

function showInfo(num) {
	if(polygons[num]) {
		GEvent.trigger(polygons[num], "mouseover");
	}
	else if(markers[num]) {
		GEvent.trigger(markers[num], "click");
	}
}

