		var menu_status = new Array();
		var menuids=[ ];
		menuids['root']='menu1';
		var loadednewpage=false;	
		function showHide(theid){
		   if(menu_status[theid] != 'show') {
			   document.getElementById(theid).style.visibility="inherit";
			   document.getElementById(theid).style.display="block";
			   menu_status[theid] = 'show';
			}else{
			   document.getElementById(theid).style.visibility="hidden";
			   document.getElementById(theid).style.display="none";
			   menu_status[theid] = 'hide';
			}
		}
		var markerarray = [ ];
		var map = this;
		var iconarray = [ ];
		
		var maphist = [ ];
		var currentmaphist = 0;
		var currentmap = '';
		var menuidtoshow=false;
		var routebounds = [ ] ;
		var rboundar = [ ];
		
		var currentmapcursorlong=0;
		var currentmapcursorlat=0;
		var oldmarker;
		
		var mainmap;
			
	function LoadMap()
	{
		if (GBrowserIsCompatible())		{
			if(document.implementation.hasFeature(
					"http://www.w3.org/TR/SVG11/feature#SVG","1.1")){ 
				_mSvgEnabled = true;
				_mSvgForced  = true;
			}
			map = new GMap2(document.getElementById("map"));
			mainmap=map;
			map.setCenter(new GLatLng(0,0), 2); 
			map.setMapType(G_HYBRID_MAP);
			if ( location.search.length > 1 )	{
				var loadingquery="mapcache/caching.php?"+location.search.substring(1,location.search.length)
				genericmap(loadingquery, map) ;
			} else {
				genericmap( "mapcache/caching.php?lastx="+itemstodisplay , map) ;
			}

			GEvent.addListener(map, "mousemove", function(point){
					currentmapcursorlong=point.x;
					currentmapcursorlat=point.y;
			});

			GEvent.addDomListener(document.getElementById("map"), "contextmenu", function(point){
				try {
					map.removeOverlay(oldmarker);
				} catch (e) { }
				
				var newmarker = new GMarker(new GLatLng(currentmapcursorlat,currentmapcursorlong)) ;
				
				var tabs = [ ];
				
				var mapsize=map.getBounds();
				var mapmin=mapsize.getSouthWest();
				var mapmax=mapsize.getNorthEast();
				var mapsizelat = Math.abs(mapmax.lat()-mapmin.lat());
				var mapsizelong = Math.abs(mapmax.lng()-mapmin.lng());
				var locationget = 'lat='+currentmapcursorlat+'&long='+currentmapcursorlong+'&latsize='+mapsizelat+'&longsize='+mapsizelong;
				tabs.push(new GInfoWindowTab('Search','<iframe frameborder="0" marginheight=0 marginwidth=0 height=200 width=300 src="frames/map/context/contextsearch.php?'+locationget+'" style="margin-right:15px;">error</iframe>'));
				if (parseInt(document.variablepassing.loggedin.value)==1) {
					tabs.push(new GInfoWindowTab('Tag Map','<iframe frameborder="0" marginheight=0 marginwidth=0 height=200 width=300 src="frames/map/context/contexttagmap.php?'+locationget+'" style="margin-right:15px;">error</iframe>'));
					tabs.push(new GInfoWindowTab('Add Media','<iframe frameborder="0" marginheight=0 marginwidth=0 height=200 width=300 src="frames/map/addmedia.php?'+locationget+'" style="margin-right:15px;">error</iframe>'));
				};
				
				
				GEvent.addListener(newmarker, "click", function() {
					newmarker.openInfoWindowTabsHtml(tabs);
				});
				
				map.addOverlay(newmarker);
				oldmarker = newmarker;
				oldmarker.openInfoWindowTabsHtml(tabs);
			});
			
/*			GEvent.addListener(map, "click", function (mapoverlay, mappoint) {
				if (mappoint) {
					currentmapcursorlong=mappoint.x;
					currentmapcursorlat=mappoint.y;
					try {
						map.removeOverlay(oldmarker);
					} catch (e) { }

					var rightclickicon = new GIcon();
					rightclickicon.iconSize = new GSize(1, 1);
					rightclickicon.iconAnchor = new GPoint(0, 0);
					rightclickicon.infoWindowAnchor = new GPoint(0, 0);
					rightclickicon.infoShadowAnchor = new GPoint(0, 0);
					rightclickicon.image = 'images/transparent.png';
							
					var newmarker = new GMarker(new GLatLng(currentmapcursorlat,currentmapcursorlong), rightclickicon) ;
					
					var tabs = [ ];

					var mapsize=map.getBounds();
					var mapmin=mapsize.getSouthWest();
					var mapmax=mapsize.getNorthEast();
					var mapsizelat = Math.abs(mapmax.lat()-mapmin.lat());
					var mapsizelong = Math.abs(mapmax.lng()-mapmin.lng());
					var locationget = 'lat='+currentmapcursorlat+'&long='+currentmapcursorlong+'&latsize='+mapsizelat+'&longsize='+mapsizelong;
					tabs.push(new GInfoWindowTab('Search','<iframe frameborder="0" marginheight=0 marginwidth=0 height=200 width=300 src="frames/map/context/contextsearch.php?'+locationget+'" style="margin-right:15px;">error</iframe>'));
					if (parseInt(document.variablepassing.loggedin.value)==1) {
						tabs.push(new GInfoWindowTab('Tag Map','<iframe frameborder="0" marginheight=0 marginwidth=0 height=200 width=300 src="frames/map/context/contexttagmap.php?'+locationget+'" style="margin-right:15px;">error</iframe>'));
						tabs.push(new GInfoWindowTab('Add Media','<iframe frameborder="0" marginheight=0 marginwidth=0 height=200 width=300 src="frames/map/addmedia.php?'+locationget+'" style="margin-right:15px;">error</iframe>'));
					};
					GEvent.addListener(newmarker, "click", function() {
						map.closeInfoWindow();
						newmarker.openInfoWindowTabsHtml(tabs);		
					});

					oldmarker = newmarker;
					map.addOverlay(oldmarker);
					oldmarker.openInfoWindowTabsHtml(tabs);
				};

});
*/
		} else {
			document.getElementById("map").innerHTML = "<h1>Browser not compatible with Google Maps. Sorry...</h1>" ;
		}
	}

		function checkshowmap(menuid) {
			if ((loadednewpage=="done") && (menuidtoshow!=false)) {
				try {
					document.getElementById(menuidtoshow).style.visibility="inherit";
					document.getElementById(menuidtoshow).style.display="block";
					menu_status[menuidtoshow] = 'hide';
					loadednewpage=false;
					window.setTimeout("checkshowmap('"+menuidtoshow+"');", 250);
				} catch (e) {
					loadednewpage="done";
					window.setTimeout("checkshowmap('"+menuidtoshow+"');", 250);
				};
			} else {
				window.setTimeout("checkshowmap('"+menuidtoshow+"');", 250);
			};
		};
		function loadgroupclick(gid,menuid) {
			loadednewpage=false;
			menuidtoshow=menuid;
			document.variablepassing.offset.value=0;
			document.variablepassing.groupsearch.value=gid;
			document.variablepassing.drawnewmap.value=1;
			genericmap('mapcache/caching.php?lastxgroup='+gid+'&lastx='+itemstodisplay,map);
			navigate();
			window.setTimeout("checkshowmap('"+menuid+"');", 250);
			
		};

		function makemenu(parent, level,smenu) {
			try {
				var items = parent.getElementsByTagName('submenu') ;
				var menuid;
				var name='';
				var menutext='';
				for ( var i = 0; i < items.length ; i++ )	{

					menuid='m'+i+"l"+level+"e"+smenu;
					if (items[i].parentNode==parent) {
						try {
							menuextra="";
							try {
								menuextra=items[i].getAttribute('menuextra')
							} catch(e) { };
							
							if ((level != 0) && (menuextra)) {
								menutext+=items[i].firstChild.nodeValue;
							};
						} catch(e) { };
						if (!menuextra) {
							try {
								name=items[i].getAttribute('name');
								title=items[i].getAttribute('title');
								menuids[name]=menuid;
								if (title!='v') {
									menutext += '<div class="menu'+level+'item" style="height:auto;">';
									menutext += '<div style="padding-bottom:1.5em;">';
									menutext += '<a class="menu'+level+'open" href="#" onClick="';
									try	{
										gid=null;
										gid=items[i].getAttribute('groupid');
									} catch (e) {
									};
									if (gid!=null) {
										menuid='m'+gid;
										menutext+='loadgroupclick(\''+gid+'\',\''+menuid+'\');';
									} else {
										menutext += 'showHide(\''+menuid+'\')';
									};
									menuids[name]=menuid;
									menutext += '">'+title+'<\/a></div>';
									menutext += '<div id="'+menuid+'" class="menu'+(level+1)+'" ';										menutext += 'style="visibility:hidden; display:none;"';
									menutext += '>';
									menutext +=	makemenu(items[i],level+1,menuid);
									menutext += '<\/div>';
									menutext += '<\/div>';
								};
							} catch(e) { };
						};
					};
				};
				return menutext;
			} catch(e) { }
		};

	function genericmap( url, parentmap)
	{
		if (url) {
		navigate();
		if (url.substr(0,7)== 'maphist') {
			currentmaphist=parseInt(url.substr(7,url.length-7));
			toget=maphist.length-(currentmaphist+1);
			if (toget<0) {
				url='mapcache/caching.php';
			} else {
				url=maphist[toget];
				while (url.substr(0,3)=='../') {
					url=url.substr(3,url.length-3);
				};
			};
		} else {
			maphist.length=maphist.length-currentmaphist;
			currentmaphist=0;
			maphist.push(url)
		}
		currentmap=url;

		parentmap.enableDoubleClickZoom();
		var request = GXmlHttp.create();
		request.open("GET", url, true);
		request.onreadystatechange = function() 
		{
			document.getElementById("loading").innerHTML = "Loading, please wait..." ;
			document.getElementById("sidebar").innerHTML = '';

			if (request.readyState == 4)
			{
			var xmlDoc = request.responseXML ;
			try	{
				mapattr = xmlDoc.getElementsByTagName("map")
				parentmap.addControl(new GLargeMapControl());
				parentmap.addControl(new GMapTypeControl());
				parentmap.addControl(new GScaleControl()) ;
				parentmap.addControl(new GOverviewMapControl());
		
				var sidemenu=xmlDoc.getElementsByTagName("menu")[0];
				document.getElementById("sidebar").innerHTML += '<div class="menu1">'+makemenu(sidemenu,1,'root')+'</div>';
				try {
				document.title = mapattr[0].getAttribute("title") ;
				} catch(e) { }
				parentmap.clearOverlays();

				var mapbounds = new GLatLngBounds();

			try	{
			var polyline = xmlDoc.getElementsByTagName("polyline") ;
				for ( var i = 0; i < polyline.length ; i++ )
				{
					var color = "#0000ff" ;
					try	{
					color = polyline[i].getAttribute("color") ;
					} catch(e) { }

					var weight = 1 ;
					try 
					{
					weight = parseFloat(polyline[i].getAttribute("weight")) ;
					} catch(e) { }

					var width = 1 ;
					try 
					{
					width = parseInt(polyline[i].getAttribute("width")) ;
					} catch(e) { }
					try 
					{
						routebounds[parseInt(polyline[i].getAttribute("rid"))] = new GLatLngBounds();
					} catch(e) { }
					
					var points = [ ] ;
					var point = polyline[i].getElementsByTagName("point") ;
					for ( j = 0 ; j < point.length ; j++ )
					{
						points.push( new GLatLng(parseFloat(point[j].getAttribute("lat")),parseFloat(point[j].getAttribute("lng"))) ) ;
						mapbounds.extend( new GLatLng(parseFloat(point[j].getAttribute("lat")),parseFloat(point[j].getAttribute("lng"))) ) ;
						try {
							routebounds[parseInt(polyline[i].getAttribute("rid"))].extend( new GLatLng(parseFloat(point[j].getAttribute("lat")),parseFloat(point[j].getAttribute("lng"))) )
						} catch(e) { }
					}
					parentmap.addOverlay( new GPolyline( points, color, width, weight ) ) ;
				}
			} catch(e) { }


			try {
				var encodedpolyline = xmlDoc.getElementsByTagName("encodedpolyline") ;
				for ( var i = 0; i < encodedpolyline.length ; i++ )
				{
					
					var color = "#ff0000" ;
					try {
					color = encodedpolyline[i].getAttribute("color") ;
					} catch(e) { }

					var weight = 1 ;
					try	{
					weight = parseFloat(encodedpolyline[i].getAttribute("weight")) ;
					} catch(e) { }

					var opacity = 1 ;
					try	{
					opacity = parseFloat(encodedpolyline[i].getAttribute("opacity")) ;
					} catch(e) { }

					var width = 1 ;
					try	{
					width = parseInt(polyline[i].getAttribute("width")) ;
					} catch(e) { }
					
					var zoomfactor = 2 ;
					try	{
						zoomfactor = parseInteger(encodedpolyline[i].getAttribute("zoomfactor")) ;
					} catch(e) { }
					
					try	{
						routebounds[parseInt(encodedpolyline[i].getAttribute("rid"))] = new GLatLngBounds();
					} catch(e) {	};
					
					try {
						var maxlat=encodedpolyline[i].getAttribute("maxlat");
						var maxlong=encodedpolyline[i].getAttribute("maxlong");
						var minlat=encodedpolyline[i].getAttribute("minlat");
						var minlong=encodedpolyline[i].getAttribute("minlong");
						mapbounds.extend( new GLatLng(maxlat, maxlong) ) ;
						mapbounds.extend( new GLatLng(minlat, minlong) ) ;
						try {
							routebounds[parseInt(encodedpolyline[i].getAttribute("rid"))].extend( new GLatLng(maxlat, maxlong) ) ;
							routebounds[parseInt(encodedpolyline[i].getAttribute("rid"))].extend( new GLatLng(minlat, minlong) ) ;
						} catch (e) {}
						var encodedpoints=encodedpolyline[i].getAttribute("points");
						var encodedzoom=encodedpolyline[i].getAttribute("levels");
						parentmap.addOverlay(new GPolyline.fromEncoded({
							color: color,
							weight: weight,
							width: width,
						  opacity: opacity,
							points: encodedpoints,
							levels: encodedzoom,
							zoomFactor: zoomfactor,
							numLevels: 18
						}));
					} catch(e) { }
				}
			} catch(e) { }
				try {
				var icons = xmlDoc.getElementsByTagName("icon") ;
				for ( var i = 0; i < icons.length ; i++ )
				{
					var name = icons[i].getAttribute("name") ;

					var x = "" ;
					var y = "" ;
					
					try	{
					x = icons[i].getAttribute("copy") ;
					} catch(e) { }

					if ( x && iconarray[x] )	{
					var icon = new GIcon(iconarray[x]) ;
					} else {
					var icon = new GIcon( ) ;
					}

					icon.image = icons[i].getElementsByTagName("image")[0].getAttribute("src") ;

					x = "" ;
					y = "" ;
					try	{
					x = icons[i].getAttribute("xanchor") ;
					y = icons[i].getAttribute("yanchor") ;
					} catch(e) { }

					if ( x != null && y!= null && x && y )
					{
					icon.iconAnchor = new GPoint( parseInt(x),parseInt(y) ) ;
					}

					x = "" ;
					y = "" ;

					try {
					x = icons[i].getAttribute("xiwanchor") ;
					y = icons[i].getAttribute("yiwanchor") ;
					} catch(e) { }

					if ( x != null && y!= null && x && y )
					{
					icon.infoWindowAnchor = new GPoint( parseInt(x),parseInt(y) ) ;
					}

					x = "" ;
					y = "" ;

					try {
					x = icons[i].getAttribute("xisanchor") ;
					y = icons[i].getAttribute("yisanchor") ;
					} catch(e) { }

					if ( x != null && y!= null && x && y )
					{
					icon.infoShadowAnchor = new GPoint( parseInt(x),parseInt(y) ) ;
					}

					x = "" ;
					y = "" ;
					try {
					x = icons[i].getElementsByTagName("image")[0].getAttribute("width") ;
					y = icons[i].getElementsByTagName("image")[0].getAttribute("height") ;
					} catch(e) { }

					if ( x != null && y!= null && x && y )
					{
					icon.iconSize = new GSize( parseInt(x),parseInt(y) ) ;
					}

					x = "" ;
					try {
					x = icons[i].getElementsByTagName("shadow")[0].getAttribute("src") ;
					} catch(e) { }

					if ( x != null && x )
					{
					icon.shadow = x ;
					}

					x = "" ;
					y = "" ;
					try {
					x = icons[i].getElementsByTagName("shadow")[0].getAttribute("width") ;
					y = icons[i].getElementsByTagName("shadow")[0].getAttribute("height") ;
					} catch(e) { }

					if ( x != null && y!= null && x && y )
					{
					icon.shadowSize = new GSize( parseInt(x),parseInt(y) ) ;
					}
					
					iconarray[name] = icon ;
				}

				} catch (e) { }



				try {
				var markers = xmlDoc.getElementsByTagName("marker") ;
				for ( var i = 0; i < markers.length ; i++ )
				{
					var point = new GLatLng( parseFloat(markers[i].getAttribute("lat")),parseFloat(markers[i].getAttribute("lng")) ) ;
						mapbounds.extend(point);
					var iconname ="" ;
					try {
					iconname = markers[i].getAttribute("iconname") ;
					} catch(e) { }
 
					var html = "" ;
					try {
					html = markers[i].getElementsByTagName("infowindow")[0].firstChild.nodeValue ;
					} catch(e) { }

 					var tabcontents = [];
					var tablabels = [];
					try {
						var tabs = markers[i].getElementsByTagName("tab");
					if (tabs.length > 0) {

						var tabbed=1;
						for ( var tabcount = 0; tabcount < tabs.length ; tabcount++ ) {
							var content=tabs[tabcount].firstChild.nodeValue;
							tabcontents.push(content);
							var label=tabs[tabcount].getAttribute("tabname");
							tablabels.push(label);

						};
					};

					} catch(e) { }
					var draggable=false;
					try {
						var draggable=markers[i].getAttribute("draggable");
						var did=markers[i].getAttribute("did");
					} catch(e) {
					}
					
					if (!draggable) {
						if (tabbed ==1) {
							var marker = createTabbedMarker(point, tabcontents, tablabels, iconname, parentmap);
							tabbed=0;
						} else {
							var marker = createMarker( point, html, iconname , parentmap) ;
						};						
					} else {
						if (tabbed ==1) {
							var marker = createDraggableTabbedMarker(point, tabcontents, tablabels, iconname, parentmap, did);
							tabbed=0;
						} else {
							var marker = createDraggableMarker( point, html, iconname , parentmap, did) ;
						};						
					};
					try {
						rboundar[i]=markers[i].getAttribute("rid");
					} catch(e) {
					}					
					markerarray[i]=marker ;
					parentmap.addOverlay(marker) ;
					try	{
						var links = markers[i].getElementsByTagName("link");
						if (links.length > 0) {
							for ( var linkcount = 0; linkcount < links.length ; linkcount++ ) {
								html = links[linkcount].firstChild.nodeValue;
								var imenuid=menuids[links[linkcount].getAttribute('menu')];
									document.getElementById(imenuid).innerHTML += '<div style="padding-bottom:0.5em">'+"<a href='javascript:try{infoLink(" + i + ");} catch (e) { };'>" + html + "</a><br/><div>" ;
							}
						}
					} catch (e) { }

				} 
				
				
				
				} catch(e) { };
				
				var lng = 0;
				var lat = 0;
				var zoom = 2;				
				try {
					try {
						zoom=map.getZoom()
					} catch (e) { }
					var currentcenter=map.getCenter();
					lat=currentcenter.lat;
					lng=currentcenter.lng;
				} catch(e) { }

				try {
				lng = parseFloat(mapattr[0].getAttribute("lng")) ;
				} catch(e) { }


				try {
				lat = parseFloat(mapattr[0].getAttribute("lat")) ;
				} catch(e) { }


				try {
				zoom = mapattr[0].getAttribute("zoom") ;
				} catch(e) { }
				
				if (zoom=="auto"){
					var boundsmin=mapbounds.getSouthWest();
					var boundsmax=mapbounds.getNorthEast();
					var center=mapbounds.getCenter();
					zoom=map.getBoundsZoomLevel(mapbounds);
				} else {
					var center = new GLatLng(lat,lng);
					zoom = parseInt(zoom)
				};
	
				parentmap.setCenter(center,zoom);

			} catch(e)	{
			}				
				document.getElementById("loading").innerHTML = "" ;
				loadednewpage="done";			
			}
		}
		request.send(null);

	}

		function createMarker(point, html, iconname, parentmap) 
		{
			if ( iconname && iconarray[iconname] )
			{
			var marker = new GMarker(point, iconarray[iconname]) ;
			} else
			{
			var marker = new GMarker(point) ;
			}
			GEvent.addListener(marker, "click", function()
			{
				marker.openInfoWindowHtml(html);
			});
			return marker;
		}

		function createDraggableMarker(point, html, iconname, parentmap, did) 
		{
			var markeroptions=new Object();
			markeroptions.draggable=true;
			if ( iconname && iconarray[iconname] )
			{
				markeroptions.icon=iconarray[iconname];
				var marker = new GMarker(point, markeroptions) ;
			} else
			{
			var marker = new GMarker(point, markeroptions) ;
			}
			GEvent.addListener(marker, "click", function()
			{
				marker.openInfoWindowHtml(html);
			});
			
			GEvent.addListener(marker, "dragstart", function() {
				parentmap.closeInfoWindow();
			});
			
			GEvent.addListener(marker, "dragend", function() {
				marker.openInfoWindowHtml(html);
				var newposition=marker.getPoint();
				var url="mapcache/caching.php?move=1&DID="+did+"&lat="+newposition.lat()+"&long="+newposition.lng();

				GDownloadUrl(url, function(data, responseCode) {	});				
			});
			
			return marker;
		}
		
		function createTabbedMarker(point, tabcontents, tablabels, iconname, parentmap) 
		{
			if ( iconname && iconarray[iconname] )
			{
				var marker = new GMarker(point, iconarray[iconname]) ;
			} else {
				var marker = new GMarker(point) ;
			}
			GEvent.addListener(marker, "click", function()
				{
					parentmap.closeInfoWindow();				
					
					var tabs = [];
					for (var i=0; i<tabcontents.length; i++) {
					tabs.push(new GInfoWindowTab(tablabels[i],tabcontents[i]));
					};
					marker.openInfoWindowTabsHtml(tabs);		
				}
			);
			return marker;
		}
	};

		function createDraggableTabbedMarker(point, tabcontents, tablabels, iconname, parentmap, did)
		{
			var markeroptions=new Object();
			markeroptions.draggable=true;
			if ( iconname && iconarray[iconname] )
			{
				markeroptions.icon=iconarray[iconname];
				var marker = new GMarker(point, markeroptions) ;
			} else {
				var marker = new GMarker(point, markeroptions) ;
			}
			GEvent.addListener(marker, "click", function()
				{
					parentmap.closeInfoWindow();
					var tabs = [];
					for (var i=0; i<tabcontents.length; i++) {
						tabs.push(new GInfoWindowTab(tablabels[i],tabcontents[i]));
					};
					marker.openInfoWindowTabsHtml(tabs);		
				}
			);
			GEvent.addListener(marker, "dragstart", function() {
				parentmap.closeInfoWindow();
			});
		
			GEvent.addListener(marker, "dragend", function() {
				var tabs = [];
				for (var i=0; i<tabcontents.length; i++) {
					tabs.push(new GInfoWindowTab(tablabels[i],tabcontents[i]));
				};
				marker.openInfoWindowTabsHtml(tabs);		
				var newposition=marker.getPoint();
				var url="mapcache/caching.php?move=1&DID="+did+"&lat="+newposition.lat()+"&long="+newposition.lng();

				GDownloadUrl(url, function(data, responseCode) {	});
			});
			return marker;
		};

		function infoLink(i)
		{
			try {
				var center=routebounds[rboundar[i]].getCenter();
				var zoom=map.getBoundsZoomLevel(routebounds[rboundar[i]]);
				map.setCenter(center,zoom-2);
			} catch(e) { 
				try {
					map.setCenter(markerarray[i].getPoint(),14);
				} catch(e) {}
			};
			try {
			 GEvent.trigger(markerarray[i], "click");
			} catch(e) { };
		};