var MouseX = 0;
var MouseY = 0;
var AnchorX = 0;
var AnchorY = 0;
var OffsetX = 0;
var OffsetY = 0;
var Dragging = false;
var Cursor = null;
var NTilesX = 4;
var NTilesY = 4;
var LastRefX = -1;
var LastRefY = -1;

// This variables are expected to be overwritten by external program.
var TileWidth = 512;
var TileHeight = 512;
var ImageWidth = 1;
var ImageHeight = 1;
var Prefix = "";
var CoordXRange = 1000;
var CoordYRange = 1000;
var ObjectNumbers = null; 
// End or external variables.

var tileSlots = Array ();
var blkimg = new Image ().src = 'black.gif';

//**************************************************************

function initialize ()
{
	var w, h;
	if (typeof (window.innerWidth) == 'undefined')
	{
		w = document.body.clientWidth;
		h = document.body.clientHeight;
	}
	else
	{
		w = window.innerWidth;
		h = window.innerHeight;
	}

	NTilesX = Math.floor ((w + TileWidth - 1) / TileWidth + 1);
	NTilesY = Math.floor ((h + TileHeight - 1) / TileHeight + 1);
	XLimit = ImageWidth - w;
	YLimit = ImageHeight - h;
	var res = rd2pix (parent.CurrentRA, parent.CurrentDEC);
	OffsetX = res[0];
	OffsetY = ImageHeight - res[1];
	if (OffsetX < 0) OffsetX = 0;
	if (OffsetX > XLimit) OffsetX = XLimit;
	if (OffsetY < 0) OffsetY = 0;
	if (OffsetY > YLimit) OffsetY = YLimit;
} // initialize

function genImageSlots ()
{
	var i, j;
	var id;
	var buffer = Array ();
	for (i = 0; i < NTilesX; ++i)
	{
		for (j = 0; j < NTilesY; ++j)
		{
			id = "tileX" + i + "Y" + j;
			buffer.push ("<img class=tile id='" + id + "' src='black.gif' " +
				" width=" + TileWidth + " height=" + TileHeight + ">");
		}
	}
	document.getElementById ('tilesArea').innerHTML = buffer.join ('');
	for (i = 0; i < NTilesX; ++i)
	{
		tileSlots[i] = Array ();
		for (j = 0; j < NTilesY; ++j)
		{
			id = "tileX" + i + "Y" + j;
			tileSlots[i][j] = document.getElementById (id);
		}
	}
} // genImageSlots

function genImageSrcName (x, y)
{
	var fname = ImageDir + '/' + Prefix + 'X' + x + 'Y' + y + '.jpg';
	return 'getTile.php?f=' + fname + '&pd=' + TilesDir;
} // genImageSrcName

function setTilesPosition (offx, offy)
{
	var i, j;
	var x1, y1;
	var imgElem;
	var relx, rely; // offset of first image to top/left corner of frame in screen coordinates.
	var refx, refy; // top/left position of first image in world coordinates.

	refx = TileWidth * Math.floor (offx / TileWidth);
	refy = TileHeight * Math.floor (offy / TileHeight);

	relx = offx - refx;
	rely = offy - refy;

	var mustChange = (LastRefX != refx) || (LastRefY != refy);
		
	for (i = 0; i < NTilesX; ++i)
	{
		xpos = i * TileWidth - relx;
		x1 = i * TileWidth + refx;
		for (j = 0; j < NTilesY; ++j)
		{
			imgElem = tileSlots[i][j];

			ypos = j * TileHeight - rely;
			y1 = j * TileHeight + refy;
			with (imgElem.style)
			{
				left = xpos;
				top = ypos;
				width = TileWidth;
				height = TileHeight;
			} // with
			if (mustChange && (x1 < ImageWidth) && (y1 < ImageHeight))
			{
				imgElem.src = genImageSrcName (x1, y1);
			}
		} // for j
	} // for i
	LastRefX = refx;
	LastRefY = refy;
} // setTilesPosition

function getAbsLeftTop (elem)
{
 	var prnt = elem.offsetParent;
	var absLeft = elem.offsetLeft;
	var absTop = elem.offsetTop;
	while (prnt)
	{
		absLeft += prnt.offsetLeft;
		absTop += prnt.offsetTop;
		lastparent = prnt;
		prnt = prnt.offsetParent;
	}
	var out = [absLeft, absTop];
	return out;
	
} // getAbsLeftTop

