/*
 * global variables:
 *	sessionLat, sessionLong, sessionZoom
 *  _GMAP_ZOOM_TO_AEROMAP
 *  sessionWays
 * currentWay
 * initKorlatozasWays
 * initSikossagWays
 * page_id (1-normal, 2-korlatozott)
 */

var gmapObj;
var gmap_selected_poi_id;
var gmap_adatterkep_type;
var gmap_prop_group;
var mgr;
var icons = {};
var allmarkers = [];
var poiStore = {};
var wayStore = {};
var gmap_active = false;//true;
var wasGMapMove = false;
var arrowMarker, arrowMarker2, pointMarker;
var korlatozas_poi = {};
var korlatozas_ways = [];
var sikossag_ways = [];
    
function getIcon(poi) {
	var type = poi.type_id;
	var icon = null;
	if (type) {
		if (page_id==2) {
			icon = new GIcon(G_DEFAULT_ICON);
			icon.image = "getIcon.php?megkozelit=" + poi.megkozelit + "&icon=images/types/type_" + type + ".gif";//"http://teszt.infomap.hu/images/gtest.gif"
			icon.iconSize = new GSize(16, 16);
			icon.iconAnchor = new GPoint(icon.iconSize.width >> 1, icon.iconSize.height >> 1);
			icon.shadow = null;//"images/" + images[1] + ".png";
		} else {
			if (icons[type]) {
				icon = icons[type];
			} else {
				icon = new GIcon(G_DEFAULT_ICON);
				icon.image = "images/types/type_" + type + ".gif";//"http://teszt.infomap.hu/images/gtest.gif"
				icon.iconSize = new GSize(16, 16);
				icon.iconAnchor = new GPoint(icon.iconSize.width >> 1, icon.iconSize.height >> 1);
				icon.shadow = null;//"images/" + images[1] + ".png";
				//size = iconData[images[1]];
				//icon.shadowSize = new GSize(size.width, size.height);
				icons[type] = icon;
			}
		}
	}
	return icon;
}
    
function setupGMap(lat, lng, zoom) {
	if (GBrowserIsCompatible()) {
		if (!lat || isNaN(lat)) lat = sessionLat;
		if (!lng || isNaN(lng)) lng = sessionLong;
		//var azoom = sessionZoom;
		if (!zoom || isNaN(zoom)) zoom = convertAeromapZoomToGMap(sessionZoom);
		gmapObj = new GMap2(document.getElementById("gmap_div"));

		//alert(lat+' '+lng+' '+zoom);
		gmapObj.setCenter(new GLatLng(lat, lng), zoom);
		//gmapObj.addMapType(G_PHYSICAL_MAP);

		gmapObj.setMapType(G_NORMAL_MAP);//G_NORMAL_MAP
		gmapObj.addControl(new GMapTypeControl());
		gmapObj.addControl(new GOverviewMapControl());
		gmapObj.addControl(new GLargeMapControl());
		//gmapObj.addControl(new GSmallMapControl());
		gmapObj.enableScrollWheelZoom();
		
		mgr = new MarkerManager(gmapObj);//GMarkerManager
		//GEvent.addListener(gmapObj, "load", GMapOnLoad);
		window.setTimeout(GMapOnLoad, 0);
		//if (sessionWays) window.setTimeout(setupWays, 0);

		GEvent.addListener(gmapObj, "moveend", GMapMoveEnd);
		//GEvent.addListener(gmapObj, "zoomend", function () {alert(gmapObj.getZoom());});

		createArrows();
		
		if (initKorlatozasWays) addKorlatozasWays();
		if (initSikossagWays) addSikossagWays();

		// Add 10 markers to the map at random locations
		/*var bounds = gmapObj.getBounds();
		var southWest = bounds.getSouthWest();
		var northEast = bounds.getNorthEast();
		var lngSpan = northEast.lng() - southWest.lng();
		var latSpan = northEast.lat() - southWest.lat();
		for (var i = 0; i < 1; i++) {
			var point = new GLatLng(southWest.lat() + latSpan * Math.random(),
			southWest.lng() + lngSpan * Math.random());
			var marker = new GMarker(point, markerOptions);
			gmapObj.addOverlay(marker);
			GEvent.addListener(marker, "click", function() {
				marker.openInfoWindowHtml("Marker <b>Helló</b>");
			});
		}*/

		//adatterkep frissitese
		window.setTimeout(_refreshAdatterkep, 0);//_refreshAdatterkep()
	}
}

