// Script per il calcolo delle effemeridi di Sole

var gradi  = 180/Math.PI;
var rad =  1/gradi;
var AlfaSole
var DeltaSole
var hsorge
var htram

function DataOggi()
	{
	var oggi= new Date()		
	var s=oggi.getDay()
	var g=oggi.getDate()		
	var m=1+oggi.getMonth()		
	var a=oggi.getYear()
	var browser=navigator.appName;
	if (browser=="Netscape") {a=a+1900}
	var gS
	var ms
	var DataCompleta
	if (s==0){gS="Domenica"}
	if (s==1){gS="Lunedi"}
	if (s==2){gS="Martedi"}
	if (s==3){gS="Mercoledi"}
	if (s==4){gS="Giovedi"}
	if (s==5){gS="Venerdi"}
	if (s==6){gS="Sabato"}

	if (m==1){ms="Gennaio"}
	if (m==2){ms="Febbraio"}
	if (m==3){ms="Marzo"}
	if (m==4){ms="Aprile"}
	if (m==5){ms="Maggio"}
	if (m==6){ms="Giugno"}
	if (m==7){ms="Luglio"}
	if (m==8){ms="Agosto"}
	if (m==9){ms="Settembre"}
	if (m==10){ms="Ottobre"}
	if (m==11){ms="Novembre"}
	if (m==12){ms="Dicembre"}

	DataCompleta=gS+" "+g+" "+ms+" "+a
return DataCompleta
}

function ultimoaggiornamento()
{
	var data=document.lastModified;
	var gg=data.substring(3,5)
	var mm=data.substring(0,2)
	var aaaa=data.substring(6,10)
	var datagg
	datagg="Ultimo aggiornamento: "+gg+"/"+mm+"/"+aaaa
return datagg
}

function AngoloGiro(a)
{
	var Ag
	var Sgn
	if (a<0) {Sgn=-1} else {Sgn=1}
	var I=Math.floor(Math.abs(a))
	var F=Math.abs(a)-I
	var R=I%360
	if (Sgn>0) {Ag=R+F} else {Ag=360-(R+F)} 
return Ag
}

function FormatGPS(grd)
{
	var Sgn
	if (grd<0) {Sgn="-"} else {Sgn="+"}
	var ang=Math.abs(grd)
	var g=Math.floor(ang)
	var p=Math.floor((ang-g)*60)
	var s=Math.floor(ang*3600-g*3600-p*60)
	var formato=Sgn+g+"°"+p+"'"+s+"\""
return formato
}

function FormatHMS(grd)
{
	var Sgn
	if (grd<0) {Sgn="-"} else {Sgn="+"}
	var ang=Math.abs(grd)
	var g=Math.floor(ang)
	var p=Math.floor((ang-g)*60)
	var s=Math.floor(ang*3600-g*3600-p*60)
	var formato=Sgn+g+"h"+p+"m"+s+"s"
return formato
}

function FormatHM(grd)
{
var ps=""
var gs=""
	var ang=Math.abs(grd)
	var g=Math.floor(ang)
	var p=Math.floor((ang-g)*60+0.5)
	if (p==60) {p=0
		    g=g+1
		   } 
	if (p<10) {ps="0"+p} else {ps=p}
	if (g<10) {gs="0"+g} else {gs=g}
	var formato=gs+":"+ps
return formato
}

function GiornoGiuliano(g,m,a,h,mn,s)
{
	var y
	var mm
	var x
	var b
	var ora_dec=(h+mn/60+s/3600)/24
	var g_dec=g+ora_dec
	var JulD
	if (m<=2) {
		y=a-1
		mm=m+12
		}
	else {
		y=a
		mm=m
		}
	x=Math.floor(y/100)
	b=2-x+Math.floor(x/4)
	JulD=Math.floor(365.25*(y+4716))+Math.floor(30.6*(mm+1))+g_dec+b-1524.5
return JulD
}

function SecoloGiuliano(JD)
{
	var T
	T=(JD-2415020.0)/36525
return T
}

function Keplero(ec,M)
{
	var Conv
	var ecg=ec*gradi
	var Eapp=M
	for (var i=1; i<=20; i++)
		{
		Conv=Eapp					
		var Temp=Eapp+((M+ecg*Math.sin(Eapp*rad)-Eapp)/(1-ec*Math.cos(Eapp*rad)))
		Eapp=Temp
		if (Math.abs(Conv-Eapp)<0.000001) {break}
	}
return Eapp 
}

function AnomVera(ecc,Anecc)
{
	var a=Math.sqrt((1+ecc)/(1-ecc))
	var b=Math.tan((Anecc/2)*rad)
	var c=(2*Math.atan(a*b))*gradi
	var AnV=AngoloGiro(c)
return AnV
}

