//	----------------------------------------------
//	D O   N O T   E D I T   T H I S   F I L E  !!!
//	----------------------------------------------
//	This is an uncommented version of astro-source.js
//	generated by WSH script jsqz.js
//	(file size reduction for better web performance.)
//	==================================================
//* Description:
//*	General astronomical algorithms, date calculations, and other general purpose functions.
//* Author:
//*	Henk Reints
//*	http://henk-reints.nl
//* DISCLAIMER:
//*	This package is provided "as is", for demonstrating purposes only, and without any guarantee
//*	for accuracy or correctness. For planning activities of any kind, one should not rely on the
//*	results of this package, but always verify them by consulting other references as well. The
//*	author(s) cannot be held responsible for any consequences of (typing or programming) errors
//*	or miscalculations.
//* ===================================================================================================
var	pi	= Math.PI
var	deg	= 180/pi
var	rad	= pi/180
var	lightSpeed	= 299792458
var	JulCentury	= 36525
var	JulYear		= JulCentury / 100
var	JulCycle	=  4 * 365         + 1
var	GregCentury	= 25 * JulCycle    - 1
var	GregCycle	=  4 * GregCentury + 1
var	HourPerDay	= 24
var	MinPerHour	= 60
var	SecPerMin	= 60
var	MinPerDay	= MinPerHour * HourPerDay
var	SecPerDay	= SecPerMin  * MinPerDay
var	SecPerHour	= MinPerHour * SecPerMin
var	msPerDay	= 1000 * SecPerDay
var	maxJSdateValue	= 1e8 * msPerDay
var	JDzeroJS	= JulianDay ('G',1970,1,1,0)
var	farFuture	= new Date ( maxJSdateValue)
var	farHistory	= new Date (-maxJSdateValue)
var	firstGregYear		= 1582
var	firstGregMonth		= 10
var	firstGregDay		= 15
setGregSwitch (firstGregYear, firstGregMonth, firstGregDay)
var	firstGregPseudoDate	= switchGregPseudoDate
var	firstGregJD		= switchGregJD
var	AU		= 1.49597871e11
var	J2000		= JulianDay ('', 2000, 1, 1)
var	EarthRadiusE	= 6378.14
var	EarthRadiusP	= 6356.76
var	SunRadius	= 696000
var	MoonRadius	= 1738
var	dayAbbr		= ['Mo'    ,'Tu'     ,'We'       ,'Th'      ,'Fr'    ,'Sa'      ,'Su'    ]
var	dayName		= ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
var	monthAbbr	= ['JAN'    ,'FEB'     ,'MAR'  ,'APR'  ,'MAY','JUN' ,'JUL' ,'AUG'   ,'SEP'      ,'OCT'    ,'NOV'     ,'DEC']
var	monthName	= ['January','February','March','April','May','June','July','August','September','October','November','December']
var	eraAbbr		= [' BCE',' CE']
var	bodyAbbr	= ['SUN', 'MOO' ]
var	bodyName	= ['Sun', 'Moon']
var	planetAbbr	= ['MER'    ,'VEN'  ,'EAR'  ,'MAR' ,'JUP'    ,'SAT'   ,'URA'   ,'NEP'    ,'PLU'  ]
var	planetName	= ['Mercury','Venus','Earth','Mars','Jupiter','Saturn','Uranus','Neptune','Pluto']
var	zodiacAbbr	= ['ARI'  ,'TAU'   ,'GEM'   ,'CNC'   ,'LEO','VIR'  ,'LIB'  ,'SCO'    ,'SGR'        ,'CAP'      ,'AQR'     ,'PSC'   ]
var	zodiacName	= ['Aries','Taurus','Gemini','Cancer','Leo','Virgo','Libra','Scorpio','Sagittarius','Capricorn','Aquarius','Pisces']
var	seasonAbbr	= ['SPR'   , 'SUM'   , 'AUT'   , 'WIN'   ]
var	seasonName	= ['Spring', 'Summer', 'Autumn', 'Winter']
var 	eclipseType = []
eclipseType[-4] = 'Total Penumbral Lunar'	; eclipseType[+1] = 'Partial Solar'
eclipseType[-3] = 'Partial Penumbral Lunar'	; eclipseType[+2] = 'Non-Central Annular Solar'
eclipseType[-2] = 'Total Umbral Lunar'		; eclipseType[+3] = 'Central Annular Solar'
eclipseType[-1] = 'Partial Umbral Lunar'	; eclipseType[+4] = 'Non-Central Total Solar'
eclipseType[ 0] = 'No'				; eclipseType[+5] = 'Central Total Solar'
var	f16 = '<font face=Arial style="font-size:16pt">'
var	f15 = '<font face=Arial style="font-size:15pt">'
var	f14 = '<font face=Arial style="font-size:14pt">'
var	f13 = '<font face=Arial style="font-size:13pt">'
var	f12 = '<font face=Arial style="font-size:12pt">'
var	f11 = '<font face=Arial style="font-size:11pt">'
var	f10 = '<font face=Arial style="font-size:10pt">'
var	f09 = '<font face=Arial style="font-size:9pt">'
var	f08 = '<font face=Arial style="font-size:8pt">'
var	f07 = '<font face=Arial style="font-size:7pt">'
var	f7  = '<font face=Arial size=7>'
var	f6  = '<font face=Arial size=6>'
var	f5  = '<font face=Arial size=5>'
var	f4  = '<font face=Arial size=4>'
var	f3  = '<font face=Arial size=3>'
var	f2  = '<font face=Arial size=2>'
var	f1  = '<font face=Arial size=1>'
var	f0  = '</font>'
function square (x)	{return x*x}
function div	(x,y)	{return     Math.floor(x/y)}
function mod	(x,y)	{return x-y*Math.floor(x/y)}
function Int	(x)	{return x-x%1}
function sind	(d)	{return Math.sin(d*rad)}
function cosd	(d)	{return Math.cos(d*rad)}
function normdegrees	(x)	{return mod(x,360)}
function diffdegrees	(a,b)	{return normdegrees(180+a-b)-180}
function decdegrees	(d,m,s)	{if(arguments.length>1){return d+(m+s/60)/60}
else{return d.deg+(d.min+d.sec/60)/60}}
function arcdegrees	(d)	{var m=(d%1)*60; return {deg:Int(d), min:Int(m), sec:(m%1)*60}}
function polynomial	(x)	{var y=0;for(var i=arguments.length-1;i>0;i--){y=y*x+arguments[i]};return y}
function polynomial1	(x,a)	{var y=0;for(var i=a.length;i>0;){y=y*x+a[--i]};return y}
function polynomial2	(x,a0,a){var y=0;for(var i=a.length;i>0;){y=y*x+a[--i]};return y*x+a0}
function distance (xyz0, xyz1)
{
var r2 = 0
for (var i = 0; i < xyz0.length; i++) {r2 += square (xyz1[i] - xyz0[i] ) }
return Math.sqrt (r2)
}
function angularDistance (LB0, LB1)
{
var c0 = Math.cos (LB0[1]), xyz0 = [c0*Math.cos(LB0[0]), c0*Math.sin(LB0[0]), Math.sin(LB0[1])]
var c1 = Math.cos (LB1[1]), xyz1 = [c1*Math.cos(LB1[0]), c1*Math.sin(LB1[0]), Math.sin(LB1[1])]
var d2 = square(xyz0[0]-xyz1[0]) + square(xyz0[1]-xyz1[1]) + square(xyz0[2]-xyz1[2])
if (d2 > 2)
{
d2 = square(xyz0[0]+xyz1[0]) + square(xyz0[1]+xyz1[1]) + square(xyz0[2]+xyz1[2])
var r = Math.PI - 2 * Math.asin (Math.sqrt (d2) / 2)
} else
{	var r = 2 * Math.asin (Math.sqrt (d2) / 2)
}
return r
}
function phaseAngle (XYZbody, XYZsun, XYZearth)
{
var xyz1 = []
var xyz2 = []
for (var i = 0; i < 3; i++)
{	xyz1[i] = XYZsun[i] - XYZbody[i]
xyz2[i] = (arguments.length > 2 ? XYZearth[i] : 0) - XYZbody[i]
}
return angularDistance (LBRfromXYZ (xyz1), LBRfromXYZ (xyz2) )
}
function RDfromLB (L,B,eps)
{
var xyz = XYZfromLBR (L,B,1)
var x = xyz[0], y = xyz[1], z = xyz[2]
var r = Math.sqrt (y*y + z*z)
var p = Math.atan2 (z, y) + eps
var c = r * Math.cos (p)
var s = r * Math.sin (p)
var t = LBRfromXYZ (x,c,s)
return [t[0],t[1]]
}
function XYZfromLBR (L,B,R)
{
if (arguments.length > 1) {var l = L, b = B, r = R} else {var l = L[0], b = L[1], r = L[2] }
var d = r * Math.cos (b)
var x = d * Math.cos (l)
var y = d * Math.sin (l)
var z = r * Math.sin (b)
return [x,y,z]
}
function LBRfromXYZ (X,Y,Z)
{
if (arguments.length > 1) {var x = X, y = Y, z = Z} else {var x = X[0], y = X[1], z = X[2] }
var R = Math.sqrt (x*x + y*y + z*z)
var B = R > 0 ? Math.asin (z/R) : R
var L = Math.atan2 (y, x); if (L < 0) {L += 2*Math.PI}
return [L,B,R]
}
function cvlt	(x)	{var r='',p=r+x;for(var i=0;i<p.length;i++){r+=(p.charAt(i)=='<'?'&lt;':p.charAt(i))};return r}
function nbsp	(x)	{var r='',p=r+x;for(var i=0;i<p.length;i++){r+=(p.charAt(i)==' '?'&nbsp;':p.charAt(i))};return r}
function dbsp	(x)	{var r='',p=r+x;for(var i=0;i<p.length;i++){r+=(p.charAt(i)==' '?'&middot;':p.charAt(i))};return r}
function wr	()	{for(var i=0;i<arguments.length;i++){document.write(arguments[i])}}
function wrln	()	{for(var i=0;i<arguments.length;i++){document.write(arguments[i])};document.write('<br>')}
function dbwr	()	{for(var i=0;i<arguments.length;i++){document.write(dbsp(cvlt(arguments[i])))}}
function dbwrln	()	{for(var i=0;i<arguments.length;i++){document.write(dbsp(cvlt(arguments[i])))};document.write('&lt;br><br>')}
function rpad	(x,L,y)	{var r=''+x,p=(arguments.length>2?''+y:' ');while(r.length<L){r+=p};return r}
function lpad	(x,L,y)	{var r=''+x,p=(arguments.length>2?''+y:' ');while(r.length<L){r=p+r};return r}
function lpads	(x,L,y)	{var r=''+x,p=(arguments.length>2?''+y:' '),s=r.charAt(0)
if((' -+').indexOf(s)<0){s=' '}else{r=r.substr(1)};return s+lpad(r,L,p)}
function lpadp	(x,L,y)	{var r=lpads(x,L,arguments.length>2?y:' ')
if(r.charAt(0)==' '&&Number(x)!=0){r='+'+r.substr(1)};return r}
function ltrim	(x,y)	{var r=''+x,s=(arguments.length>1?y:''),t=(s==''?' ':s.charAt(0)),i=0
while(i<r.length&&r.charAt(i)==t){i++};return r.substr(i)}
function rtrim	(x,y)	{var r=''+x,s=(arguments.length>1?y:''),t=(s==''?' ':s.charAt(0)),L=r.length
while(L>0&&r.charAt(L-1)==t){L--};return r.substr(0,L)}
function trim	(x,y)	{var s=(arguments.length>1?y:''),t=(s==''?' ':s.charAt(0)); return ltrim(rtrim(x,t))}
function btrim	(x)	{var r = trim(x); return (r == '' ? r : ' ' + r) }
function sign   (n)	{return (n > 0 ? '+' : (n < 0 ? '-' : ' ') ) }
function mplets (n,d,s,m)
{
var r = ''
var x = r + n
var y = (arguments.length > 1 ? d : 0)
var z = (arguments.length > 2 ? s : ''); if (z == '') {z = ' '}
var w = (arguments.length > 3 ? m : 3)
if (w > 0)
{	var k = x.length
var j = (w - k % w) % w
if (y) {x = rpad (x, k+j) } else {x = lpad (x, k+j) }
for (var i = 0; i < x.length; i += w) {r += x.substr(i,w) + z}
r = r.substr(y?0:j,r.length-j-z.length)
} else {r = x
}
return r
}
function ndecString	(x,n,s,w,p,m)
{
var r = lpads(Math.round(x*eval('1e'+n)), n+1, 0)
var i = r.length-n
var v = (arguments.length > 3 ? w : 0)
var j = (arguments.length > 4 ? p : ' ')
var k = (arguments.length > 5 ? m : 3)
var l = mplets (lpads(r.substr(0,i),v,0),0,j,k)
var r = (n > 0 ? '.'+mplets(r.substr(i) ,1,j,k) : '')
return	l + (arguments.length > 2 ? s : '') + r
}
function arcString10	(d)	{return ndecString(d,7,'&#176;') }
var arcStringDecimals = 3
var arcStringFields   = 3
function arcString	(deg,min,sec)
{
if (arguments.length>2) {var d=deg,m=min,s=sec} else {var d=deg.deg,m=deg.min,s=deg.sec}
if (arguments.length==2) {sym = min} else {sym = ['&#176;','&#39;','&#34;'] }
var sa=Math.abs(s),ma=Math.abs(m),da=Math.abs(d)
if (arcStringFields < 2 && ma >= 30) {da++; ma=0; sa=0}
if (arcStringFields < 3 && sa >= 30) {ma++; sa=0}
if (sa>9&&(''+Math.round(sa*eval('1e'+arcStringDecimals))).substr(0,1)=='6'){ma++;sa=0}
if (Math.round(ma)    >=60   ){da++;ma=0}
var ds=(decdegrees(d,m,s)<0?'-':'')+da+sym[0]
var ms=(arcStringFields < 2 ? '' : lpad(ma,2,0)+sym[1])
var ss=(arcStringFields < 3 ? '' : ltrim(ndecString(sa,arcStringDecimals,sym[2],2,'',0)))
return ds+ms+ss
}
function HMSfromDegrees (d)
{
var x = arcdegrees (normdegrees(d)/15)
var y = ['<sup>h</sup>','<sup>m</sup>','<sup>s</sup>']
return arcString (x, y)
}
function parameters()
{	var x = location.search
if (x == '') {x = '?'}
x = (x.substr(1)).split('&')
for (var i = 0; i < x.length; i++)
{	x[i] = x[i].split('=')
for (var j = 0; j < x[i].length; j++)
{	x[i][j] = unescape(x[i][j].replace(/\+/g,' ') )
}	}
return x
}
function parameterPresent (parameterName, parameterList)
{
var p = (arguments.length > 1 ? parameterList : parameters())
var k = -1
for (var i = 0; k < 0 && i < p.length; i++)
{	if (p[i][0] == parameterName) {k = i}
}
return (k >= 0)
}
function parameterValue (parameterName, parameterList)
{
var p = (arguments.length > 1 ? parameterList : parameters())
var k = -1
for (var i = 0; k < 0 && i < p.length; i++)
{	if (p[i][0] == parameterName) {k = i}
}
return (k >= 0 && p[k].length > 1 ? p[k][1] : '')
}
function makeParameters ()
{	var x = '', y = '?'
for (var i = 0; i < arguments.length; i++)
{	var aa = ''
if (arguments[i].length > 0) {aa +=                 arguments[i][0]  }
if (arguments[i].length > 1) {aa += '=' + escape(''+arguments[i][1]) }
if (aa != '') {x += y + aa; y = '&'}
}
return x
}
function TB (ta, ca, ra)	{return '<table'		+(arguments.length>0?btrim(ta):'')+'>'
+ '<tr'			+(arguments.length>2?btrim(ra):'')+'>'
+ '<td'			+(arguments.length>1?btrim(ca):'')+'>'}
function TR (ca, ra)		{return '</td></tr><tr'		+(arguments.length>1?btrim(ra):'')+'>'
+ '<td'			+(arguments.length>0?btrim(ca):'')+'>'}
function TD (ca)		{return '</td><td'		+(arguments.length>0?btrim(ca):'')+'>'}
function TE (flag)		{return (arguments.length > 0 ? flag : 1) ? '</td></tr></table>' : ''}
function setGregSwitch (year,month,day)
{
if (arguments.length == 1)
{	var dt = InverseJulianDay (year, 'G')
setGregSwitch (dt.year, dt.month, dt.day)
} else
{	switchGregJD		= JulianDay ('G', year, month, day, 0)
var x = InverseJulianDay (switchGregJD - 1, 'J')
switchGregPseudoDate0	= (x.year * 100 + x.month) * 100 + x.day
switchGregPseudoDate	= (year * 100 + month) * 100 + day
switchGregInterval	= switchGregJD - JulianDay ('G', x) - 1
}
}
function CheckDate (mode, year, month, day, hour, minute, second)
{
var dpm = [0,31,29,31,30,31,30,31,31,30,31,30,31]
var g0 = 'JG'.indexOf((''+mode+'?').substr(0,1).toUpperCase())
var g  = (g0 < 0 ? ( (year * 100 + month) * 100 + day >= switchGregPseudoDate ? 1 : 0) : g0)
isGregorian = (g == 1)
return	hour   >= 0 && hour   < 24
&&	minute >= 0 && minute < 60
&&	second >= 0 && second < 60
&&	month  >= 1 && month  < 13
&&	day    >= 1 && day   <= dpm[month]
&&	month  != 2 || day   != 29 || (year%4 == 0 && (!g || year%100 != 0 || year%400 == 0) )
&&	(g0    >= 0 || month != 10 || day < 5 || day > 14)
}
function MonthLength (mode, year, month)
{
var dpm = [0,31,29,31,30,31,30,31,31,30,31,30,31]
if (month == 2)
{	var g0 = 'JG'.indexOf((''+mode+'?').substr(0,1).toUpperCase())
if (month==2)
{	var g  = (g0 < 0 ? ( (year*100+month)*100+29 >= switchGregPseudoDate ? 1 : 0) : g0)
dpm[2] = (year%4 == 0 && (!g || year%100 != 0 || year%400 == 0) ? 29 : 28)
}
}
return dpm[month]
}
function JulianDay (mode, year, month, day, hour, minute, second)
{
var a = []
if (arguments.length == 2)
{	a = year
}
else
{	a.year	= year
a.month	= month
a.day	= day
a.hour	= (arguments.length > 4 ? hour   : 12)
a.minute= (arguments.length > 5 ? minute :  0)
a.second= (arguments.length > 6 ? second :  0)
}
var g = 'JG'.indexOf((''+mode+'?').substr(0,1).toUpperCase())
if (g < 0) {g = ( (a.year * 100 + a.month) * 100 + a.day >= switchGregPseudoDate ? 1 : 0) }
var y = (a.month < 3 ? a.year - 1 : a.year)
var r = 1721119 + y * 365 + div (y, 4) + (g ? div (y, 400) - div (y, 100) : -2)
+ Math.round ( ( (a.month + 9) % 12) * 30.6) + a.day
+ ( ( (a.hour-12) * 60 + a.minute) * 60 + a.second) / SecPerDay
isGregorian = (g == 1)
return r
}
function DateTimeUTC (datobj)
{
var r = []
r.year   = datobj.getUTCFullYear()
r.month  = datobj.getUTCMonth()+1
r.day    = datobj.getUTCDate()
r.hour   = datobj.getUTCHours()
r.minute = datobj.getUTCMinutes()
r.second = datobj.getUTCSeconds()
return r
}
function NowUTC ()
{
return DateTimeUTC (new Date () )
}
function JulianDayJS (dateObject)
{
return JDzeroJS + (arguments.length > 0 ? dateObject : new Date() ).valueOf() / msPerDay
}
function JSdateFromJD (JD)
{
return new Date( (JD - JDzeroJS) * msPerDay)
}
BirthDateHenkReints	= JSdateFromJD (JulianDay ('',1957,11,18,02,06) )
BirthDateGalileoGalilei	= JSdateFromJD (JulianDay ('',1564,02,15) )
function JulianDayToday ()
{
return Math.round (JulianDayJS () )
}
function JulianDayNow ()
{
return JulianDayJS ()
}
function roundJD (JD, unit)
{
var u = (arguments.length > 1 ? unit : 's')
var x = (u == 'm' ? MinPerDay : SecPerDay)
var d = Math.floor (JD)
var t = (Math.round ( (JD - d) * x) + 0.01) / x
return d + t
}
function InverseJulianDay (JD, mode)
{
var result = new Array()
var d = Math.floor (  JD + 0.5)
var t = Math.floor ( (JD + 0.5 - d) * SecPerDay)
var j = d - 1721120, k, L = 0, m, n = 0, y
var g = (arguments.length > 1 ? 'JG'.indexOf((''+mode+'?').substr(0,1).toUpperCase()) : -1)
if (g < 0) {g = (JD >= switchGregJD ? 1 : 0) }
if (!g) {j+= 2}
k = j
if (g) {if (mod (k+1, GregCycle  ) == 0) {L=1}
m = div (k  , GregCycle  ); n += m * 97; k -= m * GregCycle
m = div (k  , GregCentury); n += m * 24; k -= m * GregCentury
}	if (mod (k+1, JulCycle   ) == 0) {L=1}
m = div (k  , JulCycle   ); n += m
j -= n
y = div (j-L, 365)
d = j - y * 365
m = div (d + 0.5, 30.6)
d -= Math.round (m * 30.6) - 1
m = 1 + (m + 2) % 12
if (m < 3) {y++}
result.year   = y
result.month  = m
result.day    = d
result.hour   = div (t, SecPerHour); t = mod (t, SecPerHour)
result.minute = div (t, SecPerMin )
result.second = mod (t, SecPerMin )
isGregorian = (g == 1)
return result
}
function fromCivilDate (year, month, day)
{
if (arguments.length > 2)	{var y =      year, m =      month, d =      day}
else				{var y = year.year, m = year.month, d = year.day}
if (y < 0)	{var r = InverseJulianDay (JulianDay ('', y, m, d) + 365, '') }
else		{var r = []; r.year=y; r.month=m; r.day=d; r.hour=12; r.minute=0; r.second=0}
return r
}
function toCivilDate (year, month, day)
{
if (arguments.length > 2)	{var y =      year, m =      month, d =      day}
else				{var y = year.year, m = year.month, d = year.day}
if (y <= 0)	{var r = InverseJulianDay (JulianDay ('', y, m, d) - 365, '') }
else		{var r = []; r.year=y; r.month=m; r.day=d; r.hour=12; r.minute=0; r.second=0}
return r
}
function DayOfWeek (JD)
{
return (Math.floor (JD + 0.5) % 7 + 7) % 7
}
function weekno (JD, mode)
{	if (arguments.length == 1)
{	return weekno (JD, '')
} else
{	var dd = InverseJulianDay (JD, mode)
var j1 = JulianDay (mode, dd.year, 1, 1), d1 = DayOfWeek (j1)
var j2 = JulianDay (mode, dd.year,12,31), d2 = DayOfWeek (j2)
var wn = div (JD - j1 + d1 + (d1 > 3 ? 0 : 7), 7)
if (wn > 52 && (d1 > 3 || d2 < 3) ) { wn = -1}
if (wn == 0) {wn = -weekno (JD-3, mode) }
return wn
}
}
function CivilDateString (year, month, day)
{
if (arguments.length > 1)	{var y =      year, m =      month, d =      day}
else				{var y = year.year, m = year.month, d = year.day}
return lpad(d,2,0) + '-' + monthAbbr[m-1] + '-' + lpad(Math.abs(y),4,0) + eraAbbr[y < 0 ? 0 : 1]
}
function DateString (year, month, day)
{
if (arguments.length > 1)
{
return lpadp(year,4,0) + lpads(-month,2,0) + lpads(-day,2,0)
}
else
{
return DateString (year.year, year.month, year.day)
}
}
function TimeString (hour, minute, second)
{
if (arguments.length > 1)	{var h =      hour, m =      minute, s =      second}
else				{var h = hour.hour, m = hour.minute, s = hour.second}
return lpad(h,2,0) + ':' + lpad(m,2,0) + ':' + lpad(s,2,0)
}
function DateTimeString (year, month, day, hour, minute, second)
{
if (arguments.length == 1)	{var r = DateString (year) + ' ' + TimeString (year) }
else	{var r = DateString (year,month,day) + ' ' + TimeString (hour,minute,second) }
return r
}
function ndecTimeString (ndec, hour, minute, second)
{
if (arguments.length > 2)	{var h =      hour, m =      minute, s =      second}
else				{var h = hour.hour, m = hour.minute, s = hour.second}
return lpad(h,2,0) + ':' + lpad(m,2,0) + ':' + lpad(ndecString(s,ndec),ndec+3,0)
}
function DateTimeFromJD (JD, mode)
{
var m = (arguments.length > 1 ? mode : '')
var x = InverseJulianDay (JD, m)
return DateTimeString (x) + ' UTC'
}
function DateFromJD (JD, mode)
{
var m = (arguments.length > 1 ? mode : '')
return DateString (InverseJulianDay (JD, m) )
}
function fractionalYear (mode, year, month, day)
{
if (arguments.length > 2)
{
var y = arguments[1]
var m = arguments[2]
var d = arguments[3]
}
else
{
var y = arguments[1].year
var m = arguments[1].month
var d = arguments[1].day
}
var j0 = JulianDay (mode, y  , 1, 1)
var j2 = JulianDay (mode, y+1, 1, 1) - j0
var j1 = JulianDay (mode, y  , m, d) - j0
return y + j1 / j2
}
function JulianCenturyTime (JD)
{
return (JD - J2000) / JulCentury
}
function TimeFromDegrees (d, rnd)
{
var r = new Array()
var t = d * SecPerDay / 360
if (arguments.length>1 && rnd) {t = Math.round(t) }
r.hour   = div (t, SecPerHour); t = mod (t, SecPerHour)
r.minute = div (t, SecPerMin )
r.second = mod (t, SecPerMin )
return r
}
function GregorianEasterJD (year)
{
var r = null
if (year > firstGregYear)
{
var	y = year
var	a = y % 19 + 1
var	b = div (y, 100) + 1
var	c = div (3 * b, 4) - 12
var	d = div (8 * b + 5, 25) - 5
var	e = div (y * 5, 4) - 10 - c
var	f = mod (11 * a + 20 + d - c, 30)
if (f == 24 || (f == 25 && a > 11) ) {f++}
var	g = (f > 23 ? 74 : 44) - f
var	d = (arguments.length > 1 ? g : g + 7 - (e + g) % 7)
r = JulianDay ('G', y, (d > 31 ? 4 : 3), (d - 1) % 31 + 1)
}
return r
}
function JulianEasterJD (year)
{
var y = 325
var r = null
if (year > y)
{
var	y = year
var	i = (19 * (y % 19) + 15) % 30
var	d = 21 + i + (arguments.length > 1 ? 0 : 7 - (div (y * 5, 4) + i) % 7)
r = JulianDay ('J', y, (d > 31 ? 4 : 3), (d - 1) % 31 + 1)
}
return r
}
function deltaT (year)
{
var p,q,r,t,  m = 1618 + 2 * deltaTtable.length
if (year >= 1620 && year <= m)
{
p = 0.5 * (year - 1620)
q = Math.floor (p)
r = deltaTtable[q]
if (q < m && p > q) {r += (p-q) * (deltaTtable[q+1] - r)}
}
else
{
t = 0.01 * (year - 2000)
if      (year <   948)				{r  = 2177 + (497 + 44.1 * t) * t}
else if (year < 1620 || year > m)		{r  =  102 + (102 + 25.3 * t) * t}
if (year > 1520 && year < 1620)
{
t = -0.38
r += (year - 1520) * 0.01 * (deltaTtable[0] - 102 - (102 + 25.3 * t) * t)
}
if	(year > m && year < 2100)
{
t = 0.01 * (m - 2000)
r += (year - 2100) * 0.01 * (102 + (102 + 25.3 * t) * t - deltaTtable[deltaTtable.length-1] )
}
}
return r
}
function JDEfromJD (JD)
{
return JD + deltaT (2000 + (JD - J2000) / JulYear) / SecPerDay
}
function JDfromJDE (JDE)
{
return JDE - deltaT (2000 + (JDE - J2000) / JulYear) / SecPerDay
}
function meanSiderialTimeDegrees (JD)
{
var T = JulianCenturyTime (JD)
var r = 280.46061837 + 360.98564736629 * (JD - J2000) + (0.000387933 - T / 38710000) * T * T
return normdegrees (r)
}
function apparentSiderialTimeDegrees (JD)
{
return normdegrees (meanSiderialTimeDegrees(JD) + nutationRAdegrees(JDEfromJD) )
}
function meanObliquityDegrees (JDE)
{
var U	= 0.01 * JulianCenturyTime (JDE)
U = mod (U + 1, 4) - 1; if (U > 1) {U = 2 - U}
return polynomial (U, 3600 * decdegrees (23, 26, 21.448),
-4680.93, -1.55, 1999.25, -51.38, -249.67, -39.05, 7.12, 27.87, 5.79, 2.45) /3600
}
function trueObliquityDegrees (JDE)
{
return meanObliquityDegrees(JDE) + (nutationArcsec(JDE)).eps/3600
}
function nutationRAdegrees (JDE)
{
var x = nutationArcsec (JDE)
return x.psi * cosd (meanObliquityDegrees(JDE) + x.eps/3600) /3600
}
function nutationArcsec (JDE)
{
var T	= JulianCenturyTime (JDE)
var D	= polynomial1 (T, nutationtable0[0] )
var M	= polynomial1 (T, nutationtable0[1] )
var M1	= polynomial1 (T, nutationtable0[2] )
var F	= polynomial1 (T, nutationtable0[3] )
var OMG	= polynomial1 (T, nutationtable0[4] )
var psi = 0
var eps = 0
for (var n = 0; n < nutationtable1.length; n++)
{
var a = nutationtable1[n]
var x = normdegrees (a[0]*D + a[1]*M + a[2]*M1 + a[3]*F + a[4]*OMG)
psi += (a[5] + a[6] * T) * sind (x)
eps += (a[7] + a[8] * T) * cosd (x)
}
return {psi: psi*1e-4, eps: eps*1e-4}
}
function eqTimeDegrees (JDE)
{
return (SunMeanLongitudeDegrees(JDE)-0.0057183-SunApparentRAdegrees(JDE)+nutationRAdegrees(JDE)
)%360
}
function precessionRD (RD, toEpoch, fromEpoch)
{
if (arguments.length < 3)
{	return precessionRD (RD, toEpoch, J2000)
} else
{	var r = []
var t0 = (fromEpoch - J2000    ) / JulCentury
var t1 = (toEpoch   - fromEpoch) / JulCentury
var x = []
for (var i = 0; i < precessionRDtable.length; i++)
{	x[i] = polynomial (t1
, polynomial1 (t0, precessionRDtable[i][0] )
, polynomial1 (t0, precessionRDtable[i][1] )
, polynomial1 (t0, precessionRDtable[i][2] )
) * t1
}
with (Math)
{	var c0 = cos(RD[0]+x[0]), s0 = sin(RD[0]+x[0])
var c1 = cos(RD[1])	, s1 = sin(RD[1])
var c2 = cos(x[2])	, s2 = sin(x[2])
var A =    c1*s0
var B = c2*c1*c0 - s2*s1
var C = s2*c1*c0 + c2*s1
r[0] = x[1] + atan2(A,B)
r[1] = asin(C)
}
for (var i = 2; i < RD.length; i++) {r[i] = RD[i] }
return r
}
}
function precessionLB (LB, toEpoch, fromEpoch)
{
if (arguments.length < 3)
{	return precessionLB (LB, toEpoch, J2000)
} else
{	var r = []
var t0 = (fromEpoch - J2000    ) / JulCentury
var t1 = (toEpoch   - fromEpoch) / JulCentury
var x = []
for (var i = 0; i < precessionLBtable.length; i++)
{	x[i] = polynomial (t1
, polynomial1 (t0, precessionLBtable[i][0] )
, polynomial1 (t0, precessionLBtable[i][1] )
, polynomial1 (t0, precessionLBtable[i][2] )
)
if (i != 1) x[i] *= t1
}
with (Math)
{	var c0 = cos(x[0])	, s0 = sin(x[0])
var c1 = cos(LB[1])	, s1 = sin(LB[1])
var c2 = cos(x[1]-LB[0]), s2 = sin(x[1]-LB[0])
var A = c0*c1*s2 - s0*s1
var B =    c1*c2
var C = c0*s1    + s0*c1*s2
r[0] = x[1] + x[2] - atan2(A,B)
r[1] = asin(C)
}
for (var i = 2; i < LB.length; i++) {r[i] = LB[i] }
return r
}
}
function PlutoHCxyz2000 (JDE)
{
if (JDE < PlutoJD0 || JDE > PlutoJD1) {return [NaN,NaN,NaN] }
var t = 2 * (JDE - PlutoJD0) / 146120 - 1
var u = t * 73060
var xyz = []
for (var k = 0; k < 3; k++)
{	var r = 0
var s = 0
var v
var j = k * 2
for (var i = PlutoAxyz.length-1; i >= 0; i--) {r *= t; r += PlutoAxyz[i][k] }
for (var i = PlutoTerms.length-1; i >= 0; i--)
{	v  = PlutoTerms[i][0]   * u
s += PlutoTerms[i][j+1] * Math.cos (v)
s += PlutoTerms[i][j+2] * Math.sin (v)
if (i == 101 || i == 82) {s *= t}
}
xyz[k] = (r + s) * 1e-10
}
return xyz
}
function PlutoHClbr (JDE)
{
return precessionLB (LBRfromXYZ (PlutoHCxyz2000 (JDE) ), JDE)
}
function HCplanetPosition (iplanet, icoord, T)
{
if (icoord < 0)
{
var lbr = []
if (iplanet == planetPluto)	{lbr = PlutoHClbr (J2000 + T*JulCentury*10) }
else	{for (var i = 0; i < 3; i++) {lbr[i] = HCplanetPosition (iplanet, i, T) } }
return lbr
}
else
{
if (iplanet == planetPluto) {return NaN}
var result = 0
var powerofT = 1
var pi2 = 2 * Math.PI
var A, B, C, nterms
var npower = PlanetPeriodicTerms[iplanet][icoord].length
for (var ipower = 0; ipower < npower; ipower++)
{	nterms = PlanetPeriodicTerms[iplanet][icoord][ipower].length
for (var i = 0; i < nterms; i++)
{	A = PlanetPeriodicTerms[iplanet][icoord][ipower][i][0]
B = PlanetPeriodicTerms[iplanet][icoord][ipower][i][1]
C = PlanetPeriodicTerms[iplanet][icoord][ipower][i][2]
result += powerofT * A * Math.cos (B + C * T)
}
powerofT *= T
}
if (icoord < 2) {result = result % pi2}
if (icoord == 0 && result < 0) {result += pi2}
return result
}
}
function GCplanetPosition (iplanet, T, HCxyzEarth)
{
var xyz0 = []
if (arguments.length > 2) {for (var i = 0; i < HCxyzEarth.length; i++) {xyz0[i] = HCxyzEarth[i] } }
if (xyz0.length == 0)
{	xyz0 = XYZfromLBR (HCplanetPosition (planetEarth, -1, T))
if (arguments.length > 2) {for (var i = 0; i < xyz0.length; i++) {HCxyzEarth[i] = xyz0[i] } }
}
var xyz = [0,0,0]
if (iplanet != planetEarth) {xyz = XYZfromLBR (HCplanetPosition (iplanet, -1, T) ) }
for (var i = 0; i < 3; i++) {xyz[i] -= xyz0[i] }
return xyz
}
var AplPosNoEarthAberration	= 1
var AplPosNoNutation		= 2
var AplPosReturnHCpos		= 4
function ApparentPlanetPosition (iplanet, T, HCxyzEarth, flags)
{
var xyz0 = []
if (arguments.length > 2) {for (var i = 0; i < HCxyzEarth.length; i++) {xyz0[i] = HCxyzEarth[i] } }
if (xyz0.length == 0)
{	xyz0 = XYZfromLBR (HCplanetPosition (planetEarth, -1, T) )
if (arguments.length > 2) {for (var i = 0; i < xyz0.length; i++) {HCxyzEarth[i] = xyz0[i] } }
}
var g = (arguments.length > 3 ? 1*flags : 0)
var e = 1 / (SecPerDay * JulCentury * 10)
var f = e * AU / lightSpeed
var t = 0, t1, r, hcp = []
do
{
var t1 = t
if (iplanet != planetEarth)
{	hcp = HCplanetPosition (iplanet, -1, T-t)
xyz = XYZfromLBR (hcp)
} else {hcp = [0,0,0]
xyz = [0,0,0]
}
r = distance (xyz, xyz0)
t = f * r
}
while (Math.abs (t-t1) > e)
if ((g & AplPosNoEarthAberration) == 0) {xyz0 = XYZfromLBR (HCplanetPosition (planetEarth, -1, T-t) ) }
for (var i = 0; i < xyz.length; i++) {xyz[i] -= xyz0[i] }
var lbr = LBRfromXYZ (xyz)
lbr[2] = r
if ((g & AplPosNoNutation) == 0)
{	var JDE = J2000 + T * JulCentury * 10
var nut = nutationArcsec (JDE)
lbr[0] += nut.psi * rad / 3600
while (lbr[0] >= 2*pi) {lbr[0] -= 2*pi}
while (lbr[0] <  0)    {lbr[0] += 2*pi}
}
if ((g & AplPosReturnHCpos) != 0)
{	var k = lbr.length
for (var i = 0; i < hcp.length; i++) {lbr[k+i] = hcp[i] }
}
return lbr
}
function EclipseInfo (JDE, EP)
{
var EarthRadius = EarthRadiusP
if (arguments.length > 1 && EP == "E") {EarthRadius = EarthRadiusE}
var TT = [JDE - 1/24, JDE + 1/24, 0]
var gcXYZsun  =[], gcXYZmoon=[], gcXYZumbraE=[], gcXYZpenumbraE=[], gcXYZmax=[]
var gcLBRsun  =[], gcLBRmoon=[], gcLBRumbraE=[], gcLBRpenumbraE=[], gcLBRmax=[]
var guXYZsun  =[], guXYZmoon=[]
var guLBRsun  =[], guLBRmoon=[]
var gpXYZearth=[], gpXYZmoon=[]
var gpLBRearth=[], gpLBRmoon=[]
var hcXYZearth=[], hcXYZmoon=[], hcXYZumbraM=[]
var hcLBRearth=[], hcLBRmoon=[], hcLBRumbraM=[]
var xcXYZsun  =[], xcXYZmoon=[]
var xcLBRsun  =[], xcLBRmoon=[]
var L=[], B=[]
for (var t = 0; t < TT.length; t++)
{
var Tjc = JulianCenturyTime (TT[t])
var Tjm = Tjc / 10
gcLBRsun     = ApparentPlanetPosition (planetEarth, Tjm)
gcLBRsun[2] *= AU*1e-3
gcLBRmoon    = [MoonPosition(0,Tjc)*rad, MoonPosition(1,Tjc)*rad, MoonPosition(2,Tjc)*1e-3]
gcLBRumbraE  = [gcLBRsun[0]+pi, -gcLBRsun[1], gcLBRsun[2] * EarthRadius / (SunRadius - EarthRadius) ]
gcXYZsun     = XYZfromLBR (gcLBRsun   )
gcXYZmoon    = XYZfromLBR (gcLBRmoon  )
gcXYZumbraE  = XYZfromLBR (gcLBRumbraE)
for (var i = 0; i < 3; i++)
{	guXYZsun[i]  = gcXYZsun[i]  - gcXYZumbraE[i]
guXYZmoon[i] = gcXYZmoon[i] - gcXYZumbraE[i]
}
guLBRsun  = LBRfromXYZ (guXYZsun )
guLBRmoon = LBRfromXYZ (guXYZmoon)
L[t] = guLBRmoon[0] - guLBRsun[0]
B[t] = guLBRmoon[1] - guLBRsun[1]
while (L[t] >   pi) {L[t] -= 2*pi}
while (L[t] <= -pi) {L[t] += 2*pi}
if (t == 1)
{	var m = (B[1] - B[0] ) / (L[1] - L[0] )
var p = B[0] - m * L[0]
var r = -p * m / (1 + m*m)
var s = -p / m
TT[2] = TT[0] + (TT[1] - TT[0]) * (r - L[0] ) / (L[1] - L[0] )
var	tnode = TT[0] + (TT[1] - TT[0]) * (s - L[0] ) / (L[1] - L[0] )
var	anode = (m == 0 ? 0 : (m > 0 ? 1 : -1) )
}
}
if (Math.abs(gcLBRsun[0]-gcLBRmoon[0]) > pi/2)
{
gcLBRpenumbraE = [gcLBRsun[0], gcLBRsun[1], gcLBRsun[2] * EarthRadius / (SunRadius + EarthRadius) ]
gcXYZpenumbraE = XYZfromLBR (gcLBRpenumbraE)
for (var i = 0; i < 3; i++)
{	gpXYZearth[i] =              - gcXYZpenumbraE[i]
gpXYZmoon[i]  = gcXYZmoon[i] - gcXYZpenumbraE[i]
}
gpLBRearth = LBRfromXYZ (gpXYZearth)
gpLBRmoon  = LBRfromXYZ (gpXYZmoon )
var guSunRadius    = Math.asin(SunRadius /guLBRsun[2] )
var guMoonRadius   = Math.asin(MoonRadius/guLBRmoon[2])
var guElongation   = angularDistance(guLBRsun,guLBRmoon)
var gpEarthRadius  = Math.asin(EarthRadius/gpLBRearth[2])
var gpMoonRadius   = Math.asin(MoonRadius /gpLBRmoon[2] )
var gpElongation   = angularDistance(gpLBRearth,gpLBRmoon)
var guMagnitude    = (guSunRadius   + guMoonRadius - guElongation) / (2 * guMoonRadius)
var gpMagnitude    = (gpEarthRadius + gpMoonRadius - gpElongation) / (2 * gpMoonRadius)
if (guMagnitude > 1) {guMagnitude = guMagnitude * 2 - 1}
if (gpMagnitude > 1) {gpMagnitude = gpMagnitude * 2 - 1}
var eclipseType = 0
if (gpMagnitude >  0) {eclipseType = -3}
if (gpMagnitude >= 1) {eclipseType = -4}
if (guMagnitude >  0) {eclipseType = -1}
if (guMagnitude >= 1) {eclipseType = -2}
result	=
[TT[2]
,eclipseType
,(guMagnitude > 0 ? guMagnitude : gpMagnitude)
,-anode
,tnode
]
}
else
{
for (var i = 0; i < 3; i++)
{	hcXYZearth[i] =              - gcXYZsun[i]
hcXYZmoon[i]  = gcXYZmoon[i] - gcXYZsun[i]
}
var a = (hcXYZmoon[0] *hcXYZmoon[0]  + hcXYZmoon[1] *hcXYZmoon[1]  + hcXYZmoon[2] *hcXYZmoon[2]  ) * 2
var b =	(hcXYZmoon[0] *hcXYZearth[0] + hcXYZmoon[1] *hcXYZearth[1] + hcXYZmoon[2] *hcXYZearth[2] ) * 2
var c =  hcXYZearth[0]*hcXYZearth[0] + hcXYZearth[1]*hcXYZearth[1] + hcXYZearth[2]*hcXYZearth[2]
c -= EarthRadius*EarthRadius
var d = b*b - 2*a*c
p = b/a
if (d > 0) {p -= Math.sqrt (d) / a}
for (var i = 0; i < 3; i++)
{	gcXYZmax[i] = p * hcXYZmoon[i] - hcXYZearth[i]
}
gcLBRmax = LBRfromXYZ (gcXYZmax)
gcLBRmax[3] = gcLBRmax[2]
gcLBRmax[2] = EarthRadius
gcXYZmax = XYZfromLBR (gcLBRmax)
gcLBRmax = RDfromLB (gcLBRmax[0], gcLBRmax[1], trueObliquityDegrees(TT[2])*rad)
gcLBRmax[0] *= deg
gcLBRmax[1] *= deg
gcLBRmax[0] -= meanSiderialTimeDegrees(JDfromJDE(TT[2])) + nutationRAdegrees(TT[2])
while (gcLBRmax[0] >   180) {gcLBRmax[0] -= 360}
while (gcLBRmax[0] <= -180) {gcLBRmax[0] += 360}
for (var i = 0; i < 3; i++)
{	xcXYZsun[i]  = gcXYZsun[i]  - gcXYZmax[i]
xcXYZmoon[i] = gcXYZmoon[i] - gcXYZmax[i]
}
xcLBRsun  = LBRfromXYZ (xcXYZsun )
xcLBRmoon = LBRfromXYZ (xcXYZmoon)
var xcSunRadius  = Math.asin(SunRadius /xcLBRsun[2] )
var xcMoonRadius = Math.asin(MoonRadius/xcLBRmoon[2])
var xcElongation = angularDistance(xcLBRsun,xcLBRmoon)
var moonDiameter = 2 * xcMoonRadius
var sunDiameter  = 2 * xcSunRadius
var overlap      = xcSunRadius + xcMoonRadius - xcElongation
var eclipseType  = 4
if (overlap > moonDiameter) {overlap = moonDiameter;  eclipseType = 2}
if (overlap < sunDiameter && overlap < moonDiameter) {eclipseType = 1}
if (d >= 0) eclipseType += 1
if (overlap < 0) {eclipseType = 0}
var xcMagnitude  = overlap / sunDiameter
if (xcMagnitude > 1) {xcMagnitude = xcMagnitude * 2 - 1}
result	=
[TT[2]
,eclipseType
,xcMagnitude
,anode
,tnode
,gcLBRmax[1]
,gcLBRmax[0]
]
}
return	result
}
function SunMeanLongitudeDegrees (JDE)
{
return normdegrees(polynomial(
0.1*JulianCenturyTime(JDE),280.4664567,360007.6982779,0.03032028,1/49931,-1/15300,-2e-6))
}
function SunApparentRAdegrees (JDE)
{
var T = 0.1 * JulianCenturyTime (JDE)
var L =  HCplanetPosition (planetEarth, 0, T) + pi
var B = -HCplanetPosition (planetEarth, 1, T)
var eps = trueObliquityDegrees (JDE) * rad
var radec = RDfromLB (L, B, eps)
return radec[0] * deg
}
function magnitude (iplanet, XYZplanet, XYZsun, XYZearth)
{
if (iplanet == planetEarth)
{	var magn = -26.73
var illu = 1
}
else
{	var xyz1 = []
var xyz2 = []
for (var i = 0; i < 3; i++)
{	xyz1[i] = XYZsun[i] - XYZplanet[i]
xyz2[i] = (arguments.length > 3 ? XYZearth[i] : 0) - XYZplanet[i]
}
var lbr1 = LBRfromXYZ (xyz1)
var lbr2 = LBRfromXYZ (xyz2)
var angl = angularDistance (lbr1, lbr2)
var magn = 5 * Math.log (lbr1[2] * lbr2[2]) / Math.LN10 + polynomial1 (angl*deg, magnitudeTable[iplanet])
var illu = (1 + Math.cos (angl) ) / 2
}
return [magn, illu]
}
var deltaTtable =
[121	,112	,103	, 95	, 88		, 82	, 77	, 72	, 68	, 63
, 60	, 56	, 53	, 51	, 48		, 46	, 44	, 42	, 40	, 38
, 35	, 33	, 31	, 29	, 26		, 24	, 22	, 20	, 18	, 16
, 14	, 12	, 11	, 10	,  9		,  8	,  7	,  7	,  7	,  7
,  7	,  7	,  8	,  8	,  9		,  9	,  9	,  9	,  9	, 10
, 10	, 10	, 10	, 10	, 10		, 10	, 10	, 11	, 11	, 11
, 11	, 11	, 12	, 12	, 12		, 12	, 13	, 13	, 13	, 14
, 14	, 14	, 14	, 15	, 15		, 15	, 15	, 15	, 16	, 16
, 16	, 16	, 16	, 16	, 16		, 16	, 15	, 15	, 14	, 13
, 13.1	, 12.5	, 12.2	, 12.0	, 12.0		, 12.0	, 12.0	, 12.0	, 12.0	, 11.9
, 11.6	, 11.0	, 10.2	,  9.2	,  8.2		,  7.1	,  6.2	,  5.6	,  5.4	,  5.3
,  5.4	,  5.6	,  5.9	,  6.2	,  6.5		,  6.8	,  7.1	,  7.3	,  7.5	,  7.6
,  7.7	,  7.3	,  6.2	,  5.2	,  2.7		,  1.4	, -1.2	, -2.8	, -3.8	, -4.8
, -5.5	, -5.3	, -5.6	, -5.7	, -5.9		, -6.0	, -6.3	, -6.5	, -6.2	, -4.7
, -2.8	, -0.1	,  2.6	,  5.3	,  7.7		, 10.4	, 13.3	, 16.0	, 18.2	, 20.2
, 21.1	, 22.4	, 23.5	, 23.8	, 24.3		, 24.0	, 23.9	, 23.9	, 23.7	, 24.0
, 24.3	, 25.3	, 26.2	, 27.3	, 28.2		, 29.1	, 30.0	, 30.7	, 31.4	, 32.2
, 33.1	, 34.0	, 35.0	, 36.5	, 38.3		, 40.2	, 42.2	, 44.5	, 46.5	, 48.5
, 50.5	, 52.2	, 53.8	, 54.9	, 55.8		, 56.9	, 58.3	, 60.0	, 61.6	, 63.0
,63.83
,64.30
,64.57
,64.85
,65.46
]
var precessionRDtable =
[ [ [2306.2181,  1.39656, -0.000139] , [ 0.30188, -0.000344] , [ 0.017998] ]
, [ [2306.2181,  1.39656, -0.000139] , [ 1.09468,  0.000066] , [ 0.018203] ]
, [ [2004.3109, -0.85330, -0.000217] , [-0.42665, -0.000217] , [-0.041833] ]
]
for (var i = 0; i < precessionRDtable.length; i++)
{	for (var j = 0; j < precessionRDtable[i].length; j++)
{	for (var k = 0; k < precessionRDtable[i][j].length; k++)
{	precessionRDtable[i][j][k] *= rad/3600
}	}	}
var precessionLBtable =
[ [ [  47.0029  ,   -0.06603,  0.000598] , [  -0.03302,  0.000598] , [ 0.000060] ]
, [ [ 174.876384, 3289.4789 ,  0.60622 ] , [-869.8089 , -0.50491 ] , [ 0.03536 ] ]
, [ [5029.0966  ,    2.22226, -0.000042] , [   1.11113, -0.000042] , [-0.000006] ]
]
precessionLBtable[1][0][0] *= 3600
for (var i = 0; i < precessionLBtable.length; i++)
{	for (var j = 0; j < precessionLBtable[i].length; j++)
{	for (var k = 0; k < precessionLBtable[i][j].length; k++)
{	precessionLBtable[i][j][k] *= rad/3600
}	}	}
var nutationtable0 = [[0,0,0,0]]
var nutationtable1 = [[0,0,0,0,0,0,0,0,0]]
var	PlutoJD0	= 2341972.5
var	PlutoJD1	= 2488092.5
var	PlutoAxyz	= [[0,0,0]]
var	PlutoTerms	= [[0,0,0,0,0,0,0]]
var	EmptyPeriodicTerms	= [[[[0,0,0]]],[[[0,0,0]]],[[[0,0,0]]]]
var	PlanetPeriodicTerms	=
[EmptyPeriodicTerms
,EmptyPeriodicTerms
,EmptyPeriodicTerms
,EmptyPeriodicTerms
,EmptyPeriodicTerms
,EmptyPeriodicTerms
,EmptyPeriodicTerms
,EmptyPeriodicTerms
,EmptyPeriodicTerms
]
var	planetMercury	= 0
var	planetVenus	= 1
var	planetEarth	= 2
var	planetMars	= 3
var	planetJupiter	= 4
var	planetSaturn	= 5
var	planetUranus	= 6
var	planetNeptune	= 7
var	planetPluto	= 8
var magnitudeTable	=
[[-0.42	,0.0380,-273e-6,  2e-6]
,[-4.40	,0.0009, 239e-6,-65e-8]
,[ 0]
,[-1.52	,0.016]
,[-9.40	,0.005]
,[-8.88]
,[-7.19]
,[-6.87]
,[-1.00]
]