function GMapOnLoad() {
	setupPOIMarkers();
	if (sessionWays) setupWays(sessionWays);
	
	//adatterkep frissitese
	//_refreshAdatterkep;
}

function setupWays(ways) {
	var url = "ajax/get_ways.php?ways="+ways;
	$.getJSON(url,
		function (data) {
			$.each(data.ways, function(i, way) {
				var waypoints = [];
				var waypointMarkers = [];
				$.each(way.waypoints,
					function(j, waypoint) {
	  					var posn = new GLatLng(waypoint.lat, waypoint.lng);
						waypoints.push(posn);
						//alert(waypoint.name);
						if (waypoint.name!='' && waypoint.name!='n/a') {
	  						var marker = new GMarker(posn, { title: waypoint.name, hide: true });
							//GEvent.addListener(marker, "click", function() {GMapPOIClick(poi);});
			  				waypointMarkers.push(marker);
			  			}
					}
				);
				var color = "#00bbff";
				if (/*way.id!=currentWay*/i>0) color = "#000000";
				var polyline = new GPolyline(waypoints, color, 10);//#ffbb00
				gmapObj.addOverlay(polyline);
				
				way.polyline = polyline;
				way.waypointMarkers = waypointMarkers;
				wayStore[way.id] = way;
				
				mgr.addMarkers(waypointMarkers, gmapObj.getZoom());
				mgr.refresh();
			});
		}
	);
}

function gmap_showFullWay(way_id) {
	var way = wayStore[way_id];
	var bounds = way.polyline.getBounds();
	var zzoom = gmapObj.getBoundsZoomLevel(bounds);
	gmapObj.setCenter(bounds.getCenter(), zzoom);
}

function gmap_toggleShowAllWaypoints() {
	var way = wayStore[currentWayID];//TODO!!
	$.each(way.waypointMarkers,
		function(i, wpm) {
			if (wpm.isHidden()) wpm.show();
			else wpm.hide();
		}
	);
}

function gmap_showWaypoint(ndx) {
	var way = wayStore[currentWayID];
	gmapObj.panTo(way.waypointMarkers[ndx].getLatLng());
	pointMarker.setLatLng(way.waypointMarkers[ndx].getLatLng());
	pointMarker.show();
}

function gmap_setCurrentWay(way_id) {
	if (!wayStore[way_id]) setupWays(way_id);
	$.each(wayStore, 
		function(i,way) {
			var color = "#000000";
			if (way.id==way_id) color = "#00bbff";
			way.polyline.setStrokeStyle({color: color});
		}
	);
}

function gmap_toggleShowWayPOIs() {
	var way = wayStore[currentWayID];
	if (way.linkedPOIs) {
		$.each(way.linkedPOIs,
			function(i, poi) {
				if (poi.marker.isHidden()) poi.marker.show();
				else poi.marker.hide();
			}
		);
	} else {
		setupWayLinkedPoiMarkers(way);
	}
}

function addKorlatozasWays() {
	var url = "../../ajax/get_korlatozas_ways.php?activeonly=1";
	//window.open(url, 'data');
	$.getJSON(url,
		function (data) {
			//alert(data.ways.length);
			$.each(data.ways, function(i, way) {
				var waypoints=[];
				$.each(way, function(i, waypoint) { waypoints.push(new GLatLng(waypoint.lat, waypoint.lng)); });
				var polyline = new GPolyline(waypoints, "#ff0000", 10);
				gmapObj.addOverlay(polyline);
				korlatozas_ways.push(polyline);
			});
		}
	);
}

