var loaded = false;
var SEC_MS = 1000;
var HOUR_MS = 60 * 60 * SEC_MS;
var DAY_MS = 24 * HOUR_MS;
var JD_1970_0 = 2440587.5; // 1970.0 UT was JD 2440587.5;
var SYNODIC_MONTH_DAYS = 29.530589;

function setLoaded ()
{
	loaded = true; 
	writeJD ();
	writeMoon ();
}

function jd ()
{
	var ms1970 = new Date ().getTime (); // ms since 1970.0 UT
	return ms1970 / DAY_MS + JD_1970_0;
}

function writeJD ()
{
	if (loaded)
	{
		var el = document.getElementById ("jd");
		var jdString = jd ().toString ().substr (0, 13); // Only show accurate to nearest s.
		el.innerHTML = '<a href="jd.html">Julian date ' + jdString + '</a>';
		setTimeout ("writeJD ()", SEC_MS);
	}
}

function moonAge ()
{
	var jdNow = jd ();
	return (jdNow - 2455241.61875) % SYNODIC_MONTH_DAYS; // JD of new moon of Feb 2010 % synodic month
}

function moonPhase (age)
{
	var frac = age / SYNODIC_MONTH_DAYS;
	if (frac <  1/16) return "new";
	if (frac <  3/16) return "evening crescent";
	if (frac <  5/16) return "first quarter";
	if (frac <  7/16) return "waxing gibbous";
	if (frac <  9/16) return "full";
	if (frac < 11/16) return "waning gibbous";
	if (frac < 13/16) return "last quarter";
	if (frac < 15/16) return "morning crescent";
	return "new";
}

function writeMoon ()
{
	if (loaded)
	{
		var el = document.getElementById ("moon");
		var age = moonAge ();
		var ageString = age.toString ().substr (0, 4); // Only show accurate to 0.1 day.
		el.innerHTML = 'Moon age ' + ageString + ' days (' + moonPhase (age) + ')';
		setTimeOut ("writeMoon ()", HOUR_MS);
	}
}

