/************************************ GENERAL *************************************/

var bIsCorrectLabel = false;
var bCenterBorder = false;

var mutexCounter = new LockCounter();
//var nLocks = 0;
var bMouseClick = false;
var oTimeoutLabels = null;

var aSlideSteps = [	0.01, 0.02, 0.03, 0.05, 0.06, 0.08, 0.09, 0.10, 0.11, 
										0.10, 0.09, 0.08, 0.06, 0.05, 0.03, 0.02, 0.01				];

var aLockElements = [	"divControl",
											"divTileMap",
											"imgNaviCross",
											"imgSliderPlus",
											"imgSliderMinus",
											"mapCtrlSliderButtonImg",
											"linkMapModeMap",
											"linkMapModeAir",
											"linkMapModeHybrid"];

function iwLockControls()
{
	//nLocks++;
	
	if (bMousePressed)
	{
		bMousePressed = false;
		document.onmousemove	= iwGetMousePosition;
		document.onmouseup		= null; // ???
		
		// there won't be a mouseup event, so reload the labels now
		iwShowLabels(true);
	}
	
	for (var nElement = 0; nElement < aLockElements.length; nElement++)
	{
		var oElement = document.getElementById(aLockElements[nElement]);
		if (oElement != null)
			oElement.style.cursor = "wait";
	}
	
	bControlsBlocked = true;
	
	//console.log("lockControl", nLocks, bControlsBlocked);
}

function iwReleaseControls()
{
	if (mutexCounter.getLocks() == 0)
	{
		//nLocks = 0;
		
		for (var nElement = 0; nElement < aLockElements.length; nElement++)
		{
			var oElement = document.getElementById(aLockElements[nElement]);
			if (oElement != null)
				oElement.style.cursor = "";
		}
		bControlsBlocked = false;
	}
	//console.log(nLocks, bControlsBlocked);
}


function iwKeyPressed(event)
{
	//if (bControlsBlocked)
	//	return true;
	if (mutexCounter.getLocks() != 0)
		return true;
	
	if (!event)
		event = window.event;
	
	var nOffset = 10;
	if (event.ctrlKey)
		nOffset = 50;
	
	switch (event.keyCode)
	{
		case 37:	iwShowLabels(false);					// left
							oTileset.Move(nOffset, 0);
							iwShowLabels(true);
							break;
		case 38:	iwShowLabels(false);					// up
							oTileset.Move(0, nOffset);
							iwShowLabels(true);
							break;
		case 39:	iwShowLabels(false);					// right
							oTileset.Move(-nOffset, 0);
							iwShowLabels(true);
							break;
		case 40:	iwShowLabels(false);					// down
							oTileset.Move(0, -nOffset);
							iwShowLabels(true);
							break;
		//case 75:	oTileset.MoveTo(267362, 214497);	// k
	}
}

function iwMouseControl(event)
{
	//if (bControlsBlocked)
	//	return false;
	if (mutexCounter.getLocks() != 0)
	return false;
	
	if (!event)
		event = window.event;
	
	var nButton = 0; // 0: none, 1: left, 2: right
	
	if (event.which)
	{
		// Netscape: Left = 1, Middle = 2, Right = 3
		if (event.which == 3)
			nButton = 2;
		else if (event.which == 1)
			nButton = 1;
	}
	else if (event.button)
	{
		// DOM 2.0: Left = 0, Middle = 1, Right = 2; IE: Left = 1, Middle = 4, Right = 2
		if (event.button == 2)
			nButton = 2;
		else
			nButton = 1;
	}
	
	if (nButton == 1)
	{
		if (oTileset.nControlLeft == oTileset.CONTROL_DRAG)
			iwGrapMap(event);
		else if (oTileset.nControlLeft == oTileset.CONTROL_ZOOM)
			iwStartSelection(event);
		else if (oTileset.nControlLeft == oTileset.CONTROL_SELECT)
			iwGrapSelectionBorder(event);
	}
	if (nButton == 2)
	{
		if (oTileset.nControlRight == oTileset.CONTROL_DRAG)
			iwGrapMap(event);
		else if (oTileset.nControlRight == oTileset.CONTROL_ZOOM)
			iwStartSelection(event);
		else if (oTileset.nControlRight == oTileset.CONTROL_SELECT)
			iwGrapSelectionBorder(event);
	}
	
	return false;
}