function removeKorlatozasWays() {
	for (var i=0; i<korlatozas_ways.length; i++) gmapObj.removeOverlay(korlatozas_ways[i]);
}

function addSikossagWays(perc) {
	var url = "../../ajax/get_sikossag_ways.php";
	if (typeof(perc)!='undefined') url+="?perc="+perc;
	//window.open(url, 'data');
	$.getJSON(url,
		function (data) {
			//alert(data.ways.length);
			$.each(data.ways, function(i, way) {
				var waypoints=[];
				$.each(way, function(i, waypoint) { waypoints.push(new GLatLng(waypoint.lat, waypoint.lng)); });
				var polyline = new GPolyline(waypoints, "#ff0000", 10);
				gmapObj.addOverlay(polyline);
				sikossag_ways.push(polyline);
			});
		}
	);
}

function removeSikossagWays() {
	for (var i=0; i<sikossag_ways.length; i++) gmapObj.removeOverlay(sikossag_ways[i]);
}

function GMapMoveEnd() {
	//alert('GMapMoveEnd');
	wasGMapMove = true;
	setupPOIMarkers();
	
	//adatterkep frissitese
	_refreshAdatterkep();
	//refreshAreaSelect();
}

function _refreshAdatterkep() {
	var bounds = gmapObj.getBounds();
	var sw = bounds.getSouthWest();
	var ne = bounds.getNorthEast();
	
	refreshAdatterkep(sw.lng(), ne.lat(), ne.lng(), sw.lat(), gmapObj.getZoom(), adatterkepType);
}

function refreshAreaSelect() {
	/*var bounds = gmapObj.getBounds();
	var sw = bounds.getSouthWest();
	var ne = bounds.getNorthEast();
	var url = "ajax/get_pois.php?s="+sw.lat()+"&w="+sw.lng()+"&n="+ne.lat()+"&e="+ne.lng()+"&zoom=" + gmapObj.getZoom();
	//window.open(url, 'data');
	$.getJSON(url,
		function (data) {
			var area = parent.document.poiform.area;
			var areaCounter = 0;
			for (var i=0;i<area.length;i++) area.options[i]=null;
			area.options[areaCounter] = new Option("Magyarorsz�g", "0", false, false);
		}
	);*/
}

function setupWayLinkedPoiMarkers(way) {
	var url = "ajax/get_way_linked_pois.php?way=" + way.id;
	//window.open(url, 'data');
	$.getJSON(url,
		function (data) {
			//var markersByZoom = {};
			var markers = [];
			if (!way.linkedPOIs) way.linkedPOIs = {};
			$.each(data.pois, function(i, poi) {
				var ndx = $.inArray(poi.id, allmarkers);
				if (ndx==-1) {
	  				var icon = getIcon(poi);
	  				var posn = new GLatLng(poi.lat, poi.long_);
	  				var marker = new GMarker(posn, { title: poi.name, icon: icon });
					GEvent.addListener(marker, "click", function() {GMapPOIClick(poi);});
	  				//markersByZoom[zoom].push(marker);
	  				markers.push(marker);
	  				allmarkers.push(poi.id);
	  				poi.marker = marker;
					way.linkedPOIs[poi.id] = poi;
				}
			});

			mgr.addMarkers(markers, gmapObj.getZoom());
			mgr.refresh();
		}
	);
}