function Nutazione(T,Deps,Dpsi)
{
	var T2=T*T
	var L=rad*(AngoloGiro(279.6967+36000.7689*T+0.000303*T2))
	var L1=rad*(AngoloGiro(270.4342+481267.8831*T-0.001133*T2))
	var M=rad*(AngoloGiro(358.4758+359999.0498*T-0.000150*T2))
	var M1=rad*(AngoloGiro(296.1046+477198.8491*T+0.009192*T2))
	var omega=rad*(AngoloGiro(259.1833-1934.1420*T+0.002078*T2))
	var P1=-(17.2327+0.01737*T)*Math.sin(omega)-(1.2729+0.00013*T)*Math.sin(2*L)
	var P2=0.2088*Math.sin(2*omega)-0.2037*Math.sin(2*L1)+(0.1261-0.00031*T)*Math.sin(M)
	var P3=0.0675*Math.sin(M1)-(0.0497-0.00012*T)*Math.sin(2*L+M)-0.0342*Math.sin(2*L1-omega)
	var P4=-0.0261*Math.sin(2*L1+M1)+0.0214*Math.sin(2*L-M)-0.0149*Math.sin(2*L-2*L1+M)
	var P5=0.0124*Math.sin(2*L-omega)+0.0114*Math.sin(2*L1-M1)
	    Dpsi=(P1+P2+P3+P4+P5)/3600
	var P1=(9.21+0.00091*T)*Math.cos(omega)+(0.5522-0.00029*T)*Math.cos(2*L)
	var P2=-0.0904*Math.cos(2*omega)+0.0884*Math.cos(2*L1)+0.0216*Math.cos(2*L+M)
	var P3=0.0183*Math.cos(2*L1-omega)+0.0113*Math.cos(2*L1+M1)-0.0093*Math.cos(2*L-M)-0.0066*Math.cos(2*L-omega)
	    Deps=(P1+P2+P3)/3600
}

function TempoSidereo1(g,ms,a,h,mn,s)
{
	var JD=GiornoGiuliano(g,ms,a,0,0,0)
	var T=SecoloGiuliano(JD)
	var T2=T*T
	var T3=T2*T
	var Deps=""
	var Dpsi=""
	Nutazione(T)
	var eps=23.452294-0.0130125*T-0.00000164*T2+0.000000503*T3
	var epsc=(eps+Deps)*rad
	var Ts=Math.floor(0.276919398+100.0021359*T+0.000001075*T2)*24
	var oradec=h+mn/60+s/3600
	    Ts=(Ts+oradec*1.002737908)*15
	    Ts=AngoloGiro(Ts+(Dpsi*Math.cos(epsc))/15)
return Ts
}

function TempoSidereo(g,ms,a,h,mn,s)
{
	var JD=GiornoGiuliano(g,ms,a,h,mn,s)
	var T=(JD-2451545.0)/36525
	var T2=T*T
	var T3=T2*T
	var Ts=280.46061837+360.98564736629*(JD-2451545.0)+0.000387933*T2-T3/38710000
	var Deps=""
	var Dpsi=""
	    Nutazione(T,Deps,Dpsi)
	var eps=23.43929111-0.0130042*T-0.00000164*T2+0.000000503*T3
	var epsc=(eps+Deps)*rad
	    Ts=AngoloGiro(Ts+(Dpsi*Math.cos(epsc))/15)
	    Ts=Ts+360
	    Ts=AngoloGiro(Ts)	
return Ts
}

function EquazTM(T)
{
	var T2=T*T
	var T3=T2*T
	var L=rad*(AngoloGiro(279.69668+36000.76892*T+0.0003025*T2))
	var M=rad*(AngoloGiro(358.47583+35999.04975*T-0.000150*T2-0.0000033*T3))
	var e=0.01675104-0.0000418*T-0.000000126*T2
	var eps=rad*(23.452294-0.0130125*T-0.00000164*T2+0.000000503*T3)
	var y=Math.tan(eps/2)*Math.tan(eps/2)
	var EQTM=y*Math.sin(2*L)-2*e*Math.sin(M)+4*e*Math.sin(M)*Math.cos(2*L)*y
	    EQTM=EQTM-0.5*(y*y)*Math.sin(4*L)-(5/4)*(e*e)*Math.sin(2*M)
	    EQTM=EQTM*4*gradi
return EQTM
}

function AltezzaAzimuth(Lat,Decl,TA)
{	
	TA=TA+360
	TA=AngoloGiro(TA)
	if (TA<180) {AP=TA} else {AP=360-TA}
 	var D=Math.sin(rad*Lat)*Math.sin(rad*Decl)+Math.cos(rad*Lat)*Math.cos(rad*Decl)*Math.cos(rad*AP)
	Alt=gradi*Math.asin(D)
	var D=(Math.sin(rad*Decl)-Math.sin(rad*Lat)*Math.sin(rad*Alt))/(Math.cos(rad*Lat)*Math.cos(rad*Alt))
	Az=gradi*Math.acos(D)
	if (TA<180) {Az=360-Math.abs(Az)}
}

