/**
 * Funkcje markerów
 * 
 * @author Alfred Broda
 */

var mgr = null;
var listener = null;
var opis_click = null;
var geoxml;
var curro;
var icon;
var icons = Array();
var marker;
var mark;

function checkMgr() {
	if (mgr == null) {
		mgr = new MarkerManager(map, {
			trackMarkers :true
		});
	}
	if (opis_click == null) {
		opis_click = addListener(get_opis);
	}
	if (listener == null) {
		listener = GEvent.addListener(map, "click", function (item,point) {runListeners(item,point)});
	}
}

function getIcon(image, size) {
	if (!size)
		size = 22;
	var ico = null;
	if (image) {
		ico = new GIcon();
		ico.image = basedir + size + "x" + size + "/" + image;
		ico.iconSize = new GSize(32, 32);
		ico.iconAnchor = new GPoint(11, 11);
		// ico.shadow = "http://www.google.com/mapfiles/shadow50.png";
		// ico.shadowSize = new GSize(37, 34);
		ico.infoWindowAnchor = new GPoint(16, 16);
		ico.infoShadowAnchor = new GPoint(32, 32);
		icons[image] = ico;
	}
	return ico;
}

function deleteMarker(id) {
	allmarkers.splice(id, 1);
	redrawMarkers();
}

function clearMarkers() {
	checkMgr();
	mgr.clearMarkers();
	allmarkers = new Array();
	redrawMarkers();
}

function setupMarkers() {
	// map_show_icons(0);
}

/*
 * FIXME: Tworzenie pojedyńczego markera ze zmiennej globalnej oraz
 * wspólrzędnych. Po co to tutaj właściwie?
 */

var curro;
var n = 1;

function addMarker(lat, lang) {
	checkMgr();
	point = new GLatLng(lat, lang);
	var opts = {
		title :curro.name
	};
	var marker = new GMarker(point, opts);
	// map.addOverlay(marker);
	contentDiv = document.createElement('div');
	// contentDiv.className = 'gpopup';
	contentDiv.id = curro.id;
	contentDiv.innerHTML = curro.desc;
	alldesc[curro.id] = contentDiv;
	var num = allmarkers.push(marker);
	marker.openInfoWindow(contentDiv);
}

/* Wypisywanie wszystkich markerów stacjonarnych */

var num;
var i = 0;

function makeMarkers(list) {
	checkMgr();
	var posn;
	list.places._each( function(item) {
		posn = new GLatLng(item.posn[0], item.posn[1]);
		if (edit) {
			var tabs = edform(item);
			var gtabs = Array();
			var n = 0;
			tabs._each( function(tab) {
				gtabs[n] = new GInfoWindowTab(tab.label, tab.content);
				n++;
			});
			alldesc[item.id] = gtabs;
			GEvent.addListener(marker, "infowindowbeforeclose", function() {
				alert("Zmiany nie zostaną zapisane!");
			});
			item.mask = 0;
		} else {
			if (item.icon == "default.png")
				var ico = item.dicon;
			else
				var ico = item.icon;
		}
		if (item.mask == 1) {
			var icon = getIcon(item.dicon, 16);
			var opts = {
				icon :icon,
				title :item.sname,
				transparent :item.dicon
			};
			var mark2 = new GMarker(posn, opts);
			GEvent.addListener(mark2, "mouseover", function() {
				mark2.setImage(basedir + "32x32/" + item.icon);
			});
			GEvent.addListener(mark2, "mouseout", function() {
				if (map.getZoom() < item.izmax)
					mark2.setImage(basedir + "16x16/" + item.dicon);
			});
			/* FIXME: Możemy zduplikować id? Warto jakieś jednak mieć... */
			mark2.id = item.id;
			/* marker ma się pojawiać o poziom wyżej */
			mark2.izmin = item.izmin;
			mark2.izmax = item.izmax - 1;
			var desc = document.createElement('div');
			desc.innerHTML = alldesc[item.id].innerHTML;
			desc.className = 'gpopup';
			mark2.bindInfoWindow(desc, maxopts);
			/* Drugi marker będzie 'niżej' niż ten */
			item.izmin = item.izmax;
			item.izmax = 17;
			var num = allmarkers.push(mark2);
		} else {
			/*
			 * jeżeli nie maskujemy to zapewne chcemy mieć markery w pełnym
			 * zakresie
			 */
			item.izmax = 17;
		}
		var icon = getIcon(item.icon, 32);
		var opts = {
			icon :icon,
			title :item.sname,
			transparent :item.icon
		};
		var marker = new GMarker(posn, opts);
		marker.id = item.id;
		marker.item = item;
		marker.izmin = item.izmin;
		marker.izmax = item.izmax;
		marker.mask = item.mask;
		/*
		 * var desc = document.createElement('div'); var temp = opis;
		 * desc.innerHTML = opis; desc.className = 'gpopup';
		 */
		marker.desc = item.desc;
		var num = allmarkers.push(marker);
	});
	redrawMarkers();
}

/*
 * Umieszczna marker mobilny z wyszukaniem lokacji !! UWAGA !! Należy posyłać
 * małą ilość obiektów by Geocoder nie został zablokowany (status 500)!
 */

var point;

function makeMarker(list) {
	if (mark)
		map.removeOverlay(mark);
	var posn;
	// var dicon = getIcon(list.icon);
	var item = list.places[0]
	if (item.posn) {
		if (item.posn[0] == 0 && item.posn[1] == 0) {
			geocoder.getLocations(item.addr + ', Poland', function(resp) {
				if (resp && resp.Status.code == 200) {
					out = resp;
					place = resp.Placemark[0];
					actx = place.Point.coordinates[0];
					acty = place.Point.coordinates[1];
				}
			});
			item.posn[0] = actx;
			item.posn[1] = acty;
		}
	}
	if (item.zoom == 0)
		item.zoom = 12;
	// if (item.icon)
	// icon = getIcon(item.icon);
	// else {
	// icon = dicon;
	// item.icon = list.icon;
	// }
	posn = new GLatLng(item.posn[0], item.posn[1], item.zoom);
	var opts = {
		title :item.name,
		draggable :true
	};
	mark = new GMarker(posn, opts);
	GEvent.addListener(mark, 'dragend', function() {
		found(mark.getLatLng());
	});
	// mark.bindInfoWindowHtml(markerTab(item));
	map.addOverlay(mark, 0, 17);
	// allmarkers[item.id] = mark;
	/* Dodatki */
	actx = item.posn[0];
	acty = item.posn[1];
	actz = item.zoom;
	actico = item.icon;
	found(mark.getLatLng());
}

function redrawMarkers() {
	checkMgr();
	allmarkers._each( function(marker) {
		mgr.addMarker(marker, marker.izmin, marker.izmax);
	});
	num = mgr.getMarkerCount(10);
	mgr.refresh();
}

/* Tworzenie DIVa z zawartością zakłdki do dymku */
function markerTab(item) {
	var ret = document.createElement('div');
	ret.innerHTML = 'TODO: formularz obiektu ' + item.id;
	return ret;
}
