// Datei Date.js

// Daten von Gersthofen
var geoLaenge =  10.883; // Sternwarte Überlingen: 9.16217;	
var geoBreite =  48.417; // Sternwarte Überlingen: 47.76967; 

var GreenwichLaenge = 0;
var GreenwichBreite = 51.4772;

// Daten des Benutzers
var UserGeoLaenge = geoLaenge;
var UserGeoBreite = geoBreite;
var strUserName = "User";

var DayName = new Array(7);
DayName[0]="Sonntag";
DayName[1]="Montag";
DayName[2]="Dienstag";
DayName[3]="Mittwoch";
DayName[4]="Donnerstag";
DayName[5]="Freitag";
DayName[6]="Samstag";

var MonthName = new Array(12);
MonthName[0]="Januar";
MonthName[1]="Februar";
MonthName[2]="März";
MonthName[3]="April";
MonthName[4]="Mai";
MonthName[5]="Juni";
MonthName[6]="Juli";
MonthName[7]="August";
MonthName[8]="September";
MonthName[9]="Oktober";
MonthName[10]="November";
MonthName[11]="Dezember";

var UTCDayName = new Array(7);
UTCDayName[0]="Son";
UTCDayName[1]="Mon";
UTCDayName[2]="Tue";
UTCDayName[3]="Wed";
UTCDayName[4]="Thu";
UTCDayName[5]="Fri";
UTCDayName[6]="Sat";

var UTCMonthName = new Array(12);
UTCMonthName[0]="Jan";
UTCMonthName[1]="Feb";
UTCMonthName[2]="Mar";
UTCMonthName[3]="Apr";
UTCMonthName[4]="May";
UTCMonthName[5]="Jun";
UTCMonthName[6]="Jul";
UTCMonthName[7]="Aug";
UTCMonthName[8]="Sep";
UTCMonthName[9]="Oct";
UTCMonthName[10]="Nov";
UTCMonthName[11]="Dec";

function SetUserData(Laenge, Breite, Name) {
	UserGeoLaenge = Laenge;
	UserGeoBreite = Breite;
	strUserName = Name;
	}

function IsLeap(Year) {
	return ((((Year % 4) == 0) && ((Year % 100) != 0)) || ((Year % 400) == 0)); 
	}

function Get_DayNumber(Datum) {
	var jahr, monat, tag
	jahr = Datum.getFullYear();
	monat = Datum.getMonth()+1;
	tag = Datum.getDate();
	a = Math.floor((monat+10)/13);
	// alert(a);   /* 0 for Jan and Feb, 1 for March through December */
	b = tag + Math.floor((611*(monat+2))/20) - 2*a -91;
	return b + IsLeap(jahr)*a;
	}

function Get_UTCDayNumber(Datum) {
	var jahr, monat, tag
	jahr = Datum.getUTCFullYear();
	monat = Datum.getUTCMonth()+1;
	tag = Datum.getUTCDate();
	a = Math.floor((monat+10)/13);
	// alert(a);   /* 0 for Jan and Feb, 1 for March through December */
	b = tag + Math.floor((611*(monat+2))/20) - 2*a -91;
	return b + IsLeap(jahr)*a;
	}


function Get_WeekDay(Datum) {
	// 0=sunday
	var jahr, monat, tag, j, c, n
	jahr = Datum.getFullYear();
	monat = Datum.getMonth()+1;
	tag = Datum.getDate();
	j = (jahr - 1) % 100;
	c = Math.floor((jahr - 1) / 100);
	n = Get_DayNumber(Datum);
	return (28 + j + n + Math.floor(j/4) + Math.floor(c/4) + 5*c) % 7;
	}

function Get_UTCWeekDay(Datum) {
	// 0=sunday
	var jahr, monat, tag, j, c, n
	jahr = Datum.getUTCFullYear();
	monat = Datum.getUTCMonth()+1;
	tag = Datum.getUTCDate();
	j = (jahr - 1) % 100;
	c = Math.floor((jahr - 1) / 100);
	n = Get_UTCDayNumber(Datum);
	return (28 + j + n + Math.floor(j/4) + Math.floor(c/4) + 5*c) % 7;
	}


function Get_WeekNumber (y,m,d) {
	var jahr, monat, tag
	var a
	a =  Math.floor((((weekday(y,1,1) + 2) % 7) + 3 + daynumber(y,m,d)) / 7 );
	if (a==0) {
		jahr = parseInt(y);
		a = weeknumber(jahr-1,12,31)
		}
	else if  ((a==53) & ((weekday(y,12,31) % 7) <= 3)) {
			a = 1
			}
		return a;
	}


