	var E_MARKER_NONE=0
	var E_MARKER_DRAGEND=1
	var E_MARKER_DRAGSTART=2
	var E_MARKER_DRAG=3
	var E_MARKER_CLICK=4
	var E_MARKER_DBLCLICK=5
	var E_MARKER_MOUSEOVER=6
	var E_MARKER_MOUSEOUT=7
	var E_MARKER_MOUSEUP=8
	var E_MARKER_MOUSEDOWN=9
	var E_MARKER_INFOWINDOWOPEN=10
	var E_MARKER_INFOWINDOWCLOSE=11
	

	var checkDblClickTimer=null;
	
	function markerSetup()
	{
	
	}

	function markerToggle(node)
	{
		if(!node)node=markerCurrentNode
		var nodeObj=mapNodes[node]
		if(nodeObj.visible)markerHide(node);
		else markerShow(node);
	}
	
	function nodesShowHideOnZoom(zoom)
	{
		var x,nodeObj,parent
		for(x in mapNodes)
		{
			nodeObj=mapNodes[x]
			
			if(!nodeObj.isPreset)
			{
				switch(nodeObj.type)
				{
					case 'marker':
						parent=mapNodes[x].parent.group
						if((zoom>=parent.minZoom) && (zoom<=parent.maxZoom))
						{
							if(nodeObj.visible && !nodeObj.zoomVisible)
							{
								gmap.addOverlay(nodeObj.gMarker)
								nodeObj.zoomVisible=true;
							}
						}
						else
						{
							if(nodeObj.visible && nodeObj.zoomVisible)
							{
								gmap.removeOverlay(nodeObj.gMarker)
								nodeObj.zoomVisible=false;
								if(nodeObj.infoOpen)
								{
									nodeObj.infoOpen=0;
									gmap.getInfoWindow().hide() 
								}
							}
						}
					break;
					case 'overlay':
						parent=mapNodes[x].parent.group
						if((zoom>=parent.minZoom) && (zoom<=parent.maxZoom))
						{
							if(nodeObj.overlayVisible && !nodeObj.overlayZoomVisible)
							{
								gmap.addOverlay(nodeObj.gOverlay)
								nodeObj.overlayZoomVisible=true;
							}
						}
						else
						{
							if(nodeObj.overlayVisible && nodeObj.overlayZoomVisible)
							{
								gmap.removeOverlay(nodeObj.gOverlay)
								nodeObj.overlayZoomVisible=false;
							}
						}
					break;
				}
			}
		}
	}
	
	function nodesShowHideOnZoomChildren(node,zoom)
	{
		var x,treeObj,nodeObj,parent
		
		for(x in mapTreeNodes[node].children)
		{
			nodeObj=mapNodes[x]
			if(mapTreeNodes[x].childCount)nodesShowHideOnZoomChildren(x,zoom)
			
			if(!nodeObj.isPreset)
			{
				switch(nodeObj.type)
				{
					case 'marker':
						parent=mapNodes[x].parent.group
						if((zoom>=parent.minZoom) && (zoom<=parent.maxZoom))
						{
							if(nodeObj.visible && !nodeObj.zoomVisible)
							{
								gmap.addOverlay(nodeObj.gMarker)
								nodeObj.zoomVisible=true;
							}
						}
						else
						{
							if(nodeObj.visible && nodeObj.zoomVisible)
							{
								gmap.removeOverlay(nodeObj.gMarker)
								nodeObj.zoomVisible=false;
								if(nodeObj.infoOpen)
								{
									nodeObj.infoOpen=0;
									gmap.getInfoWindow().hide() 
								}
							}
						}
					break;
					case 'overlay':
						parent=mapNodes[x].parent.group
						if((zoom>=parent.minZoom) && (zoom<=parent.maxZoom))
						{
							if(nodeObj.overlayVisible && !nodeObj.overlayZoomVisible)
							{
								gmap.addOverlay(nodeObj.gOverlay)
								nodeObj.overlayZoomVisible=true;
							}
						}
						else
						{
							if(nodeObj.overlayVisible && nodeObj.overlayZoomVisible)
							{
								gmap.removeOverlay(nodeObj.gOverlay)
								nodeObj.overlayZoomVisible=false;
							}
						}
					break;
				}
			}
		}
	}


	function markerShow(node)
	{
		if(!node)node=markerCurrentNode
		var nodeObj=mapNodes[node]
		
		var parent=nodeObj.parent
		if(parent.uid!='root')
		{
			if((map.zoom>=parent.group.minZoom)&&(map.zoom<=parent.group.maxZoom))
			{
				gmap.addOverlay(nodeObj.gMarker);
				nodeObj.zoomVisible=true;
			}
			else
			{
				alert('Marker is not visible on map (zoom: '+map.zoom+') due to Min-Zoom ('+parent.group.minZoom+') and Max-Zoom ('+parent.group.maxZoom+') settings of its Group ('+parent.name+')')
				nodeObj.zoomVisible=false;
			}
		}
		else gmap.addOverlay(nodeObj.gMarker);
		
		nodeObj.visible=true;
		nodePutIcon(node)
			
		/*var parent=nodeObj.parent
		if(parent.uid!='root')
		{
			nodeObj.managerIndex=parent.markerArray.length;
			parent.markerArray.push(nodeObj.gMarker)
			parent.markerManager.refresh()
			//parent.markerManager.markerAdd(nodeObj.gMarker,parent.group.minZoom,parent.group.maxZoom)
		}
		else*/
	}
	
	function markerHide(node)
	{
		if(!node)node=markerCurrentNode
		var nodeObj=mapNodes[node]
		
		nodeObj.visible=false;
		/*var parent=nodeObj.parent
		if(parent.uid!='root')
		{
			gmap.removeOverlay(nodeObj.gMarker);
			parent.markerArray[nodeObj.managerIndex]=null
			parent.markerManager.refresh()
		}
		else*/ 
		if(nodeObj.zoomVisible)gmap.removeOverlay(nodeObj.gMarker);
		
		if(nodeObj.infoOpen)
		{
			nodeObj.infoOpen=0;
			gmap.getInfoWindow().hide() 
		}
		nodePutIcon(node)
	}
	
	
	function markerAdd(node)
	{
		if(!node)node=markerCurrentNode
		var nodeObj=mapNodes[node]

		if(!nodeObj.latLng)
		{
			nodeObj.latLng=map.center
			nodePutLatLngIcon(node)
			nodePutLatLng(node)
			//nodePutLatLngIcon(node)
		}
		if(!nodeObj.gMarker)
		{
			var marker=new GMarker(nodeObj.latLng,getMarkerOpts(node));
			nodeObj.gMarker=marker
			markerSetEventHandle(node)
			if(nodeObj.marker.drag)marker.enableDragging()	
			else marker.disableDragging()
			//markerPutInfoSimple(node);
			//markerPutInfoTabbed(node);
			//markerPutInfoBlowup(node);
			//nodePutInfoSimpleIcon(node)
			//nodePutInfoTabbedIcon(node)
			//nodePutInfoBlowupIcon(node)
		}
	}
	
	function markerRemove(node)
	{
		if(!node)node=markerCurrentNode
		var nodeObj=mapNodes[node]
		if(nodeObj.gMarker)
		{
			markerRemoveEventHandle(node)
			if(nodeObj.visible)markerHide(node)
			nodeObj.gMarker=null
			if(nodeObj.infoOpen)
			{
				nodeObj.infoOpen=0;
				gmap.getInfoWindow().hide() 
			}
			nodePutIcon(node)
			nodePutInfoSimpleIcon(node)
			nodePutInfoTabbedIcon(node)
			nodePutInfoBlowupIcon(node)
		}
	}

	function markerSet(node)
	{
		if(!node)node=markerCurrentNode
		var inherit,nodeObj=mapNodes[node]
		if(inherit=(nodeObj.isPreset?node:nodeObj.inherit))
		{
			var inherits=presets.markerInherit[inherit]
			for(x in inherits)
			{
				marker_Set(x)
			}
			nodePutIcon(inherit)
		}
		marker_Set(node)
	}


	function marker_Set(node)
	{
		if(!node)node=markerCurrentNode
		var nodeObj=mapNodes[node]
		
		if(nodeObj.gMarker)
		{
			markerRemoveEventHandle(node)
			if(nodeObj.visible && nodeObj.zoomVisible)gmap.removeOverlay(nodeObj.gMarker)
			nodeObj.gMarker=null
			var marker=new GMarker(nodeObj.latLng,getMarkerOpts(node));
			nodeObj.gMarker=marker
			markerSetEventHandle(node)
			if(nodeObj.visible && nodeObj.zoomVisible)gmap.addOverlay(marker);
			if(nodeObj.marker.drag)marker.enableDragging()	
			else marker.disableDragging()
			if(nodeObj.infoOpen)remarkerSetInfo(node,true)
		}
		nodePutIcon(node)
	}

	function getMarkerOpts(node)
	{
		if(!node)node=currentNode
		var nodeObj=mapNodes[node]
	
		return {icon:nodeObj.marker.icon
			,clickable:nodeObj.marker.clickable
			,draggable:nodeObj.marker.draggable
			,title:nodeObj.title
			,dragCrossMove:nodeObj.marker.dragCrossMove
			,bouncy:nodeObj.marker.bouncy
			,bounceGravity:nodeObj.marker.bounceGravity
		}
	}



	function markerSetEventHandle(node)
	{
		if(!node)node=markerCurrentNode
		var nodeObj=mapNodes[node]
		
		var marker=nodeObj.gMarker
		nodeObj.eventHandle=[]
		nodeObj.eventHandle[0]=GEvent.addListener(marker, "dragend", new Function('','setTimeout("markerDragEnd(\''+node+'\')",0)'));
		nodeObj.eventHandle[1]=GEvent.addListener(marker, "drag", new Function('','setTimeout("markerDrag(\''+node+'\')",0)'));
		nodeObj.eventHandle[2]=GEvent.addListener(marker, "dragstart", new Function('','setTimeout("markerDragStart(\''+node+'\')",0)'));
		nodeObj.eventHandle[3]=GEvent.addListener(marker, "click", new Function('','setTimeout("markerCheckDblClick(\''+node+'\')",0)'));
		nodeObj.eventHandle[4]=GEvent.addListener(marker, "mouseover", new Function('','setTimeout("markerMouseOver(\''+node+'\')",0)'));
		nodeObj.eventHandle[5]=GEvent.addListener(marker, "mouseout", new Function('','setTimeout("markerMouseOut(\''+node+'\')",0)'));
		nodeObj.eventHandle[6]=GEvent.addListener(marker, "mouseup", new Function('','setTimeout("markerMouseUp(\''+node+'\')",0)'));
		nodeObj.eventHandle[7]=GEvent.addListener(marker, "mousedown", new Function('','setTimeout("markerMouseDown(\''+node+'\')",0)'));
		nodeObj.eventHandle[8]=GEvent.addListener(marker, "dblclick", new Function('','setTimeout("markerDblClick(\''+node+'\')",0)'));
		nodeObj.eventHandle[9]=GEvent.addListener(marker, "infowindowopen", new Function('','setTimeout("markerInfoWindowOpen(\''+node+'\')",0)'));
		nodeObj.eventHandle[10]=GEvent.addListener(marker, "infowindowclose", new Function('','setTimeout("markerInfoWindowClose(\''+node+'\')",0)'));
		
		/*nodeObj.eventHandle[0]=GEvent.addListener(marker, "dragend", new Function('','markerDragEnd(\''+node+'\')'));
		nodeObj.eventHandle[1]=GEvent.addListener(marker, "drag", new Function('','markerDrag(\''+node+'\')'));
		nodeObj.eventHandle[2]=GEvent.addListener(marker, "dragstart", new Function('','markerDragStart(\''+node+'\')'));
		nodeObj.eventHandle[3]=GEvent.addListener(marker, "click", new Function('','markerCheckDblClick(\''+node+'\')'));
		nodeObj.eventHandle[4]=GEvent.addListener(marker, "mouseover", new Function('','markerMouseOver(\''+node+'\')'));
		nodeObj.eventHandle[5]=GEvent.addListener(marker, "mouseout", new Function('','markerMouseOut(\''+node+'\')'));
		nodeObj.eventHandle[6]=GEvent.addListener(marker, "mouseup", new Function('','markerMouseUp(\''+node+'\')'));
		nodeObj.eventHandle[7]=GEvent.addListener(marker, "mousedown", new Function('','markerMouseDown(\''+node+'\')'));
		nodeObj.eventHandle[8]=GEvent.addListener(marker, "dblclick", new Function('','markerDblClick(\''+node+'\')'));
		nodeObj.eventHandle[9]=GEvent.addListener(marker, "infowindowopen", new Function('','markerInfoWindowOpen(\''+node+'\')'));
		nodeObj.eventHandle[10]=GEvent.addListener(marker, "infowindowclose", new Function('','markerInfoWindowClose(\''+node+'\')'));*/
		
	}

	function markerSetHasOn(node)
	{
		if(!node)node=markerCurrentNode
		var nodeObj=mapNodes[node]
		
		nodeObj.marker.hasOnClick=(nodeObj.marker.infoSimpleOpenOn==E_MARKER_CLICK || nodeObj.marker.infoSimpleCloseOn==E_MARKER_CLICK || nodeObj.marker.infoTabbedOpenOn==E_MARKER_CLICK || nodeObj.marker.infoTabbedCloseOn==E_MARKER_CLICK || nodeObj.marker.infoBlowupOpenOn==E_MARKER_CLICK	|| nodeObj.marker.infoBlowupCloseOn==E_MARKER_CLICK)
		nodeObj.marker.hasOnDblClick=(nodeObj.marker.infoSimpleOpenOn==E_MARKER_DBLCLICK || nodeObj.marker.infoSimpleCloseOn==E_MARKER_DBLCLICK || nodeObj.marker.infoTabbedOpenOn==E_MARKER_DBLCLICK || nodeObj.marker.infoTabbedCloseOn==E_MARKER_DBLCLICK || nodeObj.marker.infoBlowupOpenOn==E_MARKER_DBLCLICK	|| nodeObj.marker.infoBlowupCloseOn==E_MARKER_DBLCLICK)
	}
	
	
	function markerRemoveEventHandle(node)
	{
		if(!node)node=markerCurrentNode
		var nodeObj=mapNodes[node]

		GEvent.clearInstanceListeners(nodeObj.gMarker)

		//for(var x=0;x<nodeObj.eventHandle.length;x++)GEvent.removeListener(nodeObj.eventHandle[x])
		nodeObj.eventHandle=null;
	}

	function markerInfoWindowClose(node)
	{
	}
	
	function markerInfoWindowOpen(node)
	{
		var obj=gmap.getInfoWindow()
		if(obj)
		{	
			currentInfoWindow=obj
			currentMarkerTabs=obj.getTabs()
			var elem=obj.getContentContainers()[0]
			currentMarkerSize=new GSize(elem.offsetWidth,elem.offsetHeight)
			currentMarkerPoint=obj.getPoint()
			currentMarkerInfoPixelOffset=obj.getPixelOffset()
			remarkerSetInfo(node)
		}
		else GLog.write('markerInfoWindowOpen: infoWindowObject missing')
		
	}
	
	function markerMouseUp(node)
	{
		if(!node)node=markerCurrentNode
		var nodeObj=mapNodes[node]
		
		if(nodeObj.gMarker)
		{
			openMarkerInfoWindow(node,E_MARKER_MOUSEUP)
			if(nodeObj.infoOn!=E_MARKER_MOUSEUP)closeMarkerInfoWindow(node,E_MARKER_MOUSEUP)
		}
	}

	function markerMouseDown(node)
	{
		if(!node)node=markerCurrentNode
		var nodeObj=mapNodes[node]
		
		if(nodeObj.gMarker)
		{
			openMarkerInfoWindow(node,E_MARKER_MOUSEDOWN)
			if(nodeObj.infoOn!=E_MARKER_MOUSEDOWN)closeMarkerInfoWindow(node,E_MARKER_MOUSEDOWN)
		}
	}
	
	function markerCheckDblClick(node)
	{
		if(!node)node=markerCurrentNode
		var nodeObj=mapNodes[node]
		
		if(nodeObj.marker.hasOnDblClick)
		{
			if(!checkDblClickTimer)
			{
				checkDblClickTimer=setTimeout('markerClick(\''+node+'\')',200)
				return
			}
		}
		else markerClick(node)
	}
	
	
	function markerClick(node)
	{
		if(!node)node=markerCurrentNode
		var nodeObj=mapNodes[node]

		checkDblClickTimer=null;
		nodeSetCurrent(node);
		markerPutInfoSimple(node);
		markerPutInfoTabbed(node);
		markerPutInfoBlowup(node);
		if(nodeObj.gMarker)
		{
			openMarkerInfoWindow(node,E_MARKER_CLICK)
			if(nodeObj.infoOn!=E_MARKER_CLICK)closeMarkerInfoWindow(node,E_MARKER_CLICK)
		}
	}
	
	
	function markerDblClick(node)
	{
		if(checkDblClickTimer)
		{
			clearTimeout(checkDblClickTimer)
			checkDblClickTimer=null;
		}
		
		if(!node)node=markerCurrentNode
		var nodeObj=mapNodes[node]
		
		if(nodeObj.gMarker)
		{
			openMarkerInfoWindow(node,E_MARKER_DBLCLICK)
			if(nodeObj.infoOn!=E_MARKER_DBLCLICK)closeMarkerInfoWindow(node,E_MARKER_DBLCLICK)
		}
	}
	
	function markerMouseOver(node)
	{
		if(!node)node=markerCurrentNode
		var nodeObj=mapNodes[node]
		
		if(nodeObj.gMarker)
		{
			openMarkerInfoWindow(node,E_MARKER_MOUSEOVER)
			if(nodeObj.infoOn!=E_MARKER_MOUSEOVER)closeMarkerInfoWindow(node,E_MARKER_MOUSEOVER)
		}
	}

	function markerMouseOut(node)
	{
		if(!node)node=markerCurrentNode
		var nodeObj=mapNodes[node]
		
		if(nodeObj.gMarker)
		{
			openMarkerInfoWindow(node,E_MARKER_MOUSEOUT)
			if(nodeObj.infoOn!=E_MARKER_MOUSEOUT)closeMarkerInfoWindow(node,E_MARKER_MOUSEOUT)
		}
	}

	function markerDragEnd(node)
	{
		if(!node)node=markerCurrentNode
		var nodeObj=mapNodes[node]

		nodeObj.latLng=nodeObj.gMarker.getPoint()
		nodePutLatLng(node)
		if(nodeObj.gMarker)
		{
			openMarkerInfoWindow(node,E_MARKER_DRAGEND)
			if(nodeObj.infoOn!=E_MARKER_DRAGEND)closeMarkerInfoWindow(node,E_MARKER_DRAGEND)
		}
		remarkerSetInfo(node,true)
	}

	function markerDragStart(node)
	{
		if(!node)node=markerCurrentNode
		var nodeObj=mapNodes[node]
		
		if(nodeObj.gMarker)
		{
			openMarkerInfoWindow(node,E_MARKER_DRAGSTART)
			if(nodeObj.infoOn!=E_MARKER_DRAGSTART)closeMarkerInfoWindow(node,E_MARKER_DRAGSTART)
		}
	}
	

	function markerDrag(node)
	{
		if(!node)node=markerCurrentNode
		var nodeObj=mapNodes[node]
		
		nodeObj.latLng=nodeObj.gMarker.getPoint()
		nodePutLatLng(node)
		if(nodeObj.gMarker)
		{
			openMarkerInfoWindow(node,E_MARKER_DRAG)
			if(nodeObj.infoOn!=E_MARKER_DRAG)closeMarkerInfoWindow(node,E_MARKER_DRAG)		
		}
	}