function iwGetMousePosition(event)
{
	if (!event)
		event = window.event;
		
	if (event)
	{			
		if (event.clientX)
		{
    		if (BrowserDetect.browser == "Safari" || BrowserDetect.browser == "Konqueror")
    		{
      			nCurMouseXPos = event.clientX - nMainMapOffsetPixelX;
	    		nCurMouseYPos = event.clientY - nMainMapOffsetPixelY;    		
    		}
    		else
    		{
      			nCurMouseXPos = event.clientX + document.body.scrollLeft - nMainMapOffsetPixelX;
	    		nCurMouseYPos = event.clientY + document.body.scrollTop - nMainMapOffsetPixelY;
	    	}
	    
    	}
	}
	
	iwShowStatus(event);
}

function iwShowLabels(bVisible)
{
	if (!oTileset.bIsOverview)
	{
		var nMapWidthMeter = oTileset.nTilesizeMeter * oTileset.nVisibleWidth / oTileset.nTilesize;
		var nMapHeightMeter = oTileset.nTilesizeMeter * oTileset.nVisibleHeight / oTileset.nTilesize;
		iwGetMapInfo(nMapWidthMeter, nMapHeightMeter, CHECKMODE_GETINFO);
	}

	if (BrowserDetect.browser == "Safari" || BrowserDetect.browser == "Konqueror")
	{
		document.images["imgLabels"].src = "img/blank.gif";
	}

	if (bVisible)
	{
		var sType = "air";
		if (oTileset.nMapMode == oTileset.MAPMODE_MAP)
			sType = "map";
		else if (oTileset.nMapMode == oTileset.MAPMODE_HYBRID)
			sType = "hybrid";
		
		var nMapWidthMeter = oTileset.nTilesizeMeter * oTileset.nVisibleWidth / oTileset.nTilesize;
		var nMapHeightMeter = oTileset.nTilesizeMeter * oTileset.nVisibleHeight / oTileset.nTilesize;
		iwCountClick(nMapWidthMeter, nMapHeightMeter, sType);
		document.images["imgLabels"].onload = iwRenderLabelsVisible;
		if (BrowserDetect.browser == "Safari" || BrowserDetect.browser == "Konqueror")
		{
			iwRenderDivLabelsVisible();
		}
		
		if (oTileset.nMapMode == oTileset.MAPMODE_MAP || oTileset.nMapMode == oTileset.MAPMODE_HYBRID)
		{
			bIsCorrectLabel = true;
			
			var sURL = 		oTileset.sMapServerURL
									+ "iwmapserverproxy_getlabels.jsp"
									+ "?cmd=GetMap" 
									+ "&mapcx="  + oTileset.nCenterMeterX
									+ "&mapcy="  + oTileset.nCenterMeterY
									+ "&mapdx="  + nMapWidthMeter
									+ "&mapdy="  + nMapHeightMeter
									+ "&width="  + oTileset.nVisibleWidth
									+ "&height=" + oTileset.nVisibleHeight
									+ "&projc=lcc_europe"
									+ szExtraUrlParm
									+ "&type=" + sType;
			document.images["imgLabels"].src = configurator.getMapServerUrl(sURL);
		}
		else
		{
			document.images["imgLabels"].src = "img/blank.gif";
		}
		
		if (oTileset.bHasOverview)
		{
			if (frames["frmOverview"].iwShowLabels)
			{
				frames["frmOverview"].iwShowLabels(true);
			}
		}
	}
	else
	{
		if (oTimeoutLabels)
		{
			window.clearTimeout(oTimeoutLabels);
			oTimeoutLabels = null;
		}
		document.images["imgLabels"].onload = null;
		document.images["imgLabels"].src = "img/blank.gif";
		document.images["imgLabels"].style.visibility = "hidden";
		
		if (typeof HidePOIs != 'undefined')
			HidePOIs();
		
		var result = [false, 0, 0];
		for (var nAddress = 0; nAddress < nShowAddress; nAddress++)
			ShowAddressLayer(result, nAddress);
	}
}