function IsSummerTime(Datum){
	var Month = Datum.getUTCMonth();
	var Day = Datum.getUTCDate();
	var DayOfWeek = Get_UTCWeekDay(Datum);
	var Hour = Datum.getUTCHours();
	var nToSunday = 0;
	var nInMonth = 0;
	
	if (Month < 2  ||  Month > 9)
		return false; // Winter
		
	if (Month > 2  && Month < 9)
		return true;	// Summer
		
	if (Month == 2) {
		if (Day <= 24 )
			return false; // Winter
		else {
			nToSunday = (7 - DayOfWeek) % 7;
			if (nToSunday == 0){
				if (Hour < 1)
					return false;
				else 
					return true;
			}
			nInMonth = 31-Day;
			if (nToSunday >= nInMonth)
				return true; // Summer
			else
				return false; // still Winter
		}
	}	// end month==2

	if (Month == 9) {
		if (Day <= 24 )
			return true; // Summer
		else {
			nToSunday = (7 - DayOfWeek) % 7;
			if (nToSunday == 0){
				if (Hour < 1)
					return true;
				else 
					return false;
			}
			nInMonth = 31-Day;
			if (nToSunday >= nInMonth)
				return false; // Winter
			else
				return true; // still Summer
		}
	}	// end month==2
}



function ty(yyyy,mm,dd) {
	var jahr, monat, tag;
	jahr = parseInt(yyyy);
	monat = parseInt(mm)+1;
	tag = parseInt(dd);
	}

function Get_JD0(Datum) {
// liefert das julianische Datum um 0Uhr UT
// month beginnt bei 0!!
	var jahr, monat, tag;
	jahr = Datum.getUTCFullYear();
	monat = Datum.getUTCMonth() + 1; // mm von 0..11
	tag = Datum.getUTCDate();
	if (monat > 2) {
		monat = monat -3
	} 
	else {
		monat = monat +9;
		jahr = jahr -1
	}
	tag = tag + Math.floor((153*monat+2)/5);
	c = Math.floor((146097*Math.floor(jahr / 100))/4);
	y = Math.floor((1461*(jahr % 100))/4);
	JD0 =  c + y + tag + 1721119 - 0.5;
	return JD0;
	}

function Get_JD(Datum) {
	var jd = Get_JD0(Datum) + Datum.getUTCHours()/24 + Datum.getUTCMinutes()/24/60 + Datum.getUTCSeconds()/24/3600;
	return Math.round(jd*1e5)/1e5;
}

function Get_MJD0(Datum) {
	var jd0 = Get_JD(Datum);
	return (jd0 - 2400000.5);
}

function Get_MJD(Datum){
	var mjd = Get_MJD0(Datum) + Datum.getUTCHours()/24 + Datum.getUTCMinutes()/24/60 + Datum.GetUTCSecons()/24/3600;
	return Math.round(mjd*1e5)/1e5;
}

function ToDateString(Datum){
	var Str="";
	var Year = Datum.getFullYear();
	var Month = Datum.getMonth();
	var Day = Datum.getDate();
	var DayOfWeek = Datum.getDay();
	Str = DayName[DayOfWeek]+", "+Day+". "+MonthName[Month]+" " +Year;
	return Str;
}

function ToTimeString(Datum){
	var Str='';
	var Hour = Datum.getHours();
	var Min = Datum.getMinutes();
	var Sec = Datum.getSeconds();
	if(Hour <10) Str += "0";
	Str += Hour+":";
	if(Min<10) Str+="0";
	Str+=Min+":";
	if(Sec<10)Str+="0";
	Str+=Sec;
	return Str;
}

function ToUTCDateString(Datum){
	var Str="";
	var Year = Datum.getUTCFullYear();
	var Month = Datum.getUTCMonth();
	var Day = Datum.getUTCDate();
	var DayOfWeek = Datum.getUTCDay();
	Str = UTCDayName[DayOfWeek]+" "+Day+" "+UTCMonthName[Month]+" " +Year;
	return Str;
}

function ToUTCTimeString(Datum){
	var Str='';
	var Hour = Datum.getUTCHours();
	var Min = Datum.getUTCMinutes();
	var Sec = Datum.getUTCSeconds();
	if(Hour <10) Str += "0";
	Str += Hour+":";
	if(Min<10) Str+="0";
	Str+=Min+":";
	if(Sec<10)Str+="0";
	Str+=Sec;
	return Str;
}

function ToGradMinSec(Value){
	var Str="";
	var G = 0;
	if (Value<0){
		Str +="-";
		G = -Value;
		}
	else
		G = Value;
	var m = (G - Math.floor(G))*60;
	var s = (m - Math.floor(m))*60;
	if (G < 10)
		Str += "0";
	Str += Math.floor(G) + "°";
	if (m < 10)
		Str += "0";
	Str += Math.floor(m) + "'";
	if (s < 10)
		Str += "0";
	Str += Math.floor(s) + "'' ";
	return Str;
}
 