function setMarker (offx, offy)
{
	var markerImage = parent.document.getElementById ('markerID');
	var targetImage = parent.document.getElementById ('fieldJpeg');
	var xy = getAbsLeftTop (targetImage);
	var tx = xy[0];
	var ty = xy[1];

	var posx = 150.0 * offx / ImageWidth + tx - 0.5;
	var posy = 150.0 * offy / ImageHeight + ty - 0.5;
	with (markerImage.style)
	{
		display = 'block';
		position = 'absolute';
		left = posx;
		top = posy;
	}
	var res = pix2rd (offx, ImageHeight - offy);
	parent.CurrentRA = res[0];
	parent.CurrentDEC = res[1];
} // setMarker

function initEvent ()
{
	if (document.captureEvents)
	{
		document.captureEvents (Event.MOUSEMOVE |
			Event.MOUSEUP |
			Event.MOUSEOUT |
			Event.MOUSEDOWN );
	}
	document.onmousemove = mouseMove;
	document.onmousedown = mouseDown;
	document.onmouseup = mouseUp;
	document.onmouseout = mouseOut;
	document.ondblclick = doubleClicked;

	Cursor = document.body.style;
} // initEvent

function getMouseXY (evt)
{
	if (window.event)
	{
		MouseX = window.event.clientX;
		MouseY = window.event.clientY;
	}
	else
	{
		MouseX = evt.pageX;
		MouseY = evt.pageY;
	}
} // getMouseXY

function mouseDown (e)
{
	getMouseXY (e);
	AnchorX = MouseX;
	AnchorY = MouseY;
	Dragging = true;
	document.onmousemove = mouseDrag;
	Cursor.cursor = 'move';
	return false;
} // mouseDown

function mouseMove (e)
{
	var prnt = parent.document;
	var xplace = prnt.getElementById ('xplace');

	getMouseXY (e);
	var x = MouseX + OffsetX;
	var y = MouseY + OffsetY;

	if (xplace != null)
	{
		var res = pix2rd (x, ImageHeight - y);
		var x1 = deg2Sexagecimal (res[0]);
		var y1 = deg2Sexagecimal (res[1]);
		xplace.innerHTML = 'RA[hms]= ' + x1 + ' DEC[dms]= ' + y1;
	}
	return false;
} // mouseMove

function mouseUp (e)
{
	Dragging = false;
	document.onmousemove = mouseMove;
	Cursor.cursor = 'default';
	return false;
} // mouseUp

function mouseDrag (e)
{
	var prnt = parent.document;
	var xplace = prnt.getElementById ('xplace');

	getMouseXY (e);
	var x = MouseX;
	var y = MouseY;

	/*xplace.innerHTML = 'X: ' + OffsetX + ' Y: ' + OffsetY +
		" last " + LastRefX + " " + LastRefY;
	*/

	moveImage (x, y);
	AnchorX = x;
	AnchorY = y;
	return false;
} // mouseDrag

function moveImage (x, y)
{
	OffsetX = OffsetX - x + AnchorX;
	OffsetY = OffsetY - y + AnchorY;

	if (OffsetX >= XLimit) OffsetX = XLimit;
	if (OffsetX < 0) OffsetX = 0;

	if (OffsetY >= YLimit) OffsetY = YLimit;
	if (OffsetY < 0) OffsetY = 0;

	setTilesPosition (OffsetX, OffsetY);
	setMarker (OffsetX, OffsetY);
} // moveImage

function mouseOut (e)
{
	getMouseXY (e);
	var x = MouseX;
	var y = MouseY;
	var bodyElem = document.body;
	var w = bodyElem.offsetWidth;
	var h = bodyElem.offsetHeight;

	if (window.innerHeight != undefined)
	{
		h = window.innerHeight;
	}

	if ((x < 0) || (x >= w) ||
		(y < 0) || (y >= h))
		mouseUp (e);
	//window.status ='off ' + x + ' ' + y + ' w' + w + ' h' + h;
	return false;
} // mouseOut

function doubleClicked (e)
{
	getMouseXY (e);

	var x = MouseX + OffsetX;
	var y = ImageHeight - 1 - MouseY - OffsetY;

	x = x * CoordXRange / ImageWidth;
	y = y * CoordYRange / ImageHeight;

	var len = ObjectNumbers.length;
	var i;
	var row;
	var dx, dy;
	var link;
	for (i = 0; i < len; ++i)
	{
		row = ObjectNumbers[i];
		dx = Math.abs (x - row[0]);
		dy = Math.abs (y - row[1]);
		if (dx < 10 && dy < 10)
		{
			link = "../dataAccess/notebook/egs_notebook.php?serial=" +
				row[2];
			window.open (link, "notebook");
		}
	}
} // doubleClicked

function loadFirst ()
{
	initialize ();
	genImageSlots ();
	setTilesPosition (OffsetX, OffsetY);
	setMarker (OffsetX, OffsetY);
	initEvent ();
	return false;
} // loadFirst

