﻿// Map handling routines
function Coordinate(dX, dY) 
{
	this.dX = dX;
	this.dY = dY;
}

function Marker(MarkerID, dX, dY, strClass)
{
	this.ID = MarkerID;
	this.dX = dX;
	this.dY = dY;
	this.strClass = strClass;
}

M_PICK     = 0;
M_ZOOMRECT = 1; 
M_MOVE     = 2; 
M_DISTANCE = 3;
M_OLD      = 4;
M_DRAG     = 5;
M_SELECT   = 6;
M_NORC     = 7;

function MapHandler(commandhandler)
{ 
	// Constants
	var self = this;

	// data
	this.Srv = commandhandler;
	
	this.arrPois = null;
	this.dragItem = null;
	
	this.iMode = M_PICK;
	this.arrModeIcons = new Array();
	this.iMouseDownX = 0;
	this.iMouseDownY = 0;
	this.iMouseUpX = 0;
	this.iMouseUpY = 0;
	this.bMouseDown = false;

	this.arrPalettes = new Array();
	this.arrMarkers = new Array();
	// properties	
	this.iSliderMax = 8;
	this.bEnableTrafficButtons = false;
	
	// events
	this.OnDrawSlider = function(iImageID) { }
	this.OnResetMap = function(iImageID) { }
	this.CanPick = function() { }
	
	// cursors
	//this.customCursor = new CustomCursor();
	
	// functions
	
//	this.AddCustomCursor = function(parent, fileName, fileNameForbidden, handler, width, height) {
//		this.customCursor.Create(parent, fileName, fileNameForbidden, handler, width, height);
//		this.customHandler = handler;
//	}

	this.AddRatioPalette = function(divPalette)
	{
		this.arrPalettes[this.arrPalettes.length] = divPalette;
	}
	
	this.AddMapPalette = function(divPalette, iImageID)
	{
		iImageID = isNaN(iImageID) ? 0 : iImageID;
		this.arrPalettes[this.arrPalettes.length] = divPalette;
		var a, img;
	
		var AddButton = function(func, strImageUrl, strText)
		{
			var container = new Element("div", {'class': 'palettebuttoncontainer'});
			var a = new Element("a");
			a.className = "button";
			a.setAttribute("href", "javascript:void(0);");
			a.onclick = func;
			var div = new Element("div", {'class': 'palettebutton', alt: strText}).update(" ");
			div.addClassName(strImageUrl);
			a.insert(div);
			a.m_div = div;
			a.m_buttoncss = strImageUrl;
			container.insert(a);
			divPalette.insert(container);
			return a;
		}
		
		var AddModeButton = function(iMode, strImageUrl, strText)
		{
			var func = function() { self.SetMode(iMode); return false; };
			self.arrModeIcons[iMode] = AddButton(func, strImageUrl, strText);
		}

		var AddSeparator = function()
		{
			var container = new Element("div", {'class': 'palettebuttoncontainer'});
			var div = new Element("div", {'class': 'palettebutton'});
			div.addClassName('palettebuttonseparator');
			container.insert(div);
			divPalette.insert(container);
		}
		
		var AddSliderButton = function(iSlider)
		{
			var container = new Element("div", {'class': 'palettebuttoncontainer'});
			var a = new Element("a");
			//a.setAttribute("id", "divZoom"+i);
			a.className = "zoomer";
			a.setAttribute("href", "javascript:void(0)");
			a.update(' ');
			a.onclick = function() { self.Srv.ZoomSlider(0,iSlider); return false; };
			
			//var div = new Element("div", {'class': 'zoomer'});
			//div.addClassName('palettebutton');
			//div.addClassName('sliderbutton');
			var div = new Element("div", {'class': 'palettebutton'});
			//div.addClassName('palettebutton');
			div.addClassName('zoomer');
			div.setAttribute("id", "divZoom"+i);
			a.insert(div);
			//img.style.border = "1px solid Black";
			/*if(iSlider == self.iSliderMax)
				a.style.marginLeft = "2px";
			if(iSlider == 0)
				a.style.marginRight = "2px";*/
			container.insert(a);
			divPalette.insert(container);
		}

		if (self.m_customButtons) {
			for (var jj = 0; jj < self.m_customButtons.length; jj++) {
				AddModeButton(self.m_customButtons[jj].state, self.m_customButtons[jj].classname, self.m_customButtons[jj].babel);
			}
		}
		AddModeButton(M_SELECT, "selectnotificationbutton", g_Babel.GetWord("map_selectreport"));
		AddModeButton(M_PICK, "newpinbutton", g_Babel.GetWord("map_newpin"));
		AddModeButton(M_ZOOMRECT, "zoomrectbutton", g_Babel.GetWord("map_zoom"));
		AddModeButton(M_MOVE, "movebutton", g_Babel.GetWord("map_movemap"));
		//AddModeButton(M_PICK, g_webPrefix + "design_new/mapctrl/thumbtack.gif", g_Babel.GetWord("map_newpin"));
		//AddModeButton(M_ZOOMRECT, g_webPrefix + "design_new/mapctrl/zoom_rect.gif", g_Babel.GetWord("map_zoom"));
		//AddModeButton(M_MOVE, g_webPrefix + "design_new/mapctrl/move.gif", g_Babel.GetWord("map_movemap"));

		/*img = new Element("img", {src: g_webPrefix + "design_new/transparent.gif", width: 2, height: 2});
		divPalette.insert(img);*/
		AddSeparator();

		AddButton( function() { self.Srv.ZoomOut(iImageID); return false;}, "zoomoutbutton", g_Babel.GetWord("map_zoomout") );
		
		for(var i = self.iSliderMax; i>=0; i--)
		{
			AddSliderButton(i);
		}
	
		AddButton( function() { self.Srv.ZoomIn(iImageID); return false;}, "zoominbutton", g_Babel.GetWord("map_zoomin") );
	}

	this.SetMapImage = function (iImageID)
	{
		var imgMap = $('imgMap'+ iImageID);
		var divMap = $('idMap'+iImageID);	
		
		if(iImageID == 0)
		{
			self.OnDrawSlider(0);
			ShowMapCaption(0);
		}
	
		if(imgMap)
		{						
			imgMap.hide();
			//imgMap.setAttribute("src", "../_CommonDesign/transparent.gif");
			imgMap.setAttribute("src", g_arrMapData[iImageID].strGifUrl);
			self.ResetMap(iImageID);
			imgMap.observe("load", imgMap.show);
		}
		for (var i = 0; i < g_arrMapData[0].visibleMarkers.compact().length; i++) {
			self.DrawMarker(iImageID, g_arrMapData[0].visibleMarkers[i].id, g_arrMapData[0].visibleMarkers[i].iX, g_arrMapData[0].visibleMarkers[i].iY, g_arrMapData[0].visibleMarkers[i].className);
		}

		if (window.g_intelliSearch && window.g_intelliSearch == true) {
			window.g_fromShowMap = true;
			g_reportSearch.SearchPins();
//			g_reportSearch.SearchPins(false);
		}
		
	}
	
	this.ResetMap = function(iImageID)
	{
		var divZoomRect = $('idZoomRect'+iImageID);
		if(divZoomRect)
			divZoomRect.style.visibility = 'hidden';

		var divMap = $('idMap'+iImageID);	
		if(divMap)
		{
			divMap.style.left = 0;
			divMap.style.top = 0;
			if(g_arrMapData != null && g_arrMapData[iImageID] != null)
				divMap.style.clip = 'rect(0px,'+ g_arrMapData[iImageID].iMapWidth +'px,'+ g_arrMapData[iImageID].iMapHeight +'px,0px)';
		}
		for(var i=0; i<this.arrPalettes.length; i++)
		{
			Show(this.arrPalettes[i]);
		}
		self.OnResetMap(iImageID);
		//ShowMapCaption(iImageID);
	}

	// Map Handler commands
	this.GetMode = function()	{ return self.iMode;	}
	this.IsRectMode = function() { return self.iMode == M_ZOOMRECT; }
	this.IsMoveMode = function() { return self.iMode == M_MOVE; }
	this.IsDragMode = function() { return self.iMode == M_DRAG; }
	this.IsPickMode = function() { return self.iMode == M_PICK; }
	this.IsSelectMode = function() { return self.iMode == M_SELECT; }

	this.SetMode = function (iMode)
	{
		var img, ids, a;
		if(iMode != self.iMode && iMode != "undefined")
		{
			// Unhiglighting unselected icon
			if(self.iMode >=0 && self.iMode < self.arrModeIcons.length && self.arrModeIcons[self.iMode] != null)
			{
				self.arrModeIcons[self.iMode].className = "button";
				self.arrModeIcons[self.iMode].m_div.removeClassName(self.arrModeIcons[self.iMode].m_buttoncss + "_active")
				self.arrModeIcons[self.iMode].m_div.addClassName(self.arrModeIcons[self.iMode].m_buttoncss);
			}

			self.iMode = iMode;
			setCookie("pickmode", self.iMode);
				
			var div = $("idFace");
			if(div)
			{
//				this.customCursor.Hide();
				if(self.iMode == M_PICK) {
					div.className = "mapholderPick";
//					this.customCursor.Show();
				}
				else if(self.iMode == M_SELECT) {
					div.className = "mapholderSelect";
				}
				else if(self.iMode == M_MOVE) {
					div.className = "mapholderMove";
				}
				else if(self.iMode == M_ZOOMRECT) {
					div.className = "mapholderZoom";
				}
				else {
					div.className = "mapholder";
				}
				
			}
		}
		if(self.iMode != M_DRAG)
			self.ResetMap(0);
		// Highlighting selected icon
		if(self.iMode >=0 && self.iMode < self.arrModeIcons.length && self.arrModeIcons[self.iMode] != null)
		{
			self.arrModeIcons[self.iMode].className = "activeButton";
			self.arrModeIcons[self.iMode].m_div.removeClassName(self.arrModeIcons[self.iMode].m_buttoncss);
			self.arrModeIcons[self.iMode].m_div.addClassName(self.arrModeIcons[self.iMode].m_buttoncss + "_active");
		}
	}
	
	
	this.OnMapClick = function (iImageID, pEvent)
	{
	}
	
	this.SetMouseUp = function(iImageID, iUpX, iUpY)
	{
		if(iUpX < 0)
			iUpX = 0;
		if(iUpX > g_arrMapData[iImageID].iMapWidth)
			iUpX = g_arrMapData[iImageID].iMapWidth;
		if(iUpY < 0)
			iUpY = 0;
		if(iUpY > g_arrMapData[iImageID].iMapHeight)
			iUpY = g_arrMapData[iImageID].iMapHeight;
		self.iMouseUpX = iUpX;
		self.iMouseUpY = iUpY;
	}

	this.OnMouseDown = function(iImageID, event)
	{
		self.iMouseDownX = GetEventX(event);
		self.iMouseDownY = GetEventY(event);
		self.SetMouseUp(iImageID, GetEventX(event), GetEventY(event));
		self.bMouseDown = true;
		if ($("idNORC")) {
      self.norcOrigX = $("idNORC").positionedOffset().left;
      self.norcOrigY = $("idNORC").positionedOffset().top;
		}
		if ($("idNORCClose")) {
      self.norcCloseOrigX = $("idNORCClose").positionedOffset().left;
      self.norcCloseOrigY = $("idNORCClose").positionedOffset().top;
		}
		
		for(var i=0; i<self.arrPalettes.length; i++)
		{
			Hide(self.arrPalettes[i]);
		}

		if (self.dragItem && self.dragItem.IsDragCoord(self.iMouseDownX, self.iMouseDownY) )
		{
			self.dragItem.StartDrag(self.iMouseDownX, self.iMouseDownY, self.iMode);
			self.SetMode(M_DRAG);
		}

		if(self.IsRectMode()) {
			self.DrawMouseRect(iImageID);
			ShowMapCaption(0);
		}
		if(self.IsMoveMode()) {
			self.MoveMap(iImageID);
			ShowMapCaption(0);
		}
	}

	this.NorcUpdate = function(response) {
		response = eval(response);
		if (response != null) {
			self.SetMarker("Norc", response.m_lon, response.m_lat, "Norc");
			var left = self.iMouseUpX;
			var top = self.iMouseUpY;
			var repositionNeeded = false;
			if (g_arrMapData[0].iMapWidth - self.iMouseUpX < 490) {
				left = g_arrMapData[0].iMapWidth - 490;
				repositionNeeded = true;
			}
			if (self.iMouseUpY < 430) {
				top = 430;
				repositionNeeded = true;
			}
			if (repositionNeeded) {
				self.iMouseDownX = self.iMouseUpX;
				self.iMouseDownY = self.iMouseUpY;
        if ($("idNORC")) {
          self.norcOrigX = $("idNORC").positionedOffset().left;
          self.norcOrigY = $("idNORC").positionedOffset().top;
        }
        if ($("idNORCClose")) {
          self.norcCloseOrigX = $("idNORCClose").positionedOffset().left;
          self.norcCloseOrigY = $("idNORCClose").positionedOffset().top;
				}
				self.iMouseUpX = left;
				self.iMouseUpY = top;
				self.Srv.Move(0);
			}
			else {
				self.iMouseDownX = self.iMouseUpX;
				self.iMouseDownY = self.iMouseUpY;
				self.Srv.CenterMap(0, g_arrMapData[0].iMapWidth / 2, g_arrMapData[0].iMapHeight / 2);
				//self.iMouseUpX++;
				//self.Srv.Move(0);
			}
			//self.DrawMarker(0, "Norc", self.iMouseUpX, self.iMouseUpY, "Norc");
			$("idIframeNorc").src = "http://www.norc.ro/embed.aspx?id=" + response.m_id + "&ppa=" + response.m_angle + "&r=0&vla=5&lz=70&acc=f005f0ae-728b-4d6a-9e91-ae03fb095bcd";
		}
	}

	this.OnMouseUp = function(iImageID, event)
	{
		if(self.bMouseDown)
		{
			if(event.isLeftClick())
			{
				self.SetMouseUp(iImageID, GetEventX(event), GetEventY(event));
				
				if(self.IsDragMode() && self.dragItem && iImageID == self.dragItem.iImageID)
				{
					self.dragItem.EndDrag(iImageID, self.iMouseUpX, self.iMouseUpY);
				}
				
				if(self.IsRectMode())
					self.DrawMouseRect(iImageID);
				if(self.IsMoveMode())
					self.MoveMap(iImageID);
			
				switch(self.iMode)
				{
					case M_NORC:
						var posWGS = MousePos2Wgs(self.iMouseUpX, self.iMouseUpY);
						
						var strParams = "lat=" + posWGS.dY + "&lon=" + posWGS.dX;
						var ajax = new Ajax();
						ajax.doPost(g_webPrefix + "norc.ashx", strParams, self.NorcUpdate, "text");
						
						//self.Srv.CallFunction('Norc', '&lat=' + posWGS.dY + '&lon=' + posWGS.dX, 0, self.NorcUpdate);
						//NorcAjax.doGet('http://www.norc.hu/engine/getClosestPanoPoint.ashx?lat=47.5'/* + posWGS.dY */+ '&lon=19'/* + posWGS.dX*/, self.NorcUpdate, "text");
						break;
					case M_PICK:
						if (this.CanPick()) {
							self.ClearMarkers(iImageID, 'Pin');
							var posWGS = MousePos2Wgs(self.iMouseUpX, self.iMouseUpY);
							self.SetMarker("Pin", posWGS.dX, posWGS.dY, "Pin");
							self.DrawMarker(iImageID, 'Pin', self.iMouseUpX, self.iMouseUpY, "Pin");
							g_NewReportHandler.NewPin();
							//self.Srv.Pick(iImageID, self.iMouseUpX, self.iMouseUpY, "Pin", "Pin", g_NewReportHandler.NewPin, false);
						}
						else {
							alert(g_Babel.GetWord('distancelimit'));
						}
						break;
					case M_SELECT:
						var arrLength = g_arrMapData[0].arrPois.compact().length;
						var nearest = -1;
						var minLength = Number.MAX_VALUE;
						for (var i = 0; i < arrLength; i++) {
							var x = self.iMouseUpX;
							var y = self.iMouseUpY;
							var poix = g_arrMapData[0].arrPois[i].iX;
							var poiy = g_arrMapData[0].arrPois[i].iY;
							
							if (x < poix - 2 || x > poix + 14 || y < poiy - 32 || y > poiy + 2) {
                continue;
							}
							
							var distance = Math.sqrt((x - (poix + 8)) * (x - (poix + 8)) + (y - (poiy - 16)) * (y - (poiy - 16)));
							
							if (distance < minLength) {
								minLength = distance;
								nearest = i;
							} 
						}
						
						if (minLength < 15) {
							self.ClearMarkers(iImageID, 'Pin');
							var posWGS = MousePos2Wgs(g_arrMapData[0].arrPois[nearest].iX, g_arrMapData[0].arrPois[nearest].iY);
							//self.SetMarker("Pin", posWGS.dX, posWGS.dY, "Pin");
							self.SetMarker("Pin", g_arrMapData[0].arrPois[nearest].dX, g_arrMapData[0].arrPois[nearest].dY, "Pin");
							self.DrawMarker(iImageID, 'Pin', g_arrMapData[0].arrPois[nearest].iX, g_arrMapData[0].arrPois[nearest].iY, "Pin");
							//self.Srv.Pick(iImageID, g_arrMapData[0].arrPois[nearest].iX, g_arrMapData[0].arrPois[nearest].iY, "Pick", "Pick", g_ReportSelector.SelectReportByID);
							//g_Srv.CallFunction("SelectPin", "id=" + g_arrMapData[0].arrPois[nearest].strID, 0, g_pinList.FillMessages);
							g_ReportSelector.SelectReportByID(g_arrMapData[0].arrPois[nearest].strID);
						}
						break;
					case M_ZOOMRECT: self.Srv.ZoomRect(iImageID); break;
					case M_MOVE:     self.Srv.Move(iImageID);     break;
					case M_OLD:      self.Srv.CenterMap(iImageID, GetEventX(pEvent), GetEventY(pEvent)); break;
					case M_DRAG:
						if(self.dragItem)
							self.SetMode(self.dragItem.iPrevMode);
						break;
				}
			}
			for(var i=0; i<self.arrPalettes.length; i++)
			{
				Show(self.arrPalettes[i]);
			}
		}
		self.bMouseDown = false;
		return false;
	}

	this.OnMouseOut = function(iImageID, event)
	{
		if(self.bMouseDown)
		{
			self.SetMouseUp(iImageID, GetEventX(event), GetEventY(event));
			if(self.IsRectMode())
				self.DrawMouseRect(iImageID);
			if(self.IsMoveMode())
				self.MoveMap(iImageID);
		}
	}

	this.OnMouseMove = function(iImageID, event)
	{
		var pt = MousePos2Wgs(GetEventX(event), GetEventY(event));
		var coordstring = (pt.dY >= 0 ? "N" : "S") + ((pt.dY >= 0 ? 1 : -1) * pt.dY).toFixed(6) + "; " + (pt.dX >= 0 ? "E" : "W") + ((pt.dX >= 0 ? 1 : -1) * pt.dX).toFixed(6);
		$("idCoordHolderContainer").update("<div id='idCoordHolder' class='coordholder'>" + coordstring + "</div>");
	//$("babelMap").update(GetEventX(event) + " " + GetEventY(event));
		self.SetMouseUp(iImageID, GetEventX(event), GetEventY(event));
		if(self.bMouseDown)
		{
			if(self.IsRectMode())
				self.DrawMouseRect(iImageID);
			if(self.IsMoveMode())
				self.MoveMap(iImageID);
			if(self.IsDragMode() && self.dragItem)
				self.dragItem.DoDrag(iImageID, self.iMouseUpX, self.iMouseUpY);
		}
		if((self.IsPickMode() || self.IsSelectMode()) && g_arrMapData[iImageID].arrPois != null && g_arrMapData[iImageID].arrPois.length > 0)
		{
			for(var i=0; i<g_arrMapData[iImageID].arrPois.length; i++)
			{
				var drawn = false;
				if ( (g_arrMapData[iImageID].arrPois[i].iX > self.iMouseUpX - 14)
				 &&  (g_arrMapData[iImageID].arrPois[i].iX < self.iMouseUpX)
				 &&  (g_arrMapData[iImageID].arrPois[i].iY > self.iMouseUpY)
				 &&  (g_arrMapData[iImageID].arrPois[i].iY < self.iMouseUpY + 32)
				)
				{
					self.DrawPoiLabel(iImageID, i);
					drawn = true;
					break;
				}
				if (!drawn) {
					$('idLabel').className = "hiddenlabel";
				}
			}
		}
	}

	this.DrawMouseRect = function(iImageID)
	{
		//self.HideLabel(iImageID);
		//self.HidePoiLabel(iImageID);
		var divZoomRect = $('idZoomRect'+ iImageID);
		if(divZoomRect)
		{
			if(self.bMouseDown)
			{
				divZoomRect.style.left = Math.min(this.iMouseDownX, this.iMouseUpX) + "px";
				divZoomRect.style.top =  Math.min(this.iMouseDownY, this.iMouseUpY) + "px";
				divZoomRect.style.width = Math.abs(this.iMouseUpX - this.iMouseDownX) + "px";
				divZoomRect.style.height = Math.abs(this.iMouseUpY - this.iMouseDownY) + "px";
				divZoomRect.style.visibility = 'visible';
			}
			else
				self.ResetMap(iImageID);
		}
	}

	this.MoveMap = function(iImageID)
	{
		//self.HideLabel(iImageID);
		//self.HidePoiLabel(iImageID);

		var iMoveX = this.iMouseUpX - this.iMouseDownX;
		var iMoveY = this.iMouseUpY - this.iMouseDownY;

		var divMap = $('idMap'+iImageID);
		if(divMap)
		{
      if ($("idNORC")) {
        $("idNORC").style.left = self.norcOrigX + iMoveX + "px";
        $("idNORC").style.top = self.norcOrigY + iMoveY + "px";
      }
      if ($("idNORCClose")) {
        $("idNORCClose").style.left = self.norcCloseOrigX + iMoveX + "px";
        $("idNORCClose").style.top = self.norcCloseOrigY + iMoveY + "px";
			}
			divMap.style.left = iMoveX + "px";
			divMap.style.top  = iMoveY + "px";
			var clipLeft = Math.max(0, -iMoveX);
			var clipTop  = Math.max(0, -iMoveY);
			var clipRight = Math.max(0, g_arrMapData[iImageID].iMapWidth - iMoveX);
			var clipBottom = Math.max(0, g_arrMapData[iImageID].iMapHeight - iMoveY);
			
			divMap.style.clip = 'rect('+ clipTop +'px,'+ clipRight +'px,'+ clipBottom +'px,'+ clipLeft +'px)';
		}
	}


	this.SetMarker = function(MarkerID, dX, dY, strClass)
	{
		var i;
		var iNew = -1;
		for(i=0; i<self.arrMarkers.length; i++)
		{
			if(self.arrMarkers[i] == null)
			{
				if(iNew < 0)
					iNew = i;				
				continue;
			}
			if(self.arrMarkers[i].ID == MarkerID)
			{
				iNew = i;
				break;
			}
		}
		if(iNew < 0)
			iNew = self.arrMarkers.length;

		self.arrMarkers[iNew] = new Marker(MarkerID, dX, dY, strClass);
	}

	this.DeleteMarker = function(MarkerID)
	{
		self.ClearMarkers(0, MarkerID);
		for(var i=0; i<self.arrMarkers.length; i++)
		{
			if(self.arrMarkers[i].ID == MarkerID)
			{
				self.arrMarkers[i] = null;
				break;
			}
		}
	}

	this.DrawMarker = function(iImageID, MarkerID, iPxlX, iPxlY, strClass)
	{
		var divMap = $('idMap'+iImageID);
		var id = 'idMarker'+ String(iImageID) + MarkerID;
		
		var divMarker = $(id);
		if(divMarker == null)
		{
			divMarker = new Element('div');
			divMarker.setAttribute('id', id);
		}

		if(strClass == "start") {
			divMarker.className = "markerGreen";
		}
		else if(strClass == "stop") {
			divMarker.className = "markerRed";
		}
		else if(strClass == "poiDrag") {
			divMarker.className = "markerPoiDrag";
		}
		else if(strClass == "Pin") {
			divMarker.className = "markerPin pinRed";
			//var div = new Element("div", {'class': 'pinRed'});
			//divMarker.insert(div);
		}
		else if (strClass == "Norc") {
			divMarker.className = "norcContainer";
		}
		else {
			divMarker.className = "marker";
		}

		if(strClass=="Pin")
		{
			divMarker.style.left = (iPxlX - 2) + "px";
			divMarker.style.top  = (iPxlY - 30) + "px";
			//divMap = $("idFace");
		}
		else if(strClass=="poiDrag")
		{
			divMarker.style.left = (iPxlX - 10) + "px";
			divMarker.style.top  = (iPxlY - 10) + "px";
		}
		else if(strClass=="Norc")
		{
			divMarker.style.left = (iPxlX - 3) + "px";
			divMarker.style.top  = (iPxlY - 390) + "px";
      if ($("idNORC")) {
        $("idNORC").style.left = (iPxlX + 22) + "px";
        $("idNORC").style.top = (iPxlY - 364) + "px";
        $("idNORC").style.display = "block";
			}
      if ($("idNORCClose")) {
        $("idNORCClose").style.left = (iPxlX + 458) + "px";
        $("idNORCClose").style.top = (iPxlY - 389) + "px";
        $("idNORCClose").style.display = "block";
			}
		}
		else
		{
			divMarker.style.left = (iPxlX - 2) + "px";
			divMarker.style.top  = (iPxlY - 14) + "px";
		}
		if (divMarker.parentNode != divMap) {
			divMap.insert(divMarker);
		}
		if(self.dragItem && self.dragItem.iImageID == iImageID && self.dragItem.MarkerID == MarkerID)
			self.dragItem.SetPixelCoords(iPxlX, iPxlY);
	}

	this.ClearMarkers = function(iImageID, MarkerID)
	{
		var divMap = $('idMap'+iImageID);

		if (MarkerID == undefined || MarkerID == "Norc") {
      if ($("idNORC")) {
        $("idNORC").style.display = "none";
			}
      if ($("idNORCClose")) {
        $("idNORCClose").style.display = "none";
			}
		}

		if(divMap)
		{	
			var listMarkers = divMap.getElementsByTagName('div');
			var strFilter = 'idMarker'+ iImageID;
			
			for(var i=0; i<listMarkers.length; i++)
			{
				var divMarker = listMarkers[i];
				var id = divMarker.getAttribute("id");
				if(id.substr(0,strFilter.length)==strFilter)
				{
					if(MarkerID == undefined || id.substr(strFilter.length) == MarkerID)
					{
						divMap.removeChild(divMarker);
						i--;
					}
				}
			}
		}
		if(MarkerID == null || MarkerID == undefined)
		{
			self.HidePoiLabel(iImageID);
			self.HideLabel(iImageID);
		}
	}
	
	this.LabelIcons = function(div, iPoiIndex)
	{
		var linkdiv = new Element("div")
		div.insert(linkdiv);
		linkdiv.className = "labelclose";
		var a, img;
		if(self.bEnableTrafficButtons)
		{
			a = new Element("a");
			linkdiv.insert(a);
			if(iPoiIndex < 0)
				a.setAttribute("href", "javascript:AddressPick(0,true);");
			else
				a.setAttribute("href", "javascript:ShowPoiData(0,"+ iPoiIndex+ ",true,true)");
			a.className = "button";
			a.style.margin = "1px";
			
			img = new Element("img", {src: g_webPrefix + "design_new/ttrafficctrl/traffic_from_small.gif", width: 12, height: 12, alt: "Útvonaltervezés innen"});
			a.insert(img);
			
			a = new Element("a");
			linkdiv.insert(a);
			if(iPoiIndex < 0)
				a.setAttribute("href", "javascript:AddressPick(0,false);");
			else
				a.setAttribute("href", "javascript:ShowPoiData(0,"+ iPoiIndex+ ",true,false)");
			
			a.className = "button";
			a.style.margin = "1px";
			
			img = new Element("img", {src: g_webPrefix + "design_new/ttrafficctrl/traffic_to_small.gif", width: 12, height: 12, alt: "Útvonaltervezés ide"});
			a.insert(img);
		}
		
		a = new Element("a")
		linkdiv.insert(a);
		a.className = "button";
		a.style.margin = "1px";
		a.setAttribute("href", "javascript:void(0)");

		if(iPoiIndex < 0)
			a.onclick = function() { self.HideLabel(0);self.DeleteMarker('Pick'); };
		else
			a.onclick = function() { self.HidePoiLabel(0); };

			
		img = new Element("img", {src: g_webPrefix + "design_new/mapctrl/close.gif", width: 12, height: 12, alt: "{53}"});
		a.insert(img);
	}
	
	this.DrawLabel = function()
	{
		var div= $('idLabel');
		while(div.hasChildNodes())
			div.removeChild(div.firstChild);
		div.style.left = (g_PickResult.iPxlX - 2) + "px";
		div.style.top  = (g_PickResult.iPxlY + 2) + "px";
		div.className = 'labelbox';
		
		self.HidePoiLabel(0);
		
		self.LabelIcons(div, -1);

		var caption = new Element('div');
		div.insert(caption);
		caption.className = 'labelcaption';
		if(self.bEnableTrafficButtons)
			caption.style.paddingRight = "44px";
		else
			caption.style.paddingRight = "14px";
		
		
		caption.update(g_PickResult.strName);
		
		if(g_PickResult.arrNames.length>0)
		{
			var table = new Element('table');
			div.insert(table);
			table.className = 'label';
			table.setAttribute('cellpadding', 2);
			table.setAttribute('cellspacing', 0);
			var tbody = new Element('tbody');
			table.insert(tbody);
			table = tbody;
			var tr, td; 
			if(g_PickResult.nTypeID>0)
			{
				tr = new Element('tr');
				table.insert(tr);
				td = new Element('td');
				tr.insert(td);
				td.className = 'label';
				td.update("{15}");
				td = new Element('td');
				tr.insert(td);
				td.className = 'label';
				td.update(GetPoiTypeName(g_PickResult.nTypeID, false));
			}
			for(var i=0; i<g_PickResult.arrNames.length; i++)
			{
				tr = new Element('tr');
				table.insert(tr);
				td = new Element('td');
				tr.insert(td);
				td.className = 'label';
				td.update(g_PickResult.arrNames[i]);
				td = new Element('td');
				tr.insert(td);
				td.className = 'label';
				NewAutoLinkTag(g_PickResult.arrValues[i], td);
			}
		}
		
		AvoidClip(div);
	}

	this.DrawPoiLabel = function(iImageID, iIndex)
	{
		var div = $('idLabel');
		div.update("");

		div.style.left = (g_arrMapData[iImageID].arrPois[iIndex].iX - 2) + "px";
		div.style.top  = (g_arrMapData[iImageID].arrPois[iIndex].iY + 2) + "px";
		div.className = "visiblelabel";

		if(iIndex < g_arrMapData[iImageID].arrPois.length)
		{	
//			var caption = new Element('div');
//			div.insert(caption);
			div.update(g_arrMapData[iImageID].arrPois[iIndex].strName);

			// link
//			var linkdiv = new Element("div")
//			div.insert(linkdiv);
//			linkdiv.style.textAlign = "right";
//			a = new Element("a");
//			linkdiv.insert(a);
//			a.className = "label";
//			a.setAttribute("href", "javascript:ShowPoiData("+iImageID + ","+ iIndex+ ",false,false)");
//			a.update("Részletek");
//			AvoidClip(div);
		}
	}

	this.HideLabel = function(iImageID)
	{
		var divLabel = $('idLabel');
		if(divLabel)
		{
			divLabel.className = 'hiddenlabel';
			while(divLabel.hasChildNodes())
				divLabel.removeChild(divLabel.firstChild);
		}
	}
	
	this.HidePoiLabel = function (iImageID)
	{
		var divLabel = $("idPoiLabel"+iImageID)
		if(divLabel)
		{
			divLabel.className = "hiddenlabel";
			while(divLabel.hasChildNodes())
				divLabel.removeChild(divLabel.firstChild);
		}
	}
// Drag
	this.SetDragItem = function(dragItem, dX, dY)
	{
		self.dragItem = dragItem;
		dragItem.mapHandler = self;
		self.SetMarker(dragItem.MarkerID, dX, dY, "poiDrag");
	}

// Commands
	
	self.Srv.AddMapParams = function(iImageID, iWidth, iHeight, dCenterX, dCenterY, strParams)
	{
		var strMarkers = "";
		for(var i=0; i<self.arrMarkers.length; i++)
		{
			if(self.arrMarkers[i]!= undefined)
			{
				if(strMarkers != "")
					strMarkers += "|";
				strMarkers += self.arrMarkers[i].ID + "|" + self.arrMarkers[i].dX + "|" + self.arrMarkers[i].dY + "|" + self.arrMarkers[i].strClass;
			}
		}
		var strTotalParams = 'iImageID='+iImageID + '&iWidth=' + iWidth + '&iHeight=' + iHeight 
											 + '&dCenterX=' + dCenterX + '&dCenterY=' + dCenterY
											 + '&dMinX=' + g_arrMapData[iImageID].dViewMinX + '&dMinY=' + g_arrMapData[iImageID].dViewMinY
											 + '&dMaxX=' + g_arrMapData[iImageID].dViewMaxX + '&dMaxY=' + g_arrMapData[iImageID].dViewMaxY
											 + '&dMeterPerPixelX=' + g_arrMapData[iImageID].dMeterPerPixelX
											 + '&dMeterPerPixelY=' + g_arrMapData[iImageID].dMeterPerPixelY
											 + '&iSelectedPin=' + g_arrMapData[iImageID].selectedPin;
		if(g_arrMapData[iImageID].dRadius != undefined)
				strTotalParams += '&dRadius=' + g_arrMapData[iImageID].dRadius;
		strTotalParams += '&arrMarkers='+ strMarkers;

		if(g_arrMapData[iImageID].arrLayers != null && g_arrMapData[iImageID].arrLayers.length > 0)
		{
			var strExtraLayers = "";
			for(var i=0; i<g_arrMapData[iImageID].arrLayers.length; i++)
			{
				if(strExtraLayers != "")
					strExtraLayers += "|";
				strExtraLayers += escape(g_arrMapData[iImageID].arrLayers[i]);
			}
			strTotalParams += "&arrLayers=" + strExtraLayers;
		}

		if(g_arrMapData[iImageID].arrBkvRunViews != null && g_arrMapData[iImageID].arrBkvRunViews.length > 0)
		{
			var strBkvRunViews = "";
			for(var i=0; i<g_arrMapData[iImageID].arrBkvRunViews.length; i++)
			{
				if(strBkvRunViews != "")
					strBkvRunViews += "|";
				strBkvRunViews += escape(g_arrMapData[iImageID].arrBkvRunViews[i].m_strTopVType);
				strBkvRunViews += "|" + escape(g_arrMapData[iImageID].arrBkvRunViews[i].m_strTopRunName);
				strBkvRunViews += "|" + g_arrMapData[iImageID].arrBkvRunViews[i].m_iDirection;
			}
			strTotalParams += "&arrBkvRunViews=" + strBkvRunViews;
		}
		
		if(self.arrPois != null && self.arrPois.length > 0)
		{
			var strPoiFilter = "";
			for(var i=0; i< self.arrPois.length>0; i++)
			{
				if(strPoiFilter != "")
					strPoiFilter += "|";
					
				strPoiFilter += self.arrPois[i].nID;
				strPoiFilter += "|" + self.arrPois[i].nTypeID;
				strPoiFilter += "|" + self.arrPois[i].iImageID;
				strPoiFilter += "|" + encodeURI(self.arrPois[i].GetPoiName());
				strPoiFilter += "|" + self.arrPois[i].dX;
				strPoiFilter += "|" + self.arrPois[i].dY;
			}
			strTotalParams += "&arrPoiFilter=" + strPoiFilter;		
		}

		

		if(strParams != undefined)
			strTotalParams += '&' + strParams;
		return strTotalParams;
	}

	self.Srv.CallMapFunction = function(strFunction, iImageID, strParams, handler, handlerParam)
	{
		var overridehandler = function(serverparams, dummy, iCommandID) {
			if (serverparams.mapdata != "") {
				ClearMarkers(0);
				g_arrMapData[0] = serverparams.mapdata;
				/*for (var i = 0; i < g_arrMapData[0].visibleMarkers.length; i++) {
					var marker = g_arrMapData[0].visibleMarkers[i];
					g_MapHandler.SetMarker(marker.id, marker.iX, marker.iY, marker.className);
				}*/
				SetMapImage(0);
			}
			if (handler != undefined && handler != null) {
				handler(serverparams.customresponse, handlerParam);
			}
		}
		
		self.Srv.CallFunction(strFunction, self.Srv.AddMapParams(iImageID, g_arrMapData[iImageID].iMapWidth, g_arrMapData[iImageID].iMapHeight, g_arrMapData[iImageID].dCenterX, g_arrMapData[iImageID].dCenterY, strParams), iImageID, overridehandler, handlerParam);
	}


	self.Srv.ShowMap = function(iImageID)
	{
		self.Srv.CallMapFunction('ShowMap', iImageID, self.Srv.GetSearchParams());
	}

	self.Srv.ResizeMap = function(iImageID, iWidth, iHeight)
	{
		self.Srv.CallMapFunction("ResizeMap",iImageID,"iNewWidth="+ iWidth + "&iNewHeight="+iHeight);	
	}
	
	self.Srv.Pick = function(iImageID, iPickX, iPickY, strMarkerID, strMarkerClass, handler)
	{
		if(strMarkerID == null || strMarkerID == undefined)
			strMarkerID = null;
		if(strMarkerClass == null || strMarkerClass == undefined)
			strMarkerClass = null;
		
		self.Srv.CallMapFunction("Pick", iImageID, "iPickX=" + self.iMouseUpX + '&iPickY=' + self.iMouseUpY + "&strMarkerID="+strMarkerID+"&strMarkerClass=" + strMarkerClass, handler);
	}

	self.Srv.Map2WGS = function(dX, dY, handler)
	{
		self.Srv.CallFunction("Map2WGS", "dX=" + dX + '&dY=' + dY, 0, handler);
	}

	self.Srv.GetSearchParams = function() {
		var searchParams = "";
		if (window.g_intelliSearch) {
			searchParams = "&intelliSearch=1";
			searchParams += "&bugtype=" + g_reportSearch.m_bugtype.options[g_reportSearch.m_bugtype.selectedIndex].value;
			searchParams += "&username=" + (g_reportSearch.m_username.value == g_Babel.GetWord("blurtipusername") ? "" : g_reportSearch.m_username.value);
			searchParams += "&status=" + g_reportSearch.m_status.value;
			searchParams += "&timefrom=" + (g_reportSearch.m_timefrom.value == g_Babel.GetWord("blurtipdatetime") ? "" : g_reportSearch.m_timefrom.value);
			searchParams += "&timeto=" + (g_reportSearch.m_timeto.value == g_Babel.GetWord("blurtipdatetime") ? "" : g_reportSearch.m_timeto.value);
			searchParams += "&id=" + (g_reportSearch.m_id.value == g_Babel.GetWord("blurtipid") ? "" : g_reportSearch.m_id.value);
			searchParams += "&minx=" + g_arrMapData[0].dViewMinX;
			searchParams += "&miny=" + g_arrMapData[0].dViewMinY;
			searchParams += "&maxx=" + g_arrMapData[0].dViewMaxX;
			searchParams += "&maxy=" + g_arrMapData[0].dViewMaxY;
			searchParams += "&userLevel=" + g_reportSearch.m_userlevel.options[g_reportSearch.m_userlevel.selectedIndex].value;
		}
		return searchParams;
	}
	
	self.Srv.ZoomRect = function(iImageID)
	{
		self.Srv.CallMapFunction("ZoomRect", iImageID, "iLwrX=" + self.iMouseDownX + '&iLwrY=' + self.iMouseDownY + '&iUprX=' + self.iMouseUpX + '&iUprY=' + self.iMouseUpY + self.Srv.GetSearchParams());
	}

	self.Srv.ZoomMapRect = function(iImageID, dCenterX, dCenterY, dLwrX, dLwrY, dUprX, dUprY, strLabel, dZoom, handler, handlerParam)
	{
		var strParams = 'dCenterX=' + dCenterX + '&dCenterY=' + dCenterY + '&dLwrX=' + dLwrX + '&dLwrY=' + dLwrY + '&dUprX=' + dUprX + '&dUprY=' + dUprY + '&strLabel=' + strLabel + '&dZoom=' + (dZoom != undefined ? dZoom : 1) + self.Srv.GetSearchParams(); 
		g_Srv.CallFunction('ZoomMapRect', self.Srv.AddMapParams(iImageID, g_arrMapData[iImageID].iMapWidth, g_arrMapData[iImageID].iMapHeight, dCenterX, dCenterY, strParams), iImageID, handler, handlerParam);
		//g_Srv.CallMapFunction('ZoomMapRect', iImageID, self.Srv.AddMapParams(iImageID, g_arrMapData[iImageID].iMapWidth, g_arrMapData[iImageID].iMapHeight, dCenterX, dCenterY, strParams), handler, handlerParam);
	}


	self.Srv.Move = function (iImageID)
	{
		var iMoveX = (self.iMouseUpX - self.iMouseDownX);
		var iMoveY = (self.iMouseUpY - self.iMouseDownY);
		if(iMoveX!=0 || iMoveY!=0)
			self.Srv.CallMapFunction("MoveMap", iImageID, "iMoveX=" + iMoveX + '&iMoveY=' + iMoveY + self.Srv.GetSearchParams());
		else
			self.Srv.CallMapFunction("CenterMap", iImageID, "iPickX=" + self.iMouseUpX + '&iPickY=' + self.iMouseUpY + self.Srv.GetSearchParams());
	}

	self.Srv.ZoomIn = function(iImageID)
	{
		self.Srv.CallMapFunction('ZoomIn', iImageID, "dZoomPercent=" + g_arrMapData[iImageID].dZoomPercent + self.Srv.GetSearchParams());
	}

	self.Srv.ZoomOut = function(iImageID)
	{
		self.Srv.CallMapFunction('ZoomOut', iImageID, "dZoomPercent=" + g_arrMapData[iImageID].dZoomPercent + self.Srv.GetSearchParams());
	}

	self.Srv.CenterMapWGS = function(iImageID, lat, lon, handler, handlerParams)
	{
		var strParams = "dLat=" + lat + "&dLon=" + lon + self.Srv.GetSearchParams();
		self.Srv.CallFunction('CenterMapWGS', self.Srv.AddMapParams(iImageID, g_arrMapData[iImageID].iMapWidth, g_arrMapData[iImageID].iMapHeight, 0, 0, strParams), iImageID, handler, handlerParams);
	}

	self.Srv.ZoomSlider = function(iImageID, iSlider)
	{
		if(self.iSliderMax > 0)
			self.Srv.CallMapFunction('ZoomPercent', iImageID, "dPercent=" + iSlider / self.iSliderMax + self.Srv.GetSearchParams());
	}
 
	self.Srv.CenterMap = function(iImageID, iPxlX, iPxlY)
	{
		self.Srv.CallMapFunction("CenterMap", iImageID, "iPickX=" + iPxlX + '&iPickY=' + iPxlY + self.Srv.GetSearchParams());	
	}
}