function iwCountClick(nMapWidthMeter, nMapHeightMeter, sType)
{
	var frmCountClicks = document.getElementById("frmCountClicks");
	if (frmCountClicks)
	{
		var sOverview = 0;
		if (oTileset.bIsOverview)
			sOverview = 1;
		
		var sURL =		oTileset.sMapServerURL	
								+ "WriteAccessStatistics.jsp"
								+ "?cmd=GetMap" 
								+ "&mapcx="  + oTileset.nCenterMeterX
								+ "&mapcy="  + oTileset.nCenterMeterY
								+ "&mapdx="  + nMapWidthMeter
								+ "&mapdy="  + nMapHeightMeter
								+ "&width="  + oTileset.nVisibleWidth
								+ "&height=" + oTileset.nVisibleHeight
								+ "&projc=lcc_europe"
								+ szExtraUrlParm
								+ "&type=" + sType
								+ "&overview=" + sOverview
								+ "&session=" + sSessionId
								+ "&application=" + "GS";
		
		frmCountClicks.src = configurator.getMapServerUrl(sURL);
	}
}

function iwRenderLabelsVisible()
{		
	var imgLabels = document.images["imgLabels"];
	if (imgLabels.complete && oTileset.bCompletelyVisible && !bMousePressed &&
			bIsCorrectLabel)
	{
		if (bDragLabels == true)
		{
			var divLabels = document.getElementById("divLabels");
			divLabels.style.left = "0";
			divLabels.style.top = "0";
		}
	
		imgLabels.style.visibility = "visible";
		for (var nAddress = 0; nAddress < nShowAddress; nAddress++)
			ShowAddressLayer(GetAddressPixelPosition(nAddress), nAddress);
		RequestPOILayer();
	}
	else
		oTimeoutLabels = window.setTimeout("iwRenderLabelsVisible()", 500);
};

//for mac
function iwRenderDivLabelsVisible()
{
	var divLabels = document.getElementById("divLabels")
	if (divLabels)
		divLabels.style.visibility = "visible";
	
	if (bDragLabels == true)
	{
		//var divLabels = document.getElementById("divLabels");
		divLabels.style.left = "0";
		divLabels.style.top = "0";
	}
	
	var imgLabels = document.images["imgLabels"];
	imgLabels.style.visibility = "visible";

	for (var nAddress = 0; nAddress < nShowAddress; nAddress++)
		ShowAddressLayer(GetAddressPixelPosition(nAddress), nAddress);
	RequestPOILayer();
}

/************************************ ZOOMING *************************************/

function iwStartSelection(event)
{
	document.onmousedown = FalseFunc;
	document.onmousemove = iwRedrawSelection;
	document.onmouseup = iwEndSelection;
	
	iwGetMousePosition(event);
	
	nMouseXStartPos = nCurMouseXPos;
  nMouseYStartPos = nCurMouseYPos;
}

function iwRedrawSelection(event)
{
	var bInsideMap = 			nCurMouseXPos > 0
										&&	nCurMouseYPos > 0
										&&	nCurMouseXPos < oTileset.nVisibleWidth
										&&	nCurMouseYPos < oTileset.nVisibleHeight;
	
	if (bInsideMap)
	  DrawNaviBox();
  
  iwGetMousePosition(event);
	return false;
}

function iwEndSelection(event)
{
	document.onmouseup = FalseFunc;
	document.onmousemove = iwGetMousePosition;
	
	HideNaviBox();
	iwZoom();
}

