/*
 JavaScript Sun Calculator
© 2001 Juergen Giesen
http://www.jgiesen.de
*/

var dat, myDay, myMonth, myYear, myHour, myMinute; // UT
var lat, longit, offset, locOffset;
var UTRISE, UTSET;
	

function frac(X) {
	X = X - Math.floor(X);
	if (X<0) X = X + 1.0;
	return X;		
}


function sunDecRA (what, jd) {
	var PI2 = 2.0*Math.PI;
	var cos_eps = 0.917482;
	var sin_eps = 0.397778;
	var M, DL, L, SL, X, Y, Z, R;
	var T, dec, ra;
	T = (jd - 2451545.0) / 36525.0;	// number of Julian centuries since Jan 1, 2000, 0 GMT
	M = PI2*frac(0.993133 + 99.997361*T);
	DL = 6893.0*Math.sin(M) + 72.0*Math.sin(2.0*M);
	L = PI2*frac(0.7859453 + M/PI2 + (6191.2*T+DL)/1296000);
	SL = Math.sin(L);
	X = Math.cos(L);
	Y = cos_eps*SL;
	Z = sin_eps*SL;
	R = Math.sqrt(1.0-Z*Z);
	dec = (360.0/PI2)*Math.atan(Z/R);
	ra = (48.0/PI2)*Math.atan(Y/(X+R));
	if (ra<0) ra = ra + 24.0;
	if (what==1) return dec; else return ra;
}


function riseset(DATE, MONTH, YEAR, HOUR) {
	var K = Math.PI/180.0;
	var sh = Math.sin(-K*0.8333);
	var jd=JulDay (DATE, MONTH, YEAR, HOUR);
	var dec = sunDecRA(1,jd);
	var ra = sunDecRA(2,jd);
	var gha = computeGHA (DATE, MONTH, YEAR, HOUR);
	Y0 = Math.sin(K*computeHeight(dec, lat, longit, gha)) - sh;
	var jdPlus = JulDay(DATE, MONTH, YEAR, HOUR+1.0);
	dec = sunDecRA(1,jdPlus);
	ra = sunDecRA(2,jdPlus);
	gha = computeGHA (DATE, MONTH, YEAR, HOUR+1.0);
	yPlus = Math.sin(K*computeHeight(dec, lat, longit, gha)) - sh;
	var jdMinus = JulDay(DATE, MONTH, YEAR, HOUR-1.0);
	dec = sunDecRA(1,jdMinus);
	ra = sunDecRA(2,jdMinus);
	gha = computeGHA (DATE, MONTH, YEAR, HOUR-1.0);
	yMinus = Math.sin(K*computeHeight(dec, lat, longit, gha)) - sh;
	QUAD(yMinus,yPlus);
	switch (NZ)
	{
		case 0: break;
		case 1:		
			if (yMinus<0.0) {
				UTRISE = HOUR+zero1;
			}
			else {
				UTSET = HOUR+zero1;
			}
			break;		
		case 2:		
			if (YE<0.0) {
				UTRISE = HOUR+zero2;
				UTSET=HOUR+zero1;
			}
			else {
				UTRISE = HOUR+zero1;
				UTSET=HOUR+zero2;
			}
			break;					
	}		
}

function QUAD(yMinus,yPlus){
	NZ = 0;								
	var XE;
	var A = 0.5*(yMinus+yPlus) - Y0;
	var B = 0.5*(yPlus-yMinus);
	var C = Y0;
	XE = -B/(2.0*A);
	YE = (A*XE+B)*XE + C;
	var DIS = B*B - 4.0*A*C;				// FORMULA ?
	if (DIS>=0) {
		DX = 0.5*Math.sqrt(DIS)/Math.abs(A);
		zero1 = XE - DX;
		zero2 = XE + DX;
		if (Math.abs(zero1)<=1.0) NZ = NZ + 1;
		if (Math.abs(zero2)<=1.0) NZ = NZ + 1;
		if (zero1<-1.0) zero1=zero2;
	}
}

	
	
function HoursMinutes(time) {
	var min=Math.round(60*(time-Math.floor(time)));
	var hmstr;
	if (min>=10) hmstr=Math.floor(time)+":"+min;
	else  hmstr=Math.floor(time)+":0"+min;
	if (min==60) hmstr=Math.floor(time+1)+":00";
	return hmstr;
}
	

