var theMap, mapContainer;

var isMapDrag = false;
var mapX, mapY, tMapX, tMapY, mapOrigLeft, mapOrigTop;
var minDragDist = 5;

var extraSize = 100;

function refreshJam()
{
	if ( !readyToProcess ) return;
	requestMap( "refreshjam", 0, 0, 0, 0, 0, "" );
}

function showLoc( aLat, aLon )
{
	if ( !readyToProcess ) return;
	requestMap( "show", 0, aLat, aLon, 0, 0, "" );
}

function moveLeft()
{
	if ( !readyToProcess ) return;
	newCenterX = centerHor - shiftHor;
	newCenterY = centerVer;
	requestMap( "ml", 0, newCenterX, newCenterY, 0, 0, "" );
}

function moveRight()
{
	if ( !readyToProcess ) return;
	newCenterX = centerHor + shiftHor;
	newCenterY = centerVer;
	requestMap( "mr", 0, newCenterX, newCenterY, 0, 0, "" );
}

function moveDown()
{
	if ( !readyToProcess ) return;
	newCenterX = centerHor;
	newCenterY = centerVer + shiftVer;
	requestMap( "md", 0, newCenterX, newCenterY, 0, 0, "" );
}

function moveUp()
{
	if ( !readyToProcess ) return;
	newCenterX = centerHor;
	newCenterY = centerVer - shiftVer;
	requestMap( "mu", 0, newCenterX, newCenterY, 0, 0, "" );
}

function scaleBack()
{
	if ( !readyToProcess ) return;
	if ( !isNaN( prevSc ) && ( sc != prevSc ) )
	{
		requestMap( "b", prevSc, 0, 0, centerHor, centerVer, "" );
	}
}

function zoomOut()
{
	if ( !readyToProcess ) return;
	var blocked = false;
	if ( !isNaN( sc ) )
	{
		if ( sc < minScale ) 
		{
			requestMap( "zo", Math.round( 2 * sc ), 0, 0, centerHor, centerVer, "" );
		}
	}
}

function zoomIn()
{
	if ( !readyToProcess ) return;
	if ( !isNaN( sc ) )
	{
		if ( sc > maxScale )
		{
			requestMap( "zo", Math.round( sc / 2 ), 0, 0, centerHor, centerVer, "" );
		}
	}
}

function overView()
{
	if ( !readyToProcess ) return;
	requestMap( "ov", 0, 0, 0, 0, 0, "" );
}

function setScale( scVal )
{
	if ( !isNaN( scVal ) )
	{
		if ( scVal < maxScale ) scVal = maxScale;
		if ( scVal > minScale ) scVal = minScale;
		requestMap( "sc", Math.round( scVal ), 0, 0, centerHor, centerVer, "" );
	}
}

function mapMouseMove( e )
{
	// extraSize
	var cropLeft = parseInt( mapOrigLeft + extraSize + 0 ), cropTop = parseInt( mapOrigTop + extraSize + 0 );

	if ( isMapDrag )
	{
		if ( !e ) e = window.event;

		tmpX = parseInt( tMapX + e.clientX - mapX );
		tmpY = parseInt( tMapY + e.clientY - mapY );

		cropLeft -= tmpX;
		cropTop -= tmpY;

		if ( !isNaN( tmpX ) ) theMap.style.left = parseInt( tmpX + 0 ) + 'px';
		if ( !isNaN( tmpY ) ) theMap.style.top = parseInt( tmpY + 0 ) + 'px';

		theMap.style.clip = 'rect(' + cropTop + 'px,' + parseInt( mapWidth + cropLeft + 0 ) + 'px,' + parseInt( mapHeight + cropTop + 0 ) + 'px,' + cropLeft + 'px)';

		if ( document.body.style.cursor != 'cross' ) document.body.style.cursor = "move";

		return false;
	}
}

function mapMouseDown( e ) 
{
	if ( this.className == 'dragMap' )
	{
		if ( !e ) e = window.event;

		if ( e.button )
		{
			if ( e.button != 1 ) return;
		}
		else
		{
			if ( e.which != 1 ) return;
		}

		isMapDrag = true;
		tMapX = parseInt( this.style.left + 0 );
		tMapY = parseInt( this.style.top + 0 );
		mapX = e.clientX;
		mapY = e.clientY;
		return false;
	}
}

function getMapEventCoord( e, bFromWheel )
{
	if ( !e ) e = window.event;

	posX = ( e.offsetX ) ? parseInt( e.offsetX ) : parseInt( ( ( bFromWheel ) ? e.screenX : e.clientX ) + window.pageXOffset - mapOrigLeft );
	posY = ( e.offsetY ) ? parseInt( e.offsetY ) : parseInt( ( ( bFromWheel ) ? e.screenY : e.clientY ) + window.pageYOffset - mapOrigTop );

	return [ posX, posY ];
}

function initMapImg( aMapImg )
{
	aMapImg.style.left = parseInt( mapOrigLeft + 0 ) + 'px';
	aMapImg.style.top = parseInt( mapOrigTop + 0 ) + 'px';

	if ( aMapImg.addEventListener )
	{
		aMapImg.addEventListener( "DOMMouseScroll", mapMouseWheel, false );
	}
	aMapImg.onmousewheel = mapMouseWheel;
	aMapImg.onmousedown = mapMouseDown;
	aMapImg.onmousemove = mapMouseMove;
}

function initOffsets()
{
	// extraSize
	try
	{
		containerOffs = getObjOffset( mapContainer );
		mapOrigLeft = parseInt( containerOffs[ 0 ] + 1 );
		mapOrigTop = parseInt( containerOffs[ 1 ] + 2 );
	}
	catch ( er )
	{
		mapOrigLeft = 344;
		mapOrigTop = 202;
	}
	mapOrigLeft -= extraSize;
	mapOrigTop -= extraSize;
}

function initMap()
{
	// extraSize
	mapContainer = window.document.getElementById( 'mapContainer' );
	var fgMap = getForegroundMapImg();
	var bgMap = getBackgroundMapImg();

	initOffsets();

	initMapImg( fgMap );
	initMapImg( bgMap );

	fgMap.className = 'dragMap';
	bgMap.className = 'hide';

	fgMap.style.clip = 'rect(' + extraSize + 'px,' + parseInt( mapWidth + extraSize + 0 ) + 'px,' + parseInt( mapHeight + extraSize + 0 ) + 'px,' + extraSize + 'px)';
	bgMap.style.clip = fgMap.style.clip;

	theMap = fgMap;}