function iwZoom()
{
	oTileset.nMovedX = 0;
	oTileset.nMovedY = 0;
	// if (bControlsBlocked)
	//	return false;
	if (mutexCounter.getLocks() != 0)
		return false;
	
	if (Math.abs(nMouseXStartPos - nCurMouseXPos) < 5 &&
			Math.abs(nMouseYStartPos - nCurMouseYPos) < 5		)
	{
		return false;
	}
	
	var nScalingLevel = oTileset.FindBestScalingLevel();
	if (nMouseXStartPos < nCurMouseXPos && nScalingLevel == 0)
	{
		// user tries to zoom in on highest zoom level
		return false;
	}
	else if (nMouseXStartPos > nCurMouseXPos && nScalingLevel == A_TILESIZE_METER.length - 1)
	{
		// user tries to zoom out on lowest zoom level
		return false;
	}
	
	if (oTileset.fOnZoomStart)
		oTileset.fOnZoomStart();
	
	oTileset.oAsynchroneTransferObject.AbortAllRequests();
	//iwLockControls();  //xida test
	iwShowLabels(false);
	
	oTileset.oZoomObject.Zoom(nMouseXStartPos, nMouseYStartPos, nCurMouseXPos, nCurMouseYPos);
	
	oTileset.nCenterMeterX	= oTileset.PixelToMeterX(oTileset.oZoomObject.GetZoomCenterPixelX());
	oTileset.nCenterMeterY	= oTileset.PixelToMeterY(oTileset.oZoomObject.GetZoomCenterPixelY());
	oTileset.nTilesizeMeter = oTileset.nTilesizeMeter / oTileset.oZoomObject.GetZoomFactor();
	
	if (oTileset.bHasOverview)
	{
		if (frames["frmOverview"].oTileset)
		{
			var divMapSection = frames["frmOverview"].document.getElementById("divMapSection");
			var nFactor = 	oTileset.nOverviewFactor 
										* (oTileset.nVisibleWidth / oTileset.nOverviewSize);
			
			var nZoomCenterPixelX = 	parseInt(divMapSection.style.left)
															+ (oTileset.oZoomObject.GetZoomCenterPixelX() / nFactor);
			var nZoomCenterPixelY = 	parseInt(divMapSection.style.top)
															+ (oTileset.oZoomObject.GetZoomCenterPixelY() / nFactor);
			var nZoomFactor = oTileset.oZoomObject.GetZoomFactor();
			
			var oZoomObject = frames["frmOverview"].oTileset.oZoomObject;
			
			oZoomObject.SetDivTileMap();
			
			var divTileMap = oZoomObject.oDivTileMap;
			oZoomObject.createDivZoomTiles(divTileMap);
			oZoomObject.nZoomCenterPixelX = nZoomCenterPixelX;
			oZoomObject.nZoomCenterPixelY = nZoomCenterPixelY;
			oZoomObject.SetZoomFactor(nZoomFactor);
			
			oZoomObject.getZoomArea(oZoomObject.nZoomCenterPixelX, oZoomObject.nZoomCenterPixelY);
			oZoomObject.appendZoomDIVSet();
			oZoomObject.CreateZoomTileSet(oZoomObject.nZoomTilesX, oZoomObject.nZoomTilesY, oZoomObject.nTileWidth, oZoomObject.nTileHeight, oZoomObject.nZoomTileSetLeft, oZoomObject.nZoomTileSetTop, oZoomObject.nZoomTileZIndex);	
			oZoomObject.zoomDivTiles(oZoomObject.nZoomCenterPixelX, oZoomObject.nZoomCenterPixelY, oZoomObject.nZoomFaktor, oZoomObject.nZoomSteps);
			
			if (!frames["frmOverview"].oTileset.oZoomObject.bCloneTiles) // Internet Explorer
			{
				frames["frmOverview"].oTileset.CreateTiles();
				var nIndex = 0;
				for (var iRow = 0; iRow < frames["frmOverview"].oTileset.nTotalTilesY; iRow++)
				{
					for (var iCol = 0; iCol < frames["frmOverview"].oTileset.nTotalTilesX; iCol++)
					{
						frames["frmOverview"].oTileset.aTiles[nIndex].oDiv = frames["frmOverview"].document.getElementById("divTile_" + iCol + "_" + iRow);
						frames["frmOverview"].oTileset.aTiles[nIndex].oImg = frames["frmOverview"].document.getElementById("imgTile_" + iCol + "_" + iRow);
						nIndex ++;
					}
				}
			}
			
			frames["frmOverview"].oTileset.nCenterMeterX	= oTileset.nCenterMeterX;
			frames["frmOverview"].oTileset.nCenterMeterY	= oTileset.nCenterMeterY;
			frames["frmOverview"].oTileset.nTilesizeMeter	= oTileset.nTilesizeMeter * nFactor;
			
			frames["frmOverview"].oTileset.Hide();
			frames["frmOverview"].oTileset.PlaceTiles();
			frames["frmOverview"].oTileset.LoadWholeMap();
		}
	}
	
	if (!oTileset.oZoomObject.bCloneTiles) // Internet Explorer
	{
		oTileset.CreateTiles();
		var nIndex = 0;
		for (var iRow = 0; iRow < oTileset.nTotalTilesY; iRow++)
		{
			for (var iCol = 0; iCol < oTileset.nTotalTilesX; iCol++)
			{
				oTileset.aTiles[nIndex].oDiv = document.getElementById("divTile_" + iCol + "_" + iRow);
				oTileset.aTiles[nIndex].oImg = document.getElementById("imgTile_" + iCol + "_" + iRow);
				nIndex ++;
			}
		}
	}
	oTileset.Hide(); //? 
	oTileset.PlaceTiles();
	oTileset.LoadWholeMap();
}

