// Created March 14, 2006 by Shui Hung Kwok, skwok at keck.hawaii.edu
// works with acqTool.php
// Customized variable i definitions.js

var RequestID = 1000; // Starts at 1000.
var nrReady = 0;
var gscRequest = new AjaxClass ();
var dssRequest = new AjaxClass ();
var resolveRequest = new AjaxClass ();
var overlayRequest = new AjaxClass ();
var nrStars2Show = 20;

function joinRequests (xobj)
{
	var instrumentField = document.getElementById ('instrument');
	var instrument = instrumentField.options[instrumentField.selectedIndex].value;

	var reqId = getDataContent (xobj, 'requestid');
	if (reqId == RequestID)
		++nrReady;
	if (nrReady == 2)
	{
		var objname = getDataContent (xobj, 'objname');
		var gsc = getDataContent (xobj, 'gsc');
		var dss = getDataContent (xobj, 'dss');
		var ra = getDataContent (xobj, 'RA');
		var dec = getDataContent (xobj, 'DEC');
		var sr = getDataContent (xobj, 'SR');
		var posAng = getDataContent (xobj, 'PosAngle');
		var reqId = getDataContent (xobj, 'requestid');
		var query = GetOverlayPHP + '?' +
			'obj=' + objname +
			'&id=' + reqId +
			'&gsc=' + gsc +
			'&dss=' + dss +
			'&ra=' + ra +
			'&dec=' + dec +
			'&sr=' + sr +
			'&pa=' + posAng + 
			'&instr=' + instrument;
		window.setTimeout ('delayedGetOverlay ("'+query+'")', 50);
	}
} // joinRequests

function getDataContent (xobj, kname)
{
	try
	{
		var tag = xobj.getElementsByTagName (kname);
		return tag[0].childNodes[0].data;
	}
	catch (error)
	{
		return '';
	}
} // getDataContent

// Variable supplied externally.
var guideStarList;
function gscHandler (response)
{
	if (response.readyState != 4) return;
	var xobj = response.responseXML;
	var tarea = document.getElementById ('GSCArea');
	var gscStatus = document.getElementById ('GSCStatus');
	gscStatus.innerHTML = 'Catalog <br>' + getDataContent (xobj, 'gsc') +
		': <b>' + getDataContent (xobj, 'objname') + '</b>';
	eval (getDataContent (xobj, 'data'));
	buildGSSortedTable (guideStarList);
	getInstrumentLayer ();
	joinRequests (xobj);
} // gscHandler

function dssHandler (response)
{
	if (response.readyState != 4) return;
	var xobj = response.responseXML;
	var dssStatus = document.getElementById ('DSSStatus');
	dssStatus.innerHTML = 'Archive <br>' + getDataContent (xobj, 'dss') +
		': <b>' + getDataContent (xobj, 'objname') +
		'</b>';
	joinRequests (xobj);
} // dssHandler

function overlayHandler (response)
{
	if (response.readyState != 4) return;
	var xobj = response.responseXML;
	var dssImage = document.getElementById ('overlayimage');
	var dssStatus = document.getElementById ('DSSStatus');
	var starMap = document.getElementById ('starmap');
	var gsnrField = document.getElementById ('gsnr');

	dssStatus.innerHTML = 'Archive <br>' + getDataContent (xobj, 'dss') +
		': <b>' + getDataContent (xobj, 'objname') +
		'</b>';
	var data = getDataContent (xobj, 'data');
	if (data != '')
	{
		var map = getDataContent (xobj, 'map');
		var txParams = getDataContent (xobj, 'txparams');

		eval (txParams);

		starMap.innerHTML = map;
		dssImage.src = getDataContent(xobj, 'data');
		getInstrumentLayer ();
		selectStarByNr (Number (gsnrField.value));
	}
	else 
	{
		//tarea = 'Image not available, please try again';
		//window.setTimeout ('delayedGetOverlay ("'+query+'")', 2000);
	}
} // overlayHandler

function delayedGetGSC (url)
{
	var xmlHttp = gscRequest;
	xmlHttp.sendRequest (url, gscHandler, '');
} // delayedGetGSC

function delayedGetDSS (url)
{
	var xmlHttp = dssRequest;
	xmlHttp.sendRequest (url, dssHandler, '');
} // delayedGetDSS

