var globtype;
var globzoom;
var resizing = false;
var center;
var markers = [];
var map;

function internalmove(mtype,slug,zoom,lat,long)
{
	for (var i = 0; i < markers.length; i++)
	{
		//alert(markers[i].id+"/"+slug+" // "+markers[i].zoom+"/"+zoom);
		if(markers[i].zoom == parseInt(zoom) && markers[i].id == slug)
		{
			map.panTo( new GLatLng(lat,long));
			map.setZoom(parseInt(zoom));
			markers[i].openInfoWindowHtml("<div id=\"placebox\"><div align=\"center\"><img style=\"margin-top:100px;\" src=\"/interface/loadbar\"></div></div>");
			var url = "/place/" + slug + "/"+mtype;
			var ajax = get_ajax(url);
			ajax.onreadystatechange = function ()
			{
				if (ajax.readyState == 4)
				{
					document.getElementById('placebox').innerHTML = ajax.responseText;
				}
			}
			ajax.send();
		}
	}
}

function loadplace(guid)
{
	contain('map/place/'+guid);	
}

function dragmarker(id, point)
{
	var url = "http://admin.bookofmormononline.net/map/updater.php?map="+globtype+"&guid=" + id + "&y=" + point.lat() + "&x=" + point.lng();
	//alert(url);
	var ajax = get_ajax(url);
	ajax.send();
}
function setmin(id, slug)
{
	var url = "http://admin.bookofmormononline.net/map/updater.php?map="+globtype+"&guid=" + id + "&min=" + (1 + globzoom);
	//alert(url);
	var ajax = get_ajax(url);
	ajax.send();
	hidemarker(globzoom, slug);
}
function delmarker(zoom, id)
{
	map.closeInfoWindow();
	var url = "/lab?zoom=" + zoom + "&id=" + id;
	var ajax = get_ajax(url);
	ajax.send();
	hidemarker(zoom, id);
}
function showZoomlevel(zoom)
{
	for (var i = 0; i < markers.length; i++)
	{
		if (markers[i].zoom == zoom)
		{
			markers[i].show();
		}
		else
		{
			markers[i].hide();
		}
	}
}
function hidemarker(zoom, id)
{
	for (var i = 0; i < markers.length; i++)
	{
		if (markers[i].zoom == zoom && markers[i].id == id)
		{
			markers[i].hide();
		}
	}
}
function getWindowHeight()
{
	if (self.innerHeight) return self.innerHeight;
	if (document.documentElement && document.documentElement.clientHeight) return document.documentElement.clientHeight;
	if (document.body) return document.body.clientHeight;
	return 0;
}
function getWindowWidth()
{
	if (self.innerWidth) return self.innerWidth;
	if (document.documentElement && document.documentElement.clientWidth) return document.documentElement.clientWidth;
	if (document.body) return document.body.clientWidth;
	return 0;
}

function createMarker(x, y, ax, ay, point, zoom, slug, guid,type)
{
	var labelicon = new GIcon();
	labelicon.iconSize = new GSize(x, y);
	labelicon.iconAnchor = new GPoint(ax, ay);
	labelicon.infoWindowAnchor = new GPoint(((2 * x) / 3), 5);
	var letteredIcon = new GIcon(labelicon);
	labelicon.image = "maplabel/"+slug;
	markerOptions = {
		icon: labelicon,
		draggable: false
	};
	
	if(window.location.hostname != "bookofmormononline.net")
	{
		markerOptions = {
		icon: labelicon,
		draggable: true
	};
	
	}
	
	var marker = new GMarker(point, markerOptions);
	marker.zoom = zoom;
	marker.id = slug;
	
	GEvent.addListener(marker, "dragend", function ()
	{
		dragmarker(guid, marker.getPoint());
	});
	GEvent.addListener(marker, "click", function ()
	{
		var appslug = slug;
		if(type != "google" && type != "malay") appslug = appslug+"/"+type;
		window.location.hash = "#/place/" + appslug;
		marker.openInfoWindowHtml("<div id=\"placebox\"><div align=\"center\"><img style=\"margin-top:100px;\" src=\"/interface/loadbar\"></div></div>");
		var url = "/place/" + slug + "/"+type;
		var ajax = get_ajax(url);
		ajax.onreadystatechange = function ()
		{
			if (ajax.readyState == 4)
			{
				document.getElementById('placebox').innerHTML = ajax.responseText;
			}
		}
		ajax.send();
	}
	);
	markers.push(marker);
	return marker;
}