function InitNaviBox()
{
	var divZoomIn = document.createElement('div');
	divZoomIn.id = "divZoomIn";
	divZoomIn.align = "center";
	divZoomIn.className = "navi_box";
	divZoomIn.innerHTML = 	'	<table height="100%" border="0">'
												+	'		<tr>'
												+	'			<td height="100%" align=top class="navi_box_centered">+</td>'
												+	'		</tr>'
												+ '	</table>';
	document.getElementById("divClipping").insertBefore(divZoomIn, null);
	
	var divZoomOut = document.createElement('div');
	divZoomOut.id = "divZoomOut";
	divZoomOut.align = "center";
	divZoomOut.className = "navi_box";
	divZoomOut.innerHTML = 	'	<table height="100%" border="0">'
												+	'		<tr>'
												+	'			<td height="100%" align=top class="navi_box_centered">-</td>'
												+	'		</tr>'
												+ '	</table>';
	document.getElementById("divClipping").insertBefore(divZoomOut, null);
	
	var divZoomMouse = document.createElement('div');
	divZoomMouse.id = "divZoomMouse";
	divZoomMouse.className = "navi_mouse";
	divZoomMouse.innerHTML = '<img src="img/mouse.png">';
	document.getElementById("divClipping").insertBefore(divZoomMouse, null);
}

function DrawNaviBox()
{
	var nBoxPixelLeft		= Math.min(nCurMouseXPos, nMouseXStartPos) + 2;
	var nBoxPixelRight	= Math.max(nCurMouseXPos, nMouseXStartPos);
	var nBoxPixelWidth	= Math.max(nBoxPixelRight - nBoxPixelLeft, 0);
  
	var nBoxPixelTop		= Math.min(nCurMouseYPos, nMouseYStartPos) + 2;
	var nBoxPixelBottom	= Math.max(nCurMouseYPos, nMouseYStartPos);
  var nBoxPixelHeight	= Math.max(nBoxPixelBottom - nBoxPixelTop, 0);
	
	var divZoomIn		= document.getElementById("divZoomIn");
	var divZoomOut	= document.getElementById("divZoomOut");
	var divZoomSelection = null;
	
  if (nMouseXStartPos < nCurMouseXPos) // Zoom in
	{		
		divZoomIn.style.visibility = "visible";
		divZoomOut.style.visibility = "hidden";
    divZoomSelection = divZoomIn;
	}
	else // Zoom out
	{    
    divZoomIn.style.visibility = "hidden";
		divZoomOut.style.visibility = "visible";
    divZoomSelection = divZoomOut;
	}
	
	divZoomSelection.style.height	= nBoxPixelHeight;
	divZoomSelection.style.width	= nBoxPixelWidth;
	divZoomSelection.style.top		= nBoxPixelTop + "px";
	divZoomSelection.style.left		= nBoxPixelLeft + "px";
	
	var divZoomMouse = document.getElementById("divZoomMouse");
	divZoomMouse.style.left				= (nCurMouseXPos - 15) + "px";
	divZoomMouse.style.top				= (nCurMouseYPos - 15) + "px";
	divZoomMouse.style.visibility = "visible";
}

function HideNaviBox()
{
	document.getElementById("divZoomIn").style.visibility = "hidden";
	document.getElementById("divZoomOut").style.visibility = "hidden";
	document.getElementById("divZoomMouse").style.visibility = "hidden";
}

/************************************ DRAGGING ************************************/

function iwGrapMap(event)
{
	bMousePressed = true;
	if (bDragLabels == false)
	{
		iwShowLabels(false);
	}
	document.onmousedown = FalseFunc;
	document.onmousemove = iwDragMap;
	document.onmouseup = iwDropMap;
	
	document.getElementById("divLabels").style.cursor = "move";
	
	iwGetMousePosition(event);
	
	nMouseXStartPos = nCurMouseXPos;
  nMouseYStartPos = nCurMouseYPos;
  nMouseXLastPos = nCurMouseXPos;
  nMouseYLastPos = nCurMouseYPos;
  
  if (oTileset.fOnMoveStart)
  	oTileset.fOnMoveStart();
}