function delayedGetOverlay (url)
{
	var xmlHttp = overlayRequest;
	xmlHttp.sendRequest (url, overlayHandler, '');
} // delayedGetOverlay

function retrieveStarList (gscUrl, dssUrl)
{
	window.setTimeout ('delayedGetDSS ("'+dssUrl+'")', 50);
	window.setTimeout ('delayedGetGSC ("'+gscUrl+'")', 20);
	return false;
} // retrieveStarList 

function resolveHandler (response)
{
	if (response.readyState != 4) return;
	var xobj = response.responseXML;
	var raField = document.getElementById ('raStr');
	var decField = document.getElementById ('decStr');
	var eqnxField = document.getElementById ('equinox');
	var label = document.getElementById ('resolveLabel');

	raField.value = getDataContent (xobj, 'RA');
	decField.value = getDataContent (xobj, 'DEC');
	eqnxField.value = '2000';
	label.innerHTML = 'Resolve';
	chngRaDeg ();
	chngDecDeg ();
} // resolveHandler

function delayedResolve (url)
{
	var xmlHttp = resolveRequest;
	xmlHttp.sendRequest (url, resolveHandler, '');
} // delayedResolve

function resolveName (url)
{
	window.setTimeout ('delayedResolve ("'+url+'")', 20);
	return false;
} // resolveName

function getStarList ()
{
	var tform = document.getElementById ('targetButtons');

	var objNameField = document.getElementById ('objname');
	var objName = objNameField.value;

	var gscSelect = document.getElementById ('gsc');
	var gsc = gscSelect.options[gscSelect.selectedIndex].value;

	var dssSelect = document.getElementById ('dss');
	var dss = dssSelect.options[dssSelect.selectedIndex].value;

	var posAngField = document.getElementById ('posang');

	var posAng = posAngField.value;
	var ra = tform.raStr.value;
	var dec = tform.decStr.value;
	var sr = 0.019444; // deg

	++RequestID;
	nrReady = 0;

	var query = 'gsc='+gsc+
		'&dss=' + dss +
		'&obj=' + objName + 
		'&id=' + RequestID + 
		'&pa=' + posAng +
		'&ra=' + ra +
		'&dec=' + dec;
		
	var gscUrl = GetStarCatalogPHP + '?' + query + 
		'&sr=' + sr; 
	var dssUrl = GetDSSImagePHP + '?' + query + 
		'&sr=' + 2.0/60.0; // in 2minutes to deg
	var gscStatus = document.getElementById ('GSCStatus');
	gscStatus.innerHTML = '<font color=red>Loading catalog data</font><br>ra ' + ra + ' dec ' + dec;

	var dssStatus = document.getElementById ('DSSStatus');
	dssStatus.innerHTML = '<font color=red>Loading image</font><br>&nbsp;';

	retrieveStarList (gscUrl, dssUrl);
	return false;
} // getStarList

function getOverlayImage ()
{
	var tform = document.getElementById ('targetButtons');

	var objNameField = document.getElementById ('objname');
	var objName = objNameField.value;

	var gscSelect = document.getElementById ('gsc');
	var gsc = gscSelect.options[gscSelect.selectedIndex].value;

	var dssSelect = document.getElementById ('dss');
	var dss = dssSelect.options[dssSelect.selectedIndex].value;

	var posAngField = document.getElementById ('posang');
	var posAng = posAngField.value;

	var instrumentField = document.getElementById ('instrument');
	var instrument = instrumentField.options[instrumentField.selectedIndex].value;

	var ra = tform.raStr.value;
	var dec = tform.decStr.value;
	var sr = 2.0 / 60.0;

	var query = GetOverlayPHP + '?' +
		'obj=' + objName +
		'&id=0' +
		'&gsc=' + gsc +
		'&dss=' + dss +
		'&ra=' + ra +
		'&dec=' + dec +
		'&sr=' + sr +
		'&pa=' + posAng + 
		'&instr=' + instrument;
	window.setTimeout ('delayedGetOverlay ("'+query+'")', 50);
	return false;
} // getOverlayImage

