var piGMapHandler = {
	map:		null,
	mgr:		null,
	clickHandler:null,
	tagSet:		false,
	icons:		{},
	setUp:		false,
	// inicjacja mapy
	init:		function() {
		if(!this.setUp)	{
			// start mapy
			this.map			= new GMap2(document.getElementById("map"));
			// dbl click na mapie -> zoom
			this.map.enableDoubleClickZoom();
			// typ mapy
			this.mapType();
			// obsługa kliknięcia
			this.mapClick();
			// centruję mapę
			this.setCenter();
			// start managera markerów
			var mgrProperities	= { maxZoom: 15, trackMarkers: true };
			this.mgr			= new GMarkerManager(this.map,mgrProperities);
			// markery
			this.setMarkers();
			this.setUp			= true;
		}
	},
	// typ mapy
	mapType:	function() {
		if(mapProperities["mapSize"]=="large") {
			this.map.addControl(new GLargeMapControl());
		} else if(mapProperities["mapSize"]=="small") {
			this.map.addControl(new GSmallMapControl());
		}
		if(mapProperities["typeSwitched"]==1) {
			this.map.addControl(new GMapTypeControl());
		}
	},
	// wyśrodkowanie
	setCenter:	function() {
		if(mapProperities.setCenter) {
			this.map.setCenter(new GLatLng(mapProperities.setCenter["point"][0],
											mapProperities.setCenter["point"][1]),
								mapProperities.setCenter["zoom"]);
		} else {
			this.map.setCenter(new GLatLng(51.919438,19.145136),4);
		}
	},
	// obsługa kliknięcia na mapie
	mapClick:	function() {
		if(mapProperities.clickHandler&&!this.clickHandler) {
			this.clickHandler	= GEvent.addListener(this.map, "click", mapProperities.clickHandler);
		}
	},
	// markery
	setMarkers:	function() {
		for(var i in mapMarkers) {
			var markers	= [];
    		for (var j in mapMarkers[i]["markers"]) {
				if(mapMarkers[i]["zoom"][1]>0) {
					markers.push(this.setMarker(mapMarkers[i]["markers"][j]));
				} else {
					this.map.addOverlay(this.setMarker(mapMarkers[i]["markers"][j]));
				}
			}
			if(mapMarkers[i]["zoom"][1]>0) {
				this.mgr.addMarkers(markers, mapMarkers[i]["zoom"][0], mapMarkers[i]["zoom"][1]);
			}
		}
		this.mgr.refresh();
	},
	// pojedyńczy marker
	setMarker:	function(place) {
		// ikona
		var icon	= this.getIcon(place.icon);
		// pozycja
		var pos		= new GLatLng(place["pos"][0], place["pos"][1]);
		// opcje markera
		var prop	= {};
		if(icon) {
			prop["icon"]=icon;
		}
		if(place.title) {
			prop["title"]=place.title;
		}
		if(place.clickable) {
			prop["clickable"]=place.clickable;
		}
		if(place.draggable) {
			prop["draggable"]=place.draggable;
		}
		// marker
		var marker	= new GMarker(pos,prop);
		// obsługa zdarzeń
		this.handleEvents(marker,place);
		// taby
		this.setTabs(marker,place);
		return(marker);
	},
	// ikona
	getIcon:	function(iconData) {
		if(!iconData) {
			return(null);
		}
		// jeśli jeszcze nie dodawałem ikony - robię to teraz
		if(!this.icons[iconData[0]]&&(iconsData[iconData[0]]||iconsData[iconData[1]])) {
			var icon = new GIcon();
			if(iconsData[iconData[0]]) {
				var size				= iconsData[iconData[0]];
				icon.image				= mapProperities.iconsUrl+iconData[0];
				icon.iconSize			= new GSize(size.width, size.height);
				icon.iconAnchor			= new GPoint(size.anchorX, size.anchorY);
				icon.infoWindowAnchor	= icon.iconAnchor;
			}
			if(iconsData[iconData[1]]) {
				icon.shadow				= mapProperities.iconsUrl+iconData[1];
				size					= iconsData[iconData[1]];
				icon.shadowSize			= new GSize(size.width, size.height);
				icon.shadowAnchor		= new GPoint(size.anchorX, size.anchorY);
				icon.infoShadowAnchor	= icon.shadowAnchor;
			}
			this.icons[iconData[0]] = icon;
		}
		return(this.icons[iconData[0]]);
	},
	// obsługa zdarzeń
	handleEvents: function(marker,place) {
		if(!place) {
			return;
		}
		if(place["click"]) {
			GEvent.addListener(marker, "click",place["click"]);
		}
		if(place["dragstart"]) {
			GEvent.addListener(marker, "dragstart",place["dragstart"]);
		}
		if(place["dragend"]) {
			GEvent.addListener(marker, "dragend",place["dragend"]);
		}
		if(place["drag"]) {
			GEvent.addListener(marker, "drag",place["drag"]);
		}
	},
	// obsługa tabów
	setTabs:	function(marker,place) {
		if(place["singletab"]) {
			GEvent.addListener(marker, "click", function() {
				marker.openInfoWindowHtml(place["singletab"]);
			});
		} else if(place["tabs"]) {
			var infoTabs = [];
			for(var i in place["tabs"]) {
				infoTabs.push(new GInfoWindowTab(place["tabs"][i][0],place["tabs"][i][1]));
			}
			GEvent.addListener(marker, "click", function() {
				 marker.openInfoWindowTabsHtml(infoTabs);
			});
		}
	}
};
$(document).ready(function() {
	if (GBrowserIsCompatible()) {
		piGMapHandler.init();
	}
});
$(document).unload(function() {
	if (GBrowserIsCompatible()) {
		GUnload();
	}
});