function iwDragMap(event)
{
	var bInsideMap = 			nCurMouseXPos > 0
										&&	nCurMouseYPos > 0
										&&	nCurMouseXPos < oTileset.nVisibleWidth
										&&	nCurMouseYPos < oTileset.nVisibleHeight;
	
	if (bInsideMap)
	{
	  // calculate the movement and reset the starting coordinate
	  var nMovementX = nCurMouseXPos - nMouseXLastPos;
	  var nMovementY = nCurMouseYPos - nMouseYLastPos;
	  nMouseXLastPos = nCurMouseXPos;
	  nMouseYLastPos = nCurMouseYPos;
	  
	  oTileset.Move(nMovementX, nMovementY);
	  
	  if (oTileset.bHasOverview)
		{
			// refresh the overview map			
			var nOverviewX = nMovementX / (oTileset.nOverviewFactor * (oTileset.nVisibleWidth / oTileset.nOverviewSize));
			var nOverviewY = nMovementY / (oTileset.nOverviewFactor * (oTileset.nVisibleWidth / oTileset.nOverviewSize));
			
			frames["frmOverview"].oTileset.Move(nOverviewX, nOverviewY);
		}
  }
  
  iwGetMousePosition(event);
  
	return false;
}

function iwDropMap(event)
{
	bMousePressed = false;
	
	if (event == null)
		event = window.event;
	
	document.onmouseup = null;
  document.onmousemove = iwGetMousePosition;
 	
 	document.getElementById("divLabels").style.cursor = "";
 	document.getElementById("divTileMap").style.cursor = "";

	iwShowLabels(true);
	
	// call the callback function
	if (oTileset.fOnMoveEnd)
  	oTileset.fOnMoveEnd();
  
  if (oTileset.bIsOverview)
  {
  	var nFactor = 	oTileset.nOverviewFactor
  								* (parent.oTileset.nVisibleWidth / parent.oTileset.nOverviewSize);
  	
  	var nMoveX = (nCurMouseXPos - nMouseXStartPos) * nFactor;
  	var nMoveY = (nCurMouseYPos - nMouseYStartPos) * nFactor;
  	
  	parent.iwSlide(nMoveX, nMoveY);
  }
  else
  {
		if (oTileset.nMapMode == oTileset.MAPMODE_MAP)
		{
			iwChangeZoomLevel(MAX_MAPZOOMLEVEL, CHECKMODE_LOADMAP);
			SetCurrentSliderPos();
		}
		else
		{
			var nMapWidthMeter = oTileset.nTilesizeMeter * oTileset.nVisibleWidth / oTileset.nTilesize;
			var nMapHeightMeter = oTileset.nTilesizeMeter * oTileset.nVisibleHeight / oTileset.nTilesize;		
			iwGetMapInfo(nMapWidthMeter, nMapHeightMeter, CHECKMODE_LOADMAP);
		}
	}  
	
	return false;
}

/************************************* SLIDING ************************************/

function iwSlide(nHorizontal, nVertical)
{	
	// if (bControlsBlocked)
	//	return false;
	if (mutexCounter.getLocks() != 0)
		return false;
	
	iwLockControls();
	
	if (bDragLabels == false)
	{
		iwShowLabels(false);
	}
	
	// call the callback function
	if (oTileset.fOnMoveStart)
  	oTileset.fOnMoveStart();
	
	iwSlideStep(nHorizontal, nVertical, 0, 0, 0);
	
	if (oTileset.bHasOverview)
  {
  	var nFactor = 	oTileset.nOverviewFactor
  								* (oTileset.nVisibleWidth / oTileset.nOverviewSize);
  	frames["frmOverview"].iwSlideStep(nHorizontal / nFactor, nVertical / nFactor, 0, 0, 0);
  }
}