function resolve ()
{
	var objNameField = document.getElementById ('objname');
	var objName = objNameField.value;
	var label = document.getElementById ('resolveLabel');

	var resolveUrl = GetResolvePHP + '?obj=' + objName;
	label.innerHTML = 'Resolving ...';
	resolveName (resolveUrl);

	return false;
} // resolve

function add2List ()
{
	var tform = document.getElementById ('targetButtons');

	var objNameField = document.getElementById ('objname');
	var objName = objNameField.value;

	var equinoxField = document.getElementById ('equinox');
	var equinox = equinoxField.value;

	var optionsField = document.getElementById ('options');
	var options = optionsField.value;

	var raDegField = document.getElementById ('raDeg');
	var raDeg = raDegField.innerHTML;

	var decDegField = document.getElementById ('decDeg');
	var decDeg = decDegField.innerHTML;

	var lgsFlagField = document.getElementById ('lgsflag');
	var lgsFlag = lgsFlagField.checked;

	var ra = tform.raStr.value;
	var dec = tform.decStr.value;

	var frame = frames['utarget'];

	var i;
	var found = false;
	var newEntry = new Array (objName, ra, dec, equinox, lgsFlag, options);

	if (frame.table == undefined)
		frame.table = new Array ();

	for (i in frame.table)
	{
		var ent = frame.table[i];
		if (ent[0] == objName)
		{
			found = true;
			frame.table[i] = newEntry;
		}
	}

	if (!found)
	{
		frame.table.push (newEntry);
	}
	frame.buildTable (frame.table);
} // add2List

function chngRaDeg ()
{
	var raDegField = document.getElementById ('raDeg');
	var raStrField = document.getElementById ('raStr');
	var raStr = raStrField.value;

	raDegField.innerHTML = cutDigits (sexa2deg (raStr) * 15.0, 8);
	return true;
} // chngRaDeg

function chngDecDeg ()
{
	var decDegField = document.getElementById ('decDeg');
	var decStrField = document.getElementById ('decStr');
	var decStr = decStrField.value;

	decDegField.innerHTML = cutDigits (sexa2deg (decStr), 8);
	return true;
} // chngDecDeg

function chngLGSFlag ()
{
	var optionsField = document.getElementById ('options');
	var options = optionsField.value;

	var lgsFlagField = document.getElementById ('lgsflag');
	var lgsFlag = lgsFlagField.checked;

	var optlist = options.split (/\s+/);
	var newOptlist = new Array ();
	var i, opt, mustAdd;

	mustAdd = lgsFlag;
	for (i in optlist)
	{
		opt = optlist[i];
		if (opt.length == 0) continue;
		if (opt == 'lgs=1')
		{
			if (lgsFlag)
			{
				newOptlist.push (opt);
				mustAdd = false;
			}
		}
		else
		{
			newOptlist.push (opt);
		}
	}
	if (mustAdd) newOptlist.push ('lgs=1');
	optionsField.value = newOptlist.join (' ');
	return true;
} // chngLGSFlag

function checkLGSFlag ()
{
	var optionsField = document.getElementById ('options');
	var options = optionsField.value;

	var lgsFlagField = document.getElementById ('lgsflag');

	lgsFlagField.checked = options.indexOf ('lgs=1') >= 0;
	return true;
} // checkLGSFlag

function formatList ()
{
	var frame = frames['utarget'];
	var out = new Array ();
	var blanks = "                      ";
	for (i in frame.table)
	{
		var entry = frame.table[i];
		var objName = entry[0];
		// -00 00 00.0000: 14 digits for ra
		// 13 for dec
		var ra = deg2Sexagecimal (sexa2deg (entry[1]));
		var dec = deg2Sexagecimal (sexa2deg (entry[2]));
		var equinox = entry[3];
		var options = entry[5];
		var str = "";
		if (options.indexOf ("lgs=1") < 0)
		{
			var len1 = objName.length;
			if (len1 < 14) 
			{
				objName = "  " + objName;
			}
			else if (len1 < 15)
			{
				objName = " " + objName;
			}
		}
		objName = (objName + blanks).substr(0,15);
		str = objName + ' ' +
			ra.replace (":", ' ').replace (":", ' ').substr (0, 14) + ' ' +
			dec.replace (":", ' ').replace (":", ' ').substr (0, 13) + ' ' +
			equinox + ' ' +
			options;
		out.push (str);
	}
	return out;
} // formatList

