
function CurrentJulianDate ( offset )
{
	var fDay, fDate;
	var today = new Date();
//    today.setDate(today.getHour()+ offset)

	var iYear   = today.getUTCFullYear();
	var iMonth  = today.getUTCMonth()+1;
	var iDay    = today.getUTCDate();
	var iHour   = today.getUTCHours() + offset;
	var iMinute = today.getUTCMinutes();
	var iSecond = today.getUTCSeconds();
//	var iMilliseconds = today.getUTCMilliseconds();
	
	var iEpocheYear = EpocheYear(iYear) * 1000; // 1999 to 99000 and 2032 to 32000.
	var iDayOfYear = DayOfYear(iYear, iMonth, iDay);
	var fFraction = FractionOfDay(iHour, iMinute, iSecond);
	
	fDate = iEpocheYear + iDayOfYear + fFraction;
	fDay = JulianDate(fDate);

	return fDay;	// The current JulianDate ...
}

function JulianDate ( st )
// Astronomical Formulae for Calculators, Jean Meeus, pages 23-25
// Calculate Julian Date of 0.0 Jan year
{
// input like : 99200.27104438 => 1999, 200.27104438 days.
/*	double dYear;
	int iYear = (int)(st/1000.0);
	st -= iYear * 1000;
	if (iYear < 50) iYear +=1999;
	else iYear +=1899;
old time ... */
// Modification to support Y2K }
// Valid 1957 through 2056 }

	var fYear, fDay;
	var iYear = Math.floor(st/1000.0);
	fDay = st - iYear * 1000.0; // = 99200,271 - 99000.0 = 200,271
	if (iYear < 57) iYear += 2000;
	else iYear += 1900;
	fYear = JulianDateOfYear(iYear);
	return fYear + fDay; 
}

function JulianDateOfYear ( yr )
{
	var A,B;
	var iYear = yr - 1;
	var fYear;
	A = Math.floor(iYear/100.0);
	B = 2 - A + Math.floor(A/4.0);
	fYear = Math.floor(365.25 * iYear)
          + 428.0 + 1720994.5 + B;
	return fYear;
}

function EpocheYear ( iYear )
{	// returns 99 for 1999 and 23 for 2023
	var iEpocheYear;
	if (iYear > 2000)
		iEpocheYear = iYear - 2000;
	else 
		iEpocheYear = iYear - 1900;
	return iEpocheYear;
}

function DayOfYear ( yr, mo, dy)
{
	// yr=1999 / mo=12 / dy=24 => 12/24/1999=christmas 1999
	// December is never used since the last Month of a year
	// is added by getting the days from that month.
    var days = new Array (31,28,31,30,31,30,31,31,30,31,30,31);
	var i, iDay;

	iDay = 0;
	for (i=0; i < mo - 1; i++)	// mo-2 because zero based and just add until last month
		iDay += days[i];
	iDay += dy;

	if	(((yr %4) == 0) &&	// every four years
		(((yr %100) != 0) || ((yr %400) == 0)) &&	// but not at centuries other then every 400 years
		(mo > 2)) iDay += 1;		// Schaltjahr ???
	return iDay;
}


function FractionOfDay ( hr, min, sec )
{
	var fFraction;
	fFraction = (60.0*60.0*hr	+ 
				 60.0*min		+
		         sec    )/(24.0*60.0*60.0);
	return fFraction;
}

function CalendarDate ( dJulian )
{
//  { Astronomical Formulae for Calculators, Jean Meeus, pages 26-27 }
    var		month, alpha;
    var	Z,A,B,C,D,E,F;
    var	day,year;
	var	hour, minute, second;	//, milliseconds;

	var dateReturn = new Date();
	Z = Math.floor(dJulian + 0.5);
	F = (dJulian+0.5) - Z;
	if (Z < 2299161)
		A = Z;
	else	{
		alpha = Math.floor((Z - 1867216.25)/36524.25);
		A = Z + 1.0 + alpha - Math.floor(alpha/4);
	}
	B   = A + 1524.0;
	C = Math.floor((B - 122.1)/365.25);
	D = Math.floor(365.25 * C);
	E = Math.floor((B - D)/30.6001);
	day = B - D - Math.floor(30.6001 * E) + F;
	
	if (E < 13.5)	month = Math.round(E - 1.0);
	else			month = Math.round(E - 13.0);
	if (month > 2.5)year  = C - 4716.0;
	else			year  = C - 4715.0;

	Z = Math.floor(day);		// A = fraction of day ...
	A = day-Z;
	hour = Math.floor(A*24.0);
	A = A*24.0 - hour;
	minute = Math.floor(A*60.0);
	A = A*60.0 - minute;
 	second = Math.floor(A*60.0);

	dateReturn.setYear(year);
	dateReturn.setUTCMonth(month-1); // zero based and not one based ...
	dateReturn.setUTCDate(day);
	dateReturn.setUTCHours(hour);
	dateReturn.setUTCMinutes(minute);
	dateReturn.setUTCSeconds(++second);
	
	return dateReturn;
}

function SideralTime( jd )
{
// Reference:  The 1992 Astronomical Almanac, page B6.
	var modulo;
	var UT,TU,GMST;
	TU	= Math.floor(jd + 0.5);
	UT	= (jd+0.5) - TU;
//	UT   = modf(jd + 0.5, &TU);

	jd   -= UT;
	TU   = (jd - 2451545.0)/36525.0;
	GMST = 24110.54841 + TU * (8640184.812866 + TU * (0.093104 - TU * 6.2E-6));
	GMST = (GMST + m_secday*m_omega_E*UT);	//%secday;

	module = Math.floor (GMST/m_secday);
	modulo = GMST - modulo* m_secday;
	if (modulo < 0.0)
		modulo += m_secday;
	return m_PI * 2.0 * modulo/m_secday;
}

function ThetaG( jd )
{
// Reference:  The 1992 Astronomical Almanac, page B6. 
	var	UT,TU,GMST, tmp;
	tmp	= Math.floor(jd + 0.5);
	UT = (jd + 0.5) - tmp;
	jd	= tmp;
	
	TU	= (jd - 2451545.0)/36525.0;
	
	GMST	= 24110.54841 + TU * (8640184.812866 + TU * (0.093104 - TU * 6.2E-6));
	GMST	= Modulus(GMST + m_secday*m_omega_E*UT,m_secday);
	return (2.0*m_PI*GMST/m_secday);
}