function computeHeight(dec, latitude, longit, gha) {	
	var K = Math.PI/180.0;
	var lat_K = latitude*K;
	var dec_K = dec*K;
	var x=Number(gha)+Number(longit);
	sinHeight = Math.sin(dec_K)*Math.sin(lat_K) + Math.cos(dec_K)*Math.cos(lat_K)*Math.cos(K*x);	
	return Math.asin(sinHeight)/K;
}

function computeGHA (T, M, J, STD) {	
	var K = Math.PI/180.0, N, X, XX, P;		
	N = 365 * J + T + 31 * M - 46;		 
	if (M<3) N = N + Math.floor((J-1)/4);
	else N = N - Math.floor(0.4*M + 2.3) + Math.floor(J/4);			 
	P = STD/24.0;
	X = (P + N - 7.22449E5) * 0.98564734 + 279.306;
	X = X * K;
	XX = -104.55 * Math.sin(X) - 429.266 * Math.cos(X) + 595.63 * Math.sin(2.0 * X) - 2.283 * Math.cos(2.0 * X);
	XX = XX + 4.6 * Math.sin(3.0 * X) + 18.7333 * Math.cos(3.0 * X);
	XX = XX - 13.2 * Math.sin(4.0 * X) - Math.cos(5.0 * X) - Math.sin(5.0 * X) / 3.0 + 0.5 * Math.sin(6.0 * X) + 0.231;
	XX = XX / 240.0 + 360.0 * (P + 0.5);
	if (XX > 360.0) XX = XX - 360.0;  
	return XX;				
}



	
	
function JulDay (date, month, year, UT){
	if (year<1900) year=year+1900;
	if (month<=2) {
		month=month+12; 
		year=year-1;
	}
	
	B = Math.floor(year/400.0) - Math.floor(year/100.0)  + Math.floor(year/4.0);
	A = 365.0*year - 679004.0;
	var jd = A + B + Math.floor(30.6001*(month+1)) + date + UT/24.0;
	jd = jd + 2400000.5;
	return jd;
}

	
	
	
function SunTimes(opt) {
	dat=new Date();
	myDay=dat.getDate();
	myMonth=dat.getMonth()+1;
	yy=dat.getYear()-1995;
	if (yy<0) {
		yy=yy+1900; 
		myYear=dat.getYear()+1900;
	} else  
	myYear=dat.getYear();
	myHour=dat.getHours();
	myMinute=dat.getMinutes();
	offset=dat.getTimezoneOffset();
	if (offset>=1320) offset=offset-1440;
	locOffset=-offset/60;
//	UT = myHour+(myMinute+offset)/60.0+dat.getSeconds()/3600.0;
	str=myHour+offset/60.0;
	if (myHour+offset/60.0<0)  str= 24+myHour+offset/60.0;
	if (myHour+offset/60.0>=24)  str= -24+myHour+offset/60.0;
	str=" " + str + ":";
	if (myMinute<10) {
		str=str+"0"+myMinute;
	}
	else {
		str=str+myMinute;
	}
	
	lat = "53.06";
	longit = "-1.20";
		
	if (offset>=1320) offset=offset-1440;
	var nn=-2*offset/60;
	if (offset<0) nn=nn-1;

	for (var i=-locOffset; i<-locOffset+24; i++) { // i=GMT	
		riseset(myDay, myMonth, myYear, i);
	}
		
	hRise1=UTRISE + locOffset;
	if (hRise1>24) hRise1-=24;
	if (hRise1<0) hRise1+=24;

	hSet1=UTSET + locOffset;
	if (hSet1>24) hSet1-=24;
	if (hSet1<0) hSet1+=24;

	sunrise=HoursMinutes(hRise1);
	sunset=HoursMinutes(hSet1);
	//lengthOfDay=hSet1-hRise1;
	lengthOfDay=HoursMinutes(hSet1-hRise1);
		
	//lengthOfDay=Math.round(100*lengthOfDay)/100;
	if (opt == "rise") {
		document.write(sunrise);
	} else
	if (opt == "set") {
		document.write(sunset);
	}
	else if (opt == "day") {
		document.write(lengthOfDay);
	}
	else {
		document.write("Error");
	}
	
}
	
	
	