function downloadList ()
{
	var frame = frames['utarget'];
	if (frame.table != undefined)
	{
		var downloadForm = document.getElementById ('downloadform');
		var tarea = document.getElementById ('slist');
		var out = formatList ();
		var format = document.getElementById ('starListFormatId');
		tarea.value = out.join ("\n");
		format.value = "keck";
		downloadForm.submit ();
	}
	return false;
} // downloadList

function getAsKML ()
{
	var frame = frames['utarget'];
	if (frame.table != undefined)
	{
		var downloadForm = document.getElementById ('downloadform');
		var tarea = document.getElementById ('slist');
		var out = formatList ();
		var format = document.getElementById ('starListFormatId');
		tarea.value = out.join ("\n");
		format.value = "kml";
		downloadForm.submit ();
	}
	return false;
} // getAsKML

function submitStarList ()
{
	var frame = frames['utarget'];
	if (frame.table != undefined)
	{
		var submitStarListForm = document.getElementById ('submitstarlistform');
		var tarea = document.getElementById ('sslist');
		var out = formatList ();
		tarea.value = out.join ("\n");
		submitStarListForm.submit ();
	}
	return false;
} // submitStarList


function openVisWindow ()
{
	var frame = frames['utarget'];
	var i;
	if (frame.table != undefined)
	{
		var openVisWindowForm = document.getElementById ('openviswindowform');
		var tarea = document.getElementById ('ovwslist');
		var out = new Array ();
		for (i in frame.table)
		{
			var entry = frame.table[i];
			var objName = entry[0] + '                ';
			var ra = entry[1];
			var dec = entry[2];
			var equinox = entry[3];
			var options = entry[5];
			var str = objName.substr (0, 15) + ':' +
				ra + ':' +
				dec + ':' +
				equinox + ':' +
				options;
			out.push (str);
		}
		tarea.value = out.join ("\n");
		openVisWindowForm.submit ();
	}
	return false;
} // openVisWindow

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

function getInstrumentLayer ()
{
	// We do not rotate this anymore. Rotate star field instead.
	//var posAngField = document.getElementById ('posang');
	//var posAng = posAngField.value;

	var instrumentLayerField = document.getElementById ('instrument');
	var instrumentLayer = instrumentLayerField.options[instrumentLayerField.selectedIndex].value;

	var instrumentLayerImage = document.getElementById ('instrumentlayerimage');
	var overlayImage = document.getElementById ('overlayimage');
	var tssFlag = document.getElementById ('tssflag').checked ? 1:0;

	if (overlayImage == undefined) return false;
	var xy = getAbsLeftTop (overlayImage);
	var off2 = (instrumentLayerImage.width - overlayImage.width) / 2;
	with (instrumentLayerImage.style)
	{
		top = xy[1] + off2;
		left = xy[0] + off2;
	}
	instrumentLayerImage.src = GetInstrumentLayerPHP + '?ly='+ instrumentLayer + '&ls='+tssFlag;
	instrumentLayerTimeId = 0;
	return true;
} // getInstrumentLayer

var instrumentLayerTimeId = 0;
var overlayTimeId = 0;
function delayCallGetOverlayImage ()
{
	if (overlayTimeId != 0)
	{
		clearTimeout (overlayTimeId);
	}
	overlayTimeId = setTimeout ('getOverlayImage ()', 500);
} // delayCallGetOverlayImage 

// Sorts the guide star table.
function sortTable (by)
{
	// sorts and builds the table.
	var gsnrField = document.getElementById ('gsnr');
	var gsnr = Number (gsnrField.value);
	var func = function (a, b) { return a[by] - b[by]; };

	guideStarList.sort (func);
	selectStarByNr (gsnr);

	// Refreshes the overlay image
	getInstrumentLayer ();
	// Refreshes marker
	// Just for display, because the table can change size, 
	// which can misalign the overlay graphic
	selectStarByNr (gsnr);
	return false;
} // sortTable