function loadmap(type,placedata)
{
	if(typeof(placedata) != "undefined")
	{
	var pdata = eval('(' + placedata + ')');	
	}
	globtype = type;
	G_SATELLITE_MAP.oK = "MidEast";
	G_SATELLITE_MAP.getMinimumResolution = function (){ return 5 };
	G_SATELLITE_MAP.getMaximumResolution = function (){ return 10 };
	
	

	if (!GBrowserIsCompatible()) return false;
	document.title = "Book of Mormon Map";
	function tiler(mapMinZoom,mapMaxZoom,mapBounds,dir)
	{
			var tl = [new GTileLayer(null, mapMinZoom, mapMaxZoom)];
			var mercator = new GMercatorProjection(mapMaxZoom);
			tl[0].getTileUrl = function (tile, zoom)
			{
				if ((zoom < mapMinZoom) || (zoom > mapMaxZoom))
				{
					return "http://www.maptiler.org/img/none.png";
				}
				var ymax = 1 << zoom;
				var y = ymax - tile.y - 1;
				var tileBounds = new GLatLngBounds(mercator.fromPixelToLatLng(new GPoint((tile.x) * 256, (tile.y + 1) * 256), zoom), mercator.fromPixelToLatLng(new GPoint((tile.x + 1) * 256, (tile.y) * 256), zoom));
				if (mapBounds.intersects(tileBounds))
				{
					return "/map/tile/"+dir+"/" + zoom + "/" + tile.x + "/" + y;
				}
				else
				{
					return "http://www.maptiler.org/img/none.png";
				}
			}
		return tl;
	}
	
	function maptyper(tiles, name, min, max, merc)
	{
		MAPTYPE = new GMapType(tiles, new GMercatorProjection(merc), name, {errorMessage: ""});
		MAPTYPE.getMinimumResolution = function (){ return min };
		MAPTYPE.getMaximumResolution = function (){ return max };	
		return MAPTYPE;
	}
	function resize()
	{
		var mapdiv = document.getElementById("map");
		mapdiv.style.height = (getWindowHeight() - 0) + "px";
		mapdiv.style.width = (getWindowWidth() - 150) + "px";
		map.setCenter(center);
	}
	
		var InternalBounds 	= new GLatLngBounds(new GLatLng(0.240838857289, 97.959696063), new GLatLng(13.828874185, 103.85760025));
		var InteralTiles	= tiler(4,10,InternalBounds,'malay');
		var MALAY 			= maptyper(InteralTiles,"Malay",	6,9,12);
		var MALAY_MINI 		= maptyper(InteralTiles,"",			4,4,12);

		var BajaBounds 		= new GLatLngBounds(new GLatLng(22.8394352786, -116.09), new GLatLng(30.66, -109.399532983));
		var BajaTiles 		= tiler(4,10,BajaBounds,'baja');
		var BAJA 			= maptyper(BajaTiles,"Baja",			6,10,12);
		var BAJA_MINI 		= maptyper(BajaTiles,"",				5,5,12);

		var MexicoBounds 	= new GLatLngBounds(new GLatLng(11.8101288823, -98.55), new GLatLng(21.94, -86.5186643337));
		var MexicoTiles 	= tiler(4,9,MexicoBounds,'mexico');
		var MEXICO 			= maptyper(MexicoTiles,"Mexico", 6,9,12);
		var MEXICO_MINI 	= maptyper(MexicoTiles,"", 4,4,12);


		var CostaRicaBounds 	= new GLatLngBounds(new GLatLng(6.90121380624, -89.1), new GLatLng(16.16, -79.2992127267));
		var CostaRicaTiles 		= tiler(4,9,CostaRicaBounds,'costarica');
		var COSTARICA 			= maptyper(CostaRicaTiles,"CostaRica", 6,9,12);
		var COSTARICA_MINI 		= maptyper(CostaRicaTiles,"", 4,4,12);



		var PanamaBounds 	= new GLatLngBounds(new GLatLng(3.68896100715, -81.72), new GLatLng(10.81, -75.2108936232));
		var PanamaTiles 	= tiler(3,9,PanamaBounds,'panama');
		var PANAMA 			= maptyper(PanamaTiles,"Panama", 6,9,12);
		var PANAMA_MINI 	= maptyper(PanamaTiles,"", 5,5,12);


		var HeartLandBounds 	= new GLatLngBounds(new GLatLng(24.8013962229, -98.7), new GLatLng(51.6, -70.4021450296));
		var HeartLandTiles 		= tiler(3,7,HeartLandBounds,'heartland');
		var HEARTLAND 			= maptyper(HeartLandTiles,"Heartland", 4,7,12);
		var HEARTLAND_MINI 		= maptyper(HeartLandTiles,"", 3,3,12);

		
		
		var SriLankaBounds 	= new GLatLngBounds(new GLatLng(5.93058650976, 75.74), new GLatLng(11.12, 82.0205041613));
		var SriLankaTiles 	= tiler(4,9,SriLankaBounds,'srilanka');
		var SRILANKA 		= maptyper(SriLankaTiles,"SriLanka", 7,9,12);
		var SRILANKA_MINI 	= maptyper(SriLankaTiles,"", 5,5,12);

		var HemiSphereBounds 	= new GLatLngBounds(new GLatLng(-56.0006974036, -139.0), new GLatLng(59.0, -34.0070798427));
		var HemiSphereTiles 	= tiler(1,6,HemiSphereBounds,'americas');
		var HEMISPHERE 			= maptyper(HemiSphereTiles,"Americas", 2,4,12);
		var HEMISPHERE_MINI 	= maptyper(HemiSphereTiles,"", 1,1,12);


		var NewYorkBounds 	= new GLatLngBounds(new GLatLng(42.2999820339, -79.38), new GLatLng(43.41, -76.8600226624));
		var NewYorkTiles 	= tiler(4,10,NewYorkBounds,'newyork');
		var NEWYORK 		= maptyper(NewYorkTiles,"NewYork", 8,10,12);
		var NEWYORK_MINI 	= maptyper(NewYorkTiles,"", 7,7,12);


		if(type == 'malay')
		{
			
			var MAPTYPE = MALAY;
			var MINIMAPTYPE = MALAY_MINI;
			var center = new GLatLng(7.034856521, 100.9086482);
			var initzoom = 6;
		}
		else if(type == 'baja')
		{
			var MAPTYPE = BAJA;
			var MINIMAPTYPE = BAJA_MINI;
			var center = new GLatLng(27.61, -113.05);
			var initzoom = 6;
		}
		else if(type == 'mexico')
		{
			var MAPTYPE = MEXICO;
			var MINIMAPTYPE = MEXICO_MINI;
			var center = new GLatLng(17.11, -92.61);
			var initzoom = 6;
		}
		else if(type == 'costarica')
		{
			var MAPTYPE = COSTARICA;
			var MINIMAPTYPE = COSTARICA_MINI;
			var center = new GLatLng(11.0, -84.1);
			var initzoom = 6;
		}
		else if(type == 'panama')
		{
			var MAPTYPE = PANAMA;
			var MINIMAPTYPE = PANAMA_MINI;
			var center = new GLatLng(7.2, -78.1);
			var initzoom = 6;
		}
		else if(type == 'heartland')
		{
			var MAPTYPE = HEARTLAND;
			var MINIMAPTYPE = HEARTLAND_MINI;
			var center = new GLatLng(37.3, -85.1);
			var initzoom = 4;
		}
		else if(type == 'americas')
		{
			var MAPTYPE = HEMISPHERE;
			var MINIMAPTYPE = HEMISPHERE_MINI;
			var center = new GLatLng(12, -78);
			var initzoom = 2;
		}
		else if(type == 'srilanka')
		{
			var MAPTYPE = SRILANKA;
			var MINIMAPTYPE = SRILANKA_MINI;
			var center = new GLatLng(8.9, 79.1);
			var initzoom = 7;
		}
		else if(type == 'newyork')
		{
			var MAPTYPE = NEWYORK;
			var MINIMAPTYPE = NEWYORK_MINI;
			var center = new GLatLng(42.87, -77.93);
			var initzoom = 8;
		}
		else if(type == 'google')
		{
			var MAPTYPE = G_SATELLITE_MAP  ;
			var MINIMAPTYPE = G_SATELLITE_MAP  ;
			var center = new GLatLng(24.7, 45.4);
			var initzoom = 5;
		}
		
		
		map = new GMap2(document.getElementById("map"), {
			backgroundColor: '#4c6171',
			mapTypes: [G_SATELLITE_MAP, MEXICO, HEMISPHERE, HEARTLAND, NEWYORK, COSTARICA, PANAMA, BAJA, SRILANKA, MALAY]
		});
		
		
		var minimap = new GOverviewMapControl(new GSize(200, 200));
		minimap.setMapType(MINIMAPTYPE);
	
		
		
		
		
		map.setMapType(MAPTYPE);
		
		
	
		if(typeof(pdata) != "undefined")
		{
			center = new GLatLng(pdata['lat'], pdata['long']);
			initzoom = parseInt(pdata['zoom']);
		}else
		{
				if(type=="google")		window.location.hash = "/map";
				else					window.location.hash = "/map/"+type;
			
		}
		
		map.setCenter(center);
		map.setZoom(initzoom);
		map.enableScrollWheelZoom();
		map.enableContinuousZoom();
		if(type != 'google') { map.addControl(minimap); }
		map.addControl(new GLargeMapControl3D(), new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10, 30)));
		map.addControl(new GScaleControl(), new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(10, 10)));
		map.addControl(new GMapTypeControl(), new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10, 10)));

		GDownloadUrl("/map/data/"+type, function (data)
		{
			var xml = GXml.parse(data);
			var xmarkers = xml.documentElement.getElementsByTagName("marker");
			for (var i = 0; i < xmarkers.length; i++)
			{
				var lat = xmarkers[i].getAttribute("lat");
				var lng = xmarkers[i].getAttribute("lng");
				var x = xmarkers[i].getAttribute("x");
				var y = xmarkers[i].getAttribute("y");
				var ax = xmarkers[i].getAttribute("ax");
				var ay = xmarkers[i].getAttribute("ay");
				var zoom = xmarkers[i].getAttribute("zoom");
				var slug = xmarkers[i].getAttribute("slug");
				var guid = xmarkers[i].getAttribute("guid");
				map.addOverlay(createMarker(x, y, ax, ay, new GLatLng(lat, lng), zoom, slug, guid, type));
			}
			showZoomlevel(map.getZoom());

			if(typeof(pdata) != "undefined")
				{
					//alert(pdata['lat']);
					slug = pdata['slug'];
					for (var i = 0; i < markers.length; i++)
					{
						if(markers[i].zoom == initzoom && markers[i].id == pdata['slug'])
						{
							var appslug = slug;
							if(type != "google" && type != "malay") appslug = appslug+"/"+type;
							window.location.hash = "#/place/" + appslug;
							var url = "/place/" + slug + "/"+type;
							markers[i].openInfoWindowHtml("<div id=\"placebox\"><div align=\"center\"><img style=\"margin-top:100px;\" src=\"/interface/loadbar\"></div></div>");
							setTimeout("try	{mapinfo('"+url+"');}	catch (e) {} ",10000);
							mapinfo(url);
							
						}
					}
				}
			
		});
		GEvent.addListener(map, 'maptypechanged', function ()
		{
			if(map.getCurrentMapType() == BAJA)				loadmap('baja');
			if(map.getCurrentMapType() == MALAY)			loadmap('malay');
			if(map.getCurrentMapType() == MEXICO)			loadmap('mexico');
			if(map.getCurrentMapType() == PANAMA)			loadmap('panama');
			if(map.getCurrentMapType() == HEARTLAND)		loadmap('heartland');
			if(map.getCurrentMapType() == COSTARICA)		loadmap('costarica');
			if(map.getCurrentMapType() == SRILANKA)			loadmap('srilanka');
			if(map.getCurrentMapType() == NEWYORK)			loadmap('newyork');
			if(map.getCurrentMapType() == HEMISPHERE)		loadmap('americas');
			if(map.getCurrentMapType() == G_SATELLITE_MAP )			loadmap('google');
		});
		GEvent.addListener(map, 'mouseup', 		function (overlay, point){	resize();}	);
		GEvent.addListener(map, 'mousewheel', 	function (overlay, point){ resize();});
		GEvent.addListener(map, 'moveend', 		function ()
		{
			//window.location.hash = "#/map/1/" + map.getZoom() + "/" + Math.round(map.getCenter().lng() * 100) / 100 + "/" + Math.round(map.getCenter().lat() * 100) / 100;
			center = map.getCenter();
			showZoomlevel(map.getZoom());
		});
		GEvent.addListener(map, 'zoomend', function ()
		{
			//window.location.hash = "#/map/1/" + map.getZoom() + "/" + Math.round(map.getCenter().lng() * 100) / 100 + "/" + Math.round(map.getCenter().lat() * 100) / 100;
			showZoomlevel(map.getZoom());
			center = map.getCenter();
			globzoom = map.getZoom();
			resize();
		});



}
onresize = function ()
{	try	{resize(map);}	catch (e)	{} }

function mapinfo(url)
{
	var ajax = get_ajax(url);
	ajax.onreadystatechange = function ()
	{
		if (ajax.readyState == 4)
		{
			document.getElementById('placebox').innerHTML = ajax.responseText;
		}
	}
	ajax.send();
}