function setupPOIMarkers(clearMarkers) {
	if (clearMarkers) {
		allmarkers = [];
		poiStore = {};
		mgr.clearMarkers();
	}
	var bounds = gmapObj.getBounds();
	var sw = bounds.getSouthWest();
	var ne = bounds.getNorthEast();
	var url = "ajax/get_pois.php?s="+sw.lat()+"&w="+sw.lng()+"&n="+ne.lat()+"&e="+ne.lng()+"&zoom=" + gmapObj.getZoom();
	if (typeof(gmap_selected_poi_id)!='undefined') url += "&selectedPOI=" + gmap_selected_poi_id;
	if (typeof(gmap_adatterkep_type)!='undefined') url += "&adatterkepType=" + gmap_adatterkep_type;
	if (typeof(gmap_prop_group)!='undefined') {
		url += "&prop_group=" + gmap_prop_group;
		gmap_prop_group = undefined;
	}
	//window.open(url, 'data');
	$.getJSON(url,
		function (data) {
			//var markersByZoom = {};
			var markers = [];
	
			$.each(data.pois, function(i, poi) {
				var ndx = $.inArray(poi.id, allmarkers);
				//IE bug workaround
				if (ndx!=-1 && poi.id==gmap_selected_poi_id) {
					allmarkers.splice(ndx,1);
					ndx=-1;
				}
				//alert(poi.id+' -> '+ndx);
				if (ndx==-1) {
					//var zoom = (parseInt(poi.zoom) + 1) * 2;
					//if (!markersByZoom[zoom]) markersByZoom[zoom] = [];
	  				var icon = getIcon(poi);
	  				var posn = new GLatLng(poi.lat, poi.long_);
	  				var marker = new GMarker(posn, { title: poi.name, icon: icon });
					GEvent.addListener(marker, "click", function() {GMapPOIClick(poi);});
	  				//markersByZoom[zoom].push(marker);
	  				markers.push(marker);
	  				allmarkers.push(poi.id);
	  				poi.marker = marker;
					poiStore[poi.id] = poi;
	  				if (poi.kozut_korlatozas_id) {
		  				if (!korlatozas_poi[poi.kozut_korlatozas_id]) korlatozas_poi[poi.kozut_korlatozas_id] = [];
		  				korlatozas_poi[poi.kozut_korlatozas_id].push(poi);
	  				}
				}
			});

			/*for (var i in markersByZoom) {
				mgr.addMarkers(markersByZoom[i], i);
			}*/
			mgr.addMarkers(markers, gmapObj.getZoom());
			mgr.refresh();
			if (gmap_selected_poi_id && poiStore[gmap_selected_poi_id]) GMapPOIClick(poiStore[gmap_selected_poi_id]);
		}
	);
}

function gmap_toggleNoPOI() {
	$.each(poiStore,
		function(i, poi) {
			if (poi.marker.isHidden()) poi.marker.show();
			else poi.marker.hide();
		}
	);
}

/*function GMapPOIClickById(poi_id) {
	var poiData = poiStore[poi_id];
	while (typeof poiData == 'undefined') {
		sleep(200);
		poiData = poiStore[poi_id];
	}
	GMapPOIClick(poiData);
}

function sleep(millis) {
	var date = new Date();
	var curDate = null;
	
	do { curDate = new Date(); }
	while(curDate-date < millis);
}*/

function GMapPOIClickById(poi_id) {
	var poiData = poiStore[poi_id];
	// útvonalhoz kapcsolódó POI-k nincsenek benne!!
	if (poiData) GMapPOIClick(poiData);
}

function GMapPOIClick(poi) {
	//alert(poi);
	if (!poi) {
		setupPOIMarkers();
		return;
	}
	if (korlatozas_poi[poi.kozut_korlatozas_id] && korlatozas_poi[poi.kozut_korlatozas_id].length>1)
		showArrow(korlatozas_poi[poi.kozut_korlatozas_id][0], korlatozas_poi[poi.kozut_korlatozas_id][1]);
	else showArrow(poi);
	poiClick(poi);
}