function buildGSSortedTable (table)
{
	var i;
	var raStr, decStr, brmag, bvmag, rmag, dist;
	var entry;
	var len = table.length;
	var output = new Array ();

	nrStars2Show = document.getElementById ('nrStars2ShowID').value;

	output.push ("<table width=400 border=0 bgcolor=#999999 style='font-size:12'>");
	output.push ("<tr bgcolor=#bbbbbb>");

	var headerList = new Array (
		"#",
		"ID",
		"RA",
		"DEC",
		"B-R",
		"B-V",
		"Rmag",
		"Dist"
	);

	for (i = 0; i < headerList.length; ++i)
	{
		output.push ("<th ><a href=# OnClick='sortTable (" + i + ");return false;'>" + 
			headerList[i] + "</a>");
	}
	output.push ("<th>Gal");

	if (nrStars2Show < len)
		len = nrStars2Show;

	for (i = 0; i < len; ++i)
	{
		entry = table[i];
		nr = entry[0];
		idName = entry[1];
		raStr = entry[2];
		decStr = entry[3];
		brmag = entry[4];
		bvmag = entry[5];
		rmag = entry[6];
		dist = entry[7];
		gal = entry[8];

		if ((i % 2) == 0)
			col = '#cccff';
		else
			col = '#ddeeff';
		code = 'return selectStar (' + i + ');';
		output.push ("<tr id=gsrow" + i + " bgcolor='" + col + "'>");
		output.push ("<td>"+nr);
		output.push ("<td>"+idName);
		output.push ("<td nowrap>");
		output.push ('<a href=# onClick="' + code + '">' + raStr + "</a>");
		output.push ("<td nowrap align='.'>");
		output.push ('<a href=# onClick="' + code + '">' + decStr + "</a>");
		output.push ("<td> "+brmag);
		output.push ("<td> "+bvmag);
		output.push ("<td> "+rmag);
		output.push ("<td> "+dist);
		output.push ("<td> "+gal);
	}
	output.push ("</table>");

	var tarea = document.getElementById ('GSCArea');
	tarea.innerHTML = output.join ('');
} // buildGSSortedTable

function showGuideStar (row, gnr, idName, raStr, decStr, brmag, bvmag, rmag, dist)
{
	buildGSSortedTable (guideStarList);
	var rowField = document.getElementById ('gsrow' + row);
	var guideRAField = document.getElementById ('guideRA');
	var guideDECField = document.getElementById ('guideDEC');
	var diffRAField = document.getElementById ('diffRA');
	var diffDECField = document.getElementById ('diffDEC');
	var guideBRField = document.getElementById ('guideBR');
	var guideBVField = document.getElementById ('guideBV');
	var guideRField = document.getElementById ('guideRmag');
	var guideDistField = document.getElementById ('guideDist');
	var gsnrField = document.getElementById ('gsnr');
	var gsidField = document.getElementById ('gsid');
	var targRAField = document.getElementById ('raDeg');
	var targDECField = document.getElementById ('decDeg');

	var tssFlag = document.getElementById ('tssflag');
	var lgsFlag = document.getElementById ('lgsflag');
	tssFlag.checked = lgsFlag.checked;

	if (rowField != undefined)
		rowField.style.backgroundColor = '#ffff99';
	guideRAField.value = raStr;
	guideDECField.value = decStr;
	guideBRField.value = brmag;
	guideBVField.value = bvmag;
	guideRField.value = rmag;
	guideDistField.value = dist;
	gsnrField.value = gnr;
	gsidField.value = idName;

	var decVal = sexa2deg (decStr);
	var diffDecVal = 3600.0 * (targDECField.innerHTML - decVal);
	diffDecVal = cutDigits (diffDecVal, 3)
	diffDECField.innerHTML = diffDecVal + '"';

	var diffRaVal =  3600.0 * (targRAField.innerHTML - 15.0*sexa2deg (raStr));
	diffRaVal = diffRaVal * Math.cos (decVal * Math.PI / 180.0);
	diffRaVal = cutDigits (diffRaVal, 3)
	diffRAField.innerHTML = diffRaVal + '"';

	return false;
} // showGuideStar

function selectStarByNr (nr)
{
	var i;
	for (i in guideStarList)
	{
		var entry = guideStarList[i];
		if (entry[0] == nr)
		{
			return selectStar (i);
		}
	} 
	return false;
} // selectStarByNr