function EffemeridiSole(T)
{
	var T2=T*T
	var T3=T2*T
	var L=AngoloGiro(279.69668+36000.76892*T+0.0003025*T2)
	var M=AngoloGiro(358.47583+35999.04975*T-0.000150*T2-0.0000033*T3)
	var e=0.01675104-0.0000418*T-0.000000126*T2
	var AnEcc=Keplero(e,M)
	var AnV=AnomVera(e,AnEcc)
	var c1=rad*(153.23+22518.7541*T)
	var c2=rad*(216.57+45037.5082*T)
	var c3=rad*(312.69+32964.3577*T)
	var c4=rad*(350.74+445267.1142*T-0.00144*T2)
	var c5=rad*(231.19+20.20*T)
	var c6=rad*(353.40+65928.7155*T)
	var cl=0.00134*Math.cos(c1)+0.00154*Math.cos(c2)+0.00200*Math.cos(c3)+0.00179*Math.sin(c4)+0.00178*Math.sin(c5)
	var cr=0.00000543*Math.sin(c1)+0.00001575*Math.sin(c2)+0.00001627*Math.sin(c3)+0.00003076*Math.cos(c4)+0.00000927*Math.sin(c6)
	var LV=L+AnV-M+cl
	var RV=1.0000002*(1-e*Math.cos(rad*AnEcc))+cr
	var Deps=""
	var Dpsi=""
	Nutazione(T,Deps,Dpsi)
	var Lapp=LV-0.00569+Dpsi
	var eps=23.452294-0.0130125*T-0.00000164*T2+0.000000503*T3
	var epsc=eps+Deps
	    DeltaSole=gradi*(Math.asin(Math.sin(rad*eps)*Math.sin(rad*Lapp)))
	var N=Math.cos(rad*eps)*Math.sin(rad*Lapp)
	var D=Math.cos(rad*Lapp)
	    AlfaSole=gradi*(Math.atan2(N,D))
	if (AlfaSole<0) {AlfaSole=AlfaSole+360}
}

function TransitoSole(g,ms,a,Lat,Long)
{
	var T=SecoloGiuliano(GiornoGiuliano(g,ms,a,0,0,0))
	var EOT=""
	for (var i=1; i<=4; i++)
		{
		    EOT=EquazTM(T)/60
		var tv=0
		var tm=AngoloGiro(tv+180)/15-EOT
		var TMG=tm-Long/15
		var nore=Math.floor(TMG)
		var nmin=Math.floor((TMG-nore)*60)
		var nsec=Math.floor((((TMG-nore)*60)-nmin)*60)
		    T=SecoloGiuliano(GiornoGiuliano(g,ms,a,nore,nmin,nsec))
	}
return tm	
}

function SorgeSole(g,ms,a,Lat,Long)
{
	var T=SecoloGiuliano(GiornoGiuliano(g,ms,a,0,0,0))
	var h0=-0.8333
	var EOT=""
	for (var i=1; i<=4; i++)
		{
	            EffemeridiSole(T)
		    EOT=EquazTM(T)/60
	        var temp=(Math.sin(h0*rad)-Math.sin(Lat*rad)*Math.sin(DeltaSole*rad))/(Math.cos(Lat*rad)*Math.cos(DeltaSole*rad))
	        if (Math.abs(temp)>1) {
				var HS=9999
				}
			else
				{
				var HS=Math.acos(temp)*gradi
				}	
		var tv=360-HS
		var tm=AngoloGiro(tv+180)/15-EOT
		var TMG=tm-Long/15
		var nore=Math.floor(TMG)
		var nmin=Math.floor((TMG-nore)*60)
		var nsec=Math.floor((((TMG-nore)*60)-nmin)*60)
		    T=SecoloGiuliano(GiornoGiuliano(g,ms,a,nore,nmin,nsec))
	}
return tm	
}

function TramSole(g,ms,a,Lat,Long)
{
	var T=SecoloGiuliano(GiornoGiuliano(g,ms,a,0,0,0))
	var h0=-0.8333
	var EOT=""
	for (var i=1; i<=4; i++)
		{
	            EffemeridiSole(T)
		    EOT=EquazTM(T)/60
	        var temp=(Math.sin(h0*rad)-Math.sin(Lat*rad)*Math.sin(DeltaSole*rad))/(Math.cos(Lat*rad)*Math.cos(DeltaSole*rad))
	        if (Math.abs(temp)>1) {
				var HS=9999
				}
			else
				{
				var HS=Math.acos(temp)*gradi
				}	
		var tv=HS
		var tm=AngoloGiro(tv+180)/15-EOT
		var TMG=tm-Long/15
		var nore=Math.floor(TMG)
		var nmin=Math.floor((TMG-nore)*60)
		var nsec=Math.floor((((TMG-nore)*60)-nmin)*60)
		    T=SecoloGiuliano(GiornoGiuliano(g,ms,a,nore,nmin,nsec))
	}
return tm	
}

function Calcola()
{
	var oggi= new Date()		
	var gi=oggi.getDate()		
	var me=oggi.getMonth()+1		
	var an=oggi.getYear()

	var Lat=43.858333
	var Long=10.245
	var fuso=1
	var cf=(fuso*15-Long)*4
	if (me>3 && me<11) {var OraLeg=1} else {var OraLeg=0}

	var hs=SorgeSole(gi,me,an,Lat,Long)
	hsorge=FormatHM(hs+cf/60+OraLeg)

	var hs=TramSole(gi,me,an,Lat,Long)
	htram=FormatHM(hs+cf/60+OraLeg)
}