function iwSlideStep(nHorizontal, nVertical, nStep, nRestX, nRestY)
{
	bIsCorrectLabel = false;
	if (nStep < aSlideSteps.length)
	{
		var nStepMovementX = aSlideSteps[nStep] * nHorizontal;
		var nStepMovementY = aSlideSteps[nStep] * nVertical;
		
		nStepMovementX += nRestX;
		nRestX = nStepMovementX - Math.floor(nStepMovementX);
		nStepMovementX = Math.floor(nStepMovementX);
		
		nStepMovementY += nRestY;
		nRestY = nStepMovementY - Math.floor(nStepMovementY);
		nStepMovementY = Math.floor(nStepMovementY);
		
		oTileset.Move(nStepMovementX, nStepMovementY);
		
		if (oTileset.bIsOverview && bCenterBorder)
	  {
	  	var divMapSection = document.getElementById("divMapSection");
	  	var nPosX = parseInt(divMapSection.style.left)	+ Math.floor(nStepMovementX);
	  	var nPosY = parseInt(divMapSection.style.top)		+ Math.floor(nStepMovementY);
	  	divMapSection.style.left	= nPosX;
	  	divMapSection.style.top		= nPosY;
	  }
		
		window.setTimeout("iwSlideStep(" + nHorizontal + ", " + nVertical + ", " + ++nStep + ", " + nRestX + ", " + nRestY + ")", 50);
	}
	else
	{
		bCenterBorder = false;
		iwShowLabels(true);
		iwReleaseControls();
		
		// call the callback function
		if (oTileset.fOnMoveEnd)
  		oTileset.fOnMoveEnd();

		if (!oTileset.bIsOverview)
		{
			if (oTileset.nMapMode == oTileset.MAPMODE_MAP)
			{
				iwChangeZoomLevel(MAX_MAPZOOMLEVEL, CHECKMODE_LOADMAP);
				SetCurrentSliderPos();
			}
			else
			{
				var nMapWidthMeter = oTileset.nTilesizeMeter * oTileset.nVisibleWidth / oTileset.nTilesize;
				var nMapHeightMeter = oTileset.nTilesizeMeter * oTileset.nVisibleHeight / oTileset.nTilesize;
				iwGetMapInfo(nMapWidthMeter, nMapHeightMeter, CHECKMODE_LOADMAP);
			}
		}

	}
}

/************************************ SELECTION ***********************************/

function iwGrapSelectionBorder(event)
{
	//if (bControlsBlocked)
	//	return false;
	if (mutexCounter.getLocks() != 0)
		return false;
	
	iwLockControls();
	
	bMousePressed = true;
	bCenterBorder = true;
	
	document.onmousedown	= FalseFunc;
	document.onmousemove	= iwDragSelectionBorder;
	document.onmouseup		= iwDropSelectionBorder;
	
	iwGetMousePosition(event);
	
	nMouseXStartPos = nCurMouseXPos;
  nMouseYStartPos = nCurMouseYPos;
  nMouseXLastPos	= nCurMouseXPos;
  nMouseYLastPos	= nCurMouseYPos;
}

function iwDragSelectionBorder(event)
{
  // calculate the movement and reset the last coordinate
  var nMovementX = nCurMouseXPos - nMouseXLastPos;
  var nMovementY = nCurMouseYPos - nMouseYLastPos;
  nMouseXLastPos = nCurMouseXPos;
  nMouseYLastPos = nCurMouseYPos;
  
  // move the selection border around
  var divMapSection = document.getElementById("divMapSection");
  var nPosX = parseInt(divMapSection.style.left)	+ nMovementX;
  var nPosY = parseInt(divMapSection.style.top)		+ nMovementY;
  divMapSection.style.left	= nPosX;
  divMapSection.style.top		= nPosY;
  
  iwGetMousePosition(event);
  
	return false;
}

function iwDropSelectionBorder(event)
{
	bMousePressed = false;
	
	if (event == null)
		event = window.event;
	
	document.onmouseup = null;
	document.onmousemove = iwGetMousePosition;
	
	iwGetMousePosition(event);
	
	if (oTileset.bIsOverview)
	{
		var nFactor = 	oTileset.nOverviewFactor
									* (parent.oTileset.nVisibleWidth / parent.oTileset.nOverviewSize);
	 	
		var nMoveMainX = (nMouseXLastPos - nMouseXStartPos) * nFactor;
		var nMoveMainY = (nMouseYLastPos - nMouseYStartPos) * nFactor;
		
		parent.iwSlide(-nMoveMainX, -nMoveMainY);
	}
	
	return false;
}