function setMarker (nr, raStr, decStr, gal)
{
	var markerImage = document.getElementById ('markerimage');
	var overlayImage = document.getElementById ('overlayimage');
	var areaElem = document.getElementById ('area' + nr);
	if (!areaElem) return false;

	var coords = areaElem.coords.split (',');

	var xy = getAbsLeftTop (overlayImage);
	var absLeft = xy[0] - 8 + Number (coords[0]);
	var absTop = xy[1] - 8 + Number (coords[1]);
	markerImage.title = '#' + nr + ', ' + raStr + ', ' + decStr + ', ' + gal;
	with (markerImage.style)
	{
		display = 'block';
		left = absLeft;
		top = absTop;
	}
} // setMarker

function selectStar (starNr)
{
	var markerImage = document.getElementById ('markerimage');

	if ((starNr >= guideStarList.length) || (starNr < 0))
	{
		markerImage.style.display = 'none';
		return false;
	}


	var entry = guideStarList[starNr];
	var	nr = entry[0];
	var	idName = entry[1];
	var	raStr = entry[2];
	var	decStr = entry[3];
	var	brmag = entry[4];
	var	bvmag = entry[5];
	var	rmag = entry[6];
	var	dist = entry[7];
	var	gal = entry[8];

	setMarker (nr, raStr, decStr, gal);

	return showGuideStar (starNr, nr, idName, raStr, decStr, brmag, bvmag, rmag, dist);
} // selectStar

var ppo3, ppo6;
var xpoff, ypoff;
var xpsize, ypsize;
var plRaDeg, plDecDeg;
var amdx, amdy;
var scaleX, scaleY;
var fitsCenterX, fitsCenterY;
var imgCenterX, imgCenterY;
var imgHeight;

function pixel2rd (xin, yin)
{
	var x, y;
	x = (xin - imgCenterX) / scaleX;
	y = imgHeight - 1 - yin;
	y = (y - imgCenterY) / scaleY;

	var toRadian = Math.PI / 180.0;
	var ang = toRadian * Number (document.getElementById ('posang').value);
	var sa = Math.sin (ang);
	var ca = Math.cos (ang);

	var x1 = (x * ca + y * sa) + fitsCenterX;
	var y1 = (-x * sa + y * ca) + fitsCenterY;

	return xy2rd (x1, y1);
} // pixel2rd

function xy2rd (xin, yin)
{
	// xin, yin in image pixel coordinates
	// Returns ra/dec in degree corresponding to xin/yin
	var x = xin - 0.5;
	var y = yin - 0.5;
	var obx = (ppo3 - (xpoff + x) * xpsize) / 1000.0;
	var oby = ((ypoff + y)*ypsize - ppo6) / 1000.0;

	var obx2 = obx * obx;
	var obx3 = obx2 * obx;
	var oby2 = oby * oby;
	var oby3 = oby2 * oby;

	var xi = (amdx[0]*obx+
		amdx[1]*oby+
		amdx[2]+
		amdx[3]*obx2+
		amdx[4]*obx*oby+
		amdx[5]*oby2+
		amdx[6]*(obx2+oby2)+
		amdx[7]*obx3+
		amdx[8]*obx2*oby+
		amdx[9]*obx*oby2+
		amdx[10]*oby3+
		amdx[11]*obx*(obx2+oby2)+
		Math.pow (amdx[12]*obx*(obx2+oby2), 2));

	var eta = (amdy[0]*oby+
		amdy[1]*obx+
		amdy[2]+
		amdy[3]*oby2+
		amdy[4]*oby*obx+
		amdy[5]*obx2+
		amdy[6]*(obx2+oby2)+
		amdy[7]*oby3+
		amdy[8]*oby2*obx+
		amdy[9]*oby*obx2+
		amdy[10]*obx3+
		amdy[11]*oby*(obx2+oby2)+
		Math.pow (amdy[12]*oby*(obx2+oby2),2));


	var toRad = Math.PI / 180.0;
	var raRad = plRaDeg * toRad;
	var decRad = plDecDeg * toRad;

	xi = xi * toRad / 3600.0;
	eta = eta * toRad / 3600.0;

	var numerator = xi / Math.cos (decRad);
	var denominator = 1.0 - eta * Math.tan (decRad);
	var ra = Math.atan2 (numerator, denominator) + raRad;

	var twopi = 2.0 * Math.PI;
	if (ra < 0)
		ra = ra + twopi;
	else if (ra > twopi)
		ra = ra - twopi;

	numerator = Math.cos (ra - raRad);
	denominator = (1.0 - eta * Math.tan (decRad))/(eta + Math.tan (decRad));
	dec = Math.atan (numerator / denominator);

	ra = ra / toRad;
	dec = dec / toRad;
	return [ra, dec];
} // xy2rd

