﻿// global:
var globalDivFlash = null; // foterkepen megjeleno flash reklam animacio


/* START: Right-click menu off */
//document.onclick = sourcecodeprotect;
//document.onmousedown = sourcecodeprotect;
/*
function sourcecodeprotect(e) {
  var ie = (document.all)? true:false;
  
  if (ie&&(window.event.button==2))
	return false;
  else 
	return true;	
}
*/
/* END: Right-click menu off*/


document.oncontextmenu = OnContextMenuFunc; //new Function("return False;") 

function OnContextMenuFunc (pEvent)
{	
	if (g_TopoliszPageData.GetActiveMap () != null)
		return false; // van aktív térkép és nem kell context menü
	else
		return true; // nincs és kell
};

// private:
// azert, hogy tudjuk, hogy melyik  terkep az
// aktiv (melyik felett all az eger), ez kell pl a gorgos zoomhoz

function TopoliszPageData ()
{
	this.pMap = null;
	this.pPreviousNotNullActiveMap = null;

	var me = this;

	this.SetActiveMap = function (map) 
	{
		if (me.pMap != null)
		{
			me.pPreviousNotNullActiveMap = me.pMap;
		}
		
		me.pMap = map;		
	};  
	
	this.GetActiveMap = function () {return me.pMap};
	this.GetPreviousNotActiveMap = function () {return me.pPreviousNotNullActiveMap};
}

g_TopoliszPageData = new TopoliszPageData ();


function DrawRouteStruct ()
{
	this.bNewPoint = false;
	this.bDrawRoute = false;
}

function PropertyChangedEventListener(strProperty, funcOnChanged)
{
	this.strProperty = strProperty;
	this.funcOnChanged = funcOnChanged;
}

/// protected:
///
/// Terkepi funkciokat megvalosito osztaly
///
CTopoliszMap.prototype.arrInstances = new Array();