function ToHourMinSec(Value){
	var Str="";
	var h = 0;
	if (Value<0){
		Str +="-";
		h = -Value;
		}
	else
		h = Value;
	var m = (h - Math.floor(h))*60;
	var s = (m - Math.floor(m))*60;
	if (h < 10)
		Str += "0";
	Str += Math.floor(h) + "h ";
	if (m < 10)
		Str += "0";
	Str += Math.floor(m) + "m ";
	if (s < 10)
		Str += "0";
	Str += Math.floor(s) + "s ";
	return Str;
}

function GetTimeString(Time) {
// Time in Dezimal-Stunden
	var Str="";
	var h = Time;
	var m = (h - Math.floor(h))*60;
	var s = (m - Math.floor(m))*60;
	if (h < 10)
		Str += "0";
	Str += Math.floor(h) + ":";
	if (m < 10)
		Str += "0";
	Str += Math.floor(m) + ":";
	if (s < 10)
		Str += "0";
	Str += Math.floor(s) + " ";
	return Str;
}

function GetTimeStringSmall(Time) {
// Time in Dezimal-Stunden
	var Str="";
	var h = Time;
	var m = Math.round((h - Math.floor(h))*60);
	if (h < 10)
		Str += "0";
	Str += Math.floor(h) + ":";
	if (m < 10)
		Str += "0";
	Str += m;
	return Str;
}

function Get_GMST(Datum) {
// Sternzeit für Greenwich (General Mean Siderial Time); all times in UTC
/*
	Am 1.1.2000 0:00 UT beträgt die Sternzeit 6.664444444 = 6h39'53"; JD = 2451544.5
*/
	var JD0 = Get_JD0(Datum);
	var fac = 1.00273790935; // Ein normaler Tag ist um Faktor 'fac' länger als ein Sterntag
	var NumDays = (JD0 - 2451544.5);	
	var t = Datum.getUTCHours() + Datum.getUTCMinutes()/60 + Datum.getUTCSeconds()/3600;
	var Phi0 = 6.664444444 + 24*fac*NumDays;	// um 0:00 UT
	var Phi = Phi0 + fac*t;					// um h:m:s UT
	var zeit = Phi % 24; // Modulo 24
	return zeit;	
}

function Get_UMST(Datum) {
// Sternzeit für die Userdaten (User Mean Siderial Time); all times in UTC
/*
	Am 1.1.2000 0:00 UT beträgt die Sternzeit 6.664444444 = 6h39'53"; JD = 2451544.5
*/
	var JD0 = Get_JD0(Datum);
	var fac = 1.00273790935; // Ein normaler Tag ist um Faktor 'fac' länger als ein Sterntag
	var NumDays = (JD0 - 2451544.5);	
	var t = Datum.getUTCHours() + Datum.getUTCMinutes()/60 + Datum.getUTCSeconds()/3600;
	var Phi0 = 6.664444444 + 24*fac*NumDays;	// um 0:00 UT
	var Phi = Phi0 + fac*t + UserGeoLaenge/15;					// um h:m:s UT
	var zeit = Phi % 24; // Modulo 24
	return zeit;	
}


function Get_MST(JD,Laenge){
	var fac = 1.00273790935; // Ein normaler Tag ist um Faktor 'fac' länger als ein Sterntag
	var NumDays = (JD - 2451544.5);	
	var Phi = 6.664444444 + 24*fac*NumDays + Laenge/15;
	var zeit = Phi % 24; // Modulo 24
	return zeit;	
}

function Get_LMST(Datum) {
// Sternzeit lokal (Local Mean Siderial Time); all times in UTC
/*
	Am 1.1.2000 0:00 UT beträgt die Sternzeit 6.664444444 = 6h39'53"; JD = 2451544.5
*/
	var JD0 = Get_JD0(Datum);
	var fac = 1.00273790935; // Ein normaler Tag ist um Faktor 'fac' länger als ein Sterntag
	var NumDays = (JD0 - 2451544.5);	
	var t = Datum.getUTCHours() + Datum.getUTCMinutes()/60 + Datum.getUTCSeconds()/3600;
	var Phi0 = 6.664444444 + 24*fac*NumDays;	// um 0:00 UT
	var Phi = Phi0 + fac*t + geoLaenge/15;					// um h:m:s UT
	var zeit = Phi % 24; // Modulo 24
	return zeit;	
}


function Get_Zeitgleichung(DayOfYear)
{
	// aus: http://lexikon.astroinfo.org/zeitgleichung/
	// Berechnung in Stunden
	var ZGL = -0.1752*Math.sin(0.033430 * DayOfYear + 0.5474) - 0.1340*Math.sin(0.018234*DayOfYear - 0.1939); // in Tagen
	return (Math.round(ZGL*60*10)/10);
}