function initEvents ()
{
	if (document.captureEvents)
	{
		document.captureEvents (Event.MOUSEMOVE);
		document.onmousemove = mouseMoveHandler;
	}
} // initEvents

function showRaDecPos ()
{
	var rdField = document.getElementById ('radecpos');
	var instrumentLayerImage = document.getElementById ('instrumentlayerimage');
	if (!amdx || !amdy) return true;
	var x, y;
	if (window.event)
	{
		x = window.event.offsetX;
		y = window.event.offsetY;
	}
	else
	{
		leftTop =  getAbsLeftTop (instrumentLayerImage);
		x = MouseX - leftTop[0];
		y = MouseY - leftTop[1];
	}
	radec = pixel2rd (x, y);
	var ra = deg2Sexagecimal (radec[0] / 15.0);
	var dec = deg2Sexagecimal (radec[1]);
	rdField.innerHTML = 'RA= ' + ra + ' DEC= ' + dec;
	return true;
} // showRaDecPos

var MouseX = 0, MouseY = 0;
function mouseMoveHandler (evt)
{
	MouseX = evt.pageX;
	MouseY = evt.pageY;
	return true;
} // mouseMoveHandler

function addGuideStar ()
{
	var frame = frames['utarget'];
	if (frame.table == undefined)
		frame.table = new Array ();

	var targetName = document.getElementById ('objname').value;
	var i;
	var entry;

	var foundIdx = -1;
	for (i in frame.table)
	{
		entry = frame.table[i];
		if (entry[0] == targetName)
		{
			foundIdx = i;
			break;
		}
	}

	// Call add2List to update science target entry.
	add2List ();
	if (foundIdx == -1)
	{
		foundIdx = frame.table.length;
	}

	var starNr = document.getElementById ('gsnr').value;
	var idName = document.getElementById ('gsid').value;
	var raStr = document.getElementById ('guideRA').value; 
	var decStr = document.getElementById ('guideDEC').value;
	var brmag =  document.getElementById ('guideBR').value;
	var bvmag =  document.getElementById ('guideBV').value;
	var rmag =  document.getElementById ('guideRmag').value;
	var dist =  document.getElementById ('guideDist').value;
	var posAng =  document.getElementById ('posang').value;
	var equinox = 2000;
	var lgsFlag = false;
	var options = 'b-r=' + brmag + ' b-v=' + bvmag + 
		' rmag=' + rmag + ' sep=' + dist + ' pa=' + posAng;

	var newEntry = new Array (idName, raStr, decStr, 2000, lgsFlag, options);

	i = Number (foundIdx) + 1;
	var stop = frame.table.length;

	foundIdx = -1;
	while (i < stop)
	{
		entry = frame.table[i];
		if (entry[4]) break;
		if (entry[0] == idName)
		{
			foundIdx = i;
			break;
		}
		++i;
	}

	if (foundIdx < 0)
		frame.table.splice (i, 0, newEntry);
	else
		frame.table.splice (foundIdx, 1, newEntry);
	frame.buildTable (frame.table);
} // addGuideStar

function setTssFlag ()
{
	var tssFlag = document.getElementById ('tssflag');
	var lgsFlag = document.getElementById ('lgsflag');
	lgsFlag.checked = tssFlag.checked;
	chngLGSFlag ();
	delayCallGetOverlayImage ();
	return false;
} // setTssFlag

chngRaDeg ();
chngDecDeg ();
chngLGSFlag ();
setTimeout ('delayedGetGSC ("' +
	GetStarCatalogPHP + 
	'?reqId=0&gsc=GCS&obj=NONE")', 20);
initEvents ();