function createArrows() {
	// Create arrow marker #1
	var arrowIcon = new GIcon(G_DEFAULT_ICON);//G_DEFAULT_ICON
	arrowIcon.image = "../../images/arrow_anim_orig.gif";
	arrowIcon.shadow = null;
	arrowIcon.iconSize = new GSize(18, 30);
	arrowIcon.iconAnchor = new GPoint(arrowIcon.iconSize.width >> 1, arrowIcon.iconSize.height + 7);//, arrowIcon.iconSize.height >> 1
	
	// Set up our GMarkerOptions object
	var markerOptions = { icon:arrowIcon, clickable:false };
	
	var point = new GLatLng(1,1);
	arrowMarker = new GMarker(point, markerOptions);
	arrowMarker.hide();
	gmapObj.addOverlay(arrowMarker);

	// Create arrow marker #2
	arrowMarker2 = new GMarker(point, markerOptions);
	arrowMarker2.hide();
	gmapObj.addOverlay(arrowMarker2);

	// Create point marker
	var pointIcon = new GIcon(G_DEFAULT_ICON);//G_DEFAULT_ICON
	pointIcon.image = "../../images/point.gif";
	pointIcon.shadow = null;
	pointIcon.iconSize = new GSize(15, 15);
	pointIcon.iconAnchor = new GPoint(pointIcon.iconSize.width >> 1, pointIcon.iconSize.height >> 1);
	
	// Set up our GMarkerOptions object
	var pointMarkerOptions = { icon:pointIcon, clickable:false };

	pointMarker = new GMarker(point, pointMarkerOptions);
	pointMarker.hide();
	gmapObj.addOverlay(pointMarker);
}

function showArrow(poi, poi2) {
	var arrowPosLatLng = new GLatLng(poi.lat, poi.long_);
	//var poiPosLatLng = new GLatLng(poi.lat, poi.long_);
	//var poiPosPoint = gmapObj.fromLatLngToDivPixel(poiPosLatLng);
	//var arrowPosPoint = new GPoint(poiPosPoint.x, poiPosPoint.y-5);
	//var arrowPosLatLng = gmapObj.fromDivPixelToLatLng(arrowPosPoint);
	
	arrowMarker.setLatLng(arrowPosLatLng);
	arrowMarker.show();
	
	if (poi2) {
		arrowPosLatLng = new GLatLng(poi2.lat, poi2.long_);
		//poiPosLatLng = new GLatLng(poi2.lat, poi2.long_);
		//poiPosPoint = gmapObj.fromLatLngToDivPixel(poiPosLatLng);
		//arrowPosPoint = new GPoint(poiPosPoint.x, poiPosPoint.y-5);
		//arrowPosLatLng = gmapObj.fromDivPixelToLatLng(arrowPosPoint);
		
		arrowMarker2.setLatLng(arrowPosLatLng);
		arrowMarker2.show();
	} else arrowMarker2.hide();
}

function convertGMapZoomToAeromap(gzoom) {
	return _GMAP_ZOOM_TO_AEROMAP[gzoom];
}

function convertAeromapZoomToGMap(azoom) {
	if (azoom>=_GMAP_ZOOM_TO_AEROMAP[6]) return 6;
	if (azoom>=_GMAP_ZOOM_TO_AEROMAP[7]) return 7;
	if (azoom>=_GMAP_ZOOM_TO_AEROMAP[8]) return 8;
	if (azoom>=_GMAP_ZOOM_TO_AEROMAP[9]) return 9;
	if (azoom>=_GMAP_ZOOM_TO_AEROMAP[10]) return 10;
	if (azoom>=_GMAP_ZOOM_TO_AEROMAP[11]) return 11;
	if (azoom>=_GMAP_ZOOM_TO_AEROMAP[12]) return 12;
	if (azoom>=_GMAP_ZOOM_TO_AEROMAP[13]) return 13;
	if (azoom>=_GMAP_ZOOM_TO_AEROMAP[14]) return 14;
	if (azoom>=_GMAP_ZOOM_TO_AEROMAP[15]) return 15;
	if (azoom>=_GMAP_ZOOM_TO_AEROMAP[16]) return 16;
	if (azoom>=_GMAP_ZOOM_TO_AEROMAP[17]) return 17;
	if (azoom>=_GMAP_ZOOM_TO_AEROMAP[18]) return 18;
	if (azoom>=_GMAP_ZOOM_TO_AEROMAP[19]) return 19;
	return 20;
}