function CTopoliszMap(strSessionID, divMap, bHasMiniMap, bCanLooseFocus)
{
	this.m_bRasterLevel = true;
	this.m_bPaleMapGridImage = false;
	this.m_arrLevelInfo = null; 
	this.m_bRubberMode = false;
	this.m_bRubberDrawing = false;
	this.rubberDiv = null;
	this.rubberDivTop = 0;
	this.rubberDivLeft = 0;
	this.rubberDivBottom = 0;
	this.rubberDivRight = 0;
	this.m_bZoomRectVsMoveModeInverted = false;
	this.bExternalMouseHandling = false;
	this.bLabelHasPanoramaButton = true;
	this.bLabelHasStartButton = true;
	this.bLabelHasStopButton = true;
	this.bLabelHasThroughButton = true;
	
	this.arrInstances[this.arrInstances.length] = this;
	this.bPreviewIsOn = false;
	/*if(divMap)
		divMap.pMap = this;*/
	this.strSessionID = strSessionID;
	this.divMap = divMap;
	this.divFace = null;
	this.arrPois = new Array();
	this.arrPoisOnGrid = new Array(); 
	this.OnPoiOnGridListChanged = null;
	this.OnMarkerListChanged = null;
	this.OnMapViewChanged = null;
	this.pMapPalette = null;

	this.graphics = null;
	this.polyline = null;

	///private:
	this.bMouseDown = false;
	this.iMouseDownX = 0;
	this.iMouseDownY = 0;
	this.iMouseUpX = 0;
	this.iMouseUpY = 0;
	this.iMouseMoveStartX = 0;
	this.iMouseMoveStartY = 0;
	this.iMouseMoveEndX = 0;
	this.iMouseMoveEndY = 0;

	this.iMousePosX = 0;
	this.iMousePosY = 0;


	this.pGridMain = null;

	this.iMapViewWidth = 0;
	this.iMapViewHeight = 0;

	//Allapotmentes
	this.arrStates = new Array();      // Terkepi allapot: CMapData tomb
	this.iActiveState = -1;            // Melyik az aktiv elem a tomben
	this.bSkipNextStateChange = false; // A kovetkezo allapotvaltast ne regisztralja

	this.pRouteSearch = null;  //Utvonaltervezo modul
	this.pTextResult = null;   //Utvonal megjelenito modul

	// a grid size in pixels
	this.iMapGridItemWidth = (g_RasterMapInfo != null ? g_RasterMapInfo.iSectionWidth : 150);
	this.iMapGridItemHeight = (g_RasterMapInfo != null ? g_RasterMapInfo.iSectionHeight: 150);

	// grid size in items
	//this.iGridHeight = 5;
	//this.iGridWidth = 7;
	
	this.iGridHeight = Math.ceil(screen.availHeight / this.iMapGridItemHeight) + 1;
	this.iGridWidth = Math.ceil(screen.availWidth / this.iMapGridItemWidth) + 1;
	
	// full map size in pixels
	this.iMapWidth = this.iMapGridItemWidth * this.iGridWidth;
	this.iMapHeight = this.iMapGridItemHeight * this.iGridHeight;

	
	// Screen.availHeight / Width : kepernyo merete


	this.DEFAULT_MINIMAP_LEVEL = 0;
	this.DIFF_MAP_LEVELS = 5;
	this.MAP_DEFAULT_LEVEL = 3; //2;
	this.MAP_MINIMUM_LEVEL = 3; //2;

	// -1 jelenti a lehetseges maximalis erteket
	this.MAP_MAXIMUM_LEVEL = -1;

	// Ezeken a valtozokon keresztul adja at a zoom fuggveny elso fele (a szerverhivas
	// elotti) a masodik felenek (a szerverhivas utaninak)
	this.ArgZoom_ZoomPosX = 0;
	this.ArgZoom_ZoomPosY = 0;

	this.pixeldensity = 10;
	this.InciServer = null;
	this.NoSessionServer = null;
	this.ReadSessionServer = null;

	this.bMainMapMode = true;
	this.bHasMiniMap = bHasMiniMap;
	this.pConnectedMainMap = null;
	this.pConnectedMiniMap = null;

	// MiniMap eseten:
	this.pMiniMapFrame = null;
	this.bMiniMapVisible = false;

	// Zoom animacio
	this.animDiv = null;

// Meretarany mutato
	this.ratiometerDiv = null;

	// A gyors egymas utani zoomok osszegezesehez
	this.bZooming = false;
	this.iZoomingLevelChange = 0;
	this.pZoomSrc = undefined;

	this.bFrameMouseDown = false;
	this.iFrameMouseX;
	this.iFrameMouseY;
	this.iFrameMouseStartX;
	this.iFrameMouseStartY;

	// tavolsagmeres

	this.graphics = null;
	this.DistMeter = null;
	this.bDistanceMeasuring = false;
	this.pDistanceDisplay = null;
	this.pDistancePoly = new CPolyline();
	this.bDrawRouteHappening = false;
	this.bDrawDistMeasureHappening = false;
	
	this.bDrawHidFile = false;
	this.strDrawTrfEdgeVT = "";
	this.strDrawTrfNodeVT = "";
	this.strDrawRunParams = "";

	// borders

	this.iMapDivBorderWidth = 3;

	// felhasznaloi mozgatas

	this.bUserMovedByMouse = false;

	// this.bUserMovedEndedFlag: akkor allitjuk true-ra, ha azt szeretnenk, hogy
	// a move callbackje meghivja a user ended moving-ot.

	this.bUserMovedEndedFlag = false;


	// this.bUserMoving => true lesz ha barmilyen mozgatas tortenik, s
	// csak a UserMovingEnded allitja vissza false-ba. A UserStartMoving mukodesehez kell.

	this.bUserMoving = false;


	this.pLastStateFromServer = null;
	this.iMovingSinceLastServerStateX = 0;
	this.iMovingSinceLastServerStateY = 0;

	// autoscroll

	this.AutoScrollDY = 0;
	this.AutoScrollDX = 0;
	this.bAutoScrollEnabled = false;
	this.bMouseOverMapView = false;
	this.iAutoScrollMargin = 15;
	this.bAutoScrolling = false;
	this.divFaceBorderTop = null;
	this.divFaceBorderLeft = null;
	this.divFaceBorderBottom = null;
	this.divFaceBorderRight = null;
	this.imgFaceBorderTop = null;
	this.imgFaceBorderLeft = null;
	this.imgFaceBorderBottom = null;
	this.imgFaceBorderRight = null;
	
	this.AutoMoveLimit = 0;
	this.AutoMoveLimitStartValue = 1000; // autoscroll pixel limit 
	

	// markerek (<-- wgs es cimek), addresslabelek (<-- rajzelemek (pixXY, cimek))

	this.pMarkers = new Markers ();
	this.pLabels = new Array ();
	this.pRouteSearch = null;
	this.bDisplayPOIBanner = true;
	this.bDisplayCoords = getBoolCookie('bDisplayCoords', false);
	
	// pick mode
	this.bPickMode = false;
	this.strPickMode = "internal";

	this.bMouseEventsAreSet = false;

	this.divPoiParent = null;
	this.divPrintPreview = null;
	this.sPoiLayers = "";
	
	this.pMouseOverLayerPoi = null;		
	this.pMouseOverPin = null;	/* type: Marker*/	
	this.pLastMouseOverPin = null;	
	this.bMouseLongOverTimingEnabled = true;

	// out/over: map palette
	this.bCursorOnMapPalette = false;

	// moving from outer source (ie. other code)
	this.bOuterMoving = false;
	
	// egergorgetes finomhangolasa
	this.bWheeling = false;
	this.iWheelingDeltaSum = 0;

	// label "befagyasztasa"
//	this.bFixedLabel = false; // régebbi cucc a layer poi-hoz
	this.pFixedMarker = null;

	this.arrDrawRouteCallbackListeners = new Array ();

	this.bEnableMapCaption = true;
	this.divMapCaption = null;
	this.divMapCopyright = null;
	this.divToolTip = null;

	this.bZoomingHappens = false;
	
	this.divAddressFormatHelp = null;
	
	this.bFocused = true;
	this.strRole = "mainmap";		
	this.iMainGridImageOpacity = 100;
	this.m_bPickingForbidden = false; // azért kell, hogy a fókuszálást kiváltó klikkre ne pickeljen
	
	// properties
	this.m_bMouseWheelZoomEnabled = true;		
	this.m_bMapAlwaysFocused = false;
	
	this.bUserPickEnabled = true;
	this.iScrollMagicNumber = 4;
	this.m_bCanLooseFocus = bCanLooseFocus == undefined ? true : bCanLooseFocus;
	var m_bDrawTMC = false; 
	var m_bDrawTMCWeather = false; 
	this.arrTMCTextTable = [];
	
	var m_bDrawUTV = false;
	var m_arrUTVCameras = [];
	var m_dUTVMinX = 0;
	var m_dUTVMinY = 0;
	var m_dUTVMaxX = 0;
	var m_dUTVMaxY = 0;
	
	var m_bDrawPTStopsGlobal = false;
	var m_bDrawPTStopsLocal = false;
	var m_bDrawDailyNews = false;
	this.m_bDrawNORC = false;
	this.m_arrDrawnPois = new Array();

	this.strDefaultCountry = "Magyarország";
	this.iMustVisibleMarkerSID = 0;
	
	this.bZoomCalled = false;	// After the first zoom-kind function call ("ZoomToRect", "ZoomToPoint", ...) becomes "true"
								// Used in the page initialisation phase
	this.bInitPhase = true;		// While page is under initialisation (image downloads, elements' arrange) is true
								// main reason: under initialisation MUST NOT zoom.
								// Used in the page initialisation phase (true from creation till PageInitEnded() call
	
	this.arrPropertyChangedListeners = [];
	
	// label handling
	this.iLabelDesignVersion = 2;
	
	this.strCopyrightText = "";
	
	this.bLayerPoiRedrawNeeded = false;
	
	// external address handler
	this.HandleAddress = null;
	
	var me = this;

	// Űber hack
	this.SetScrollMagicNumber = function(value) {
		me.iScrollMagicNumber = value;
	}
	
	this.EnableMouseWheelZoom = function () 
	{
		me.m_bMouseWheelZoomEnabled = true;
	}

	this.DisableMouseWheelZoom = function () 
	{
		me.m_bMouseWheelZoomEnabled = false;
	}
	
	this.SetMapAlwaysFocused = function () 
	{
		me.m_bCanLooseFocus = false;		
		me.SetFocus();
	}	
	
	// must call after page init script 
	this.PageInitEnded = function ()
	{
		me.bInitPhase = false;
	}
	
	this.SetCopyrightText = function (value)
	{
		me.strCopyrightText = value;
	}
	
	this.GetTMCState = function()
	{
		if(me.arrTMCTextTable != null && me.arrTMCTextTable.length > 0)
			return me.arrTMCTextTable[0];
		return "";
	}
	
	this.GetTMCStateExt = function()
	{
		var ret = me.GetTMCState();
		
		if (m_bDrawTMC && m_bDrawTMCWeather)
			ret = "B" + ret;
		else if (m_bDrawTMC && !m_bDrawTMCWeather)
			ret = "T" + ret;
		else if (!m_bDrawTMC && m_bDrawTMCWeather)
			ret = "W" + ret;
		return ret;
	}
		
	this.Get_bDrawTMC = function ()
	{
		return m_bDrawTMC;
	}

	this.Get_bDrawTMCWeather = function ()
	{
		return m_bDrawTMCWeather;
	}
		
	this.GetTMCText = function(iIndex)
	{
		if(me.arrTMCTextTable != null)
		{
			if(0 < iIndex && iIndex < me.arrTMCTextTable.length)
				return me.arrTMCTextTable[iIndex];
		}
		return "";
	}

	this.SetFocus = function ()
	{
		if ((me.bFocused == false) /*&& (me.strRole == "mainmap")*/)
		{			
			me.bFocused = true;
			me.VisualiseFocusState ();
		}
	}
	
	this.UnSetFocus = function ()
	{
		if ((me.bFocused == true && me.m_bCanLooseFocus)/* && (me.strRole == "mainmap")*/)
		{
			me.bFocused = false;
			me.VisualiseFocusState ();
		}
	}
	
	this.SetMoveMode = function ()
	{
		me.m_bRubberMode = false;
		me.m_bRubberDrawing = false;	
		if (me.rubberDiv)
		{
			if (me.rubberDiv.parentNode)
				me.rubberDiv.parentNode.removeChild(me.rubberDiv);
		}
		if (me.pMapPalette.ZoomRectImgButton != null)
			me.pMapPalette.ZoomRectImgButton.SetActive(false);
		if (me.pMapPalette.MoveModeImgButton != null)
			me.pMapPalette.MoveModeImgButton.SetActive(true);
			
		me.SetFocus();
		me.SetNormalCursor();		
	}

	this.SetZoomRectMode = function ()
	{
		me.m_bRubberMode = true;
		me.m_bRubberDrawing = false;		
		if (me.pMapPalette.ZoomRectImgButton != null)
			me.pMapPalette.ZoomRectImgButton.SetActive(true);
		if (me.pMapPalette.MoveModeImgButton != null)
			me.pMapPalette.MoveModeImgButton.SetActive(false);
			
		me.SetFocus();
		me.SetNormalCursor();
	}
	
	this.ScrollPageToMap = function ()
	{
		if (me.divMap != null)
                   location.hash = me.divMap.id;
	}

	
	this.VisualiseFocusState = function ()
	{
		if (me.strRole != "minimap")
		{
			if (me.divFace != null)
			{
				if (me.bFocused == true)
				{
					me.divFace.style.border = "3px solid #999999";
				}
				else
				{
					me.divFace.style.border = "3px double #CCCCCC";
				}				
			}
			me.SetNormalCursor();
		}
	}
	
	this.AddDrawRouteCallbackListener = function (pFunction)
	{
		var bExists = false;
		var i;
		for (i = 0; i < me.arrDrawRouteCallbackListeners.length; i++)
		{
			var pListenerFunc = me.arrDrawRouteCallbackListeners [i];
			if (pListenerFunc == pFunction)
			{
				bExists = true;
				break;
			}
		}

		if ((bExists == false) && (pFunction != null))
			me.arrDrawRouteCallbackListeners.push (pFunction);
	}

	this.CallDrawRouteCallbackListeners = function ()
	{
		var i;
		for (i = 0; i < me.arrDrawRouteCallbackListeners.length; i++)
		{
			var pListenerFunc = me.arrDrawRouteCallbackListeners [i];
			if (pListenerFunc != null)
				pListenerFunc ();
		}
	}
	
	this.FillLevelInfo = function ()
	{
	    m_arrLevelInfo = new Array();
	   	   
	    var i;
	    for (i = 0; i < g_RasterMapInfo.iLevels; i++)
	    {
	        m_arrLevelInfo.push (g_RasterMapInfo.arrLevels[i].dPixelDensityXMeter);
	    }
	}	

	/// private:
	this.Init = function()
	{
		//if (me.bHasMiniMap)
		if(me.strRole == "mainmap")
		{
			document.onkeypress = me.OnKeyDown;
		}

		me.FillLevelInfo ();

		me.pixeldensity = me.GetInitialPixelDensity();
		me.className = "CTopoliszMap";
		me.InciServer = new CommandHandler(g_strHandlerUrl, me.strSessionID, g_strAppID, g_strLangID);
		me.InciServer.OnReadyStateChange = me.OnReadyStateChangeInternal;
		me.InciServer.OnCommandReady = me.OnCommandReadyInternal;
		me.InciServer.OnCommandError = me.OnCommandErrorInternal;

		me.NoSessionServer = new CommandHandler(g_strNoSessionHandlerUrl, me.strSessionID, g_strAppID, g_strLangID);
		me.NoSessionServer.OnReadyStateChange = me.OnReadyStateChangeInternal;
		me.NoSessionServer.OnCommandReady = me.OnCommandReadyInternal;
		me.NoSessionServer.OnCommandError = me.OnCommandErrorInternal;

		me.ReadSessionServer = new CommandHandler(g_strReadSessionHandlerUrl, me.strSessionID, g_strAppID, g_strLangID);
		me.ReadSessionServer.OnReadyStateChange = me.OnReadyStateChangeInternal;
		me.ReadSessionServer.OnCommandReady = me.OnCommandReadyInternal;
		me.ReadSessionServer.OnCommandError = me.OnCommandErrorInternal;

		// esemenyek beallitasa kiveve scroll
		if(me.divMap)
			me.SetMapDiv(me.divMap);

		// MiniMap beallitas 
		if (me.bHasMiniMap && me.divMap)
		{
			// ZoomAnim beallitas
			me.CreateZoomAnim ();

			// ToolTip div beallitas
			me.CreateToolTip ();
		}

		if(me.strRole != "minimap")
		{
			// Meretarany mutato
			me.CreateRatioMeter (false);
			
			// ToolTip div beallitas
			me.CreateToolTip ();
			
			if(me.strRole == "mainmap")
			{
				m_bDrawTMC = false; //getBoolCookie('bDrawTMC', false);
				m_bDrawTMCWeather = false; //getBoolCookie('bDrawTMCWeather', false);
				m_bDrawPTStopsGlobal = false;
				m_bDrawPTStopsLocal = false;
			}
		}
		if(me.strRole == "minimap")
		{
			m_bDrawPTStopsGlobal = false;
			m_bDrawPTStopsLocal = false;
			m_bDrawDailyNews = false;
		}

		me.VisualiseFocusState();

		if (me.bMainMapMode)
		{
			me.SetScrollEvents();
		}

		if(me.OnCreate)
		{
			try {
				me.OnCreate(me);
			}
			catch (exp) {
				if(me.OnError)
					me.OnError(exp,'CTopoliszMap.OnCreate');
			}
		}
				
		// flash teszt
	
		if (me.strRole=="minimap") // mini map
		{
			// Ha HTML kódként adott a reklám:

			me.divMap.style.border = "2px solid Orange";
				
			/*
			globalDivFlash = NewTag ("div",me.divMap);
			globalDivFlash.style.position = "absolute";
			globalDivFlash.style.top = "3px";
			globalDivFlash.style.left = "3px";
			globalDivFlash.style.zIndex = 100;
			var divAdNokia = GetBlock("adNokia");
			globalDivFlash.appendChild (divAdNokia);
			divAdNokia.style.display = "";
			*/
			

			// Ha javascriptben kell kavarni a hirdetest:
			
			/*
			var filename = "";
			//var filename = "images/6210 Polaris_95x95.swf";
			
			if (filename != "")
			{
				globalDivFlash = NewTag ("div",me.divMap);
				globalDivFlash.style.position = "absolute";
				globalDivFlash.style.top = "3px";
				globalDivFlash.style.left = "3px";
				
				var xmlIc=document.createElement('object');
				xmlIc.setAttribute('type','application/x-shockwave-flash');
				xmlIc.setAttribute('data', '');
				xmlIc.data=filename;
				xmlIc.setAttribute('width', '');
				xmlIc.width="95";
				xmlIc.setAttribute('height','');
				xmlIc.height="95";

				var paramIc=document.createElement('param');
				paramIc.setAttribute('name','');
				paramIc.name="movie";
				paramIc.setAttribute('value','');
				paramIc.value=filename;
				xmlIc.appendChild(paramIc);
				globalDivFlash.appendChild(xmlIc);
			
				try
				{
					xmlIc.LoadMovie(0,filename); 
				}
				catch(e)
				{
				}
			}
			*/
		}
		me.CreateCopyrightLabel();
	}

	/// private:
	this.InitGrid = function ()
	{
		if (!me.pConnectedMainMap)
		{
			var toplogo = NewTag("img", me.divMap);
			toplogo.id = divMap.id + "toplogo";
			toplogo.className = "toplogo";
			/*SetImage(toplogo, GetAbsUrl("images/t.gif"), 58, 28, "Topolisz");*/
			toplogo.src = GetAbsUrl("images/t.gif");
			toplogo.alt = "Topolisz";			
			if (g_strAppID.toLowerCase() == "trafficnav") {
        NewTag("br", me.divMap);
        var logo = NewTag("img", me.divMap);
        logo.id = divMap.id + "trafficnavlogo";
        logo.className = "trafficnavlogo";
        logo.src = GetAbsUrl("images/buttonpalette/logo_trafficnav.png");
        logo.alt = "TrafficNav";
			}
		}
		else
			me.bEnableMapCaption = false;

		
		if (me.pGridMain == null)
		{
			me.pGridMain = new CMapGrid (0, 0, me.iGridHeight-1, me.iGridWidth-1, me, 0, 0);
			var mgd = me.pGridMain.CreateGrid();
			me.graphics = new Graphics (mgd.id);
		}

		if (me.pConnectedMiniMap)
			me.pConnectedMiniMap.InitGrid ();

		// tavolsagmeres

		me.graphics = new Graphics(me.pGridMain.mainGridDiv.id);
		me.DistMeter = new DistanceMeter(me.graphics, 0, 0, me.pGridMain.mainGridDiv, me.pDistancePoly);
	}

	///private:
	this.CopyMarkersAndPois = function(baby)
	{
		delete baby.pMarkers;
		baby.pMarkers = me.pMarkers.Clone();
		delete baby.arrPois;
		baby.arrPois = me.arrPois.slice(0);
	}

	/// private:
	this.SetAsMiniMap = function (pConnectedMainMap)
	{
		me.bMainMapMode = false;
		me.pConnectedMainMap = pConnectedMainMap;
		me.pConnectedMainMap.pConnectedMiniMap = me;
		me.pConnectedMainMap.divMap.appendChild(me.divMap);
		me.divMap.style.visibility = "visible";
		me.iGridHeight = 2;
		me.iGridWidth = 2;
		me.SetBorderThickness (0);
	}

	/// private:
	this.GetMapGridItemWidth = function()
	{
		return me.iMapGridItemWidth;
	}

	/// private:
	this.GetMapGridItemHeight = function()
	{
		return me.iMapGridItemHeight;
	}

	/// private:
	this.GetMapGridWidthInPixel = function()
	{
		return me.iMapGridItemWidth * me.pGridMain.GetWidth();
	}

	/// private:
	this.GetMapGridHeightInPixel = function()
	{
		return me.iMapGridItemHeight * me.pGridMain.GetHeight();
	}

	/// private:
	this.GetMapViewWidth = function()
	{
		return me.iMapViewWidth;
	}

	/// private:
	this.GetMapViewHeight = function()
	{
		return me.iMapViewHeight;
	}

	/// private:
	this.GetMapWidth = function()
	{
		return me.iMapWidth;
	}

	/// private:
	this.GetMapHeight = function()
	{
		return me.iMapHeight;
	}

	/// private:
	this.GetMapGridItem = function ()
	{
		var pGridItem = new CMapGridItem(me);
		AddTag(pGridItem.div, me.divMap);
		return pGridItem;
	}

	/// protected:
	// Egy sztringben adja vissza a Session ID-t
	this.GetSessionID = function()
	{
		return me.strSessionID;
	}

	/// protected:
	/// SessionID beallitas
	this.SetSessionID = function(strSessionID)
	{
		me.strSessionID = strSessionID;
	}

	/// private:
	this.SetMouseUp = function(iUpX, iUpY)
	{
		this.iMouseUpX = iUpX;
		this.iMouseUpY = iUpY;
	}

	/// private:
	this.SetMouseDown = function(iDownX, iDownY)
	{
		me.iMouseDownX = iDownX;
		me.iMouseDownY = iDownY;
	}

	/// private:
	this.SetMouseMoveStart = function (iUpX, iUpY)
	{
		this.iMouseMoveStartX = iUpX;
		this.iMouseMoveStartY = iUpY;
	}

	/// private:
	this.SetMouseMoveEnd = function (iDownX, iDownY)
	{
		me.iMouseMoveEndX = iDownX;
		me.iMouseMoveEndY = iDownY;
	}

	/// private:
	this.GetMapDivWidth = function ()
	{
		return GetLayerWidth(me.divMap);
	}

	/// private:
	this.GetMapDivHeight = function ()
	{
		return GetLayerHeight(me.divMap);
	}
	
	// private:
	
	this.IsInView = function (x,y)
	{
		var mvw = me.GetMapViewWidth ();
		var mvh = me.GetMapViewHeight ();
		var mvvx = me.pGridMain.GetMapViewVectorX ();
		var mvvy = me.pGridMain.GetMapViewVectorY ();

		if ((x >= mvvx) && (x <= mvvx + mvw) && (y >= mvvy) && (y <= mvvy + mvh))
		{
			return true;
		}

		return false;
	}

	/// private:
	this.WriteIntoStatusBar = function (strInput)
	{
		var str = window.status + " " + strInput;
		var len = str.length;	
		var from = 	Math.max(0,len - 100);
		var to = len;			
		window.status = str.substr (from, to);
	}

	/// private:
	this.MoveMap = function ()
	{
		me.pGridMain.sMoveCallbackOn = "true";

		var iMoveX = me.iMouseMoveEndX - me.iMouseMoveStartX;
		var iMoveY = me.iMouseMoveEndY - me.iMouseMoveStartY;

		var bItWasARealMove = me.MoveMapYX (iMoveY, iMoveX);
		me.bUserMovedByMouse = me.bUserMovedByMouse || bItWasARealMove;
		return /*me.pGridMain.Move(-iMoveY,-iMoveX)*/bItWasARealMove;
	}

// private
	this.MoveMainMapInsteadOfMiniMap = function ()
	{
		if ((me.pConnectedMainMap != null)) // && (me.pConnectedMainMap.bUnderMoving == false))
		{
			document.onselectstart = function () { return false; }; // ie
			me.pConnectedMainMap.pGridMain.sMoveCallbackOn = "true";

			var miniMapLevel = me.GetLevel();
			var mainMapLevel = me.pConnectedMainMap.GetLevel();
				var miniMapPixelDensity = me.GetPixelDensity();
			var mainMapPixelDensity = me.GetPixelDensityFromLevel (mainMapLevel);
			var ratio = 1/ (mainMapPixelDensity / miniMapPixelDensity);

			var iMoveX = (me.iMouseMoveEndX - me.iMouseMoveStartX) * ratio;
			var iMoveY = (me.iMouseMoveEndY - me.iMouseMoveStartY) * ratio;

			var bItWasARealMove = me.pConnectedMainMap.MoveMapYX (iMoveY, iMoveX, "MoveMainMapInsteadOfMiniMap", true);
			me.pConnectedMainMap.bUserMovedByMouse = me.pConnectedMainMap.bUserMovedByMouse || bItWasARealMove;
		}
	}

	/// private:
	/// General mover function for internal use
	this.MoveMapYX = function(iMoveY, iMoveX)
	{
		me.HidePrintPreview();
		if (me.bUserMoving == false)
			me.UserMovingStarted ();
		me.bUserMoving = true;
		return me.pGridMain.Move(-iMoveY,-iMoveX);
	}

	/// protected:
	/// A terkep arrebmozgatasa megadott pixelekkel.
	this.MoveMapYX_outer = function(iMoveY, iMoveX)
	{
		me.HidePrintPreview();
		me.pGridMain.Move(-iMoveY,-iMoveX);
		me.bOuterMoving = true;
	}

	/// private:
	this.MovedCallback = function ()
	{
		// Frissiteni kell az address labeleket, ha mozgatas
		// tortent, de nem kell varni a DrawMapPersonal valaszara.
		// Ha tortent DrawMapPersonal hivas, akkor annak a callbackje majd frissit
		if (me.bDrawRouteHappening == false)
			me.RearrangeLabels();
		else
		{
			var types = ["start","through","stop"];
			me.HidePinLabelsMulti(types);
		}
			
		if (me.OnMapViewChanged)		
		{
			try {
					me.OnMapViewChanged ();
				}
				catch(exp)
				{
					if(me.OnError)
						me.OnError(exp, 'OnMapViewChanged');
				}
		}

		if (me.bUserMovedEndedFlag == true)
		{
			me.bUserMovedEndedFlag = false;
			me.UserMovingEnded ();
		}

		if (me.bOuterMoving == true)
		{
			me.OnStateChanged (me.pLastStateFromServer, me.iMovingSinceLastServerStateX, me.iMovingSinceLastServerStateY);
			me.bOuterMoving = false;
		}

		if (me.bMainMapMode)
		{
			me.MoveMiniMapSync ();
		}

		if (!me.bMainMapMode)
		{
			me.MoveMainMapSync ();
		}
	}

	/// private:
	// ha a main map-ot mozgattak meg , akkor hivodik
	// a minimap frame-jenek mozgatasa is kvazi main map mozgatas !
	this.MoveMiniMapSync = function ()
	{
		if (me.bMiniMapVisible)
		{
			var mainMapLevel = me.GetLevel();
			var miniMapLevel = me.pConnectedMiniMap.GetLevel();
			var mainMapPixelDensity = me.GetPixelDensity();
			var miniMapPixelDensity = me.GetPixelDensityFromLevel (miniMapLevel);

			var ratio = mainMapPixelDensity / miniMapPixelDensity;

			var iCol = (me.pGridMain.GetViewAbsoluteLeft() + (me.GetMapViewWidth ()) / 2) * ratio - (me.pConnectedMiniMap.GetMapViewWidth()) / 2;
			var iRow = (me.pGridMain.GetViewAbsoluteTop() + (me.GetMapViewHeight ()) / 2) * ratio - (me.pConnectedMiniMap.GetMapViewHeight()) / 2;
			me.pConnectedMiniMap.pGridMain.sMoveCallbackOn = "rearrangeframe";
			me.pConnectedMiniMap.MoveMapTo (iRow,iCol);
		}
	}

	/// private:
	this.MoveMainMapSync = function ()
	{
		if ((me.pConnectedMainMap != null)) // && (me.pConnectedMainMap.bUnderMoving == false))
		{
			var miniMapLevel = me.GetLevel();
			var mainMapLevel = me.pConnectedMainMap.GetLevel();
				var miniMapPixelDensity = me.GetPixelDensity();
			var mainMapPixelDensity = me.GetPixelDensityFromLevel (mainMapLevel);

			var ratio = 1/ (mainMapPixelDensity / miniMapPixelDensity);

			var iCol = (me.pGridMain.GetViewAbsoluteLeft() + me.GetMapViewWidth () / 2) * ratio - me.pConnectedMainMap.GetMapViewWidth() / 2;
			var iRow = (me.pGridMain.GetViewAbsoluteTop() + me.GetMapViewHeight () / 2) * ratio - me.pConnectedMainMap.GetMapViewHeight() / 2;
			me.pConnectedMainMap.pGridMain.sMoveCallbackOn = "false";
			me.pConnectedMainMap.MoveMapTo (iRow,iCol);
		}
	}

	/// private:
	// a terkep viewban lathato bal felso pixeleve
	// teszi a teljes logikai terkep iRow,iCol pixelet
	this.MoveMapTo = function (iRow, iCol)
	{
		me.pGridMain.MoveTo (iRow, iCol);
	}

	/// private:
	// a view koordinatarendszereben iTop, iLeft pontban levo
	// pontot bemozgatja a view kozeppontjaba N szintet zoomolva ra
	this.ZoomToCenter = function (iTop, iLeft, N)
	{
		var MVW = me.GetMapViewWidth ();
		var MVH = me.GetMapViewHeight ();

		var newLevel = me.GetLevel() + N;
		if (newLevel > me.GetMaximumLevel ())
			newLevel = me.GetMaximumLevel ();
		var oldPixelDensity = me.GetPixelDensity();
		var newPixelDensity = me.GetPixelDensityFromLevel (newLevel);


		// bal/felso -k
		var beforeAbsY = me.pGridMain.GetViewAbsoluteTop() + iTop;
		var beforeAbsX = me.pGridMain.GetViewAbsoluteLeft() + iLeft;
		var afterAbsY = oldPixelDensity/newPixelDensity * beforeAbsY;
		var afterAbsX = oldPixelDensity/newPixelDensity * beforeAbsX;

		var AbsX = afterAbsX - MVW / 2;
		var AbsY = afterAbsY - MVH / 2;

		var PixDen = me.GetPixelDensityFromLevel (newLevel);
		me.pGridMain.RemoveZoomPreview();
		
		// ----
		
		//var PreviewZoomPosX = iLeft;//ZoomPosX;
		//var PreviewZoomPosY = iTop;//ZoomPosY;
		var PreviewZoomPosX = MVW / 2;//ZoomPosX;
		var PreviewZoomPosY = MVH / 2;//ZoomPosY;

		if (me.GetMapViewWidth() > me.GetActiveWidthFromLevel(newLevel))
			PreviewZoomPosX = me.GetMapViewWidth () / 2;
		if (me.GetMapViewHeight() > me.GetActiveHeightFromLevel(newLevel))
			PreviewZoomPosY = me.GetMapViewHeight () / 2;		
		
		var PreviewMoveX = iLeft - MVW / 2;
		var PreviewMoveY = iTop - MVH / 2;
		
		if (me.bPreviewIsOn)
			me.pGridMain.ZoomPreview (oldPixelDensity/newPixelDensity, PreviewZoomPosX, PreviewZoomPosY, -PreviewMoveX, -PreviewMoveY);
			
		// ----
		
		me.ZoomMap (PixDen, AbsX, AbsY, 0, 0);
	}

	/// private:
	this.ValidateEventSource = function(pEvent)
	{
		for(var src = GetEventSourceElement(pEvent).parentNode; src != null; src = src.parentNode)
		{
			if(src == me.divPoiParent)
				return false;
			if(src == me.divMap)
				return true;
			if(src.nodeName.toLowerCase() == "body")
				return true;
		}
		return true;
	}

	/// private:
	this.OnMapClick = function(pEvent)
	{

		// a T-ONLNINE-mal itt van a Pick, de nekunk az OnMouseUp-on	

		// grid koordinatak

		var xxx = GetEventXNew(pEvent) - GetAbsLayerLeft (me.pGridMain.mainGridDiv);
		var yyy = GetEventYNew(pEvent) - GetAbsLayerTop (me.pGridMain.mainGridDiv);
		var obj = GetEventSourceElement(pEvent);

		var pPoiMouseOver = me.GetPoiNearXY (xxx, yyy);
		if (pPoiMouseOver != null)
		{
			if ((obj.className == "face") || (obj.className == "poiParent"))
				me.OnMouseClickLayerPoi (pPoiMouseOver);
		}


		var pPinMouseOver = me.pMarkers.GetPinNearXY (xxx, yyy);
		if (pPinMouseOver != null)
		{
			if ((obj.className == "face") || (obj.className == "poiParent"))
				pPinMouseOver.OnLabelSignClick();
				
		}

		return false;
	}

	/// private:
	this.OnMapDblClick = function(pEvent)
	{
		if(!me.ValidateEventSource(pEvent))
			return true;
	
		if (me.bMainMapMode == true)
		{
			if (me.bDistanceMeasuring == true)
			{
				me.OnOffMeasureDistance ();
			}
			else
			{
				//me.ZoomToCenter (GetEventY(pEvent), GetEventX(pEvent), 1);
			}
		}
	}

	/// private:
	this.OnMouseDown = function (pEvent)
	{				
		return me.OnMouseDownFunc(pEvent);
	}

	/// private:
	this.OnMouseDownFunc = function (pEvent)
	{
      var srcCheck = me.ValidateEventSource(pEvent); // ha rossz: return true;				
		//if ((srcCheck == false) && (me.bDistanceMeasuring == false)) return false;
	
		if (me.bFocused == false)
		{
			me.SetFocus ();
			me.m_bPickingForbidden = true;
		}
		else
		{
			me.m_bPickingForbidden = false;
		}
	
		if (globalDivFlash != null)
		{
			globalDivFlash.style.display = "none";
			globalDivFlash.parentNode.style.border = "3px solid Orange";
		}

		// grid koordinatak
		var xx = GetEventXNew(pEvent) - GetAbsLayerLeft (me.pGridMain.mainGridDiv);
		var yy = GetEventYNew(pEvent) - GetAbsLayerTop (me.pGridMain.mainGridDiv);

		if(me.BeforeMouseDown)
		{
			me.BeforeMouseDown(pEvent, xx, yy);
		}
		if(me.bExternalMouseHandling)
		{
			if(me.OnMouseDownExternal)
				me.OnMouseDownExternal(pEvent, xx, yy);
		}
		else
		{
			// tavolsagmeres mod
			if (!me.bExternalMouseHandling && me.bDistanceMeasuring)
			{
				if (me.bDrawDistMeasureHappening  == false)
				{
					me.DrawDistMeasure (xx, yy);
				}
				return false;
			}

			// hagyomanyos mod
			var realRubberMode = me.m_bRubberMode;
			if (IsRightClick(pEvent) == true)
			{
				if (realRubberMode == true)
					realRubberMode = false;
				else
					realRubberMode = true;
					
				me.m_bZoomRectVsMoveModeInverted = true;
			}							
			else
				me.m_bZoomRectVsMoveModeInverted = false;
				
			me.SetNormalCursor();
			
			var x = GetEventXNew(pEvent) - GetAbsLayerLeft (me.divFace);
			var y = GetEventYNew(pEvent) - GetAbsLayerTop (me.divFace);  
			
			
			if ( !me.bExternalMouseHandling && (realRubberMode == true)  && (me.m_bRubberDrawing == false))
			{
				me.rubberDiv = NewTag ("div", me.divFace);
				me.rubberDiv.style.position = "absolute";
				me.rubberDiv.style.border = "2px solid Red";
				me.rubberDiv.style.height = "0px";
				me.rubberDiv.style.width = "0px";
				me.rubberDiv.style.top = GetEventYNew(pEvent) - GetAbsLayerTop(me.divFace) - 8  + "px";
				me.rubberDiv.style.left = GetEventXNew(pEvent) - GetAbsLayerLeft(me.divFace) - 8 + "px";
				me.rubberDivBottom = me.rubberDivTop = GetEventYNew(pEvent) - GetAbsLayerTop(me.divFace) - 8;
				me.rubberDivRight = me.rubberDivLeft = GetEventXNew(pEvent) - GetAbsLayerLeft(me.divFace) - 8;
				me.rubberDiv.onmouseup = function () {g_TopoliszPageData.SetActiveMap (me); me.SetFocus();};
				me.m_bRubberDrawing = true;
			}
			//else
			{
				me.bPickMode = true;
				me.bMouseDown = true;
				me.SetMouseDown(x,y);
StopEventPropagation(pEvent);
				return false;
			}
		}
StopEventPropagation(pEvent);
		return false;
	}

	this.bMouseWheelEnabled = true;

	// private:
	this.OnMouseWheel = function (pEvent)
	{
		if (!me.m_bMouseWheelZoomEnabled)
			return;
			
		try
		{
			var delta = WheelEventCalculateDelta (pEvent);
			
			var pMap = g_TopoliszPageData.GetActiveMap ();
			
			if ((pMap != null) && (pMap.bFocused == true))
			{
				if (/*me.bMouseWheelEnabled && */(pMap != null) )
				{
					if (pMap.bMainMapMode)
					{
						if (pMap.bWheeling == false)
						{
							pMap.bWheeling = true;
							setTimeout(pMap.WheelZoom, 30);
						}

						pMap.iWheelingDeltaSum += delta;
						StopEventPropagation(pEvent);
						return false;
					}
				}
				else
				{
					me.bMouseWheelEnabled = false;
				}
			}
			else 
			{
				var pPrevActMap = g_TopoliszPageData.GetPreviousNotActiveMap();
				if (pPrevActMap != null)
					pPrevActMap.UnSetFocus ();
			}
			
			return true;
		}
		catch (e)
		{
		}
	}
	/// private:
	this.WheelZoom = function ()
	{
		if (globalDivFlash != null)
		{
			globalDivFlash.style.display = "none";
			globalDivFlash.parentNode.style.border = "3px solid Orange";
		}

		me.pZoomSrc = me.className;
		
		
	
		// sajnos hack: valamiert hol 2, hol 1 tick-et ad vissza a gorgozes
		// a terkep felett. Ha gorgetunk a page felett azutan 1-et ad, ha nem akkor alapbol 2-ot.
		// :(
		//if (me.iWheelingDeltaSum == 1) me.iWheelingDeltaSum = 2;
		//if (me.iWheelingDeltaSum == -1) me.iWheelingDeltaSum = -2;


		var iTick = me.iWheelingDeltaSum / me.iScrollMagicNumber;
		var iAbsTick = Math.abs(iTick);
		var iSign = iTick / iAbsTick;
		var iRoundAbsTick = Math.round(iAbsTick);
		var iDiffLevel = iRoundAbsTick * iSign;

		
		
		me.ZoomByLevel (iDiffLevel);
		me.bWheeling = false;
		me.iWheelingDeltaSum = 0;
	}

	/// private:
	// a felhasznaloi mozgatas kezdete:
	// pl. lenyomja az egergombot, s mozdit
	// pl. ramegy az autoscroll margora
	this.UserMovingStarted = function ()
	{
		//me.HidePinLabels("address") ();
	}

	/// private:
	// ez a fuggveny hivodik meg akkor, ha a user befejezte a move-olast,
	// mert pl. felengedte az egeret
	// Fontos! ugy kell meghivni, hogy a szerver valasza mar meglegyen addigra (ha load is volt)
	this.UserMovingEnded = function ()
	{
		me.bUserMoving = false;
		////		
		var dMinX = me.pGridMain.dWgsLowerLeftX;
		var dMinY = me.pGridMain.dWgsLowerLeftY;
		var dMaxX = me.pGridMain.dWgsUpperRightX;
		var dMaxY = me.pGridMain.dWgsUpperRightY;
		
		var Params = "";
		Params += 'dMinX=' + dMinX;
		Params += '&dMinY=' + dMinY;
		Params += '&dMaxX=' + dMaxX;
		Params += '&dMaxY=' + dMaxY;	
		me.NoSessionServer.CallFunction("MapRectToSettlement", Params, 0, me.MapRectToSettlementCallback);
		
	}

	// private:
	this.MapRectToSettlementCallback = function (caption)
	{
		me.ShowMapCaption (caption);
		me.OnStateChanged (me.pLastStateFromServer, me.iMovingSinceLastServerStateX, me.iMovingSinceLastServerStateY, caption);
	}

	/// private:
	this.OnMouseUp = function(pEvent)
	{
		return me.OnMouseUpFunc (pEvent);
	}

	/// private:
	this.OnMouseUpFunc = function (pEvent)
	{	
		var srcCheck = me.ValidateEventSource(pEvent);

		var xx = GetEventXNew(pEvent) - GetAbsLayerLeft (me.pGridMain.mainGridDiv);
		var yy = GetEventYNew(pEvent) - GetAbsLayerTop (me.pGridMain.mainGridDiv);

		if(me.BeforeMouseUp)
			me.BeforeMouseUp(pEvent, xx, yy);

		// ide majd a téglalap
		if(me.bExternalMouseHandling)
		{
			if(me.OnMouseUpExternal)
				me.OnMouseUpExternal(pEvent, xx, yy);
		}
		else
		{
			// rubber rect things starts
		
			me.m_bZoomRectVsMoveModeInverted = false;
			me.SetNormalCursor();
			
			
			if (me.m_bRubberDrawing == true)
			{
				me.rubberDiv.parentNode.removeChild(me.rubberDiv);
				me.m_bRubberDrawing = false;
				var mapwidth  = me.GetMapDivWidth();
				var mapheight  = me.GetMapDivHeight();
				var rubberwidth = Math.abs(me.rubberDivRight - me.rubberDivLeft);
				var rubberheight = Math.abs(me.rubberDivBottom - me.rubberDivTop);
								
				if ((rubberwidth > 10) && (rubberheight > 10))
				{
					var Z1 = mapwidth / rubberwidth;
					var Z2 = mapheight / rubberheight;
					var Z3 = Math.min (Z1, Z2);
					var Z4 = Math.log(Z3) / Math.log(2);
					Z = Math.round(Z4);
					
					if (me.GetLevel() != me.GetMaximumLevel ())
					{
						me.ZoomToCenter((me.rubberDivTop+me.rubberDivBottom)/2,(me.rubberDivLeft+me.rubberDivRight)/2, Z);
					}
				}
			}
			
			// rubber rect things ends
			
			if (me.bFrameMouseDown)
			{
				// minimapban vagyunk

				me.pMiniMapFrame.divSecFrame.style.visibility = "hidden";
				me.pMiniMapFrame.divSecFrameFill.style.visibility = "hidden";
				me.bFrameMouseDown = false;

				// elmozgatjuk a terkepet

				var x = GetEventXNew(pEvent);
				var y = GetEventYNew(pEvent);

				var iMoveX = -(x - me.iFrameMouseStartX);
				var iMoveY = -(y - me.iFrameMouseStartY);

				if ((iMoveX != 0) || (iMoveY != 0))
				{
					var miniMapLevel = me.GetLevel();
					var mainMapLevel = me.pConnectedMainMap.GetLevel();
					var miniMapPixelDensity = me.GetPixelDensity();
					var mainMapPixelDensity = me.GetPixelDensityFromLevel (mainMapLevel);

					var ratio = 1/ (mainMapPixelDensity / miniMapPixelDensity);

					me.pConnectedMainMap.pGridMain.sMoveCallbackOn = "true";
					me.pConnectedMainMap.bUserMovedEndedFlag = true;
					me.pConnectedMainMap.MoveMapYX (Math.floor(iMoveY * ratio), Math.floor(iMoveX * ratio));
				}
			}
			else if (me.bMouseDown == true)
			{
				{
					var x = GetEventXNew(pEvent) - GetAbsLayerLeft (me.divFace);
					var y = GetEventYNew(pEvent) - GetAbsLayerTop (me.divFace);

					me.SetMouseUp(x,y);

					var bSamePlaceUpAndDown = false;			    
					if ((me.iMouseUpX == me.iMouseDownX) && (me.iMouseUpY == me.iMouseDownY))
						bSamePlaceUpAndDown = true;

					me.bMouseDown = false;										

					if (bSamePlaceUpAndDown && !me.pConnectedMainMap && (me.m_bPickingForbidden==false)) // Pickeles csak utvonaltervnel
					{
						if (srcCheck == true)
						{
							if ((me.pMouseOverLayerPoi == null) && (me.pMouseOverPin == null))							
								me.UserPicked (pEvent);
						}
						else
						{
							return true;
						}
					}
					else // Mozgatas
					{
						// ha az egerfelengedes pillanataban mar a szerver valasza megjott 
						// (mar ha volt keres feleje)
						
						if (me.bUserMovedByMouse == true)
						{
							if (me.pGridMain.AllowMove == true) 
							{
								me.bUserMovedByMouse = false;
								me.UserMovingEnded ();
							}
							else
							{
								me.bUserMovedEndedFlag = true;
							}
						}
					}
				}
			}
		}
		
		return false;
	}

	/// private:	
	this.OnMouseMoveOnDocument = function (pEvent)
	{		
		try
		{
			var pActMap = g_TopoliszPageData.GetActiveMap ();
			if (g_TopoliszPageData.GetActiveMap() == me)
			{
				me.OnMouseMove (pEvent);
			}

			me.OnMouseMoveOnDocumentHandler (pEvent);			
		}
		catch (e)
		{
		}
	}

/// private:
	this.OnMouseMoveOnDocumentHandler = function (pEvent) 
	{
		// box over / out
		if (me.pMapPalette)
		{
			var div = me.pMapPalette.pSlider.slider;
			var l = GetAbsLayerLeft (div);
			var t = GetAbsLayerTop (div);
			var r = l + GetLayerWidth (div);
			var b = t + GetLayerHeight (div);
	
			var x = GetEventXNew (pEvent);
			var y = GetEventYNew (pEvent);

			if ((l <= x) && (x <= r) && (y <= b-3) && (t+3 <= y))
			{
				if (me.bCursorOnMapPalette == false)
				{
					me.pMapPalette.SliderOnMouseOver ();
					me.bCursorOnMapPalette = true;
				}
			} else if (me.bCursorOnMapPalette == true)
			{
				me.pMapPalette.SliderOnMouseOut ();
				me.bCursorOnMapPalette = false;
			}
		}
	}

	/// private:	
	this.OnMouseUpOnDocument = function (pEvent)
	{
		try
		{
			if ((g_TopoliszPageData.GetActiveMap() == me) || (me.m_bRubberDrawing)) // ie6 hulyesege
			{
				me.OnMouseUp (pEvent);
			}
			else
			{
				me.UnSetFocus();
			}
		}
		catch (e)
		{
		}
	}

	/// private:
	this.OnMouseMove = function(pEvent)
	{
		try
		{
			me.bMouseWheelEnabled = true;
			me.bMouseOverMapView = true;

			// tavolsagmeres mod
			me.bPickMode = false;

			var xx = GetEventXNew(pEvent) - GetAbsLayerLeft (me.pGridMain.mainGridDiv);
			var yy = GetEventYNew(pEvent) - GetAbsLayerTop (me.pGridMain.mainGridDiv);

			if(me.BeforeMouseMove)
				me.BeforeMouseMove(pEvent, xx, yy);

	// itt a teglalap
			if(me.bExternalMouseHandling)
			{
				if(me.OnMouseMoveExternal)
					me.OnMouseMoveExternal(pEvent, xx, yy)
			}
			else
			{
				if (me.m_bRubberDrawing == true)
				{
					var top = me.rubberDivTop;
					var left = me.rubberDivLeft;
					var bottom = GetEventYNew(pEvent) - GetAbsLayerTop(me.divFace)
					var right = GetEventXNew(pEvent) - GetAbsLayerLeft(me.divFace);
					var temp = 0;

					me.rubberDivBottom = bottom;
					me.rubberDivTop = top;
					me.rubberDivLeft = left;
					me.rubberDivRight = right;
					
					if (top > bottom) {temp = bottom; bottom = top;  top  = temp;}
					if (left>right)   {temp = right;  right  = left; left = temp;}
					me.rubberDiv.style.top = top + "px";
					me.rubberDiv.style.left = left + "px";
					me.rubberDiv.style.height = bottom - top - 5 + "px";
					me.rubberDiv.style.width =  right - left - 5 + "px";
				}
				else if (me.bDistanceMeasuring)
				{
					if (me.bDrawDistMeasureHappening == false)
					{
						me.DistMeter.MoveDistCursor (xx, yy);
					}
				}
				// hagyomanyos mod (ez mindig kell)
				me.OnMouseMoveFunc (pEvent);
			}
			StopEventPropagation(pEvent);
		}
		catch (e)
		{
		}
		return false;
	}

	/// private:
	this.OnMouseMoveFunc = function (pEvent)
	{
		var obj = GetEventSourceElement(pEvent);
		var xxx = GetLayerX (pEvent);
		var yyy = GetLayerY (pEvent);

		if (me.bFrameMouseDown)
		{
			// minimap frame-ben vagyunk

			var obj = GetEventSourceElement(pEvent);

			var ty1 = GetLayerTop (me.pMiniMapFrame.divFrame);
			var ty2 = GetLayerTop (me.pMiniMapFrame.divSecFrame);

			if (obj.className=="minimapframe")
			{
				xxx += GetLayerLeft (me.pMiniMapFrame.divFrame);
				yyy += GetLayerTop (me.pMiniMapFrame.divFrame);
				
			}
			else if (obj.className=="minimapsecframe")
			{
				xxx += GetLayerLeft (me.pMiniMapFrame.divSecFrame);
				yyy += GetLayerTop (me.pMiniMapFrame.divSecFrame);
			}
			
			var LT = GetAbsLayerTop (me.pMiniMapFrame.divSecFrame) - GetAbsLayerTop (me.divFace);
			var LL = GetAbsLayerLeft (me.pMiniMapFrame.divSecFrame) - GetAbsLayerLeft (me.divFace);
			
			var NewLeft = (LL + xxx - me.iFrameMouseX);
			var NewTop = (LT + yyy - me.iFrameMouseY);
			
			// ronda de nincs mas
			var border = -3; //0
			if (BrowserDetect.browser=="Firefox")
				border = 3;
			
			me.pMiniMapFrame.divSecFrame.style.left =  NewLeft+border + "px";
			me.pMiniMapFrame.divSecFrame.style.top =  NewTop+border + "px";
			me.pMiniMapFrame.divSecFrameFill.style.left =  NewLeft+border + "px";
			me.pMiniMapFrame.divSecFrameFill.style.top =  NewTop+border + "px";

			me.iFrameMouseX = xxx;
			me.iFrameMouseY = yyy;
		}
		else if  (g_TopoliszPageData.GetActiveMap() == me) 
		{
			// xx, yy : face koordinatak

			var xx = GetEventXNew(pEvent) - GetAbsLayerLeft (me.divFace);
			var yy = GetEventYNew(pEvent) - GetAbsLayerTop (me.divFace);

			me.iMousePosX = xx;
			me.iMousePosY = yy;

			me.SetMouseMoveEnd(xx, yy);


			if (me.m_bRubberDrawing == false)
			{
				if(me.bMouseDown)
				{
					if ((me.bHasMiniMap) || (me.pConnectedMainMap == null))
						me.MoveMap();
					else
					{
						me.MoveMainMapInsteadOfMiniMap ();
					}
				}
				else
				{
					// auto-scroll
					if
					(
						  ( 
							(me.iMousePosY > 0) && (me.iMousePosX > 0) && (me.iMousePosY < me.GetMapViewHeight()) && (me.iMousePosX < me.GetMapViewWidth()) 
						  )
						  &&
						  ( 
							(me.iMousePosY < me.iAutoScrollMargin) || 
							(me.iMousePosX < me.iAutoScrollMargin) ||
							(me.iMousePosY > me.GetMapViewHeight() - me.iAutoScrollMargin) || 
							(me.iMousePosX > me.GetMapViewWidth() - me.iAutoScrollMargin) 
						  )	
					)
					{
							if (me.bAutoScrolling == false)
							{
								me.AutoMoveLimit = me.AutoMoveLimitStartValue;
								window.setTimeout (me.AutoScroll, 500);
							}
					}
					  
					// poi mouse over handling
					  
					// grid koordinatak
					var xxx = GetEventXNew(pEvent) - GetAbsLayerLeft (me.pGridMain.mainGridDiv);
					var yyy = GetEventYNew(pEvent) - GetAbsLayerTop (me.pGridMain.mainGridDiv);
					  	
					/* PIN (signless marker) mouse over/out */
					var pPin = me.pMarkers.GetPinNearXY (xxx, yyy);
					if ((obj.className == "face") || (obj.className == "poiParent"))
					{						
						if ((pPin!=null) && (pPin!=me.pMouseOverPin))
						{
							me.pMouseOverPin = pPin;	
							me.pLastMouseOverPin = pPin;
														
							if (pPin.bLongMouseOver == false) // azonnali reakció
								pPin.OnLabelSignMouseOver();
							else if (me.bMouseLongOverTimingEnabled) // csak 500ms után reagál
							{																
								me.bMouseLongOverTimingEnabled = false;	
								setTimeout(me.OnMouseLongOverTimer, 500);
							}															
						}
					}
							
																								
					var evX = GetEventXNew(pEvent);
					var evY = GetEventYNew(pEvent);
					
					var limitpix = me.pMarkers.GetMouseOutDistance();
					var sqlimitpix = limitpix * limitpix;
					var idx;
					for (idx = 0; idx < me.pMarkers.arrMarkers.length; idx++)
					{
						var pM = me.pMarkers.arrMarkers[idx];						
						if (pM != null)
						{						
							var cond1 = false;
							
							// cond1: mouse out sign ?
							
							// - signless
							if (pM.IsSignless())
							{
								if (((pM.iPixX - xxx) * (pM.iPixX - xxx)) + ((pM.iPixY - yyy) * (pM.iPixY - yyy)) > sqlimitpix)
								{
									cond1 = true;
									if (pM == me.pMouseOverPin)
										me.pMouseOverPin = null;
								}
							}
							else
							{
								var w = pM.GetProperty("pin_img_width");
								var h = pM.GetProperty("pin_img_height");
								var rx = pM.GetProperty("pin_img_refx");
								var ry = pM.GetProperty("pin_img_refy");								
								var mar = 10;						
								if ((xxx > pM.iPixX + w - rx + mar) || (xxx < pM.iPixX - rx - mar) || (yyy > pM.iPixY + h - ry + mar) || (yyy < pM.iPixY - ry - mar))
								{
									cond1 = true;
									if (pM == me.pMouseOverPin)
										me.pMouseOverPin = null;
								}								
							}
							
							if (pM.IsLabelBoxVisible())
							{								
								var cond2 = false;																
								if (pM.pLabel != null)
								{
									var iMargin = 5;
									var l = GetAbsLayerLeft(pM.pLabel.divLabelBox2) - iMargin;
									var r = GetAbsLayerRight(pM.pLabel.divLabelBox2) + iMargin;
									var t = GetAbsLayerTop(pM.pLabel.divLabelBox2)  - iMargin;
									var b = GetAbsLayerBottom(pM.pLabel.divLabelBox2)  + iMargin;	
																		
									if ((evX < l) || (evX > r) || (evY < t) || (evY > b))
									{										
										cond2 = true;
									}																		
								}								
								if (cond1 && cond2)
								{
									me.OnLabelSignMouseOut (pM);											
								}
							}														
						}
					}										
				}
			}
		    me.SetMouseMoveStart(xx, yy);					
		}
	}
	
	this.OnMouseLongOverTimer = function ()
	{	
		if (me.pMouseOverPin != null)
			me.pMouseOverPin.OnLabelSignMouseOver();			
		me.bMouseLongOverTimingEnabled = true;	
	}
	
	/// private:
	this.AutoScroll = function ()
	{
		me.AutoScrollDY = 0;
		me.AutoScrollDX = 0;

		if (me.bAutoScrollEnabled && me.bMouseOverMapView)
		{
			if 
			      (
			          ( 
			            (me.iMousePosY > 0) && (me.iMousePosX > 0) && (me.iMousePosY < me.GetMapViewHeight()) && (me.iMousePosX < me.GetMapViewWidth()) 
			          )
			          &&
			          ( 
			            (me.iMousePosY < me.iAutoScrollMargin) || 
			            (me.iMousePosX < me.iAutoScrollMargin) ||
			            (me.iMousePosY > me.GetMapViewHeight() - me.iAutoScrollMargin) || 
			            (me.iMousePosX > me.GetMapViewWidth() - me.iAutoScrollMargin) 
			          )
			      )
			{
				var VY = me.iMousePosY - me.GetMapViewHeight() / 2;
				var VX = me.iMousePosX - me.GetMapViewWidth() / 2;
				var L = Math.sqrt(VY * VY + VX * VX);

				VY = VY / L * 6;
				VX = VX / L * 6;

				if  ((me.iMousePosY < me.iAutoScrollMargin/2)
				|| (me.iMousePosX < me.iAutoScrollMargin/2)
				|| (me.iMousePosY > me.GetMapViewHeight() - me.iAutoScrollMargin/2)
				|| (me.iMousePosX > me.GetMapViewWidth() - me.iAutoScrollMargin/2))
				{
					VY *= 2;
					VX *= 2;
				}

				me.AutoScrollDX = -VX;
				me.AutoScrollDY = -VY;
			}

			if (((me.AutoScrollDY != 0) || (me.AutoScrollDX != 0)) && (me.AutoMoveLimit > 0))
			{
				me.pGridMain.sMoveCallbackOn = "true";
				me.AutoMoveLimit -= Math.sqrt(me.AutoScrollDY * me.AutoScrollDY + Math.round(me.AutoScrollDX) * Math.round(me.AutoScrollDX));
				me.MoveMapYX(Math.round(me.AutoScrollDY), Math.round(me.AutoScrollDX));
				me.bAutoScrolling = true;
				window.setTimeout (me.AutoScroll, 100);
			}
			// autoscroll befejezodott, mert a savbol elmozditotta az egeret
			// a fho a map belseje fele
			else if (me.bAutoScrolling)
			{
				me.bAutoScrolling = false;
				me.UserMovingEnded ();

			}
		}
	}

	/// private:
	this.OnMouseOver = function (pEvent)
	{
		try
		{
			var pActMap = g_TopoliszPageData.GetActiveMap ();
			if (pActMap == null)
				g_TopoliszPageData.SetActiveMap (me);
			else if (pActMap.bMouseDown == false) // nem dragolt az aktiv
				g_TopoliszPageData.SetActiveMap (me);
		}
		catch (e)
		{
		}
	}


	/// private:
	this.OnMouseOut = function(pEvent)
	{	    
        try
        {
                
	            if ((pEvent == undefined) || (pEvent == null))
		            pEvent = window.event;    		        
                var relTarg = pEvent.relatedTarget || pEvent.toElement;

                if (relTarg.className != "face" && 
                    relTarg.className != "poiParent" && 
                    relTarg.className != "anim_main" &&
                    relTarg.className != "anim_br" &&
                    relTarg.className != "anim_bl" &&
                    relTarg.className != "anim_tr" &&
                    relTarg.className != "anim_tl"
                    )
                {
					var pActMap =  g_TopoliszPageData.GetActiveMap ();
					if ((pActMap == me) && (pActMap.bMouseDown == false))
					{
						g_TopoliszPageData.SetActiveMap (null);
						me.bMouseOverMapView = false;

						var AutoScrollFinishedByMouseOut = false;
						if (me.bAutoScrolling)
						{
							me.bAutoScrolling = false;
							AutoScrollFinishedByMouseOut = true;
						}

						// ha az egerfelengedes pillanataban mar a szerver valasza megjott 
						// (mar ha volt keres feleje)
						// + volt mozgatas

						if ((me.bUserMovedByMouse == true) || (AutoScrollFinishedByMouseOut == true))
						{
							if (me.pGridMain.AllowMove == true) 
							{
								me.bUserMovedByMouse = false;
								me.UserMovingEnded ();
							}
							else
							{
								me.bUserMovedEndedFlag = true;
							}
						}
					}
				}
		}
		catch (e)
		{
		}
	}

	/// protected:
	/// Visszadja azt a div-et, amiben a terkep van
	this.GetMapDiv = function()
	{
		return me.divMap;
	}

	/// private:
	this.SetMouseEvents = function ()
	{
	    if (me.bMouseEventsAreSet == false)
	    {
		    me.divFace.onclick = me.OnMapClick;
		    me.divFace.ondblclick = me.OnMapDblClick;
		    me.divFace.onmousedown = me.OnMouseDown;
		    //me.divFace.onmouseup = me.OnMouseUp;
		    //me.divFace.onmousemove = me.OnMouseMove;
		    
		    // MOUSE MOVE
		    
			if (window.addEventListener)
			/** Mozilla */
			{
				//me.divFace.addEventListener ('mousemove',me.OnMouseMove,false);			
				document.addEventListener ('mousemove',me.OnMouseMoveOnDocument,false);			
			}
			else
			/** IE/Opera */
			{
				//me.divFace.attachEvent ('onmousemove',me.OnMouseMove,false);		
				document.attachEvent ('onmousemove',me.OnMouseMoveOnDocument,false);		
			}		    

            // MOUSE UP

			if (window.addEventListener)
			/** Mozilla */
			{
				//me.divFace.addEventListener ('mousemove',me.OnMouseMove,false);			
				window.addEventListener ('mouseup',me.OnMouseUpOnDocument,false);			
			}
			else
			/** IE/Opera */
			{
				//me.divFace.attachEvent ('onmousemove',me.OnMouseMove,false);		
				document.attachEvent ('onmouseup',me.OnMouseUpOnDocument,false);		
			}		    
		    
		    me.divFace.onmouseout = me.OnMouseOut;
		    me.divFace.onmouseover = me.OnMouseOver;	
		    me.bMouseEventsAreSet = true;
		}
	}
	

	/// protected:
	/// Itt kell megadni azt a div-et, ahova a terkepet kell rajzolni
	this.SetMapDiv = function(divMap)
	{
		me.divMap = divMap;

		if (divMap.className == "")
			divMap.className = "map";

		divMap.style.overflow = "hidden";
		var clipLeft = GetLayerLeft(divMap);
		var clipTop  = GetLayerTop(divMap);
		var clipRight = clipLeft + GetLayerWidth(divMap);
		var clipBottom = clipTop + GetLayerHeight(divMap);
		//divMap.style.clip = 'rect('+ clipTop +'px,'+ clipRight +'px,'+ clipBottom +'px,'+ clipLeft +'px)';
		this.iMapViewWidth = clipRight - clipLeft - me.iMapDivBorderWidth;
		this.iMapViewHeight = clipBottom - clipTop - me.iMapDivBorderWidth;

		me.divFace = NewTag("div", me.divMap);
		me.divFace.id = divMap.id + "face";
		me.divFace.className = "face";
		me.divFace.style.width = Math.max(0,(GetLayerWidth(divMap) - 2 * me.iMapDivBorderWidth)) + "px";
		me.divFace.style.height = Math.max(0,(GetLayerHeight(divMap) - 2 * me.iMapDivBorderWidth))  + "px";
		me.divFace.style.cursor = "pointer";

		me.divPrintPreview = NewTag('div', me.divFace);
		me.divPrintPreview.className = "printPreview";
		me.divPrintPreview.style.width = me.iMapWidth;
		me.divPrintPreview.style.height = me.iMapHeight;

		me.divPoiParent = NewTag('div', me.divFace);
		me.divPoiParent.className = "poiParent";
		me.divPoiParent.style.width = me.iMapWidth;
		me.divPoiParent.style.height = me.iMapHeight;
		me.divPoiParent.style.top = "0px";
		me.divPoiParent.style.left = "0px";

		me.SetMouseEvents ();
	}

	this.GetMapPinLabelTopMargin = function ()
	{
		var margin = 0;
		if (me.strRole == "mainmap")
		{
			var divButtonPalette = GetBlock ("idMapButtonPalette");
			if (divButtonPalette != null)
				margin = GetLayerBottom (divButtonPalette);
		}		
		
		return margin;
	}

	/// private:
	this.CreateFaceBorder = function ()
	{
		var BorderOpacity = 10;

		setAlpha(".faceborder");

		me.divFaceBorderTop = NewTag("div", me.divMap);
		me.divFaceBorderTop.className = "faceborder";
		me.divFaceBorderTop.style.width = Math.max(0, GetLayerWidth (divMap) - 2 * me.iMapDivBorderWidth) + "px";
		me.divFaceBorderTop.style.height = me.iAutoScrollMargin + "px";
		me.divFaceBorderTop.style.top = 0 + "px";
		SetOpac (me.divFaceBorderTop, BorderOpacity);
		me.divFaceBorderTop.style.visibility = "hidden";

		me.imgFaceBorderTop = NewTag("img", me.divMap);
		me.imgFaceBorderTop.className = "faceborder";
		me.imgFaceBorderTop.style.left = Math.max(0, (GetLayerWidth (divMap) - 2 * me.iMapDivBorderWidth - 9)/2) + "px";
		me.imgFaceBorderTop.style.top = 0 + "px";
		me.imgFaceBorderTop.style.visibility = "hidden";
		SetImage(me.imgFaceBorderTop, GetAbsUrl('images/mapctrl/faceborder_top.png'), 9, 9, "");

		me.divFaceBorderBottom = NewTag("div", me.divMap);
		me.divFaceBorderBottom.className = "faceborder";
		me.divFaceBorderBottom.style.width = Math.max(0, GetLayerWidth (divMap) - 2 * me.iMapDivBorderWidth) + "px";
		me.divFaceBorderBottom.style.height = me.iAutoScrollMargin + "px";
		me.divFaceBorderBottom.style.bottom = 0 + "px";
		SetOpac (me.divFaceBorderBottom, BorderOpacity);
		me.divFaceBorderBottom.style.visibility = "hidden";

		me.imgFaceBorderBottom = NewTag("img", me.divMap);
		me.imgFaceBorderBottom.className = "faceborder";
		me.imgFaceBorderBottom.style.left = Math.max(0, (GetLayerWidth (divMap) - 2 * me.iMapDivBorderWidth - 9)/2) + "px";
		me.imgFaceBorderBottom.style.bottom = 0 + "px";
		me.imgFaceBorderBottom.style.visibility = "hidden";
		SetImage(me.imgFaceBorderBottom, GetAbsUrl('images/mapctrl/faceborder_bottom.png'), 9, 9, "");

		me.divFaceBorderLeft = NewTag("div", me.divMap);
		me.divFaceBorderLeft.className = "faceborder";
		me.divFaceBorderLeft.style.width = me.iAutoScrollMargin + "px";
		me.divFaceBorderLeft.style.height = Math.max(0, GetLayerHeight (divMap) - 2 * me.iMapDivBorderWidth - 2 * me.iAutoScrollMargin) + "px";
		me.divFaceBorderLeft.style.top = me.iAutoScrollMargin + "px";
		me.divFaceBorderLeft.style.left = 0 + "px";
		SetOpac (me.divFaceBorderLeft, BorderOpacity);
		me.divFaceBorderLeft.style.visibility = "hidden";

		me.imgFaceBorderLeft = NewTag("img", me.divMap);
		me.imgFaceBorderLeft.className = "faceborder";
		me.imgFaceBorderLeft.style.left = 0 + "px";
		me.imgFaceBorderLeft.style.top = Math.max(0, (GetLayerHeight (divMap) - 2 * me.iMapDivBorderWidth - 2 * me.iAutoScrollMargin + 9) / 2)+ "px";
		me.imgFaceBorderLeft.style.visibility = "hidden";
		SetImage(me.imgFaceBorderLeft, GetAbsUrl('images/mapctrl/faceborder_left.png'), 9, 9, "");

		me.divFaceBorderRight = NewTag("div", me.divMap);
		me.divFaceBorderRight.className = "faceborder";
		me.divFaceBorderRight.style.width = me.iAutoScrollMargin + "px";

		me.divFaceBorderRight.style.height = Math.max(0, GetLayerHeight (divMap) - 2 * me.iMapDivBorderWidth  - 2 * me.iAutoScrollMargin) + "px";
		me.divFaceBorderRight.style.top = me.iAutoScrollMargin + "px";
		me.divFaceBorderRight.style.right = 0 + "px";
		me.divFaceBorderRight.style.visibility = "hidden";
		SetOpac (me.divFaceBorderRight, BorderOpacity);

		me.imgFaceBorderRight = NewTag("img", me.divMap);
		me.imgFaceBorderRight.className = "faceborder";
		me.imgFaceBorderRight.style.right = 0 + "px";
		me.imgFaceBorderRight.style.top = Math.max(0, (GetLayerHeight (divMap) - 2 * me.iMapDivBorderWidth - 2 * me.iAutoScrollMargin + 9) / 2)+ "px";
		me.imgFaceBorderRight.style.visibility = "hidden";
		SetImage(me.imgFaceBorderRight, GetAbsUrl('images/mapctrl/faceborder_right.png'), 9, 9, "");
	}
	
	/// protected:
	/// Visszadja azt a div-et, amire a felhasznalo sajat objektumai (pl poi) kerulnek.
	this.GetPoiParentDiv = function()
	{
		return me.divPoiParent;
	}

	/// private:
	this.RearrangeFaceBorder = function ()
	{
		if(me.divFaceBorderTop)
		{
			me.divFaceBorderTop.style.width = Math.max(0, GetLayerWidth (divMap) - 2 * me.iMapDivBorderWidth) + "px";
			me.divFaceBorderTop.style.height = me.iAutoScrollMargin + "px";
			me.divFaceBorderTop.style.top = 0 + "px";

			me.imgFaceBorderTop.style.left = Math.max(0, (GetLayerWidth (divMap) - 2 * me.iMapDivBorderWidth - 9)/2) + "px";

			me.divFaceBorderBottom.style.width = Math.max(0, GetLayerWidth (divMap) - 2 * me.iMapDivBorderWidth) + "px";
			me.divFaceBorderBottom.style.height = me.iAutoScrollMargin + "px";
			me.divFaceBorderBottom.style.bottom = 0 + "px";

			me.imgFaceBorderBottom.style.left = Math.max(0, (GetLayerWidth (divMap) - 2 * me.iMapDivBorderWidth - 9)/2) + "px";

			me.divFaceBorderLeft.style.width = me.iAutoScrollMargin + "px";
			me.divFaceBorderLeft.style.height = Math.max(0, GetLayerHeight (divMap) - 2 * me.iMapDivBorderWidth - 2 * me.iAutoScrollMargin) + "px";
			me.divFaceBorderLeft.style.top = me.iAutoScrollMargin + "px";
			me.divFaceBorderLeft.style.left = 0 + "px";

			me.imgFaceBorderLeft.style.top = Math.max(0, (GetLayerHeight (divMap) - 2 * me.iMapDivBorderWidth - 2 * me.iAutoScrollMargin + 9) / 2)+ "px";

			me.divFaceBorderRight.style.width = me.iAutoScrollMargin + "px";
			me.divFaceBorderRight.style.height = Math.max(0, GetLayerHeight (divMap) - 2 * me.iMapDivBorderWidth  - 2 * me.iAutoScrollMargin) + "px";
			me.divFaceBorderRight.style.top = me.iAutoScrollMargin + "px";
			me.divFaceBorderRight.style.right = 0 + "px";

			me.imgFaceBorderRight.style.top = Math.max(0, (GetLayerHeight (divMap) - 2 * me.iMapDivBorderWidth - 2 * me.iAutoScrollMargin + 9) / 2)+ "px";
		}
	}

	/// private:
	this.SetVisibilityBorders  = function (bVisibilityHorizontal, bVisibilityVertical)
	{
		if(me.iAutoScrollMargin <= 0)
		{
			bVisibilityHorizontal = false;
			bVisibilityVertical = false;
		}
		if(!me.bDistanceMeasuring)
		{
			bVisibilityHorizontal = false;
			bVisibilityVertical = false;
		}
		if ((bVisibilityHorizontal) && (bVisibilityVertical))
		{
			if(!me.divFacBorderLeft)
				me.CreateFaceBorder();

			me.divFaceBorderLeft.style.top = me.iAutoScrollMargin  + "px";
			me.divFaceBorderLeft.style.height = Math.max(0, GetLayerHeight (me.divMap) - 2 * me.iMapDivBorderWidth - 2 * me.iAutoScrollMargin) + "px";
			me.divFaceBorderRight.style.top = me.iAutoScrollMargin  + "px";
			me.divFaceBorderRight.style.height = Math.max(0, GetLayerHeight (me.divMap) - 2 * me.iMapDivBorderWidth - 2 * me.iAutoScrollMargin) + "px";

			me.divFaceBorderTop.style.visibility = "visible";
			me.divFaceBorderBottom.style.visibility = "visible";
			me.divFaceBorderLeft.style.visibility = "visible";
			me.divFaceBorderRight.style.visibility = "visible";

			me.imgFaceBorderTop.style.visibility = "visible";
			me.imgFaceBorderBottom.style.visibility = "visible";
			me.imgFaceBorderLeft.style.visibility = "visible";
			me.imgFaceBorderRight.style.visibility = "visible";

		}
		else if ((!bVisibilityHorizontal) && (!bVisibilityVertical))
		{
			if(me.divFaceBorderBottom)
			{
				me.divFaceBorderTop.style.visibility = "hidden";
				me.divFaceBorderBottom.style.visibility = "hidden";
				me.divFaceBorderLeft.style.visibility = "hidden";
				me.divFaceBorderRight.style.visibility = "hidden";
				me.imgFaceBorderTop.style.visibility = "hidden";
				me.imgFaceBorderBottom.style.visibility = "hidden";
				me.imgFaceBorderLeft.style.visibility = "hidden";
				me.imgFaceBorderRight.style.visibility = "hidden";
			}
		}
		else if ((bVisibilityHorizontal) && (!bVisibilityVertical))
		{
			if(!me.divFaceBorderLeft)
				me.CreateFaceBorder();

			me.divFaceBorderLeft.style.top = "0px";	
			me.divFaceBorderLeft.style.height = Math.max(0, GetLayerHeight (me.divMap) - 2 * me.iMapDivBorderWidth) + "px";
			me.divFaceBorderRight.style.top = "0px";	
			me.divFaceBorderRight.style.height = Math.max(0, GetLayerHeight (me.divMap) - 2 * me.iMapDivBorderWidth) + "px";

			me.divFaceBorderTop.style.visibility = "hidden";
			me.divFaceBorderBottom.style.visibility = "hidden";
			me.divFaceBorderLeft.style.visibility = "visible";
			me.divFaceBorderRight.style.visibility = "visible";

			me.imgFaceBorderTop.style.visibility = "hidden";
			me.imgFaceBorderBottom.style.visibility = "hidden";
			me.imgFaceBorderLeft.style.visibility = "visible";
			me.imgFaceBorderRight.style.visibility = "visible";
		}
		else if ((!bVisibilityHorizontal) && (bVisibilityVertical))
		{
			if(!me.divFaceBorderTop)
				me.CreateFaceBorder();

			me.divFaceBorderTop.style.visibility = "visible";
			me.divFaceBorderBottom.style.visibility = "visible";
			me.divFaceBorderLeft.style.visibility = "hidden";
			me.divFaceBorderRight.style.visibility = "hidden";

			me.imgFaceBorderTop.style.visibility = "visible";
			me.imgFaceBorderBottom.style.visibility = "visible";
			me.imgFaceBorderLeft.style.visibility = "hidden";
			me.imgFaceBorderRight.style.visibility = "hidden";
		}
				
		me.bAutoScrollEnabled = (bVisibilityHorizontal || bVisibilityVertical) ;
	}

	/// private:
	this.SetBorderThickness = function (iThickness)
	{
		me.iAutoScrollMargin = iThickness;
		if(me.divFaceBorderTop)
		{
			me.divFaceBorderTop.style.height = me.iAutoScrollMargin + "px";
			me.divFaceBorderBottom.style.height = me.iAutoScrollMargin + "px";
			me.divFaceBorderLeft.style.width = me.iAutoScrollMargin + "px";
			me.divFaceBorderRight.style.width = me.iAutoScrollMargin + "px";
			me.divFaceBorderLeft.style.top = me.iAutoScrollMargin + "px";
			me.divFaceBorderLeft.style.height = Math.max(0, GetLayerHeight (me.divMap) - 2 * me.iMapDivBorderWidth - 2 * me.iAutoScrollMargin) + "px";
			me.divFaceBorderRight.style.top = me.iAutoScrollMargin + "px";
			me.divFaceBorderRight.style.height = Math.max(0, GetLayerHeight (me.divMap) - 2 * me.iMapDivBorderWidth - 2 * me.iAutoScrollMargin) + "px";
		}
	}

	/// private:
	this.SetScrollEvents = function ()
	{
		if (me.bMainMapMode)
		{
			/** DOMMouseScroll is for mozilla. */
			if (window.addEventListener)
			{
				window.addEventListener('DOMMouseScroll', me.OnMouseWheel, false);
				window.addEventListener('mousewheel', me.OnMouseWheel, false);
			}
			else
			/** IE/Opera. */
			{
				document.attachEvent ('onmousewheel',me.OnMouseWheel,false);
			}
		}
	}
	

	/// private:
	this.SetMapToDefaultLevelAndPosition = function ()
	{
		me.ZoomMap(me.GetPixelDensityFromLevel(me.MAP_DEFAULT_LEVEL), me.GetCenterPosX(me.MAP_DEFAULT_LEVEL), me.GetCenterPosY(me.MAP_DEFAULT_LEVEL), 0, 0);
	}

	/// private:
	this.GetCenterPosX = function (iLevel)
	{
		var A = me.GetActiveWidthFromLevel (iLevel);
		var V = me.GetMapViewWidth ();
		return Math.floor((A - V) / 2);
	}

	/// private:
	this.GetCenterPosY  = function (iLevel)
	{
		var A = me.GetActiveHeightFromLevel (iLevel);
		var V = me.GetMapViewHeight ();
		return Math.floor((A - V) / 2);
	}

	/// protected:
	///Nyelv beallitas
	this.SetLang = function(strLang)
	{
		g_Babel.SetLang(strLang);
	}

	/// protected:
	/// Nyelv lekerdezese
	this.GetLang = function()
	{
		return g_Babel.GetLang();
	}

	/// private:
	this.Show = function ()
	{
		me.divMap.style.visibility="visible";
	}

	/// private:
	this.Hide = function ()
	{
		me.divMap.style.visibility="hidden";
	}
	
	/// private:
	this.GetInitialPixelDensity = function ()
	{
		// this is a main map
		if (me.bHasMiniMap)
		{
			return me.GetPixelDensityFromLevel(me.MAP_DEFAULT_LEVEL);
		/*	var iStartLevel = typeof(g_iSuggestedStartLevel) != "undefined" ? g_iSuggestedStartLevel : me.MAP_DEFAULT_LEVEL;
			if (iStartLevel == -1) iStartLevel = me.MAP_DEFAULT_LEVEL;
			return me.GetPixelDensityFromLevel(iStartLevel);*/
		}
		// this is a mini map
		else
		{
			return me.GetPixelDensityFromLevel(me.DEFAULT_MINIMAP_LEVEL);
		}
	}
	
	/// private:
	this.ZoomOut = function()
	{
		// ezzel dontjuk el, hogy eger pointer pontjara kell-e zoomolni vagy kozepre
		me.pZoomSrc = this.className;
		me.ZoomByLevel(-1);
	}

	/// private:
	this.ZoomIn = function()
	{
		// ezzel dontjuk el, hogy eger pointer pontjara kell-e zoomolni vagy kozepre
		me.pZoomSrc = this.className;
		me.ZoomByLevel(+1);
	}

	/// private:
	// + zoom in
	// - zoom out

	//  this.bZooming = false;
	//  this.iZoomingLevelChange = 0;
	this.ZoomByLevel = function (iDiffLevel)
	{
		me.iZoomingLevelChange += iDiffLevel;

		if (me.bZooming==false)
		{
			me.bZooming=true;
			window.setTimeout(me.ZoomByLevelMain,250);
		}
	}

	/// private:
	this.ZoomByLevelMain = function (bForced)
	{
		var iDiffLevel =  me.iZoomingLevelChange;
		me.iZoomingLevelChange = 0;
		me.bZooming=false;
	
		var oldLevel = me.GetLevel();
		var newLevel = oldLevel + iDiffLevel;

		if (newLevel > me.GetMaximumLevel())
			newLevel = me.GetMaximumLevel();
		if (newLevel < me.GetMinimumLevel())
			newLevel = me.GetMinimumLevel();

		if ((oldLevel != newLevel) || bForced==true)
		{
			var oldPixelDensity = me.GetPixelDensity();
			var newPixelDensity = me.GetPixelDensityFromLevel (newLevel);

			var ZoomPosX = 0;
			var ZoomPosY = 0;

			if (me.pZoomSrc == "CTopoliszMap")
			{
				ZoomPosX = me.iMousePosX;
				ZoomPosY = me.iMousePosY;
			}
			else
			{
				if (me.GetMapViewWidth() <= me.GetActiveWidth())
					ZoomPosX = me.GetMapViewWidth() / 2;
				else
					ZoomPosX = me.GetActiveWidth() / 2;

				if (me.GetMapViewHeight() <= me.GetActiveHeight())
					ZoomPosY = me.GetMapViewHeight() / 2;
				else
					ZoomPosY = me.GetActiveHeight() / 2;
			}

			var beforeAbsY = me.pGridMain.GetViewAbsoluteTop();
			var beforeAbsX = me.pGridMain.GetViewAbsoluteLeft();
			var afterAbsY = oldPixelDensity/newPixelDensity * (beforeAbsY+ZoomPosY)-ZoomPosY;
			var afterAbsX = oldPixelDensity/newPixelDensity * (beforeAbsX+ZoomPosX)-ZoomPosX;

			var PreviewZoomPosX = ZoomPosX;
			var PreviewZoomPosY = ZoomPosY;

			if (me.GetMapViewWidth() > me.GetActiveWidthFromLevel(newLevel))
				PreviewZoomPosX = me.GetMapViewWidth () / 2;
			if (me.GetMapViewHeight() > me.GetActiveHeightFromLevel(newLevel))
				PreviewZoomPosY = me.GetMapViewHeight () / 2;

			if (me.bPreviewIsOn)
				me.pGridMain.ZoomPreview (oldPixelDensity/newPixelDensity, PreviewZoomPosX, PreviewZoomPosY, 0, 0);

			me.ZoomMap(newPixelDensity, afterAbsX, afterAbsY, ZoomPosX, ZoomPosY);
		}
	}

	/// private:
	// A level-nek megfeleloen beallitja a csuszkat
	this.SetSlider = function ()
	{
		if(me.pMapPalette)
		{
			var Level = me.GetLevel() - me.GetMinimumLevel();
			var LevelNumber = me.GetLevelNumber();
			var value = Level / (LevelNumber-1);
			if (me.pMapPalette.pSlider)
				me.pMapPalette.pSlider.setPercentY (1-value);
		}
	}

	/// private:
	this.GetPixelDensity = function()
	{
		return me.pixeldensity;
	}

	/// private:
	// callback
	this.ZoomModifiedBySlider = function (sliderPercent)
	{
		var oldPixelDensity = me.GetPixelDensity();
		var newLevel = Math.round((1-sliderPercent) * (me.GetLevelNumber() - 1)) + me.GetMinimumLevel();
		var newPixelDensity = me.GetPixelDensityFromLevel (newLevel);
		var oldLevel = me.GetLevel();

		var ZoomPosX = 0;
		var ZoomPosY = 0;

		ZoomPosX = me.GetMapViewWidth() / 2;
		ZoomPosY = me.GetMapViewHeight() / 2;

		if (oldLevel != newLevel)
		{
			var beforeAbsY = me.pGridMain.GetViewAbsoluteTop();
			var beforeAbsX = me.pGridMain.GetViewAbsoluteLeft();
			var afterAbsY = oldPixelDensity/newPixelDensity * (beforeAbsY+ZoomPosY) - ZoomPosY;
			var afterAbsX = oldPixelDensity/newPixelDensity * (beforeAbsX+ZoomPosX) - ZoomPosX;

			if (me.bPreviewIsOn)
				me.pGridMain.ZoomPreview (oldPixelDensity/newPixelDensity, ZoomPosX, ZoomPosY,0, 0);
				
			me.ZoomMap(newPixelDensity, afterAbsX, afterAbsY, ZoomPosX, ZoomPosY);
		}
	}

	// ==================================================================================================
	// ==================================================================================================

	// Zoomolas
	// --------

	// PixelDensity : a zoomolas utani Meter/Pixel arany
	// PosX, PosY : a zoomolas utan a bal/felso sarok abszolut koordinatai a teljes logikai terkep k.r-ben
	// ZoomPosX, ZoomPosY : a zoomolas kozeppontja, a zoomolas elotti view k.r-ben;
	//                      ez a parameter csak a zoomolas kozeppontjanak (animacioval, keppel torteno) megjelolesehez
	//                      kell. Ha erre nincs szukseg, legyen (0;0).

	// ZoomMap: Zoom-ol. StartZoom - EndZoom (callback) parossal mukodik.

	// --------------------------------------------------------------------------------------------------

	/// private:
	this.ZoomMap = function (PixelDensity, PosX, PosY, ZoomPosX, ZoomPosY)
	{
		if (PixelDensity>me.GetMaxPixelDensity()) PixelDensity=me.GetMaxPixelDensity();
		if (PixelDensity<me.GetMinPixelDensity()) PixelDensity=me.GetMinPixelDensity();

		me.StartZoom (PixelDensity, PosX, PosY, ZoomPosX, ZoomPosY);
	}
	// --------------------------------------------------------------------------------------------------

	/// private:
	this.ZoomMiniMapSync = function (PixelDensity, ZoomPosX, ZoomPosY, bUsePreview)	
	{
		if (me.bMiniMapVisible)
		{
			var mainMapLevel = me.GetLevelFromPixelDensity (PixelDensity);
			var levelDiff = me.DIFF_MAP_LEVELS;
			var miniMapLevel = mainMapLevel - levelDiff;
			if (miniMapLevel < 0) miniMapLevel = 0; //xxx 0-kene csak a gyartott terkep nem tuti
			/*if (miniMapLevel <= 0) miniMapLevel = 1;*/

			var mainMapPixelDensity = PixelDensity;
			var miniMapPixelDensity = me.GetPixelDensityFromLevel (miniMapLevel);

			var ratio = mainMapPixelDensity / miniMapPixelDensity;

			// a minimap kozeppont tartoan koveti a mainmap-ot

			var iCol = (me.pGridMain.GetViewAbsoluteLeft() + me.GetMapViewWidth () / 2) * ratio - me.pConnectedMiniMap.GetMapViewWidth() / 2;
			var iRow = (me.pGridMain.GetViewAbsoluteTop() + me.GetMapViewHeight () / 2) * ratio - me.pConnectedMiniMap.GetMapViewHeight() / 2;

			var MiniPosX = iCol;
			var MiniPosY = iRow;

			if ((me.bMiniMapVisible) && (bUsePreview))
			{
				var FrameTop = me.pConnectedMiniMap.pMiniMapFrame.GetFrameTop();
				var FrameLeft = me.pConnectedMiniMap.pMiniMapFrame.GetFrameLeft();
				var PreViewX = ZoomPosX * ratio + FrameTop + 3;
				var PreViewY = ZoomPosY * ratio + FrameLeft + 3;
				me.pConnectedMiniMap.pGridMain.ZoomPreview (me.pConnectedMiniMap.GetPixelDensity()/miniMapPixelDensity, PreViewX, PreViewY, 0, 0);
			}
			me.pConnectedMiniMap.ZoomMap (miniMapPixelDensity, MiniPosX, MiniPosY, 0, 0);
		}
	}

	// --------------------------------------------------------------------------------------------------
	/// private:
	this.StartZoom = function (PixelDensity, PosX, PosY, ZoomPosX, ZoomPosY)
	{		
		var iNewLevel = me.GetLevelFromPixelDensity (PixelDensity);		
		var bRasterZoom = (me.GetMaximumRasterLevel() > iNewLevel) ? true : false;
			      
		var types = ["start","through","stop"];
		me.HidePinLabelsMulti(types);
		me.HidePois ();
		me.HidePrintPreview();
		me.HideRoute ();
		me.HideDistMeasure();

		me.pGridMain.SetMainGridImage("", 100 );
		me.pGridMain.SetMainGridImageSec("", 100 );

		if(me.DistMeter)
		{
			me.DistMeter.ClearRubberLine ();
			me.DistMeter.ClearCursors ();
		}
		
		var isIn = true;
		if (PixelDensity > me.pixeldensity) isIn = false;

		if ((ZoomPosX != 0) && (ZoomPosY != 0))
			me.ShowZoomAnimation (ZoomPosY, ZoomPosX, isIn);

		if (me.GetActiveWidthFromLevel(iNewLevel) < me.GetMapViewWidth())
			PosX = me.GetCenterPosX(iNewLevel);
		if (me.GetActiveHeightFromLevel(iNewLevel) < me.GetMapViewHeight())
			PosY = me.GetCenterPosY(iNewLevel);

		var iNewTop = me.pGridMain.GetTopFromAbsCoordY (PosY);
		var iNewLeft = me.pGridMain.GetLeftFromAbsCoordX (PosX);
		var iGridWidth = me.pGridMain.GetWidth ();
		var iGridHeight = me.pGridMain.GetHeight ();

		me.ArgZoom_ZoomPosX = ZoomPosX;
		me.ArgZoom_ZoomPosY = ZoomPosY;

		var iViewDeltaX = me.GetMapViewWidth ();
		var iViewDeltaY = me.GetMapViewHeight ();
		var iNewViewOffsetY = me.pGridMain.GetMapViewVectorYFromAbsCoordY(PosY); // zoom utani view offset
		var iNewViewOffsetX = me.pGridMain.GetMapViewVectorXFromAbsCoordX(PosX); // zoom utami view offset

		var Params =  'iLevel=' + iNewLevel;
			Params += '&iMinRow=' + iNewTop;
			Params += '&iMinCol=' + iNewLeft;
			Params += '&iMaxRow=' + (iNewTop+iGridHeight-1);
			Params += '&iMaxCol=' + (iNewLeft+iGridWidth-1);
			Params += '&iViewOffsetX=' + (iNewViewOffsetX);
			Params += '&iViewOffsetY=' + (iNewViewOffsetY);
			Params += '&iViewDeltaX=' + (iViewDeltaX);
			Params += '&iViewDeltaY=' + (iViewDeltaY);

		me.bZoomingHappens = true;
		me.bZoomCalled = true;
		me.NoSessionServer.CallFunction("DrawRasterMap", Params, 0, me.EndZoomMain);
	}
		
	// --------------------------------------------------------------------------------------------------
	/// private:
	// tisztan szervertol jott valasz alapjan
	this.EndZoomMain = function (serverResponse, clientParam, iCommandID)
	{
		me.bZoomingHappens = false;
		if(!serverResponse)
			return;
								
		me.m_bRasterLevel = (serverResponse.arrUrls.length != 0);
		me.SetPalingGridImage();
		
		if (!me.m_bRasterLevel)
		{
			me.iMainGridImageOpacity = 100;
		}

		if (me.pConnectedMiniMap)
		{	                
			if (!me.pConnectedMiniMap.m_bRasterLevel)		
			{		
				me.pConnectedMiniMap.iMainGridImageOpacity = 100;					
			}
		}
						
		me.ShowMapCaption(serverResponse.strCaption);		
		me.pLastStateFromServer = serverResponse;
		me.iMovingSinceLastServerStateX = 0;
		me.iMovingSinceLastServerStateY = 0;

		me.pixeldensity = me.GetPixelDensityFromLevel(serverResponse.iLevel);
		me.iMapWidth = me.GetMapCols () * me.GetMapGridItemWidth ();
		me.iMapHeight = me.GetMapRows () * me.GetMapGridItemHeight ();
		me.pGridMain.ShowMainGridImage ();
		me.pGridMain.LoadLevel2 (serverResponse);
		me.SetSlider ();

		// Nem engedjuk meg a mozgatast, ahol a terkep keskenyebb a viewernel.

		me.SetMovingRights ();

		// set MiniMap

		if (me.bMainMapMode)
		{
			me.ZoomMiniMapSync (me.pixeldensity, me.ArgZoom_ZoomPosX, me.ArgZoom_ZoomPosY, true);
		}

		if (me.pMiniMapFrame)
			me.pMiniMapFrame.ReArrange ();

		me.RearrangeRatioMeter();
		me.OnStateChanged (serverResponse, 0, 0);			
		me.DrawRoute();
		me.DrawDistMeasure();
		

        me.RearrangePois ();
        me.ShowPois ();
        me.SetNormalCursor ();
	}

	// --------------------------------------------------------------------------------------------------  
	
	this.SetPalingGridImage = function (bPaleMapGridImage)
	{
		if (bPaleMapGridImage != undefined)
			me.m_bPaleMapGridImage = bPaleMapGridImage;
			
		if (me.m_bPaleMapGridImage && me.m_bRasterLevel)
			me.iMainGridImageOpacity = 50;	
		else
			me.iMainGridImageOpacity = 100;	
	}
		
	/// private:
	this.SetMovingRights = function ()
	{
		if (me.GetActiveWidth() < me.GetMapViewWidth())
		{
			me.pGridMain.bCanMoveX = false;
			PosX = 0;
		}
		else
		{
			me.pGridMain.bCanMoveX = true;
		}

		if (me.GetActiveHeight() < me.GetMapViewHeight())
		{
			me.pGridMain.bCanMoveY = false;
			PosY = 0;
		}
		else
		{
			me.pGridMain.bCanMoveY = true;
		}

		me.SetVisibilityBorders (me.pGridMain.bCanMoveX, me.pGridMain.bCanMoveY);
	}

	/// private:
	this.GetLevelNumber = function ()
	{
		return me.GetMaximumLevel () - me.GetMinimumLevel () + 1;
	}

	/// private:
	this.GetMinimumLevel = function ()
	{
		if (me.bHasMiniMap)
			return me.MAP_MINIMUM_LEVEL;
		else
			return 0;
	}

	/// private:
	this.GetMaximumLevelByServer = function ()
	{
    try
    {
	    return g_RasterMapInfo != null ? g_RasterMapInfo.iLevels - 1 : 0;
		}
		catch (e)
		{
	    return 0;
		}
	}

	/// private:
	this.GetMaximumLevel = function ()
	{
		if ( (me.MAP_MAXIMUM_LEVEL > -1) && (me.MAP_MAXIMUM_LEVEL <= me.GetMaximumLevelByServer()/*A + me.GetLevelExtension()*/) )
			return me.MAP_MAXIMUM_LEVEL;
		else
			return me.GetMaximumLevelByServer()/*A + me.GetLevelExtension()*/;
	}
	
	this.GetMaximumRasterLevel = function ()
	{
		if ( (me.MAP_MAXIMUM_LEVEL > -1) && (me.MAP_MAXIMUM_LEVEL <= me.GetMaximumLevelByServer()) )
			return me.MAP_MAXIMUM_LEVEL;
		else
			return me.GetMaximumLevelByServer();	
	}
	
	/// private:
	this.GetLevelFromPixelDensity = function (PixelDensity)
	{
        try 
        {
			var minLevel = me.GetMinimumLevel ();
			var maxLevel = me.GetMaximumLevel ();

			if(m_arrLevelInfo != null)
			{
				for (i = minLevel; i < maxLevel + 1; i++)
				{
					if (m_arrLevelInfo[i] == PixelDensity)
						return i;
				}
				return maxLevel;
			}
		}
		catch (e)
		{
		}
		
		return 0;
	}

	// private:
	this.GetLevelFromPixelDensityNonExact = function (PixelDensity)
	{
    try 
    {
			var minLevel = me.GetMinimumLevel ();
			var maxLevel = me.GetMaximumLevel ();

			if(m_arrLevelInfo != null)
			{
				for (i = minLevel; i < maxLevel + 1; i++)
				{					
					if (m_arrLevelInfo[i] < PixelDensity)
						return i;
				}
				return maxLevel;
			}
		}
		catch (e)
		{
		}
		
		return 0;
	}
	

	/// private:
	this.GetLevel = function ()
	{
		return me.GetLevelFromPixelDensity(me.pixeldensity);
	}

	/// private:
	this.GetMaxPixelDensity = function ()
	{
		return m_arrLevelInfo != null ? m_arrLevelInfo[me.GetMinimumLevel()] : 0;
	}

	/// private:
	this.GetMinPixelDensity = function ()
	{
		return m_arrLevelInfo != null ? m_arrLevelInfo[me.GetMaximumLevel()] : 0;
	}

	/// private:
	this.GetPixelDensityFromLevel = function (Level)
	{
    try 
    {
	    return m_arrLevelInfo != null ? m_arrLevelInfo[Level] : 0;
		}
		catch (e)
		{
	    return 0;
		}
	}

	/// private:
	this.GetMapColsFromLevel = function (Level)
	{
	    if (g_RasterMapInfo.iLevels > Level)
		    return g_RasterMapInfo.arrLevels[Level].iCols;
		return 0;
	}

	/// private:
	this.GetMapRowsFromLevel = function (Level)
	{
	    if (g_RasterMapInfo.iLevels > Level)
		    return g_RasterMapInfo.arrLevels[Level].iRows;
		return 0;
	}

	/// private:
	this.GetMapCols = function ()
	{
	    return g_RasterMapInfo != null ? g_RasterMapInfo.arrLevels[me.GetLevel()].iCols : 0;
	}

	/// private:
	this.GetMapRows = function ()
	{
	    return g_RasterMapInfo != null ? g_RasterMapInfo.arrLevels[me.GetLevel()].iRows : 0;
	}

	/// private:
	this.GetActiveWidth = function ()
	{
	    return g_RasterMapInfo != null ? g_RasterMapInfo.arrLevels[me.GetLevel()].iActiveWidth : 0;
	}

	/// private:
	this.GetActiveHeight = function ()
	{
	    return g_RasterMapInfo != null ? g_RasterMapInfo.arrLevels[me.GetLevel()].iActiveHeight : 0;
	}

	/// private:
	this.GetActiveWidthFromLevel = function (iLevel)
	{
   		return g_RasterMapInfo != null ? g_RasterMapInfo.arrLevels[iLevel].iActiveWidth : 0;
	}

	/// private:
	this.GetActiveHeightFromLevel = function (iLevel)
	{
	    return g_RasterMapInfo != null ? g_RasterMapInfo.arrLevels[iLevel].iActiveHeight : 0;
	}

	/// protected:
	// Egy adott pont fole viszi a terkepet, adott nagyitasi fokozatban
	// strScale lehetseges ertekei:
	//    Country
	//    Region
	//    Settlement
	//    Street
	this.ZoomToScale = function(wgsX, wgsY, strScale)
	{
		var dRadius = me.GetRadiusMeter (strScale);
		me.ZoomToPoint (wgsX, wgsY, dRadius, null);
	}
	
	/// private:
	this.GetRadiusMeter = function (strScale)
	{
		var dRadius;

		switch(strScale)
		{
			case "Country":     dRadius = 160000; break;
			case "Region":      dRadius = 30000; break;
			case "Settlement":  dRadius = 3000; break;
			case "Street":      dRadius = 300; break;
			default:         
			dRadius = 160000;
		}
		
		return dRadius;
	}

	/// protected:
	/// Egy adott pont fole viszi a terkepet, adott sugarral
	this.ZoomToPoint = function(wgsX, wgsY, dRadius, pfOuterCallback)
	{
		var types = ["start","through","stop"];
		me.HidePinLabelsMulti(types);
		me.HidePois ();
		
		me.DistMeter.ClearRubberLine ();
		me.DistMeter.ClearCursors ();
		me.HideRoute ();
		me.HideDistMeasure();
		
		
		var iViewDeltaX = me.GetMapViewWidth ();
		var iViewDeltaY = me.GetMapViewHeight ();
		var iGridDeltaX = me.GetMapGridItemWidth () * me.iGridWidth;
		var iGridDeltaY = me.GetMapGridItemHeight () * me.iGridHeight;

		var Params = "";
		Params += 'dCenterX=' + wgsX;
		Params += '&dCenterY=' + wgsY;
		Params += '&dRadius=' + dRadius;
		Params += '&iViewDeltaX=' + iViewDeltaX;
		Params += '&iViewDeltaY=' + iViewDeltaY;
		Params += '&iGridDeltaX=' + iGridDeltaX;
		Params += '&iGridDeltaY=' + iGridDeltaY;

		me.bZoomCalled = true;
		me.NoSessionServer.CallFunction ("DrawRasterMapCenter", Params, 0, me.ZoomToPointCallback, pfOuterCallback);
		me.pGridMain.RemoveZoomPreview();
	}

	/// private:
	this.ZoomToPointCallback = function (result, pfOuterCallback, iCommandID)
	{
		me.ArgZoom_ZoomPosX=0;
		me.ArgZoom_ZoomPosY=0;			
		me.EndZoomMain (result, null, iCommandID);		
		if (pfOuterCallback)
		    pfOuterCallback ();
	}
	/// protected:
	// Wgs-ben adott teglalap (dMinX,dMinY,dMaxX,dMaxY) fole viszi a terkepet
	this.ZoomToRect = function(dMinX,dMinY,dMaxX,dMaxY, pfOuterCallback)
	{		
		var iViewDeltaX = me.GetMapViewWidth ();
		var iViewDeltaY = me.GetMapViewHeight ();
		var iGridDeltaX = me.GetMapGridItemWidth () * me.iGridWidth;
		var iGridDeltaY = me.GetMapGridItemHeight () * me.iGridHeight;

		if ((iViewDeltaX <= 0) || (iViewDeltaY <= 0) || (iGridDeltaX <= 0) || (iGridDeltaY <= 0) || (dMinX > dMaxX)
		    || (dMinY > dMaxY))
		return;

		// check pixel coordinates
	
		var types = ["start","through","stop"];
		me.HidePinLabelsMulti(types);
		me.HidePois ();
		
		me.DistMeter.ClearRubberLine ();
		me.DistMeter.ClearCursors ();
		me.HideRoute ();		
		me.HideDistMeasure();		
			
		var Params = "";
		Params += 'dMinX=' + dMinX;
		Params += '&dMinY=' + dMinY;
		Params += '&dMaxX=' + dMaxX;
		Params += '&dMaxY=' + dMaxY;
		Params += '&iViewDeltaX=' + iViewDeltaX;
		Params += '&iViewDeltaY=' + iViewDeltaY;
		Params += '&iGridDeltaX=' + iGridDeltaX;
		Params += '&iGridDeltaY=' + iGridDeltaY;

		me.bZoomCalled = true;
		me.NoSessionServer.CallFunction ("DrawRasterMapRectangle", Params, 0, me.ZoomToRectCallback, pfOuterCallback);
		me.pGridMain.RemoveZoomPreview();
	}

	/// private:
	this.ZoomToRectCallback = function (result, pfOuterCallback, iCommandID)
	{
		me.ArgZoom_ZoomPosX=0;
		me.ArgZoom_ZoomPosY=0;		
		me.EndZoomMain (result, null, iCommandID);		
		if (pfOuterCallback)
		    pfOuterCallback ();				    		
	}

	/// protected:
	/// Megjeleniti a teljes orszagot ugy, hogy a befoglalo div-et a
	/// leheto legjobban kitoltse.
	this.ZoomToDefault = function (pfOuterCallback)
	{		
		if(g_RasterMapInfo != null)
			//me.ZoomToRect (g_RasterMapInfo.wgsMapMinX + 0.5, g_RasterMapInfo.wgsMapMinY + 0.5, g_RasterMapInfo.wgsMapMaxX - 0.5, g_RasterMapInfo.wgsMapMaxY - 0.5, pfOuterCallback);				
			me.ZoomToRect (g_RasterMapInfo.wgsMapMinX, g_RasterMapInfo.wgsMapMinY, g_RasterMapInfo.wgsMapMaxX, g_RasterMapInfo.wgsMapMaxY, pfOuterCallback);				
	}
	
	/// private:
	this.DrawRoute = function ()
	{
		me.bDrawRouteHappening = true;
		var dMinX = me.pGridMain.dWgsLowerLeftX;
		var dMinY = me.pGridMain.dWgsLowerLeftY;
		var dMaxX = me.pGridMain.dWgsUpperRightX;
		var dMaxY = me.pGridMain.dWgsUpperRightY;
		var iGridWidth = me.GetMapGridWidthInPixel();
		var iGridHeight = me.GetMapGridHeightInPixel();

		var CommonParams = "";
		CommonParams += 'dMinX=' + dMinX;
		CommonParams += '&dMinY=' + dMinY;
		CommonParams += '&dMaxX=' + dMaxX;
		CommonParams += '&dMaxY=' + dMaxY;
		CommonParams += '&iGridWidth=' + iGridWidth;
		CommonParams += '&iGridHeight=' + iGridHeight;
		CommonParams += '&dPixelDensity=' + me.GetPixelDensity();

		// Poik
		if(me.OnPoiDrawBegins)
		{
			try {
				me.OnPoiDrawBegins();
			}
			catch (exp) {
				if(me.OnError)
					me.OnError(exp,'CTopoliszMap.OnPoiDrawBegins');
			}
		}

		var i=0;
		var strPoiIDs = "";
		var strPoiXs  = "";
		var strPoiYs  = "";
		for(i=0; i<me.arrPois.length; i++)
		{
			if(me.arrPois[i] != null)
			{
				if(strPoiIDs != "")
				{
					strPoiIDs += '|';
					strPoiXs  += '|';
					strPoiYs  += '|';
				}
				strPoiIDs += me.arrPois[i].strID;
				strPoiXs  += me.arrPois[i].dX;
				strPoiYs  += me.arrPois[i].dY;
			}
		}
		
		var Params1 = ""; // poi, marker

		// DrawRoute
		
		Params1 += 'bDrawRoute=1';
		
		if (me.m_bRasterLevel == false)
			Params1 += '&bDrawMap=1';
		else
			Params1 += '&bDrawMap=0';		

		// Poik

		Params1 += '&arrPoiIDs=' + strPoiIDs;
		Params1 += '&arrPoiX=' + strPoiXs;
		Params1 += '&arrPoiY=' + strPoiYs;

		// Layeres poi-k
		
		Params1 += '&arrPoiTypeIDs=' + me.GetPoiLayers();

		// Markerek
		me.pMarkers.DeleteAllWithType("tmc");
		me.pMarkers.DeleteAllWithType("lpoi");
		me.pMarkers.DeleteAllWithType("ptstop");
		Params1 += '&' + me.pMarkers.GetUrl();
		
		// Trf megjelenites
		Params1 += '&bDrawHidFile=' + me.bDrawHidFile;
		Params1 += '&strDrawTrfEdgeVT=' + me.strDrawTrfEdgeVT;
		Params1 += '&strDrawTrfNodeVT=' + me.strDrawTrfNodeVT;
		Params1 += '&strDrawRuns=' + me.strDrawRunParams;

		// utvonal + poi + marker
		Params1 = CommonParams + "&" + Params1;
		var pDRS1 = new DrawRouteStruct();
		pDRS1.bDrawRoute = true;
		pDRS1.bNewPoint = false;
		me.HideRoute ();
		me.HideDistMeasure();
		me.RemovePinLabelsSpec ();
				
		var divParent = me.divPoiParent;
		if (divParent != null)
		{
			while(divParent.firstChild)
				divParent.removeChild(divParent.firstChild);
									
			me.RemoveLayerPOIBoxes ();		
			var types = ["start","through","stop"];	
			me.RemovePinLabelsExclusiveMulti(types);
		}						
		
		var iViewOffsX = me.pGridMain.iMapViewVectorX;
		var iViewOffsY = me.pGridMain.iMapViewVectorY;
		var iViewW = me.GetMapViewWidth ();
		var iViewH = me.GetMapViewHeight ();
		Params1 += '&iViewOffsetX=' 	+ iViewOffsX;
		Params1 += '&iViewOffsetY=' 	+ iViewOffsY;
		Params1 += '&iViewDeltaX=' 	+ iViewW;
		Params1 += '&iViewDeltaY=' 	+ iViewH;		

		me.pGridMain.SetMainGridImage ("", me.iMainGridImageOpacity );
		me.ReadSessionServer.CallFunction ("DrawMapPersonal", Params1, 0,  me.DrawRouteCallback, pDRS1);

		if (m_bDrawTMC || m_bDrawPTStopsGlobal || m_bDrawPTStopsLocal || m_bDrawTMCWeather)
		{
			var bDrawTMC = (m_bDrawTMC || m_bDrawTMCWeather);
			var Params2 = CommonParams; // poi, marker
			Params2 += '&bDrawRoute=0';
			Params2 += '&bDrawMap=0';	
			Params2 += '&bDrawTMC=' + bDrawTMC;
			Params2 += '&strTMCState=' + me.GetTMCStateExt();
			Params2 += '&strDrawTrfMode=false';
			Params2 += '&iViewOffsetX=' 	+ iViewOffsX;
			Params2 += '&iViewOffsetY=' 	+ iViewOffsY;
			Params2 += '&iViewDeltaX=' 	+ iViewW;
			Params2 += '&iViewDeltaY=' 	+ iViewH;
			Params2 += '&bDrawPTStopsGlobal=' + m_bDrawPTStopsGlobal;
			Params2 += '&bDrawPTStopsLocal=' + m_bDrawPTStopsLocal;
			me.pGridMain.SetMainGridImageSec ("", 100);
			me.ReadSessionServer.CallFunction ("DrawMapPersonal", Params2, 0,  me.DrawRouteCallbackTMC, pDRS1);
		}
	}

	///protected:
	/// Ujrarajzolja a poikat, markereket a terkep mozgatasa (letoltese) nelkul
	this.DrawPois = function()
	{
		me.DrawRoute();
	}

	/// private:
	this.DrawDistMeasure = function (iNewDistancePixelPointX, iNewDistancePixelPointY)
	{
		var bNewPoint = false;
		if ((iNewDistancePixelPointX != undefined ) && (iNewDistancePixelPointY != undefined ))
			bNewPoint = true;

		me.bDrawDistMeasureHappening = true;
		var dMinX = me.pGridMain.dWgsLowerLeftX;
		var dMinY = me.pGridMain.dWgsLowerLeftY;
		var dMaxX = me.pGridMain.dWgsUpperRightX;
		var dMaxY = me.pGridMain.dWgsUpperRightY;
		var iGridWidth = me.GetMapGridWidthInPixel();
		var iGridHeight = me.GetMapGridHeightInPixel();

		var CommonParams = "";
		CommonParams += 'dMinX=' + dMinX;
		CommonParams += '&dMinY=' + dMinY;
		CommonParams += '&dMaxX=' + dMaxX;
		CommonParams += '&dMaxY=' + dMaxY;
		CommonParams += '&iGridWidth=' + iGridWidth;
		CommonParams += '&iGridHeight=' + iGridHeight;

		// tavolsagmeres
		if(me.pDistancePoly.PointNum > 0 || bNewPoint)
		{
			var Params2 = ""; // tavolsagmeres
			Params2 += 'bDrawRoute=0';

			if (me.pDistancePoly.PointNum > 0)
			{
				Params2 += '&arrDistX=' + me.pDistancePoly.GetXs ();
				Params2 += '&arrDistY=' + me.pDistancePoly.GetYs ();
			}

			Params2 = CommonParams + "&" + Params2;

			if (bNewPoint)
			{
				Params2 += '&iDistNextPointX=' + iNewDistancePixelPointX;
				Params2 += '&iDistNextPointY=' + iNewDistancePixelPointY;
			}

			var iViewOffsX = me.pGridMain.iMapViewVectorX;
			var iViewOffsY = me.pGridMain.iMapViewVectorY;
			var iViewW = me.GetMapViewWidth ();
			var iViewH = me.GetMapViewHeight ();
			Params2 += '&iViewOffsetX=' 	+ iViewOffsX;
			Params2 += '&iViewOffsetY=' 	+ iViewOffsY;
			Params2 += '&iViewDeltaX=' 	+ iViewW;
			Params2 += '&iViewDeltaY=' 	+ iViewH;


			me.NoSessionServer.CallFunction ("DrawMapPersonal", Params2, 0, me.DrawDistMeasureCallback, bNewPoint);
		}
		else
			me.bDrawDistMeasureHappening = false;
	}

	/// private:
	this.DrawPrintPreview = function ()
	{
		me.bDrawPrintPreviewHappening = true;
		var pMapData = me.GetMapData();

		var dMinX = pMapData.dMinX;
		var dMinY = pMapData.dMinY;
		var dMaxX = pMapData.dMaxX;
		var dMaxY = pMapData.dMaxY;
		var iGridWidth = me.GetMapViewWidth();
		var iGridHeight = me.GetMapViewHeight();

		var CommonParams = "";
		CommonParams += 'dMinX=' + dMinX;
		CommonParams += '&dMinY=' + dMinY;
		CommonParams += '&dMaxX=' + dMaxX;
		CommonParams += '&dMaxY=' + dMaxY;
		CommonParams += '&iGridWidth=' + iGridWidth;
		CommonParams += '&iGridHeight=' + iGridHeight;
		CommonParams += '&dPixelDensity=' + me.GetPixelDensity();

		var Params1 = "";

		// DrawRoute
		Params1 += 'bDrawRoute=1';
		//DrawMap
		Params1 += '&bDrawMap=1';
		// DrawTMC
		var bDrawTMC = (m_bDrawTMC || m_bDrawTMCWeather);
		Params1 += '&bDrawTMC=' + bDrawTMC;
		if(bDrawTMC)
		{
			Params1 += '&strTMCState=' + me.GetTMCStateExt();
		}
		
		// utvonal + poi + marker
		Params1 = CommonParams + "&" + Params1;
		
		var iViewOffsX = me.pGridMain.iMapViewVectorX;
		var iViewOffsY = me.pGridMain.iMapViewVectorY;
		var iViewW = me.GetMapViewWidth ();
		var iViewH = me.GetMapViewHeight ();
		Params1 += '&iViewOffsetX=' 	+ iViewOffsX;
		Params1 += '&iViewOffsetY=' 	+ iViewOffsY;
		Params1 += '&iViewDeltaX=' 	+ iViewW;
		Params1 += '&iViewDeltaY=' 	+ iViewH;
		
		me.ReadSessionServer.CallSyncFunction ("DrawMapPersonal", Params1, 0,  me.DrawPrintPreviewCallback);
	}
	
	AddEvent(window, "beforeprint", function() {
		if(me.bMainMapMode)
		{
			me.DrawPrintPreview; 
		}
	});
	
	this.DrawPrintPreviewCallback = function (result, pClientParam, iCommandID)
	{
		var strImageUrl = result.strUrl;

		me.divPrintPreview.style.left = "0px";
		me.divPrintPreview.style.top = "0px";
		me.divPrintPreview.style.width = me.GetMapViewWidth() + "px";
		me.divPrintPreview.style.height = me.GetMapViewHeight() + "px";
		while(me.divPrintPreview.firstChild)
			me.divPrintPreview.removeChild(me.divPrintPreview.firstChild);

		var img = NewTag('img', me.divPrintPreview);
		SetImage(img, strImageUrl, me.GetMapViewWidth(), me.GetMapViewHeight(), "");
		me.divPrintPreview.style.display = "block";

		me.bDrawPrintPreviewHappening = false;
	}

	/// private:
	this.HidePrintPreview = function()
	{
		me.divPrintPreview.style.display = "none";
	}

	/// private:
	this.HideRoute = function ()
	{
		if(me.pGridMain)
			me.pGridMain.HideMainGridImage ();
	}

	/// private:
	this.HideDistMeasure = function ()
	{
		if(me.pGridMain)
			me.pGridMain.HideDistMeasure ();
	}

	/// private:
	this.ShowDistMeasure = function ()
	{
		me.pGridMain.ShowDistMeasure ();
	}

	/// private:
	this.ShowRoute = function ()
	{
//		me.pGridMain.ShowMainGridImage ();
	}


	this.DrawRouteCallbackTMC = function (result, pClientParam, iCommandID)
	{
	    var strImageUrl = result.strUrl;

	    // route + poi + marker
	    me.pGridMain.SetMainGridImageSec(strImageUrl, 100);

	    //TMC 

	    if (result.arrTMCTextTable != null && result.arrTMCTextTable.length > 0)
	    {
	        me.arrTMCTextTable = result.arrTMCTextTable;
	    }
	    var SetDrawBoxContentData = function (marker, tmc)
	    {
	        var TMCDrawBoxContentData = function (divParent)
	        {
	            if (divParent != null)
	            {
	                var divData = NewTag("div", divParent);
	                divData.style.width = "200px";
	                var arrLines = me.GetTMCText(tmc.iEventDescriptionIndex).split("<br/>");
	                for (var iLine = 0; iLine < arrLines.length; iLine++)
	                {
	                    NewTextTag(arrLines[iLine], divData);
	                    if (iLine < arrLines.length - 1)
	                        NewTag("br", divData);
	                }


	                var arrLines = me.GetTMCText(tmc.iTMCTextIndex).split("<br/>");
	                if ((arrLines.length > 1) || ((arrLines.length == 1) && (arrLines[0] != "")))
	                {
	                    var divData = $("<div style='padding-top:0.4em'></div>").appendTo(divParent); //NewTag("div", divParent);
	                    //divData.style.paddingTop = "0.4em";
	                    for (var iLine = 0; iLine < arrLines.length; iLine++)
	                    {
	                        var iPos = arrLines[iLine].indexOf(':');
                            if (iPos > 0)
	                        {
	                            divData.append("<span style='font-weight:bold;font-size:110%'>" + arrLines[iLine].substr(0, iPos + 1) + "</span>");
	                            divData.append(arrLines[iLine].substr(iPos + 1) );
	                        }
	                        else
	                        {
	                            divData.append(arrLines[iLine]);
	                        }
	                        divData.append("<br/>");
	                    }
	                }
	            }
	        };
	        marker.DrawBoxContentData = TMCDrawBoxContentData;
	        var k = 22;
	        k++;
	        return k;
	    }

	    for (var iTMC = 0; iTMC < result.arrTMCEvents.length; iTMC++)
	    {
	        var tmc = result.arrTMCEvents[iTMC];

	        var marker = new Marker(me, "tmc", 0, 0, null, null);
	        SetDrawBoxContentData(marker, tmc);
	        marker.SetProperty("start_button", false);
	        marker.SetProperty("through_button", false);
	        marker.SetProperty("stop_button", false);
	        marker.SetProperty("panorama_button", false);
	        marker.SetProperty("pinnumber", 0);
	        marker.SetProperty("handle_details", false);
	        marker.SetProperty("div_label_sign_class", "marker");
	        marker.SetProperty("pin_img_width", 27);
	        marker.SetProperty("pin_img_height", 27);
	        marker.SetProperty("pin_img_refx", 13);
	        marker.SetProperty("pin_img_refy", 13);
	        marker.SetProperty("delete_marker_on_label_close", false);
	        marker.SetProperty("caption", me.GetTMCText(tmc.iLocationDescriptionIndex).split('<br/>').join(' '));
	        marker.SetProperty("show_coordinates", me.bDisplayCoords);
	        marker.SetProperty("fix_label_on_click", true);
	        //marker.bMouseOverEnabled = true;
	        //marker.bMouseOverEnabled = false;
	        marker.bLongMouseOver = true;



	        me.pMarkers.Add(marker)

	        if (marker != null)
	        {
	            marker.iPixX = tmc.iX;
	            marker.iPixY = tmc.iY;

	            var pinlabel = me.CreatePinLabel(marker);
	            pinlabel.DrawSign();
	        }
	    }

	    //TMC END

	    // PTSTOPS
	    var SetDrawBoxContentDataPTStop = function (marker, tmc)
	    {
	        var PTStopDrawBoxContentData = function (divParent)
	        {
	            if (divParent != null)
	            {
	                var divData = NewTag("div", divParent);
	                NewTextTag("hahó", divData);
	            }
	        };
	        marker.DrawBoxContentData = PTStopDrawBoxContentData;
	    }


	    for (var iPTStop = 0; iPTStop < result.arrPTStops.length; iPTStop++)
	    {
	        var ptstop = result.arrPTStops[iPTStop];

	        var marker = new Marker(me, "ptstop", 0, 0, null, null);
	        marker.SetProperty("start_button", me.bLabelHasStartButton);
	        marker.SetProperty("through_button", false);
	        marker.SetProperty("stop_button", me.bLabelHasStopButton);
	        marker.SetProperty("panorama_button", me.bLabelHasPanoramaButton);
	        marker.SetProperty("pinnumber", 0);
	        marker.SetProperty("handle_details", false);
	        marker.SetProperty("div_label_sign_class", "marker");
	        marker.SetProperty("pin_img_width", 10);
	        marker.SetProperty("pin_img_height", 10);
	        marker.SetProperty("pin_img_refx", 0);
	        marker.SetProperty("pin_img_refy", 5);
	        marker.SetProperty("label_dy", -5);
	        marker.SetProperty("delete_marker_on_label_close", false);
	        marker.SetProperty("show_coordinates", me.bDisplayCoords);
	        marker.SetProperty("fix_label_on_click", true);
	        marker.bMouseOverEnabled = true;
	        marker.bLongMouseOver = true;
	        marker.ptstop = ptstop;

	        var ptstopDrawBox_Custom = function (label)
	        {
	            if (label.pMarker.GetProperty("get_all_data_from_server") != "???")
	            {
	                if ((label.pMarker.bContentLoaded) && (label == null))
	                {
	                    window.status = "<teszt null>";
	                }

	                if ((label.pMarker.bContentLoaded) && (label != null)) // picit a második feltétel hack
	                {
	                    label.DrawBox_Default();
	                }
	                else
	                {
	                    var iID = label.pMarker.GetProperty("get_all_data_from_server");
	                    me.NoSessionServer.CallFunction("GetPTStopData", "id=" + iID + "&dX=" + label.pMarker.dX + "&dY=" + label.pMarker.dY, 0, me.MarkerDataArrived, label.pMarker);
	                }
	            }
	            else
	            {
	                me.MarkerDataArrived(label.pMarker.ptstop, label.pMarker);
	            }
	        }

	        marker.DrawBox_Custom = ptstopDrawBox_Custom;

	        if (ptstop.strName == "")
	        {
	            marker.SetProperty("get_all_data_from_server", ptstop.nID);
	            marker.bContentLoaded = false;
	        }
	        else
	        {
	            marker.bContentLoaded = true;
	        }

	        me.pMarkers.Add(marker)

	        if (marker != null)
	        {
	            marker.iPixX = ptstop.iPxlX;
	            marker.iPixY = ptstop.iPxlY;
	            marker.dX = ptstop.dWgsX;
	            marker.dY = ptstop.dWgsY;

	            var pinlabel = me.CreatePinLabel(marker);
	            pinlabel.DrawSign();
	        }
	    }

	    // PTSTOPS END

	}


	/// private:
	this.DrawRouteCallback = function (result, pClientParam, iCommandID)
	{
		if (result == null)
		{
			me.bDrawRouteHappening = false;
			me.CallDrawRouteCallbackListeners ();
					
			/*var divParent = me.divPoiParent;
			if (divParent != null)
			{
				while(divParent.firstChild)
					divParent.removeChild(divParent.firstChild);
										
				me.RemoveLayerPOIBoxes ();		
				var types = ["start","through","stop"];	
				me.RemovePinLabelsExclusiveMulti(types);
			}*/			
			
			return;
		}
		
		//-------------------------------------------------------------
		
		var strImageUrl = result.strUrl;		
		// route + poi + marker					
		me.pGridMain.SetMainGridImage (strImageUrl, me.iMainGridImageOpacity );
		me.RearrangePois ();
		me.ShowPois ();

		var divParent = me.divPoiParent;

		if (divParent != null)
		{
			/*while(divParent.firstChild)
				divParent.removeChild(divParent.firstChild);
									
			me.RemoveLayerPOIBoxes ();		
			var types = ["start","through","stop"];	
			me.RemovePinLabelsExclusiveMulti(types);*/

			if(me.OnPoiDraw)
			{
				try
				{
					var iPoi;
					for(iPoi = 0; iPoi < result.arrPois.length; iPoi++)
					{
						if(result.arrPois[iPoi].strID.substr(0, 4) != "pbp_")
							me.OnPoiDraw(divParent, result.arrPois[iPoi].strID, result.arrPois[iPoi].iX, result.arrPois[iPoi].iY);
					}
				}
				catch (exp) {
					if(me.OnError)
						me.OnError(exp,'CTopoliszMap.OnPoiDraw');
				}
			}
			if(me.OnPoiDrawEnded)
			{
				try {
					me.OnPoiDrawEnded();
				}
				catch (exp)	{
					if(me.OnError)
						me.OnError(exp,'CTopoliszMap.OnPoiDrawEnds');
				}
			}
	
		}

		var iLabel;
		var bFixedMarkerFound = false;
		for(iLabel = result.arrMapLabels.length-1; iLabel >= 0; iLabel--)
		{
			var label = result.arrMapLabels[iLabel];
			var marker = me.pMarkers.Find (label.ID);

			if(marker != null)
			{
				marker.iPixX = label.iPixX;
				marker.iPixY = label.iPixY;

				var pinlabel = me.CreatePinLabel (marker);
				pinlabel.DrawSign();
													
				if (marker.bLabelBoxMustBeVisible)
				{
					pinlabel.DrawBox();
					me.pFixedMarker = marker;
					bFixedMarkerFound = true;
				}
			}
		}		
		
		// LayerPoi (new)
		
		var SetDrawBoxContentDataLayerPoi = function (marker, lpoi)
		{
			var LayerPoiDrawBoxContentData = function(divParent)
			{
				if(divParent != null)
				{
					var divData = NewTag("div", divParent);
				}
			};
			marker.DrawBoxContentData = LayerPoiDrawBoxContentData;
			return 0;
		}

		for(var iLayerPoi = 0; iLayerPoi < result.arrPois.length; iLayerPoi++)
		{
			var lpoi = result.arrPois[iLayerPoi];
			
			if(lpoi.strID.substr(0, 4) == "pbp_")
			{
				if (me.bDisplayPOIBanner) {
					me.ShowPoiBannerPoi(lpoi);
				}
				continue;
			}
			
			var marker = new Marker(me, "lpoi", 0, 0, null, null);
			SetDrawBoxContentDataLayerPoi(marker, lpoi);
			marker.SetProperty ("start_button", me.bLabelHasStartButton);
			marker.SetProperty ("through_button", me.bLabelHasThroughButton);
			marker.SetProperty ("stop_button", me.bLabelHasStopButton);
			marker.SetProperty ("panorama_button", me.bLabelHasPanoramaButton);
			marker.SetProperty ("pinnumber", 0);
			marker.SetProperty ("handle_details", true);
			marker.SetProperty ("div_label_sign_class", "marker");
			marker.SetProperty ("pin_img_width", 27);
			marker.SetProperty ("pin_img_height", 27);
			marker.SetProperty ("pin_img_refx", 0);
			marker.SetProperty ("pin_img_refy", 9);
			marker.SetProperty ("fix_label_on_click", true);
			marker.SetProperty ("delete_marker_on_label_close", false);
			marker.SetProperty ("caption", lpoi.strName);
			marker.SetProperty ("show_coordinates", me.bDisplayCoords);
			marker.SetProperty ("get_details_from_server", lpoi.strID);
			marker.SetProperty ("get_wgs_from_server", lpoi.strID);			
			marker.SetProperty ("label_dx",0);
			marker.SetProperty ("label_dy",-9);
			marker.SetProperty ("pinnumbercolor", "Black");
			if(lpoi.iImageID > 1)
			{
				marker.SetProperty("label_css_classname", marker.GetProperty("label_css_classname")+" priority_label");
				marker.SetProperty("list_css_classname", marker.GetProperty("list_css_classname")+ " priority_label");
			}
			
			marker.DrawBoxContentData = function (divLabelBoxContent)
			{
				if (marker.GetProperty ("show_coordinates") == true)
				{
					var iServerID = marker.GetProperty ("get_wgs_from_server");
					if (iServerID != "???")
						me.NoSessionServer.CallFunction("SearchPoi", "iID=" + iServerID, 0, me.LayerPOIWGSDataArrived, divLabelBoxContent); 
				}
			}			
			
			me.pMarkers.Add (marker) 
			
			if(marker != null)
			{
				marker.iPixX = lpoi.iX;
				marker.iPixY = lpoi.iY;

				var pinlabel = me.CreatePinLabel (marker);
				pinlabel.DrawSign();
				
				if (lpoi.strID == me.iMustVisibleMarkerSID)
				{
					bFixedMarkerFound = true;
					marker.bLabelBoxMustBeVisible = true;					
					me.iMustVisibleMarkerSID = 0;
					me.pFixedMarker = marker;
				}
									
				if (marker.bLabelBoxMustBeVisible)
					pinlabel.DrawBox();				
			}
		}			
		
		if (!bFixedMarkerFound)
			me.pFixedMarker = null;
		else if (me.pFixedMarker != null)
			me.OnLabelSignClick (me.pFixedMarker);				    		
				
		if (me.OnMarkerListChanged) {
			me.OnMarkerListChanged ();
		}
		
		if (me.OnPoiOnGridListChanged)		
		    me.OnPoiOnGridListChanged ();		    				    			
		    		
		me.ShowRoute ();
		me.ShowDistMeasure ();

		me.bDrawRouteHappening = false;
		
		// ie bug miatt kell
		if (me.bHasMiniMap == false)
			me.divMap.style.display = "";

		me.CallDrawRouteCallbackListeners ();
	}


	this.GetPoiBannerMoverContent = function (poi)
	{
	    if ((typeof (g_pPoiBannerCampaign) != "undefined") && g_pPoiBannerCampaign != null)
	    {
	        var iLength = g_pPoiBannerCampaign.arrContentTemplates.length;
	        var iIndex = Math.min(Math.floor(Math.random() * iLength), iLength - 1);
	        if (iIndex >= 0 && iIndex < iLength)
	        {
	            var strTemplate = unescape(g_pPoiBannerCampaign.arrContentTemplates[iIndex]);
	            strTemplate = strTemplate.replace("[Caption]", poi.strCaption);
	            return unescape(strTemplate);
	        }
	    }
	    return "";
	}

	var m_pbpTimer = null;

	this.ShowPoiBannerPoi = function (poi)
	{
	    if ((typeof (g_pPoiBannerCampaign) != "undefined") && g_pPoiBannerCampaign != null)
	    {
	        var divPoiParent = me.GetPoiParentDiv();
	        var iID = parseInt(poi.strID.substr(4), 10);
	        if (iID > 0)
	        {
	            var poidata = null;

	            if (g_pPoiBannerCampaign.arrPois != null)
	            {
	                for (var i = 0; i < g_pPoiBannerCampaign.arrPois.length; i++)
	                {
	                    if (g_pPoiBannerCampaign.arrPois[i].nID == iID)
	                    {
	                        poidata = g_pPoiBannerCampaign.arrPois[i];
	                        break;
	                    }
	                }
	            }

	            if (poidata)
	            {
	                var div = NewTag("div");
	                /*var a = NewTag('a', div);
	                a.setAttribute("href", poidata.strLinkUrl);
	                a.setAttribute("target", "_blank");
	                a.style.border = "0px";*/
	                var img = NewTag("img", div);
	                SetImage(img, poidata.strIconUrl, poidata.iIconWidth, poidata.iIconHeight, "");
	                div.style.position = "absolute";
	                div.style.left = Math.round(poi.iX - poidata.iIconWidth / 2) + "px";
	                div.style.top = Math.round(poi.iY - poidata.iIconHeight / 2) + "px";
	                AddTag(div, divPoiParent);

	                var followlink = function (pEvent)
	                {
	                    window.open(poidata.strLinkUrl);
	                };

	                var removebox = function ()
	                {
	                    $(".pbp_mover").remove();
	                    //window.status += "(rb)";
	                };

	               var timer = null;


	                var stoptimer = function ()
	                {
	                    //window.status += "(null-)";
	                    if (m_pbpTimer != null)
	                    {
	                        //window.status += "(" + m_pbpTimer + "-)";
	                        window.clearTimeout(m_pbpTimer);
	                        m_pbpTimer = null;
	                    }

	                }

	                var starttimer = function ()
	                {
	                    stoptimer();
	                    m_pbpTimer = window.setTimeout(

                        function ()
                        {
                            //window.status += "(" + m_pbpTimer + "×)";
                            removebox(); 
                        }
                        , 1250);
                        //window.status += "(" + m_pbpTimer + "+)";

	                };



	                $(div).hover(
						function (pEvent)
						{
						    //window.status += "(hov)";
						    removebox();
						    stoptimer();
						    var d2 = NewTag('div');
						    d2.className = "pbp_mover";
						    d2.style.position = "absolute";
						    d2.style.zIndex = "4000";
						    d2.style.left = Math.round(poi.iX - poidata.iIconWidth / 2) + "px";
						    d2.style.top = Math.round(poi.iY + poidata.iIconHeight / 2) + "px";
						    //$(d2).append(poidata.strMouseOverHtml).wrap("<div/>");
						    $(d2).append(me.GetPoiBannerMoverContent(poidata)).wrap("<div/>");
						    $(d2).hover(stoptimer, removebox);
						    $(d2).click(followlink);
						    $(this).after(d2);

						    var offsetFace = $(me.divFace).offset();
						    var widthFace = $(me.divFace).innerWidth();
						    var heightFace = $(me.divFace).innerHeight();
						    var offsetBox = $(d2).offset();
						    var widthBox = $(d2).outerWidth();
						    var heightBox = $(d2).outerHeight();

						    if (offsetBox.left + widthBox > offsetFace.left + widthFace || offsetBox.top + heightBox > offsetFace.top + heightFace)
						    {
						        var iNewBoxLeft = offsetBox.left;
						        var iNewBoxTop = offsetBox.top;

						        if (offsetBox.left + widthBox > offsetFace.left + widthFace)
						        {
						            iNewBoxLeft = (offsetFace.left + widthFace) - (widthBox + 3);
						        }
						        if (offsetBox.top + heightBox > offsetFace.top + heightFace)
						        {
						            iNewBoxTop = (offsetFace.top + heightFace) - (heightBox + 3);
						        }

						        $(d2).offset({ left: iNewBoxLeft, top: iNewBoxTop });
						    }

						},
						starttimer
					);
	                $(img).click(followlink);
	            }
	        }
	    }
	}

	this.LayerPOIWGSDataArrived = function (result, divLabelBoxContent)
	{
		try
		{
			var divCoord = NewTag('div', divLabelBoxContent, divLabelBoxContent.firstChild);
			NewTextTag(FormatCoordG(result.arrRecords[0].dX, result.arrRecords[0].dY), divCoord);
			divCoord.ondragstart = function() { return false; }; 
			divCoord.onselectstart = function() { return false; }; 				
		}
		catch (e)
		{
		}
	}

	/// private:
	this.DrawDistMeasureCallback = function(result, bNewPoint)
	{
		var strImageUrl = result.strUrl;

		// tavolsagmeres

		while(me.pGridMain.mainGridDistMeasureImageDiv.firstChild)
			me.pGridMain.mainGridDistMeasureImageDiv.removeChild(me.pGridMain.mainGridDistMeasureImageDiv.firstChild);

		me.pGridMain.SetMainGridDistMeasureImage (strImageUrl);
		me.DistMeter.SetPixelDensity (me.pixeldensity);

		me.pDistancePoly.SetPointsPixelX(result.arrDistPolylinePixelX); // az uj grid koord
		me.pDistancePoly.SetPointsPixelY(result.arrDistPolylinePixelY); // az uj grid koord
	
		var iMousePosInGridX = me.iMousePosX + me.pGridMain.GetMapViewVectorX();
		var iMousePosInGridY = me.iMousePosY + me.pGridMain.GetMapViewVectorY();

		if (bNewPoint)
		{
			me.pDistancePoly.AddPoint(result.dLastDistPointY, result.dLastDistPointX);
			me.pDistancePoly.dDistanceMeter = result.dDistanceMeter;
		}

		me.DistMeter.ClearRubberLine ();
		me.DistMeter.ClearCursors ();
		if (me.pDistanceDisplay)
			me.pDistanceDisplay.displayLastDist.lastChild.nodeValue = "0 km";

		if (result.arrDistPolylinePixelX != null && result.arrDistPolylinePixelX.length > 0)  // tartalmaz pontot a polyline
		{
			me.DistMeter.Init ();
			me.DistMeter.AddDistPoint (me.pDistancePoly.GetLastPointPixelX(), me.pDistancePoly.GetLastPointPixelY());
			me.DistMeter.SetEndPoint (iMousePosInGridX, iMousePosInGridY);
			var divParent = me.pGridMain.mainGridDistMeasureImageDiv;

			for(var i=0; i < result.arrDistPolylinePixelX.length; i++)
			{
				var divPoint = NewTag ("div");
				divPoint.style.position = "absolute";
				divPoint.style.left = (result.arrDistPolylinePixelX[i] - 10) + "px";
				divPoint.style.top  = (result.arrDistPolylinePixelY[i] - 10) + "px";
				var img = NewTag ("img");
				SetTransparentPng (img, GetAbsUrl("images/mapctrl/distance_point.png"), 21, 21);
				AddTag (img, divPoint);
			
				AddTag (divPoint, divParent);
			}
		}

		me.bDrawDistMeasureHappening = false;
	}
	
	/// private:
   /* 
   this.GetPoisInView = function ()
    {
        var i;
        var arrPoisInView = new Array();
        for (i = 0; i < me.arrPoisOnGrid.length; i++)
        {
            var poiOnGrid = me.arrPoisOnGrid[i];
            if (me.IsInView (poiOnGrid.iX, poiOnGrid.iY))
            {
                arrPoisInView.push(poiOnGrid);
            }
        }    
        return arrPoisInView;
    }        
	*/

   this.GetPoisInView = function ()
    {
        var i;
        var arrPoisInView = new Array();
        for (i = 0; i < me.pMarkers.arrMarkers.length; i++)
        {
            var poiOnGrid = me.pMarkers.arrMarkers[i];
            if (poiOnGrid != null)
            {
				if (poiOnGrid.mainType != "lpoi")
					continue;
				if (me.IsInView (poiOnGrid.iPixX, poiOnGrid.iPixY))
					arrPoisInView.push(poiOnGrid);
			}
        }    
        return arrPoisInView;
    }        
	
	/// protected:
	/// Itt kell megadni a Poi listat
	/// arrPois = CSimplePoi tomb
	this.SetPoiList = function(arrPois)
	{
		me.arrPois = (arrPois != null ? arrPois : new Array());
	}

	// protected:
	// visszaadja az aktualis Poi listat
	this.GetPoiList = function()
	{
		return me.arrPois;
	}

 // private:
    // ezeket a poikat kaptuk vissza akkor amikor uj grid-et kertunk le.
	this.SetPoiOnGridList = function(arrPoisOnGrid)
	{
	    if (me.arrPoisOnGrid != null)
	    {
	        delete me.arrPoisOnGrid;
	        me.arrPoisOnGrid = null;	        
	    }
	    
		me.arrPoisOnGrid = new Array();		
		
		var i;
		for (i = 0; i < arrPoisOnGrid.length; i++)
		{
			if(typeof(LayerPoi) != "undefined")
			{
		    var pSmallPoi = new LayerPoi(arrPoisOnGrid[i].strID, arrPoisOnGrid[i].iX, arrPoisOnGrid[i].iY,  arrPoisOnGrid[i].strName/*,
										arrPoisOnGrid[i].wgsX, arrPoisOnGrid[i].wgsY*/);
		    pSmallPoi.pMap = me;
            me.arrPoisOnGrid.push	(pSmallPoi);
      }
		}				
		
		if (me.OnPoiOnGridListChanged)		
		    me.OnPoiOnGridListChanged ();
	}
// private:
	this.GetPoiOnGridList = function()
	{
		return me.arrPoisOnGrid;
	}

	/// public:
	/// Poi rajzolas elott hivodik meg, itt meg folul lehet irni a poi koordinatakat
	this.OnPoiDrawBegins = function()
	{
	}

	/// public:
	// Ezt kell feluldefinialni a poi rajzolonak
	this.OnPoiDraw = function(divParent, strID, iX, iY)
	{
	}

	/// public:
	/// Az osszes Poi felrajzolva esemeny
	this.OnPoiDrawEnded = function()
	{
	}

	/// public:
	// Ezt kell feluldefinialni a label rajzolonak
	this.OnLabelDraw = function(tmTopoliszMap, pMapLabel, pMarker)
	{
	}
	// protected:
	// Visszadja az osszes Poi tipust egy CPoiType tombben melysegi bejaras szerint
	this.GetPoiTypes = function()
	{
		return g_arrPoiTypes;
	}

	// protected:
	// Aszinkron poi kereses,
	// poiQuery: CPoiQuery struktura
	// callback_function (pPoiSearchResult, callback_param): A kereses vegeztevel hivodik meg,
	// elso parametere a poi talalat, a masodik parametere pedig a callback_paramban megadott objektum.
	this.SearchPoi = function(pPoiQuery, callback_function, callback_param)
	{
		if(pPoiQuery != null)
		{
			var strParams =	"nID=" + pPoiQuery.nID
			              + "&strFilter=" + pPoiQuery.strFilter
				            + "&strType=" + pPoiQuery.strType
				            + "&iFirst=" + pPoiQuery.iFirst
				            + "&iLast=" + pPoiQuery.iLast;
			
			if(pPoiQuery.bHasRect)
			{
				strParams += "&dMinX=" + pPoiQuery.dMinX + "&dMinY=" + pPoiQuery.dMinY
				          + "&dMaxX=" + pPoiQuery.dMaxX + "&dMaxY=" + pPoiQuery.dMaxY;
			}
			me.NoSessionServer.CallFunction('SearchPoi', strParams, 0, callback_function, callback_param);
		}
	}
	
	/// private:
	this.GetPoiTypeName = function (strPoiTypeId)
	{
		if(g_arrPoiTypes != null)
		{
			for(var i = 0; i < g_arrPoiTypes.length; i++)
			{
				var pType = g_arrPoiTypes[i];
				if (strPoiTypeId == pType.iID)
					return pType.strName;
			}			
		}	
		return "";	
	}
	
	/// protected:
	/// A terkep allapotat bementi egy sztringbe es visszaadja azt.
	this.SaveState = function()
	{
		var mapdata = me.arrStates[me.iActiveState];
		var strState = "dX=" + mapdata.dCenterX
		             + "&dY=" + mapdata.dCenterY
		             + "&dRadius=" + mapdata.dRadius
		             + "&lang=" + me.GetLang();
		if(me.pRouteSearch != null)
		{
			var arrAddressList = me.pRouteSearch.GetAddressList();
			var iAddress;
			var strAddresses = '', strX = '', strY = '';
			for(iAddress = 0; iAddress < arrAddressList.length; iAddress++)
			{
				if(strAddresses != "")
				{
					strAddresses += '|';
					strX += '|';
					strY += '|';
				}
				strAddresses += encodeURIComponent(arrAddressList[iAddress].strAddress);
				strX += arrAddressList[iAddress].dX;
				strY += arrAddressList[iAddress].dY;
			}
			if(strAddresses != "")
			{
				strState += "&bToll=" + (me.pRouteSearch.bUseTolledRoute ? 1 : 0);
				strState += "&bFerry=" + (me.pRouteSearch.bUseFerry ? 1: 0);
				strState += "&bDirtyRoad=" + (me.pRouteSearch.bUseDirtyRoad ? 1 : 0);
				strState += "&arrAddresses=" + strAddresses + "&arrX=" + strX + "&arrY=" + strY;
			}
			if(me.pRouteSearch)
			{
				strState += "&traffictype=" + me.pRouteSearch.strTrafficType;
				strState += "&icarOptim=" + me.pRouteSearch.iCarOptim;
			}
		}
		
		if(me.pMarkers != null)
		{
			var arrMarkers = me.pMarkers.arrMarkers;
			var iMarker;
			var strMarkerCaptions = '', dMarkersXs = '', dMarkersYs = '', strMarkerTypes = '';
			for(iMarker = 0; iMarker < arrMarkers.length; iMarker++)
			{
			    var actMarker = arrMarkers[iMarker];
			    
			    if (actMarker != null)
			    {
			        if(strMarkerCaptions != "")
			        {
				        strMarkerCaptions += '|';
				        dMarkersXs += '|';
				        dMarkersYs += '|';
				        strMarkerTypes += '|';
			        }
			        
			        var oAddr = actMarker.ToAddress();			        
			        strMarkerCaptions += oAddr.strAddress;                    
			        dMarkersXs += oAddr.dX;
			        dMarkersYs += oAddr.dY;			
			        strMarkerTypes += actMarker.mainType;					
				}
			}
			
			if(strMarkerCaptions != "")
			{
				strState += "&strMarkerCaptions=" + strMarkerCaptions;
				strState += "&strMarkerTypes=" + strMarkerTypes;
				strState += "&dMarkerXs=" + dMarkersXs;
				strState += "&dMarkerYs=" + dMarkersYs;
			}			
		}
		
		// --------------------------------


		var the_res = "";
		var i;
		for ( i=0; i<strState.length; ++i)
		{
		    var to_code_charcode = strState.charCodeAt(i);
		    var char_to_code = strState.charAt(i);		    		    
		    
		    var coded_charcode;
		    var coded_char;		   	   

            if ((to_code_charcode >= 48) && (to_code_charcode <= 57))
            {
                the_res += String.fromCharCode (57 - to_code_charcode + 48);    
            }
            else if ((to_code_charcode >= 97) && (to_code_charcode <= 122))
            {
                the_res += String.fromCharCode (122 - to_code_charcode + 97);    
            }            
            else
            {
                var firstOrdNum = Math.floor (to_code_charcode / 26); 	     		   
                var secOrdNum = to_code_charcode % 26;            
                var firstCodedChar = String.fromCharCode (firstOrdNum + 65);
                var secCodedChar = String.fromCharCode (secOrdNum + 65);
                the_res += firstCodedChar;
                the_res += secCodedChar;
            }            
		}		

		return the_res;
	}

	/// private:
	this.DecodeState = function(encStrState)
	{
		var strState = "";
		var j = 0;

		while (j < encStrState.length)
		{
			var code = encStrState.charCodeAt(j);
			if ((code >= 48) && (code <= 57))
			{
				strState += String.fromCharCode (57 - code + 48);    
				j++;
			}
			else if ((code >= 97) && (code <= 122))
			{
				strState += String.fromCharCode (122 - code + 97);    
				j++;
			}
			else
			{
				var firstCode = encStrState.charCodeAt(j) - 65;
				var secCode = encStrState.charCodeAt(j+1) - 65;
				var ch = String.fromCharCode (firstCode * 26 + secCode);
				strState += ch;
				j++; j++;
			}
		}
		
		return strState;
	}
	
	// private:
	this.ParseState = function (strState)
	{
		var parsed = new Object();
		arrParams = strState.split('&');
		parsed.dX = 200;
		parsed.dY = 200;
		parsed.dRadius = 200;
		parsed.lang = "";
		parsed.arrAddresses = null;
		parsed.arrX = null;
		parsed.arrY = null;
		parsed.bToll = null;
		parsed.bFerry = null;
		parsed.bDirtyRoad = null;
		parsed.arrMarkerCaptions = null;
		parsed.arrMarkerTypes = null;
		parsed.arrMarkerXs = null;
		parsed.arrMarkerYs = null;
		parsed.trafficType = null;
		parsed.iCarOptim = null;

		for(var i=0; i<arrParams.length; i++)
		{
			var arrValues = arrParams[i].split('=');
			if(arrValues.length >= 2)
			{
				var strCommand = arrValues[0].toLowerCase();
				switch(strCommand)
				{
					case 'dx': parsed.dX = arrValues[1]; break;
					case 'dy': parsed.dY = arrValues[1]; break;
					case 'dradius': parsed.dRadius = arrValues[1]; break;
					case 'lang' : parsed.lang = arrValues[1]; break;
					case 'btoll': parsed.bToll = (parseInt(arrValues[1]) != 0 ? true : false); break;
					case 'bferry': parsed.bFerry = (parseInt(arrValues[1]) != 0 ? true : false); break;
					case 'bdirtyroad': parsed.bDirtyRoad = (parseInt(arrValues[1]) != 0 ? true : false); break;
					case 'arraddresses' : parsed.arrAddresses = arrValues[1].split('|'); break;
					case 'arrx' : parsed.arrX = arrValues[1].split('|'); break;
					case 'arry' : parsed.arrY = arrValues[1].split('|'); break;
					case 'strmarkercaptions' : parsed.arrMarkerCaptions = arrValues[1].split('|'); break;
					case 'strmarkertypes' : parsed.arrMarkerTypes = arrValues[1].split('|'); break;
					case 'dmarkerxs' : parsed.arrMarkerXs = arrValues[1].split('|'); break;
					case 'dmarkerys' : parsed.arrMarkerYs = arrValues[1].split('|'); break;
					case 'traffictype' : parsed.trafficType = arrValues[1]; break;
					case 'icaroptim' : parsed.iCarOptim = arrValues[1]; break;
				}
			}
		}
		
		return parsed;
	}

	/// protected:
	/// A SaveState altal kapott sztringbol visszaallitja a terkep allapotat
	// Ures sztringgel meghivva a kezdoallapotot tolti be

	this.LoadState = function(encStrState)
	{
		var strState = me.DecodeState(encStrState);
		// --------------------------------
		// Ures sztringre kezdoallapot
		if(strState.length < 1)
		{
			me.Reset();
			return;
		}

		var parsed = me.ParseState(strState);

		if (parsed.trafficType != null)
			me.pRouteSearch.SetTrafficType(parsed.trafficType);

		if (parsed.bToll != null)
			me.pRouteSearch.bUseTolledRoute = parsed.bToll;

		if (parsed.bFerry != null)
			me.pRouteSearch.bUseFerry = parsed.bFerry;

		if (parsed.bDirtyRoad != null)
			me.pRouteSearch.bUseDirtyRoad = parsed.bDirtyRoad;

		if (parsed.iCarOptim != null)
			me.pRouteSearch.iCarOptim = parsed.iCarOptim;

		if(parsed.dX!=null && parsed.dY != null)
			me.ZoomToPoint(parsed.dX, parsed.dY, parsed.dRadius);

		if(parsed.arrAddresses != null && parsed.arrAddresses.length > 0)
		{
			var myArr = new Array();
			for(var i=0; i<parsed.arrAddresses.length; i++)
			{
				myArr[i] = new CSimpleAddress();
				myArr[i].strAddress = decodeURIComponent(parsed.arrAddresses[i]);
				myArr[i].dX         = parsed.arrX[i];
				myArr[i].dY         = parsed.arrY[i];
			}
			me.pRouteSearch.SetAddressList(myArr);
			if(parsed.arrAddresses.length > 1)
				me.pRouteSearch.FindRoute(false);
			me.pRouteSearch.Show();
		}

		if(parsed.arrMarkerCaptions != null && parsed.arrMarkerCaptions.length > 0)
		{
			var myArr = new Array();
			for(var i=0; i<parsed.arrMarkerCaptions.length; i++)
			{
			    var address = new CSimpleAddress();				
				address.strAddress = parsed.arrMarkerCaptions[i];
				address.dX         = parsed.arrMarkerXs[i];
				address.dY         = parsed.arrMarkerYs[i];								
				me.AddMarker (address, parsed.arrMarkerTypes[i], 0, 0);
			}
		}										
	}
	
	
// address: CAddress	

	// original, it works
	this.AddMarker = function (address, type, iPixX, iPixY, divDetails)
	{        
		var	pin_css_class = "marker";
		if (me.iLabelDesignVersion == 2)
			pin_css_class = "marker_v2";
				
		var	pin_img_url = GetAbsUrl("images/mapctrl/marker.gif");
		if (me.iLabelDesignVersion == 2)
			pin_img_url = GetAbsUrl("images/label/f_7.png");
		
		if (type == "stop")
		{
			pin_img_url = GetAbsUrl("images/mapctrl/marked_red.gif");					
			if (me.iLabelDesignVersion == 2)
				pin_img_url = GetAbsUrl("images/label/f_2.png");
		}		
		
		else if (type == "start")
		{
			pin_img_url = GetAbsUrl("images/mapctrl/marked_green.gif");
			if (me.iLabelDesignVersion == 2)
				pin_img_url = GetAbsUrl("images/label/f_4.png");
		}
		
        var dX = address.dX;
        var dY = address.dY;
        var arrNames = null;
        var arrValues = null;
        var marker = new Marker(me, type, dX, dY, arrNames, arrValues);
        marker.SetProperty ("start_button", me.bLabelHasStartButton);
        marker.SetProperty ("through_button", me.bLabelHasThroughButton);
        marker.SetProperty ("stop_button", me.bLabelHasStopButton);
        marker.SetProperty ("panorama_button", me.bLabelHasPanoramaButton);
		marker.SetProperty ("pin_css_class", pin_css_class);
		marker.SetProperty ("div_label_sign_class","marker");
		marker.SetProperty ("pin_img_url", pin_img_url);
		marker.SetProperty ("pin_img_width", 27);
		marker.SetProperty ("pin_img_height", 27);
		
		if (me.iLabelDesignVersion == 2)
		{
			marker.SetProperty ("pin_img_refx", 11);
			marker.SetProperty ("pin_img_refy", 30);
			marker.SetProperty ("label_dx", 0);
			marker.SetProperty ("label_dy", -11);
			
		}
		else
		{
			marker.SetProperty ("pin_img_refx", 2);
			marker.SetProperty ("pin_img_refy", 14);
		}
		
		marker.SetProperty ("delete_marker_on_label_close", (type == "pick"));		
		marker.SetProperty ("fix_label_on_click", true);
		if ((address.strAddress != "") && (address.strAddress != undefined))
		{
			marker.SetProperty ("caption", address.strAddress); 
			marker.SetProperty ("Cím", address.strAddress); 
		}		
		if ((address.strName != "") && (address.strName != undefined))
		{
			marker.SetProperty ("caption", address.strName); 
			marker.SetProperty ("Név", address.strName); 
		}
			
		marker.SetProperty ("show_coordinates", me.bDisplayCoords);	
		
		var bDetails = !((divDetails == undefined) || (divDetails == null));
		marker.SetProperty ("handle_details", bDetails);
		if (bDetails)
			marker.SetProperty ("details_to_show", divDetails);
		
		marker.SetPixelCoordinates (iPixX, iPixY);

        me.pMarkers.Add (marker) ;    // pick, start, stop, through
        var label = me.CreatePinLabel (marker);
        label.DrawSign ();
        //label.DrawBox();	
        return marker;	
	}


	/// protected:
	/// Visszaallitja a terkep kezdoallapotat
	this.Reset = function()
	{
		if(me.pRouteSearch)
			me.pRouteSearch.SetAddressList(null);
			
        me.pMarkers.DeleteAll();		
		me.InciServer.CallFunction("DeleteRoute", "", 0, me.SetMapToDefaultLevelAndPosition());
	}


	/// protected:
	// Az adott allapothoz tartozo valtozokat adja vissza egy CMapData strukturaban
	this.GetMapData = function()
	{
		if(me.iActiveState >= 0)
			return me.arrStates[me.iActiveState];
		return null;
	}

	/// protected:
	// Pixel pontokat szamit at wgs koordinatara
	this.PixelToWgs = function(iX, iY)
	{
		var mapdata = me.arrStates[me.iActiveState];
		// A bejevo koordinatak a grid koordinata rendszereben ervenyesek
		// at kell oket szamitani a view koordinata rendszerere
		iX -= mapdata.iViewportOffsetX;
		iY -= mapdata.iViewportOffsetY;


		// Es akkor johet a terkepi koordinata transzformacio
		var wgsCoord = new CSimplePoi("", 0,0);
		wgsCoord.dX = mapdata.dMinX + (mapdata.dMaxX - mapdata.dMinX) * (iX / mapdata.iMapWidth);
		wgsCoord.dY = mapdata.dMaxY - (mapdata.dMaxY - mapdata.dMinY) * (iY / mapdata.iMapHeight); //Iranycsere WGS miatt!!!!
		return wgsCoord;
	}

	/// protected:
	// Egerkattintasra hivodik meg, pl. gombostu felvitelkor kell feluldefinialni
	this.OnPick = function(pickMode, iX, iY)
	{
	}

	/// private:
	this.AddToTrafficList = function(strAddress, dX, dY)
	{
		var address =  new CSimpleAddress(strAddress, dX, dY);
		me.pRouteSearch.pSearch.SetAddress(address);
		me.pRouteSearch.pSearch.Go();
	}

	/// private:
	this.Test = function (dZoomFactor, iBasePointX, iBasePointY)
	{
		if (me.bPreviewIsOn)
			this.pGridMain.ZoomPreview (dZoomFactor, iBasePointX, iBasePointY, 0, 0);
	}

	/// private:
	this.DrawLine = function ()
	{
		// abszolot pixelben a vagasi ablak
		var boxLeft = me.pGridMain.iLeft * me.GetMapGridItemWidth();
		var boxTop = me.pGridMain.iTop * me.GetMapGridItemHeight();
		var boxRight = boxLeft + me.pGridMain.iWidth * me.GetMapGridItemWidth();
		var boxBottom = boxTop + me.pGridMain.iHeight * me.GetMapGridItemHeight();

		if (me.polyline)
		{
			me.polyline.UnDraw();
			me.polyline.Draw (me.graphics, me.pixeldensity, boxTop, boxLeft, boxBottom, boxRight);
		}
	}

	/// private:
	// ============================================================================
	// ZOOM ANIMACIO BLOKKJA
	// ============================================================================

	/// private:
	this.CreateZoomAnim = function ()
	{
		me.animDiv = document.createElement ('div');
		me.animDiv.style.visibility = 'hidden';
		me.animDiv.className = 'anim_main';
		me.animDiv.style.top = 0;
		me.animDiv.style.left = 0;
		me.divFace.appendChild(me.animDiv);			

		var animtlDiv = document.createElement ('div');
		animtlDiv.className = 'anim_tl';
		var animtrDiv = document.createElement ('div');
		animtrDiv.className = 'anim_tr';
		var animblDiv = document.createElement ('div');
		animblDiv.className = 'anim_bl';
		var animbrDiv = document.createElement ('div');
		animbrDiv.className = 'anim_br';

		me.animDiv.appendChild(animtlDiv);
		me.animDiv.appendChild(animtrDiv);
		me.animDiv.appendChild(animblDiv);
		me.animDiv.appendChild(animbrDiv);		
	}

	/// private:
	this.ShowZoomAnimation = function (iOy, iOx, bIn)
	{
		var border = 3;
		if (me.animDiv != null)
		{
			if (!bIn)
			{
				me.animDiv.style.height = "160px";
				me.animDiv.style.width = "160px";
				me.animDiv.style.top = (iOy - /*GetLayerHeight(me.animDiv)*/ 160 / 2 - border) + "px";
				me.animDiv.style.left = (iOx - /*GetLayerWidth(me.animDiv)*/ 160 / 2 - border) + "px";
				me.animDiv.style.visibility = 'visible';
				window.setTimeout(me.TestAnimPhasesIn,100);
			}
			else
			{
				me.animDiv.style.height = "40px";
				me.animDiv.style.width = "40px";
				me.animDiv.style.top = (iOy - /*GetLayerHeight(me.animDiv)*/ 40 / 2 - border) + "px";
				me.animDiv.style.left = (iOx - /*GetLayerWidth(me.animDiv)*/ 40 / 2 - border) + "px";
				me.animDiv.style.visibility = 'visible';
				window.setTimeout(me.TestAnimPhasesOut,50);
			}
		}
	}

	/// private:
	this.TestAnimPhasesIn = function ()
	{
		var step = 25;
		if (GetLayerWidth(me.animDiv) > 40)
		{
			var lw = GetLayerWidth (me.animDiv);
			var lh = GetLayerHeight (me.animDiv);
		
			me.animDiv.style.visibility = 'hidden';
			var iOx =  GetLayerLeft(me.animDiv) + lw / 2;
			var iOy =  GetLayerTop(me.animDiv) + lh / 2;
			me.animDiv.style.height = (lh - step) + "px";
			me.animDiv.style.width = (lw - step) + "px";
			me.animDiv.style.top = (iOy - (lh - step) / 2) + "px";
			me.animDiv.style.left = (iOx - (lw - step) / 2) + "px";
			me.animDiv.style.visibility = 'visible';
			window.setTimeout(me.TestAnimPhasesIn,70);
		}
		else
		{
			me.animDiv.style.visibility = 'hidden';
		}
	}

	/// private:
	this.TestAnimPhasesOut = function ()
	{
		var step = 25;
		if (GetLayerWidth(me.animDiv) < 160)
		{
			var lw = GetLayerWidth (me.animDiv);
			var lh = GetLayerHeight (me.animDiv);
		
			me.animDiv.style.visibility = 'hidden';
			var iOx =  GetLayerLeft(me.animDiv) + lw / 2;
			var iOy =  GetLayerTop(me.animDiv) + lh / 2;
			me.animDiv.style.height = (lh + step) + "px";
			me.animDiv.style.width = (lw + step) + "px";
			me.animDiv.style.top = (iOy - (lw + step) / 2) + "px";
			me.animDiv.style.left = (iOx - (lh + step) / 2) + "px";
			me.animDiv.style.visibility = 'visible';
			window.setTimeout(me.TestAnimPhasesOut,70);
		}
		else
		{
			me.animDiv.style.visibility = 'hidden';
		}
	}

	// ============================================================================
	// MERETARANY MUTATO
	// ============================================================================

	this.bShowMeterPerPixel = false;
	/// private:
	this.CreateRatioMeter = function (bShowMeterPerPixel)
	{
		me.bShowMeterPerPixel = bShowMeterPerPixel;
		
		me.ratiometerDiv = document.createElement ('div');
		me.ratiometerDiv.style.visibility = 'visible';
		me.ratiometerDiv.className = 'ratiometer';

		me.divMap.appendChild(me.ratiometerDiv);
		setAlpha(".ratiometer");

		var ratiometerrightborderDiv = document.createElement ('div');
		ratiometerrightborderDiv.className = 'ratiometerrightborder';
		me.ratiometerDiv.appendChild(ratiometerrightborderDiv);

		var ratiometerleftborderDiv = document.createElement ('div');
		ratiometerleftborderDiv.className = 'ratiometerleftborder';
		me.ratiometerDiv.appendChild(ratiometerleftborderDiv);

		SetOpac(me.ratiometerDiv, 85);
		NewTag("span", me.ratiometerDiv);
	}


	/// private:
	this.RearrangeRatioMeter = function ()
	{
		var avgPixel = 100;
		var minPixel = 70;

		var iMeterPerPixel = me.GetPixelDensity ();

		// 100 px ennyi meter
		var pre_realsize = avgPixel * iMeterPerPixel;
		var pixelsize = avgPixel;

		var lg = 1;

		while (pre_realsize > 100)
		{
			pre_realsize = pre_realsize / 10;
			lg = lg * 10;
		}

		var realsize = 0;
		if (pre_realsize < (10 + 30) / 2)
			realsize = 10;
		else if (pre_realsize < (30 + 40) / 2)
			realsize = 30;
		else if (pre_realsize < (40 + 50) / 2)
			realsize = 40;
		else if (pre_realsize < (50 + 80) / 2)
			realsize = 50;
		else if (pre_realsize < (80 + 100) / 2)
			realsize = 80;
		else 
			realsize = 100;

		pixelsize = realsize / pre_realsize * pixelsize;

		if (pixelsize < minPixel)
		{
			pixelsize = 2 * pixelsize;
			realsize = 2 * realsize;
		}

		var unit = "";
		if (realsize * lg >= 1000)
		{
			realsize = realsize * lg / 1000;
			unit = "km";
		}
		else
		{
			realsize = realsize * lg;
			unit = "m";
		}

		if (me.ratiometerDiv)
		{
			me.ratiometerDiv.style.width = (pixelsize) + "px";
			var span = me.ratiometerDiv.lastChild;
			while(span.firstChild)
				span.removeChild(span.firstChild)
			NewTextTag((realsize) + " " + unit, span);
			if(me.bShowMeterPerPixel)
			{
				NewTag('br', span);
				NewTextTag(" (" + iMeterPerPixel + " m/px)", span);
			}
			
		}
	}

	/// private:
	this.CreateMapCaption = function ()
	{
		var div = NewTag('div');
		div.className = 'UI_mapcaption_container';
		me.divMapCaption = NewTag ('div', div);
		me.divMapCaption.className = 'UI_mapcaption';
		setAlpha(".UI_mapcaption");
		SetOpac(me.divMapCaption, 85);
		AddTag (div, me.divMap, me.divFace);
	}
	
	this.CreateCopyrightLabel = function ()
	{
		if (me.strCopyrightText != "")
		{
			var div = NewTag('div');
			div.className = 'UI_copyrightcaption_container';
			me.divMapCopyright = NewTag ('div', div);
			me.divMapCopyright.className = 'UI_copyrightcaption';			
			setAlpha(".UI_copyrightcaption");
			SetOpac(me.divMapCopyright, 85);
			AddTag (div, me.divMap, me.divFace);		
			NewTextTag(me.strCopyrightText, me.divMapCopyright);
		}
	}

	/// private:
	this.OnStateChanged = function (sLastRasterMapData, iPixelDeltaX, iPixelDeltaY, caption)
	{
	    if ((caption==null) || (caption==undefined))
	        caption = "";
	        
		var mapdata = null;
		if(sLastRasterMapData)
		{
			mapdata = new CMapData();
			mapdata.strCaption = sLastRasterMapData.strCaption;
			mapdata.iMapWidth  = me.GetMapViewWidth();
			mapdata.iMapHeight = me.GetMapViewHeight();

			mapdata.dCenterX = sLastRasterMapData.dCenterX;
			mapdata.dCenterY = sLastRasterMapData.dCenterY;
			mapdata.dRadius  = sLastRasterMapData.dMinRadius;

			mapdata.dMinX = sLastRasterMapData.dViewportLowerLeftX;
			mapdata.dMinY = sLastRasterMapData.dViewportLowerLeftY;
			mapdata.dMaxX = sLastRasterMapData.dViewportUpperRightX;
			mapdata.dMaxY = sLastRasterMapData.dViewportUpperRightY;

			mapdata.dGridMinX = sLastRasterMapData.dGridLowerLeftX;
			mapdata.dGridMinY = sLastRasterMapData.dGridLowerLeftY;
			mapdata.dGridMaxX = sLastRasterMapData.dGridUpperRightX;
			mapdata.dGridMaxY = sLastRasterMapData.dGridUpperRightY;

			mapdata.dMeterPerPixelX = mapdata.dMeterPerPixelY = me.GetPixelDensityFromLevel (sLastRasterMapData.iLevel);

			mapdata.iViewportOffsetX = sLastRasterMapData.iViewportOffsetX;
			mapdata.iViewportOffsetY = sLastRasterMapData.iViewportOffsetY;

		}
		else // Ha nem volt szerveroldali letoltes, akkor az elozo mapdatat vegyuk alapul
		{
			if(me.iActiveState < 0 || me.arrStates.length < me.iActiveState || me.arrStates[me.iActiveState] == null)
				return;
			mapdata = new CMapData();
			mapdata.strCaption  = caption;
			mapdata.iMapWidth   = me.arrStates[me.iActiveState].iMapWidth;
			mapdata.iMapHeight  = me.arrStates[me.iActiveState].iMapHeight;

			mapdata.dCenterX    = me.arrStates[me.iActiveState].dCenterX;
			mapdata.dCenterY    = me.arrStates[me.iActiveState].dCenterY;
			mapdata.dRadius     = me.arrStates[me.iActiveState].dRadius;

			mapdata.dMinX = me.arrStates[me.iActiveState].dMinX;
			mapdata.dMinY = me.arrStates[me.iActiveState].dMinY;
			mapdata.dMaxX = me.arrStates[me.iActiveState].dMaxX;
			mapdata.dMaxY = me.arrStates[me.iActiveState].dMaxY;

			mapdata.dGridMinX = me.arrStates[me.iActiveState].dGridMinX;
			mapdata.dGridMinY = me.arrStates[me.iActiveState].dGridMinY;
			mapdata.dGridMaxX = me.arrStates[me.iActiveState].dGridMaxX;
			mapdata.dGridMaxY = me.arrStates[me.iActiveState].dGridMaxY;

			mapdata.dMeterPerPixelX = me.arrStates[me.iActiveState].dMeterPerPixelX;
			mapdata.dMeterPerPixelY = me.arrStates[me.iActiveState].dMeterPerPixelY;

			mapdata.iViewportOffsetX = me.arrStates[me.iActiveState].iViewportOffsetX;
			mapdata.iViewportOffsetY = me.arrStates[me.iActiveState].iViewportOffsetY;
		}

		if(iPixelDeltaX != 0 || iPixelDeltaY != 0)
		{
			var dOffsetX = (mapdata.dMaxX - mapdata.dMinX) * iPixelDeltaX / mapdata.iMapWidth;
			var dOffsetY = (mapdata.dMaxY - mapdata.dMinY) * iPixelDeltaY / mapdata.iMapHeight;

			mapdata.dCenterX += dOffsetX;
			mapdata.dCenterY += dOffsetY;
			mapdata.dMinX    += dOffsetX;
			mapdata.dMinY    += dOffsetY;
			mapdata.dMaxX    += dOffsetX;
			mapdata.dMaxY    += dOffsetY;

			mapdata.dGridMinX += dOffsetX;
			mapdata.dGridMinY += dOffsetY;
			mapdata.dGridMaxX += dOffsetX;
			mapdata.dGridMaxY += dOffsetY;

			mapdata.iViewportOffsetX = me.pGridMain.iMapViewVectorX;
			mapdata.iViewportOffsetY = me.pGridMain.iMapViewVectorY;
		}

		// Ha ugyanaz az allapot, mint az aktualis, akkor undo vagy redo tortent, es nem kell uj allapotbejegyzes
		if (!me.bSkipNextStateChange) 
		{
			me.arrStates[++me.iActiveState] = mapdata;
			// Ha undok utan indult masmerre, akkor meg lehetnek utana allapotok, amiket most torlunk
			var i;
			for(i=me.iActiveState+1; i<me.arrStates.length; i++)
			{
				me.arrStates[i] = null;
			}
		}
		me.bSkipNextStateChange = false;
		if(me.OnMapStateChanged)
		{
			try {
				me.OnMapStateChanged();
			}
			catch(exp)
			{
				if(me.OnError)
					me.OnError(exp,'CTopoliszMap.OnMapStateChanged');
			}
		}	
		WaCount();
		window.status = mapdata.dMeterPerPixelX;
	}
	
	// public:
	// Terkepi allapot valtozasakor hivodik meg
	this.OnMapStateChanged = function()
	{
	}

	/// protected:
	/// Elozo terkepi allapot visszaallitasa
	this.Undo = function()
	{
		if(me.iActiveState > 0)
		{
			var mapdata = me.arrStates[--me.iActiveState];
			if(mapdata)
			{
				me.bSkipNextStateChange = true;
				me.ZoomToRect(mapdata.dMinX, mapdata.dMinY, mapdata.dMaxX, mapdata.dMaxY);
			}
		}
	}

	/// protected:
	/// Undo megse
	this.Redo = function()
	{
		if(me.iActiveState < GetArrayLength(me.arrStates))
		{
			var mapdata = me.arrStates[++me.iActiveState];
			if(mapdata)
			{
				me.bSkipNextStateChange = true;
				me.ZoomToRect(mapdata.dMinX, mapdata.dMinY, mapdata.dMaxX, mapdata.dMaxY);
			}
		}
	}

	/// private:
	// tavolsagmeres
	this.OnOffMeasureDistance = function (sSrc)
	{
		if (me.bDistanceMeasuring == false)
		{
			me.bDistanceMeasuring = true;
			me.SetVisibilityBorders (me.pGridMain.bCanMoveX, me.pGridMain.bCanMoveY);
			me.pDistancePoly.Init();
			me.DistMeter.Init ();

			me.pDistanceDisplay = new DistanceDisplay(me);
			me.DistMeter.onMove = me.pDistanceDisplay.Move;	
			me.DistMeter.DisplayLength = me.pDistanceDisplay.DisplayLength;
			me.DistMeter.onClose = function() {{ me.pDistanceDisplay.Close(); }}
			if(me.pMapPalette)
				SetImage(me.pMapPalette.imgDistanceMeasure, GetAbsUrl("design/ICON_measure_off.gif"), 17, 17, "Distance");
		}
		else
		{
			if ((sSrc != "button" && sSrc != "key"))
			{
				var x = me.iMousePosX;
				var y = me.iMousePosY;
				x -= GetLayerLeft (me.pGridMain.mainGridDiv) + me.iMapDivBorderWidth;
				y -= GetLayerTop (me.pGridMain.mainGridDiv) + me.iMapDivBorderWidth;

				// x,y a kattintas helye grid koordinatakban
				me.DrawDistMeasure(x, y);
			}
			else
			{
				me.DistMeter.ClearRubberLine ();
				me.DistMeter.ClearCursors ();
			}

			if (me.pDistanceDisplay)
			{
				//me.pDistanceDisplay.displayLastDist.lastChild.nodeValue = 0;
				me.pDistanceDisplay.distTr.style.display = "none";
				me.pDistanceDisplay.exitTr.style.display = "none";
			}

			me.bDistanceMeasuring = false;
			me.SetVisibilityBorders (me.pGridMain.bCanMoveX, me.pGridMain.bCanMoveY);
			//SetOpac(me.pGridMain.mainGridDiv, 99);
			SetOpac(me.pGridMain.mainGridDistMeasureImageDiv, 99);

			var i;
			for (i = 0; i < 80; i++)
			{
				window.setTimeout(me.OpacityGame, i * 40);
			}

			window.setTimeout(me.OffMeasureDistance, 3500);
		}
	}

	/// private:
	this.BlinkDistance = function ()
	{
		if (me.pGridMain.mainGridDiv.style.visibility == "visible")
		{
			me.pGridMain.mainGridDiv.style.visibility = "hidden";
		}
		else
		{
			me.pGridMain.mainGridDiv.style.visibility = "visible";
		}
	}

	/// private:
	this.OpacityGame = function () 
	{
		var o = GetOpac (me.pGridMain.mainGridDistMeasureImageDiv);

		// paros
		if (Math.floor (o/2) == Math.ceil(o/2))
		{
			o = o + 10;
		}
		else
		{
			o = o - 10;
		}

		if (o < 0) o = 0;
		if (o > 100) o = 99;

		SetOpac(me.pGridMain.mainGridDistMeasureImageDiv, o);
	}

	/// private:
	this.OffMeasureDistance = function ()
	{
		SetOpac(me.pGridMain.mainGridDistMeasureImageDiv, 100);
		//SetOpac(me.pGridMain.mainGridImageDiv, 100);
		me.bDistanceMeasuring = false;
		me.DistMeter.Close ();
		if(me.pMapPalette)
			SetImage(me.pMapPalette.imgDistanceMeasure, GetAbsUrl("design/ICON_measure_on.gif"), 17, 17, "Distance");
		me.pDistancePoly.Init ();
		
		me.pGridMain.mainGridDistMeasureImageDiv.style.visibility = "hidden";
		me.pGridMain.SetMainGridDistMeasureImage (null);
		//me.DrawRoute ();				
	}

	this.IsMiniMapVisible = function()
	{
		return me.pConnectedMiniMap != null && me.bMiniMapVisible;
	}

	// Show/hide minimap
	/// protected:
	/// Elrejti a kisterkepet.	
	this.HideMiniMap = function ()
	{
		if (me.pConnectedMiniMap != null)
		{
			me.pConnectedMiniMap.divMap.style.display = "none";
			
			/*
			// rejtelyes okbol kulon be kell allitani
			if (me.pConnectedMiniMap.pGridMain)
			{
				me.pConnectedMiniMap.pGridMain.mainGridDiv.style.visibility = "hidden";			
				me.pConnectedMiniMap.pGridMain.mainGridImageDiv.style.visibility = "hidden";
			}
			*/
	

			me.pConnectedMiniMap.SetVisibilityBorders (false, false);
			me.bMiniMapVisible = false;

			if (me.pConnectedMiniMap.pGridMain)
				me.pConnectedMiniMap.pGridMain.RemoveZoomPreview();
		}
		if(me.OnHideMiniMap)
		{
			try {
				me.OnHideMiniMap();
			}
			catch (exp) {
				if(me.OnError)
					me.OnError(exp,'CTopoliszMap.OnHideMiniMap');
			}
		}

	}
	
	this.CreateMiniMap = function()
	{
		var divMiniMap = NewTag("div");
		var strMiniMapId = me.divMap.id + "mm";
		AddTag(divMiniMap, me.divMap);
		divMiniMap.setAttribute ("id",strMiniMapId);
		divMiniMap.className = "minimap";
		me.pConnectedMiniMap = new CTopoliszMap(me.strSessionID, divMiniMap, false);
		me.pConnectedMiniMap.bDrawTMC = false;
		me.pConnectedMiniMap.strRole = "minimap";
		me.pConnectedMiniMap.Init();
		me.pConnectedMiniMap.SetAsMiniMap (me);
		me.pConnectedMiniMap.pMiniMapFrame = new CMiniMapFrame (me, me.pConnectedMiniMap);
		//me.HideMiniMap();
	}

	/// protected:
	/// Megjeleniti a kisterkepet.	
	/// Csak az InitGrid () utan hivhato es ertelemszeruen csak akkor 
	/// van hatasa, ha a Map-et ugy hoztuk letre, hogy van MiniMap-ja
	/// (ez konstruktor parameter)
	this.ShowMiniMap = function ()
	{
		if (me.pConnectedMiniMap == null)
		{
			me.CreateMiniMap();
		}
		if (me.pConnectedMiniMap != null)
		{
			me.bMiniMapVisible = true;
			me.ZoomMiniMapSync (me.GetPixelDensity(), 0, 0, false);
			me.pConnectedMiniMap.divMap.style.display="";						
			
			if (me.pMapPalette != null)
				SetImage(me.pMapPalette.imgMiniMap, "images/mapctrl/hideminimap_utvonalterv.png", 14, 14, "");
				
			if(me.OnShowMiniMap)
			{
				try {
					me.OnShowMiniMap();
				}
				catch (exp) {
					if(me.OnError)
						me.OnError(exp,'CTopoliszMap.OnShowMiniMap');
				}
			}
		}
	}
	
	// private:
	// Kisterkep megjelenitesekor hivodik meg.
	this.OnShowMiniMap = null;
	
		// private:
	// Kisterkep eltunesekor hivodik meg.
	this.OnHideMiniMap = null;


	/// private:
	this.OnKeyDown = function (pEvent)
	{
		if (me.bDistanceMeasuring == true)
		{
			me.OnOffMeasureDistance ("key");
		}
	}

	// =====================================================================
	// ADDRESS LABELek es MARKERek kezelese
	// =====================================================================	

	this.OnRouteChanged = function (sAddress)
	{
	}


    this.OnNewFoundAddress = function (sAddress)
    {
			// toroljuk az osszes cimkereses markert es a hozza tartozo labelt is!	
            //me.pMarkers.DeleteAllWithType("searching");
            me.pMarkers.DeleteAll();

            // Ha a talalatnak nincs cime, akkor javitjuk a megjelenitest

			if (sAddress.strAddress == "")
				sAddress.strAddress = "< ??? >";            
            
            // a markerekhez hozzaadjuk az uj cimkereses markert
            var pMarker = me.AddMarker (sAddress, "searching", 0, 0);
            
            // letrehozzuk az uj labelt            
            var label = me.CreatePinLabel (pMarker);                            
            
            // nem jelenitjuk meg meg, mert a koordinatak ebben a pillanatban
            // meg nem helyesek, de a Search-et koveto zoomolas ezt korrigalja
                        
            label.DrawSign ();      
            label.Hide ();      
    }			

	this.OnNewPickedAddress = function (sAddress, iPickPointX, iPickPointY, strMarkerClass)
	{
			me.pMarkers.DeleteAllWithType(strMarkerClass);
			var marker = me.AddMarker (sAddress, strMarkerClass, iPickPointX, iPickPointY);
			
			marker.pLabel.DrawBox();
			me.OnLabelSignClick (marker); //as if clicked on it
	}

	// =====================================================================
	// PIN LABEL
	// =====================================================================	

	this.PreLabelCreate = null; // function(pLabel){};
	this.OnLabelCreate = null; // function(pLabel){};


	this.CreatePinLabel = function (pMarker)
	{
		var label = new PinLabel(me, pMarker);
		me.pLabels[me.pLabels.length] = label;
		pMarker.pLabel = label;
		return label;
	}

	/// private:
	this.RemovePinLabels = function  (mainType)
	{
		var i;
		for (i = 0; i <  me.pLabels.length; i++)
		{
			var al = me.pLabels[i];

			if (al != null)
			{
				if ((al.pMarker.mainType == mainType) || (mainType == null) || (mainType == undefined))
				{
					al.Delete ();
					delete al;
					me.pLabels[i] = null;
				}
			}
		}
	}

	/// private:
	this.RemovePinLabelsSpec = function  () // in case of zooming, moving map
	{
		var i;
		for (i = 0; i <  me.pLabels.length; i++)
		{
			var al = me.pLabels[i];
			if (al != null)
			{								
				al.RemoveSign ();
				al.DestroyDivLabelBox ();
				al.pMarker.pLabel = null;					
				delete al;
				me.pLabels[i] = null;
			}
		}
	}
	
	this.RemovePinLabelsExclusive = function (mainType)
	{
		var i;
		for (i = 0; i <  me.pLabels.length; i++)
		{
			var al = me.pLabels[i];

			if (al != null)
			{
				if (al.pMarker.mainType != mainType)
				{
					al.Delete ();
					delete al;
					me.pLabels[i] = null;
				}
			}
		}	
	}	
	
	this.RemovePinLabelsExclusiveMulti = function (typelist)
	{
		var i;
		for (i = 0; i <  me.pLabels.length; i++)
		{
			var al = me.pLabels[i];
			if (al != null)
			{
				var j;
				var bNotInList = true;
				for (j = 0; j < typelist.length; j++)
				{
					if (typelist[j] == al.pMarker.mainType)
					{
						bNotInList = false;
						break;
					}
				}
			
				if (bNotInList)
				{
					al.Delete ();
					delete al;
					me.pLabels[i] = null;
				}
			}
		}	
	}		

	// you can set the labels behaviour here:
	
	this.OnPinLabelBoxCreated = function (pMarker)
	{		
		if (pMarker != me.pFixedMarker)
		{
			if (me.pFixedMarker != null)
			{
				if (me.pFixedMarker.pLabel != null)
					me.pFixedMarker.pLabel.RemoveBox();
				me.pFixedMarker = null;
			}
		}
	}
			
	this.OnPinLabelBoxDestroyed = function (pMarker)
	{
		if (me.pFixedMarker == pMarker)
			me.pFixedMarker = null;
	}			
			
	// helyesen: LabelSign And LabelBox mouse out 
	this.OnLabelSignMouseOut = function (pMarker)
	{		
		if (pMarker != me.pFixedMarker)
			pMarker.pLabel.RemoveBox();
	}

	this.OnLabelSignMouseOver = function (pMarker)
	{	
		if (me.pFixedMarker == null) 
		{
			me.RemovePinBoxes();
			if (pMarker.pLabel)		
			{	
				if (pMarker.bMouseOverEnabled)
					pMarker.pLabel.DrawBox (); 			
			}
		}
	}	
	
	this.OnLabelSignClick = function (pMarker)
	{	
		if (me.pFixedMarker != pMarker)
		// van a fixált markertől különböző marker
		{
			if (me.pFixedMarker != null)
			{
				if (me.pFixedMarker.pLabel)
					me.pFixedMarker.pLabel.RemoveBox();
				me.pFixedMarker = null;	
			}
			if (pMarker.GetProperty("fix_label_on_click"))
			{
				me.pFixedMarker = pMarker;			
				var ServerID = pMarker.GetProperty ("get_wgs_from_server");
				if (ServerID != "???")
					me.iMustVisibleMarkerSID = ServerID;							
			}
			if (pMarker.pLabel)
				pMarker.pLabel.DrawBox();
		}
	}	
	
	this.VehicleTypeIsTrain = function (id)
	{
		if (id >= 13) 
			return true;
		else	
			return false;
	}
	
	this.MarkerDataArrived = function (data, pMarker)
	{
		if (data == null)
		{
			alert("Nincs megállóhely adat!");
			return;
		}
		
		var PTDataDrawer = function (div)
		{									
			var domTable = NewTag ("table", div);
			domTable.className = "ptstops";
			var domTableBody = NewTag ("tbody", domTable);															
						
			var bContainsAnyValidName = false;
			var bContainsAnyValidDescription = false;
			var bContainsAnyValidVehicleType = false;
			
			var arrTDNames = new Array();
			var arrTDDescriptions = new Array();
			var arrTDVehicleTypes = new Array();
			
			// TABLE HEADER			
			var domTableRow = NewTag ("tr", domTableBody);				
			var	domTableData_Name = NewTag ("th", domTableRow); arrTDNames.push(domTableData_Name);
				//domTableData_Name.style.textDecoration = "underline";			
				domTableData_Name.style.paddingBottom = "6px";
			var	domTableData_Description = NewTag ("th", domTableRow); arrTDDescriptions.push(domTableData_Description);
				//domTableData_Description.style.textDecoration = "underline";			
				domTableData_Description.style.paddingBottom = "6px";
			var	domTableData_VehicleType = NewTag ("th", domTableRow); arrTDVehicleTypes.push(domTableData_VehicleType);
				//domTableData_VehicleType.style.textDecoration = "underline";			
				domTableData_VehicleType.style.paddingBottom = "6px";
			var	domTableData_Link = NewTag ("th", domTableRow);
				//domTableData_Link.style.textDecoration = "underline";			
				domTableData_Link.style.paddingBottom = "6px";
			
			NewTextTag (g_Babel.GetWord('capPTStop_run'), domTableData_Name);
			NewTextTag (g_Babel.GetWord('capPTStop_name'), domTableData_Description);
			NewTextTag (g_Babel.GetWord('capPTStop_type'), domTableData_VehicleType);
			NewTextTag ("", domTableData_Link);
			
			// TABLE CONTENT
			var i = 0;
			var bTooMany = false;			
			for (i = 0; i < data.arrRuns.length; i++)
			{
				domTableRow = NewTag ("tr", domTableBody);				
				domTableData_Name = NewTag ("td", domTableRow); arrTDNames.push(domTableData_Name);
				domTableData_Description = NewTag ("td", domTableRow); arrTDDescriptions.push(domTableData_Description);
				domTableData_VehicleType = NewTag ("td", domTableRow); arrTDVehicleTypes.push(domTableData_VehicleType);
				domTableData_Link = NewTag ("td", domTableRow);							
				
				var runitem = data.arrRuns[i];				
				var bIsTrain = me.VehicleTypeIsTrain (runitem.iVehicleTypeID);
					
				if (runitem.bShowName && !bIsTrain)	
				{	
					var spanName = NewTag ("span", domTableData_Name);
					if (runitem.strName != "") bContainsAnyValidName = true;
					spanName.className = runitem.strClass;
					NewTextTag (runitem.strName, spanName);
				}							
				
				if (runitem.bShowDescription)		
				{
					if (runitem.strDescription != "") bContainsAnyValidDescription = true;
					var divDescription = NewTag ("div", domTableData_Description);
					divDescription.style.whiteSpace = "nowrap";
					NewTextTag (runitem.strDescription, divDescription);				
				}
					
				if (bIsTrain)
				{
					var divVehicleType = NewTag ("div", domTableData_VehicleType);
					divVehicleType.style.whiteSpace = "nowrap";
					NewTextTag (runitem.strVehicleType, divVehicleType);				
					bContainsAnyValidVehicleType = true;			
				}
				
				// per item link
				if (runitem.strLink != "")
				{
					var divLink = NewTag ("div", domTableData_Link);
					var aLink = NewTag ("a", divLink);				
					divLink.onclick = function (pEvent) {StopEventPropagation (pEvent); return false;}					
					aLink.setAttribute("href", "javascript:void(0)");					
					aLink.myhref = runitem.strLink;
					aLink.onclick = function ()
					{						
						if (me.pLastMouseOverPin != null)
						{
							if (me.pLastMouseOverPin.pLabel != null)
							{
								me.pLastMouseOverPin.pLabel.RemoveBox();
							}						
						}
						window.open(this.myhref);
					}
													
					aLink.style.whiteSpace = "nowrap";												
					NewTextTag (g_Babel.GetWord('capPTStop_schedule'), aLink);		
				}
																								
				if (i > 10)
				{
					bTooMany = true;
					break;
				}
			}
			
			if (bTooMany == true)
			{	
				var toomanyDiv = NewTag("div", div);
				toomanyDiv.style.paddingLeft = "12px";
				NewTextTag ("...", toomanyDiv);
			}			
			
			if (bContainsAnyValidName == false)
			{
				var i = 0;
				for (i = 0; i < arrTDNames.length; i++)
				{
					arrTDNames[i].style.display = "none";
				}
			}

			if (bContainsAnyValidDescription == false)
			{
				var i = 0;
				for (i = 0; i < arrTDDescriptions.length; i++)
				{
					arrTDDescriptions[i].style.display = "none";
				}
			}
			
			if (bContainsAnyValidVehicleType == false)
			{
				var i = 0;
				for (i = 0; i < arrTDVehicleTypes.length; i++)
				{
					arrTDVehicleTypes[i].style.display = "none";
				}
			}


			
			// loc link
			if (data.strLink != "")
			{
			
				var divLocLink = NewTag ("div", div);
				var aLocLink = NewTag ("a", divLocLink);				
				divLocLink.onclick = function (pEvent) {StopEventPropagation (pEvent); return false;}
				
				aLocLink.style.display = "block";
				aLocLink.style.padding = "12px";
				aLocLink.style.paddingTop = "3px";
				aLocLink.style.color = "blue";
				aLocLink.setAttribute("href", "javascript:void(0)");				
				aLocLink.onclick = function ()
				{						
					if (me.pLastMouseOverPin != null)
					{
						if (me.pLastMouseOverPin.pLabel != null)
						{
							me.pLastMouseOverPin.pLabel.RemoveBox();
						}						
					}
					window.open(data.strLink);
				}
												
																			
				aLocLink.style.whiteSpace = "nowrap";												
				NewTextTag (g_Babel.GetWord('capPTStop_stationschedule'), aLocLink);					
			}
			
		}
		
		if ((data.strName != null) && (data.strName != undefined))
		{
			var strCaption = data.strName;
			var pMapData = me.GetMapData();
			if(data.strCity != null && data.strCity != "" && strCaption.indexOf(data.strCity) < 0 && pMapData.strCaption.indexOf(data.strCity) < 0)
			{
				strCaption = data.strCity + " " + strCaption;
			}
			pMarker.SetProperty ("caption", strCaption);
		}
		pMarker.DrawBoxContentData = PTDataDrawer;
		pMarker.bContentLoaded = true;
		if (pMarker.pLabel != null)
			pMarker.pLabel.DrawBox_Default ();
	}
	
				
	// until this line
												
	this.RemovePinBoxes = function (mainType)
	{
		if (me.pMarkers != null)
		{
			var i;
			for (i = 0; i < me.pMarkers.arrMarkers.length; i++)
			{
				var m = me.pMarkers.arrMarkers[i];
				if (m != null)
				{
					if ((mainType == undefined) || (mainType == null) || (mainType == m.mainType))
					{
						var al = m.pLabel;
						if (al != null)
							al.RemoveBox ();
					}
				}
			}
		}	
	}
	
		
	this.RemovePinBoxesExclusive = function  (mainType)
	{
		if (me.pLabels != null)
		{
			var i;
			for (i = 0; i <  me.pLabels.length; i++)
			{
				var al = me.pLabels[i];
				if (al != null)
				{
					if (mainType != al.pMarker.mainType)
						al.RemoveBox ();
				}
			}
		}
	}

	this.RemovePinBoxesExclusiveMulti = function  (typelist)
	{
		if (me.pLabels != null)
		{
			var i;
			for (i = 0; i <  me.pLabels.length; i++)
			{
				var al = me.pLabels[i];
				if (al != null)
				{
					var j;
					var bNotInList = true;
					for (j = 0; j < typelist.length; j++)
					{
						if (typelist[j] == al.pMarker.mainType)
						{
							bNotInList = false;
							break;
						}
					}
								
					if (bNotInList)
						al.RemoveBox ();
				}
			}
		}
	}
		
	this.RemoveLayerPOIBoxes = function ()
	{
		if (typeof(g_TopoliszControls) != "undefined" && g_TopoliszControls && g_TopoliszControls.pExtraInfo && g_TopoliszControls.pExtraInfo.pPoiBox)
			g_TopoliszControls.pExtraInfo.pPoiBox.DeselectPOI ();
	}
		
	/// private:	
	this.RearrangeLabels = function ()
	{
		var i;
		for (i = 0; i <  me.pLabels.length; i++)
		{
			var al = me.pLabels[i];

			if (al != null)
			{
				al.ReArrange ();
			}
		}
	}
	

	
	/// private:
	
	this.RearrangePois = function  ()
	{
		if (me.divPoiParent)
		{
			me.divPoiParent.style.left = -me.pGridMain.GetMapViewVectorX() + "px";
			me.divPoiParent.style.top = -me.pGridMain.GetMapViewVectorY() + "px";	
		}
	}

	this.HidePois = function  ()
	{
		if (me.divPoiParent)
		{
			me.divPoiParent.style.visibility = "hidden";
		}
	}

	this.ShowPois = function  ()
	{
		if (me.divPoiParent)
		{
			me.divPoiParent.style.visibility = "visible";
		}
	}


	/// private:
	this.ShowPinLabels = function  (mainType)
	{		
		var i;
		for (i = 0; i <  me.pLabels.length; i++)
		{
			var al = me.pLabels[i];

			if (al != null)
			{
				if ((mainType == undefined) || (mainType == null) || (mainType == al.pMarker.mainType))
				{
					al.Show ();
				}
			}
		}
	}

	this.ShowPinLabelsMulti = function (typelist)
	{
		var i;
		for (i = 0; i < typelist.length; i++)
			me.ShowPinLabels (typelist[i]);
	}

	/// private:
	this.HidePinLabels = function  (mainType)
	{
		var i;
		for (i = 0; i <  me.pLabels.length; i++)
		{
			var al = me.pLabels[i];

			if (al != null)
			{
				if ((mainType == undefined) || (mainType == null) || (mainType == al.pMarker.mainType))
				{
					al.Hide ();
				}
			}
		}
	}

	this.HidePinLabelsMulti = function (typelist)
	{
		var i;
		for (i = 0; i < typelist.length; i++)
			me.HidePinLabels (typelist[i]);
	}


	this.SetDisplayCoords = function (bEnable)
	{
		me.bDisplayCoords = bEnable;
		setCookie('bDisplayCoords', me.bDisplayCoords);
		var arrays = new Array(me.pLabels);
		var iArray, iLabel;
		for(iArray = 0; iArray < arrays.length; iArray++)
		{
			for(iLabel = 0; iLabel < arrays[iArray].length; iLabel++)
			{
				var lab = arrays[iArray][iLabel];
				if(lab != null)
				{					
					lab.pMarker.SetProperty("show_coordinates", bEnable);
					lab.RemoveBox();
				}
			}
		}
	}

	this.PropertyChanged = function(strProperty)
	{
		for(var i=0; i<me.arrPropertyChangedListeners.length; i++)
		{
			var listener = me.arrPropertyChangedListeners[i];
			if(listener && listener.strProperty == strProperty && listener.funcOnChanged)
			{
				listener.funcOnChanged();
			}
		}
	}
	
	this.AddPropertyChangedListener = function(strProperty, funcOnChanged)
	{
		me.arrPropertyChangedListeners[me.arrPropertyChangedListeners.length] = new PropertyChangedEventListener(strProperty, funcOnChanged);
	}

	// ---------------------------------------------------------------------

	this.SetDrawTMC = function (bEnable, bSilent)
	{
		if(bEnable != m_bDrawTMC)
		{
			m_bDrawTMC = bEnable;
			setCookie('bDrawTMC', m_bDrawTMC);
			me.PropertyChanged("bDrawTMC");
			if (!bSilent) {
				me.DrawRoute();
			}
		}
	}

	this.SetDrawTMCWeather = function (bEnable, bSilent)
	{
		if(bEnable != m_bDrawTMCWeather)
		{
			m_bDrawTMCWeather = bEnable;
			setCookie('bDrawTMCWeather', m_bDrawTMCWeather);
			me.PropertyChanged("bDrawTMCWeather");
			if (!bSilent) {
				me.DrawRoute();
			}
		}
	}
	
	this.AddDrawTMCChangedListener = function(funcOnChanged)
	{
		me.AddPropertyChangedListener("bDrawTMC", funcOnChanged);
	}
	
	this.AddDrawTMCWeatherChangedListener = function(funcOnChanged)
	{
		me.AddPropertyChangedListener("bDrawTMCWeather", funcOnChanged);
	}

	// ---------------------------------------------------------------------

	this.IsDrawPTStopsGlobal = function()
	{
		return m_bDrawPTStopsGlobal;
	}


	this.IsDrawPTStopsLocal = function()
	{
		return m_bDrawPTStopsLocal;
	}

	this.SetDrawPTStopsGlobal = function (bEnable, bSilent)
	{
		if(bEnable != m_bDrawPTStopsGlobal)
		{
			m_bDrawPTStopsGlobal = bEnable;
			me.PropertyChanged("bDrawPTStopsGlobal");
			if (!bSilent) {
				me.DrawRoute();
			}
		}
	}

	this.SetDrawPTStopsLocal = function (bEnable, bSilent)
	{
		if(bEnable != m_bDrawPTStopsLocal)
		{
			m_bDrawPTStopsLocal = bEnable;
			me.PropertyChanged("bDrawPTStopsLocal");
			if (!bSilent) {
				me.DrawRoute();
			}
		}
	}
	
	this.AddDrawPTStopsGlobalChangedListener = function(funcOnChanged)
	{
		me.AddPropertyChangedListener("bDrawPTStopsGlobal", funcOnChanged);
	}

	this.AddDrawPTStopsLocalChangedListener = function(funcOnChanged)
	{
		me.AddPropertyChangedListener("bDrawPTStopsLocal", funcOnChanged);
	}

	// ---------------------------------------------------------------------

	// =====================================================================
	// PICK MODE
	// =====================================================================	

	/// private:
	this.ChangePickMode = function ()
	{
		if (me.bPickMode == true)
			me.ResetPickMode ();
		else
			me.SetPickMode ("internal");
	}

	/// protected:
	// strPickMode lehetseges ertekek: 
	// "internal" : normal pick markerrel es labellel
	// "labelless": normal pick markerrel, label nelkul
	// "external" vagy barmi egyeb: Az OnPick meghivasan kivul nem csinal semmit
	
	this.SetPickMode = function (strPickMode)
	{
		me.bPickMode = true;
		me.strPickMode = strPickMode;
		me.divFace.style.cursor = "crosshair";

		//if(strPickMode == "internal" && me.pTextResult && me.pTextResult.imgbtnPick)
		//	me.pTextResult.imgbtnPick.SetDefaultSrc(GetAbsUrl('images/routectrl/megjelolom_a_terkepen_mdown.png'));
	}

	/// private:
	this.ResetPickMode = function  ()
	{
		me.bPickMode = false;
		me.strPickMode = "internal";
		me.divFace.style.cursor = "pointer";
		//if(me.pTextResult && me.pTextResult.imgbtnPick)
		//	me.pTextResult.imgbtnPick.SetDefaultSrc(GetAbsUrl('images/routectrl/megjelolom_a_terkepen.png'));
	}

	/// private:	    	  	
	
	this.UserPicked = function (pEvent)
	{
		if (!me.bUserPickEnabled) {
			return;
		}
		// grid koordinatak
		var xxx = GetEventXNew(pEvent) - GetAbsLayerLeft (me.pGridMain.mainGridDiv);
		var yyy = GetEventYNew(pEvent) - GetAbsLayerTop (me.pGridMain.mainGridDiv);  

		// Ha layeres POI-n van az up, akkor nem is cimpickrol van szo.
		var bOnPoi = false;
		var obj = GetEventSourceElement(pEvent);
		var pPoiMouseOver = me.GetPoiNearXY (xxx, yyy);
		if (pPoiMouseOver != null)
		{
				if ((obj.className == "face") || (obj.className == "poiParent")) 
						bOnPoi=true;
		}
		if (bOnPoi == true)
			return;


		// call server
		// Params-t kitolten me.pTopoliszMap alapjan:
		if(me.strPickMode == "internal" || me.strPickMode == "labelless")
		{
		var MapLevel = me.GetLevel();
			//var AddressLevel = "6";  // utca, hsz
			////var AddressLevel = "-1";  // AL_INVALID
			//if (MapLevel < 9)
			//	AddressLevel = "2";  // telepules
		
			AddressLevel = "9";  // AL_FULL

		var Params =  '';
		    Params += 'iAddressLevel=' + AddressLevel;
		    Params += '&iGridX=' + (xxx);
		    Params += '&iGridY=' + (yyy);
		    Params += '&iLevel=' + MapLevel;
		    Params += '&iGridUpperRow=' + me.pGridMain.GetTop();
		    Params += '&iGridLeftColumn=' + me.pGridMain.GetLeft();
		    Params += '&iGridLowerRow=' + me.pGridMain.GetBottom();
		    Params += '&iGridRightColumn=' + me.pGridMain.GetRight();
		    Params += '&bNorc=true';

			var clientparam = new Object();
			
			clientparam.pickpoint = new CCoordinate(xxx, yyy);
			clientparam.strMarkerClass = (me.strPickMode == "internal" ? "pick" : "picknolabel");

			me.NoSessionServer.CallFunction("ReverseGeoCodeAddress", Params, 0, me.UserPickedCallback, clientparam);
		}

		var strPickMode = me.strPickMode;
		me.ResetPickMode();
		
		if(me.OnPick)
		{
			try {
				me.OnPick (strPickMode, xxx, yyy);
			} catch(exp) {
				if(me.OnError)
					me.OnError(exp, 'CTopoliszMap.OnPick');
			}
		}

		
	}

	/// private:
	this.UserPickedCallback = function (addressresult, clientparam)
	{
		var address = addressresult;
		if (me.HandleAddress) {
			me.HandleAddress(address);
		}
		var pickpoint = clientparam.pickpoint;
		var strMarkerClass = clientparam.strMarkerClass;
		// add picked address

		//me.imgPick.src = GetAbsUrl('images/MegjelolATerkepen.gif');

		me.pMarkers.DeleteAllWithType("pick");

		if(address != null)
		{
			me.OnNewPickedAddress (address, pickpoint.dX, pickpoint.dY, strMarkerClass);
		}
	}

	this.Pixel2AC = function(iGridX, iGridY, callbackFunction, callbackParam)
	{
		var Params =  '';
		    Params += '&iGridX=' + iGridX;
		    Params += '&iGridY=' + iGridY;
		    Params += '&iLevel=' + me.GetLevel();
		    Params += '&iGridUpperRow=' + me.pGridMain.GetTop();
		    Params += '&iGridLeftColumn=' + me.pGridMain.GetLeft();
		    Params += '&iGridLowerRow=' + me.pGridMain.GetBottom();
		    Params += '&iGridRightColumn=' + me.pGridMain.GetRight();

		me.NoSessionServer.CallFunction("Pixel2AC", Params, 0, callbackFunction, callbackParam);
	}

	/// private
	this.OnReadyStateChangeInternal = function (iState, iTag)
	{
		var somebody = (me.pConnectedMainMap ? me.pConnectedMainMap : me);
		somebody.OnReadyStateChange(iState, iTag);
	}

	/// private
	this.OnCommandReadyInternal = function(iCommandID) 
	{
		var somebody = (me.pConnectedMainMap ? me.pConnectedMainMap : me);
		somebody.OnCommandReady(iCommandID); 
	}

	/// private
	this.OnCommandErrorInternal = function(exp, iCommandID)
	{
		var somebody = (me.pConnectedMainMap ? me.pConnectedMainMap : me);
		somebody.OnCommandError(exp, iCommandID);
	}

	
	/// protected:
	/// Letoltes kozbeni allapotvaltaskor hivodik meg:
	/// iState lehetseges ertekei:
	/// 0: Kapcsolat meg nem nyilt meg.
	//  1: A keres meg nem lett elkuldve.
	//  2: A valasz meg nem erkezett meg.
	//  3: A valasz feldolgozasa folyamatban.
	//  4: Kesz
	this.OnReadyStateChange = function(iState)
	{
	}
	
	/// protected:
	/// Sikeres szerverhivas utan hivodik meg
	this.OnCommandReady = function(iCommandID)
	{
	}
	
	/// protected:
	/// Sikertelen szerverhivas utan hivodik meg
	/// exp: a hibat kivalto kivetel, ha van.
	this.OnCommandError = function(exp)
	{
	}
	
	/// protected:
	/// Esemeny (OnAkarmi )kozben dobott exceptionre hivodik meg
	/// exp: kivetel
	/// strSource: a kivetelt elkapo fuggveny neve
	this.OnError = function(exp, strSource)
	{
	    alert (strSource + ": " + exp);
	}

	
	/// protected:
	/// A terkep div-jenek atmeretezese utan kell mindig meghivni.
	this.Redraw = function ()
	{		
		if ((me.bZoomingHappens == false))
		{			
			me.RedrawWithoutZooming ();

			// set position 
			me.iZoomingLevelChange = 0;
			if (me.bInitPhase == false)
				me.ZoomByLevelMain (true);

			
/*			var iStartLevel = typeof(g_iSuggestedStartLevel) != "undefined" ? g_iSuggestedStartLevel : -1;
			if (iStartLevel == -1) 
			{		
				me.iZoomingLevelChange = 0;				
			}
			else
			{
				me.iZoomingLevelChange = iStartLevel - me.GetLevel();			
			}
			me.ZoomByLevelMain (true);
			
			g_iSuggestedStartLevel = -1;
*/
		}
	}
	/// protected:
	/// A terkep div-jenek atmeretezese utan kell mindig meghivni.
	this.RedrawWithoutZooming = function ()
	{
		// face border
		me.RearrangeFaceBorder ();

		// iMapViewWidth, iMapViewHeight
		var clipLeft = GetLayerLeft(divMap);
		var clipTop  = GetLayerTop(divMap);
		var clipRight = clipLeft + GetLayerWidth(divMap);
		var clipBottom = clipTop + GetLayerHeight(divMap);
		me.iMapViewWidth = clipRight - clipLeft - me.iMapDivBorderWidth;
		me.iMapViewHeight = clipBottom - clipTop - me.iMapDivBorderWidth;
	
		// divFace width, height
		me.divFace.style.width = Math.max(0,(GetLayerWidth(divMap) - 2 * me.iMapDivBorderWidth)) + "px";
		me.divFace.style.height = Math.max(0, (GetLayerHeight(divMap) - 2 * me.iMapDivBorderWidth))  + "px";
		
		// minimap frame

		if (me.pConnectedMiniMap)
		{
			if (me.pConnectedMiniMap.pMiniMapFrame)
				me.pConnectedMiniMap.pMiniMapFrame.ReArrange (true);
		}
	}

    /// private:
    this.TesztResize = function (w,h)
    {
	    me.divMap.style.width = w+ "px";
	    me.divMap.style.height = h+ "px";			
    }

    /// public:
    /// Meg kell hivni a border vastagsagaval a SetMapDivBorderWidth - et
    this.SetMapDivBorderWidth = function (iBorderWidth)
    {    
        this.iMapDivBorderWidth = iBorderWidth;
    }   

   /// private:
    this.SetPoiLayers = function (sPoiLayers)
    {
        me.sPoiLayers = sPoiLayers;
    }
    
    this.GetPoiLayers = function ()
    {
        return me.sPoiLayers;
    }
    
    this.GetPoiNearXY = function (x,y) //x,y : grid koord
    {
        var i;
        var l = me.arrPoisOnGrid.length;
        
        for (i = 0; i < l; i++)
        {
            var pPoi = me.arrPoisOnGrid[i];
            if (pPoi != null)
            {
                if ((Math.abs((pPoi.iX - x)) < 10) && (Math.abs((pPoi.iY - y)) < 10))
                {
                    return pPoi;
                }
            }
        }        
        
        return null;
    }
        
  /*  this.OnMouseClickLayerPoi = function (pPoi)
    {
		var types = ["start","through","stop"];
        me.RemovePinBoxesExclusiveMulti(types);
        pPoi.MouseClickEventHandler ();
        me.bFixedLabel = true;
    }*/
    
    // pPoi : not null !
    /*
    this.OnMouseOverLayerPoi = function (pPoi)
    {
        if (me.bFixedLabel == false)
        {
            me.pMouseOverLayerPoi = pPoi;
            me.divPoiParent.style.cursor = "pointer";
            me.divFace.style.cursor = "pointer";
			var types = ["start","through","stop"];
            me.RemovePinBoxesExclusiveMulti(types);
            pPoi.MouseOverEventHandler ();
        }
    }

    // pPoi : not null !
    
    this.OnMouseOutLayerPoi = function (pPoi)
    {
        me.SetNormalCursor ();
        me.pMouseOverLayerPoi = null;
        pPoi.MouseOutEventHandler ();
    }
    */
    
	this.SetNormalCursor = function ()
	{
		if (me.pGridMain)	
		{						
			if (me.bFocused)
			{
				if (me.m_bRubberMode == true) 
				{
					if (me.m_bZoomRectVsMoveModeInverted == false)
					{
						me.divPoiParent.style.cursor = "crosshair"; 
						me.divFace.style.cursor = "crosshair";     
					}
					else
					{
						me.divPoiParent.style.cursor = "pointer"; 
						me.divFace.style.cursor = "pointer";     
					}				
				}			
				else // me.m_bRubberMode == false
				{
					if (me.m_bZoomRectVsMoveModeInverted == true)
					{
						me.divPoiParent.style.cursor = "crosshair"; 
						me.divFace.style.cursor = "crosshair";     			
					}
					else
					{
						me.divPoiParent.style.cursor = "pointer"; 
						me.divFace.style.cursor = "pointer";     
					}									
				}			
			}
			else
			{
				me.divPoiParent.style.cursor = "default"; 
				me.divFace.style.cursor = "default";     
			}
		}
	}

	this.ShowMapCaption = function (strCaption)
	{
		if(me.bEnableMapCaption)
		{
			if (me.divMapCaption==null)
				me.CreateMapCaption();
			while(me.divMapCaption.firstChild)
				me.divMapCaption.removeChild(me.divMapCaption.firstChild);

			if (strCaption == "")
				strCaption = me.strDefaultCountry;

			NewTextTag(strCaption, me.divMapCaption);
		}
	}

	this.ShowToolTip = function (pEvent, caption)
	{
		var left = GetEventXNew (pEvent);
		var top = GetEventYNew (pEvent);
		if(me.divToolTip)
		{
			me.divToolTip.style.top = (top + 15) + "px";
			me.divToolTip.style.left = (left + 15) + "px";
			me.divToolTip.style.zIndex = 1000;
			me.divToolTip.innerHTML = caption; 
			me.divToolTip.style.display = "";
			window.setTimeout(me.HideToolTip, 3000);
		}
	}

	this.HideToolTip = function ()
	{
		if(me.divToolTip)
			me.divToolTip.style.display = "none";
	}

	this.CreateToolTip = function ()
	{
		me.divToolTip = NewTag ("div");
		me.divToolTip.className = "tooltip";
		me.divToolTip.style.display = "none";
		var divUniverse = GetBlock ("idUniverse");
		if(divUniverse)
			AddTag (me.divToolTip, divUniverse);	
	}


	this.IsDrawUTV = function()
	{
		return m_bDrawUTV;
	}

	this.SetDrawUTV = function(bEnable, bSilent)
	{
		if(bEnable != m_bDrawUTV)
		{
			m_bDrawUTV = bEnable;
			if (!bSilent) {
				if(m_bDrawUTV)
				{
					if(m_arrUTVCameras == null || m_arrUTVCameras.length < 1)
					{
						me.NoSessionServer.CallFunction("GetUTV", "", 0, me.SetUtvCameras);
					}
					else
					{
						me.ShowUtvCameras();
					}
				}
				else
				{
					me.RemovePinBoxes ("utv");	
					me.RemovePinLabels ("utv");
					me.pMarkers.DeleteAllWithType ("utv");
				}
			}
			me.PropertyChanged("bDrawUTV");
		}
	}

	this.AddDrawUTVChangedListener = function(funcOnChanged)
	{
		me.AddPropertyChangedListener("bDrawUTV", funcOnChanged);
	}



	this.SetUtvCameras = function (utvlist, pDummy, iCommandID) 
	{
		m_arrUTVCameras = utvlist;
		if(utvlist != null && utvlist.length > 0)
		{
			m_dUTVMinX = utvlist[0].x;
			m_dUTVMinY = utvlist[0].y;
			m_dUTVMaxX = utvlist[0].x;
			m_dUTVMaxY = utvlist[0].y;

			for(var i=0; i<utvlist.length; i++)
			{
				if(m_dUTVMinX > utvlist[i].x)
					m_dUTVMinX = utvlist[i].x;
				if(m_dUTVMinY > utvlist[i].y)
					m_dUTVMinY = utvlist[i].y;
				if(m_dUTVMaxX < utvlist[i].x)
					m_dUTVMaxX = utvlist[i].x;
				if(m_dUTVMaxY < utvlist[i].y)
					m_dUTVMaxY = utvlist[i].y;
			}
			me.ShowUtvCameras();
		}
		else
		{
			m_dUTVMinX = m_dUTVMinY = m_dUTVMaxX = m_dUTVMaxY = 0;
		}
	}
	
	this.ShowUtvCameras = function()
	{
		if(m_arrUTVCameras == null || m_arrUTVCameras.length < 1)
			return;
			
		for (var i = 0; i < m_arrUTVCameras.length; i++)
		{
			var imgExt = (/MSIE (5\.5)|[6]/.test(navigator.userAgent) && navigator.platform == "Win32") ? ".gif" : ".png";
			var rad = m_arrUTVCameras[i].angle * Math.PI / 180;            
			var type = "utv";
			var dX = m_arrUTVCameras[i].x;
			var dY = m_arrUTVCameras[i].y;                                   
			var marker = new Marker(me, type, dX, dY, null, null);
			marker.SetProperty ("start_button", false);
			marker.SetProperty ("through_button", false);
			marker.SetProperty ("stop_button", false);
			marker.SetProperty ("panorama_button", false);
			marker.SetProperty ("close_button", false);
			marker.SetProperty ("pinnumber", 0);
			marker.SetProperty ("handle_details", false);                        
			marker.SetProperty ("pin_css_class", "markerUTV");
			marker.SetProperty ("div_label_sign_class","markerUTV");
			marker.SetProperty ("pin_img_url", "design/utv/" + m_arrUTVCameras[i].angle + imgExt);
			marker.SetProperty ("pin_img_width", 25);
			marker.SetProperty ("pin_img_height", 25);
			marker.SetProperty ("pin_img_refx", Math.round(12 - m_arrUTVCameras[i].pixelradius * Math.sin(rad)));
			marker.SetProperty ("pin_img_refy", Math.round(12 + m_arrUTVCameras[i].pixelradius * Math.cos(rad)));
			marker.SetProperty ("delete_marker_on_label_close", false);
			marker.SetProperty ("caption",unescape(m_arrUTVCameras[i].name));
			marker.SetProperty ("show_coordinates", me.bDisplayCoords);
			marker.SetProperty ("labelbox_css_classname", "labelboxUTV");	
			marker.SetProperty ("LeglessLabel", "true");
			marker.SetProperty ("label_dx", 0);
			marker.SetProperty ("label_dy", +15);

			var SET_func_label_sign_on_click = function (i)
			{
				var func_label_sign_on_click = function () {

					var utv = new CUTV (m_arrUTVCameras[i].id, m_arrUTVCameras[i].x, m_arrUTVCameras[i].y, m_arrUTVCameras[i].address, 
									m_arrUTVCameras[i].name, m_arrUTVCameras[i].camUrl, m_arrUTVCameras[i].angle, m_arrUTVCameras[i].pixelradius);
					me.ShowUtvCam(utv);
				}	
				marker.SetProperty("func_label_sign_on_click", func_label_sign_on_click);
			}
			SET_func_label_sign_on_click(i);

			me.pMarkers.Add (marker) ; //utv
		}
		/*
		var mapdata = me.GetMapData();
		if(mapdata)
		{
			if(mapdata.dMeterPerPixelX < 16)
			{
				var arrX = [ mapdata.dMinX, mapdata.dMinX, mapdata.dMaxX, mapdata.dMaxX ];
				var arrY = [ mapdata.dMinY, mapdata.dMaxY, mapdata.dMinY, mapdata.dMaxY ];
				for(i=0; i<arrX.length; i++)
				{
					if(m_dUTVMinX < arrX[i] && arrX[i] < m_dUTVMaxX && m_dUTVMinY < arrY[i] && arrY[i] < m_dUTVMaxY)
					{
						me.DrawRoute();
						return;
					}
				}
			}
		}
		*/
		me.DrawRoute();
	}

	this.ShowUtvCam = function(pUTV)
	{
		var containerDiv = GetBlock("utvCam");
		var dataDiv = null;
		var iframe = null;
		if(!containerDiv)
		{
			containerDiv = NewTag("div", me.GetMapDiv());
			containerDiv.setAttribute("id", "utvCam");
			containerDiv.style.position = "absolute";
			containerDiv.style.bottom = "0px";
			containerDiv.style.right = "0px";
			containerDiv.style.width = "160px";
			containerDiv.style.zIndex = "100";
			containerDiv.style.border = "1px Red";			
		}
		else
		{
			while(containerDiv.firstChild != containerDiv.lastChild)
				containerDiv.removeChild(containerDiv.firstChild);
			dataDiv = containerDiv.lastChild;
			iframe = dataDiv.firstChild;
		}
		
		

		var closediv = NewTag("div", containerDiv, dataDiv);
		closediv.className = "labelclose";
		a = NewTag("a", closediv);
		a.setAttribute("href", "javascript:void(0)");
		a.onclick = me.HideUtvCam;
		var img = NewTag("img", a);
		SetImage(img, GetAbsUrl("images/mapctrl/close.gif"), 12, 12, "Bezár");


		var caption = NewTag('div', containerDiv, dataDiv);
		caption.ondragstart = function() { return false; };
		caption.onselectstart = function() { return false; };
		//caption.className = GetLabelCaptionClassG();
		caption.className = "utvlabelcaption";
		caption.style.whiteSpace = "normal";
		caption.style.paddingRight = "12px";
		NewTextTag(unescape(pUTV.address), caption);
		NewTag('br', caption);
		var strName = unescape(pUTV.name);
		var iPos = strName.indexOf('(');
		if(iPos > 0)
		{
			NewTextTag(strName.substr(0, iPos), caption);
			NewTag('br', caption);
			NewTextTag(strName.substr(iPos), caption);
		}
		else
			NewTextTag(strName, caption);




		if(!iframe)
		{
			var dataDiv = NewTag('div', containerDiv);
			dataDiv.style.width = "160px";
			dataDiv.style.height = "120px";
			dataDiv.style.textAlign = "center";
			dataDiv.style.backgroundColor = "#FFFFFF";
			dataDiv.style.backgroundPosition = "center";
			dataDiv.style.backgroundRepeat = "no-repeat";
			dataDiv.style.backgroundImage = "url('" + GetAbsUrl("images/partners/utvlogo.png") +"')";

			iframe = NewIframe("?Command=Flash&width=160&height=120&url=" + pUTV.GetSafeCamUrl() , 160,120);
			iframe.style.margin = "0px";
			AddTag(iframe, dataDiv);
		}
			else
			{
				containerDiv.style.display = "";
				iframe.src = "?Command=Flash&width=160&height=120&url=" + pUTV.GetSafeCamUrl();
			}
	}
	
	this.HideUtvCam = function()
	{
		var containerDiv = GetBlock("utvCam");
		if(containerDiv)
		{
			containerDiv.style.display = "none";
			var iframe = containerDiv.lastChild.firstChild;
			iframe.src = "";
		}
	}

	this.IsDrawDailyNews = function()
	{
		return me.m_bDrawDailyNews;
	}

	this.SetDrawDailyNews = function(bEnable, bSilent)
	{
		if(bEnable != me.m_bDrawDailyNews)
		{
			me.m_bDrawDailyNews = bEnable;
			if (!bSilent) {
				if(me.m_bDrawDailyNews)
				{
					me.NoSessionServer.CallFunction("GetNapiHirek", "categories=1", 0, me.DrawDailyNews);
				}
				else
				{
					me.RemovePinBoxes ("dailynews");	
					me.RemovePinLabels ("dailynews");
					me.pMarkers.DeleteAllWithType ("dailynews");
				}
			}
			me.PropertyChanged("bDrawDailyNews");
		}
	}

	this.AddDrawDailyNewsChangedListener = function(funcOnChanged)
	{
		me.AddPropertyChangedListener("bDrawDailyNews", funcOnChanged);
	}
	
	this.DrawDailyNews = function (dailynewslist, pDummy, iCommandID) 
	{
		var length = dailynewslist.length;
		var i = 0;
		for ( i = 0; i < length; i++)
		{				
            var type = "dailynews";
            var dX = dailynewslist [i].eovx;
            var dY = dailynewslist [i].eovy;
                                                                                                
            var marker = new Marker(me, type, dX, dY, null, null);
            marker.SetProperty ("start_button", false);
            marker.SetProperty ("through_button", false);
            marker.SetProperty ("stop_button", false);
            marker.SetProperty ("panorama_button", false);
            marker.SetProperty ("pinnumber", 0);
            marker.SetProperty ("handle_details", true);                        
			marker.SetProperty ("pin_css_class", "markerDailyNews");
			marker.SetProperty ("div_label_sign_class", "markerDailyNews");
			marker.SetProperty ("pin_img_url", "http://utvonal.bkv.hu/napihir/public.ashx?appID=NapiHirek&Command=GetImage&id=" + dailynewslist [i].signid);
			marker.SetProperty ("pin_img_width", 38);
			marker.SetProperty ("pin_img_height", 38);
			marker.SetProperty ("pin_img_refx", 20);
			marker.SetProperty ("pin_img_refy", 20);			
			marker.SetProperty ("label_dx", 0);
			marker.SetProperty ("label_dy", -9);						
			marker.SetProperty ("delete_marker_on_label_close", false);
			marker.SetProperty ("caption", unescape(dailynewslist [i].shortdescription));
			marker.SetProperty ("show_coordinates", me.bDisplayCoords);
																										
			var divDetails = NewTag("div");
			NewTextTag(unescape(dailynewslist [i].longdescription), divDetails);			
			marker.SetProperty ("details_to_show", divDetails);     
			marker.SetProperty("fix_label_on_click", true);				
		    me.pMarkers.Add (marker) ;	 //dailynews						
		}						
				
		me.ZoomToPoint (19.1,47.48, 10000); // Bp
	}			

	this.IsDrawPOIBanner = function()
	{
		return me.bDisplayPOIBanner;
	}

	this.SetDrawPOIBanner = function(bEnable, bSilent)
	{
		if(bEnable != me.bDisplayPOIBanner)
		{
			me.bDisplayPOIBanner = bEnable;
			me.PropertyChanged("bDisplayPOIBanner");
			if (!bSilent) {
				me.DrawRoute();
			}
		}
	}

	this.IsDrawCoordsLabel = function()
	{
		return me.bDisplayCoords;
	}

	this.SetDrawCoordsLabel = function(bEnable)
	{
		if(bEnable != me.bDisplayCoords)
		{			
			me.SetDisplayCoords(bEnable);
			me.PropertyChanged("bDisplayCoords");
		}	
	}

	this.AddDrawCoordsLabelChangedListener = function(funcOnChanged)
	{
		me.AddPropertyChangedListener("bDisplayCoords", funcOnChanged);
	}					
		
	this.IsDrawNORC = function()
	{
		return me.m_bDrawNORC;
	}

	this.SetDrawNORC = function(bEnable)
	{
		if(bEnable != me.m_bDrawNORC)
		{			
			me.m_bDrawNORC = bEnable;
			me.PropertyChanged("bDrawNORC");
		}	
	
	}

	this.AddDrawNORCChangedListener = function(funcOnChanged)
	{
		me.AddPropertyChangedListener("bDrawNORC", funcOnChanged);
	}
		
	this.IsDrawPOI = function(sernum)
	{
		var i = 0;
		for (i = 0; i < me.m_arrDrawnPois.length; i++)
		{
			if (me.m_arrDrawnPois[i] == sernum)
				return true;
		}		
		return false;
	}

	
	this.GetPipeSepPoiIDs = function ()
	{
		var ret = "";
		var i = 0;
		for (i = 0; i < me.m_arrDrawnPois.length; i++)
		{
			if (me.m_arrDrawnPois[i] != null)
			{					
				switch (me.m_arrDrawnPois[i])
				{
					// vendéglátás
					case "1": ret += "504|500|"; break;
					// közlekedés					
					case "2": ret += "501|506|511|512|"; break;
					// üzlet
					case "3": ret += "502|508|"; break;
					// közösség
					case "4": ret += "503|"; break;
					// szabadidő 
					case "5": ret += "505|509|510|"; break;
					// egészség *
					case "6": ret += "507|"; break;
					default:
					break;
				}
			}				
		}	
		if (ret.length > 0) 
		{
			ret = ret.substr(0, ret.length-1);
		}			
		return ret;
	}

	this.SetDrawPOI = function(sernum, bEnable, bSilent)
	{	
		if (bEnable)
		{
			/* put in */
			var i = 0;
			for (i = 0; i < me.m_arrDrawnPois.length; i++)
			{
				if (me.m_arrDrawnPois[i] == null)
				{					
					me.m_arrDrawnPois[i] = sernum; /* into an empty place */
					break;
				}				
			}										
			if (i == me.m_arrDrawnPois.length)	/* in the end */
				me.m_arrDrawnPois.push(sernum);
		}
		else
		{
			var i = 0;
			for (i = 0; i < me.m_arrDrawnPois.length; i++)
			{
				if (me.m_arrDrawnPois[i] == sernum)
				{
					delete me.m_arrDrawnPois[i];
					me.m_arrDrawnPois[i] = null;
				}				
			}							
		}
		
		var strPipeSepPoiIDList = me.GetPipeSepPoiIDs();
		me.SetPoiLayers (strPipeSepPoiIDList);
		
		if (me.bLayerPoiRedrawNeeded == false)
		{
			if (!bSilent) {
				me.bLayerPoiRedrawNeeded = true;
				setTimeout (me.LayerPoiRedraw, 700);
			}
		}
				
		//me.DrawRoute ();				
	}
	
	this.LayerPoiRedraw = function ()
	{
		me.DrawRoute ();				
		me.bLayerPoiRedrawNeeded = false;
	}

	this.AddDrawPOIChangedListener = function(funcOnChanged)
	{
		me.AddPropertyChangedListener("bDrawPOI", funcOnChanged);
	}			
}

// private:
CTopoliszMap.RedrawAll = function()
{
	var arrInstances = CTopoliszMap.prototype.arrInstances;
	for(var i=0; i<arrInstances.length; i++)
	{
		if(arrInstances[i])
			arrInstances[i].Redraw();
	}
}
