var suncalc_updated var HA_for_calibrated_position,SetLocation var Calibrate_pulsevalue,Calibrate_pulse_per_ha_degree,calibrate_inc_direction,SatNameCurrentIndex var output_angles= new Array() var output_moon_angles= new Array() var autoupdate,SatLon,autoprintupdate autoupdate=0; autoprintupdate=0; suncalc_updated="Calculator script updated 01-05-2008 09:05 UTC
"; html_suncalc_updated="


Updated 01 May 2008
"; //window.setInterval CalculateAngles(),5000 //window.setInterval "update()",1000,JavaScript function printupdate(){ if (autoprintupdate==1) autoprintupdate=0 else autoprintupdate=1; } function update(){ if (autoupdate==0) { window.setInterval("AutoCalculateAngles()", 1000); } else { //window.setInterval("CalculateAngles()", 0); //autoupdate=1; } if (autoupdate==1) autoupdate=0 else autoupdate=1; } function date_and_time(){ date_and_time=Date(); //alert(Date()); } function ShowCredit() { var credittext credittext="First uploaded 05032006 " credittext=credittext+"\nProgrammed by Jens T. Satre" credittext=credittext+"\nScript for sun position calculations" credittext=credittext+"\n0503-2006: First version, Javascript" credittext=credittext+"\n0603-2006: Display Sun Elevation with and without atmospheric refraction" credittext=credittext+"\n0603-2006: Display satellite longitude which gives same azimuth as the sun" credittext=credittext+"\n0110-2006: Added Moon position (Moon elevation accuracy is not good at the moment)" credittext=credittext+"\n0210-2006: Moon elevation(altitude) corrected lunar parallelax(thanks to Paul Schlyter)" credittext=credittext+"\n0210-2006: Display satellite longitude which gives same azimuth as the Moon" credittext=credittext+"\n0410-2006: Small fix: Moon Geometric Elevation and Moon Elevation (atmospheric refraction)" credittext=credittext+"\n0203-2008: Fixes for eccentric anomaly iterations for the moon (higher accuracy)" credittext=credittext+"\n0203-2008: Iterations fix hopefully prevents a problem with script running slow" credittext=credittext+"\n2904-2008: Corrected error in UTC date display(reported by MetService New Zealand)" credittext=credittext+"\n0105-2008: Corrected error in Azimuth for southern hemisphere(reported by MetService New Zealand)" alert(credittext); } function AutoCalculateAngles(){ if (autoupdate==1) { set_todays_date(); CalculateAngles(); if (autoprintupdate==1) printresult(); } } function GetSiteLocationNameFromCookie() { var MyCookieVal var ValArray=new Array(); // //if (Month>=5) Season="Fall" //else //Season="Spring"; MyCookieVal=document.cookie; //alert(MyCookieVal); if (MyCookieVal !== "") // If cookie has value then set users defaults { ValArray=MyCookieVal.split(":"); //' Reads 6 cookie values in to the array Lat=ValArray[0]; LatDir=ValArray[1]; if (LatDir=="South") Lat=-Lat; Lon=ValArray[2]; LonDir=ValArray[3]; if (LonDir=="East") Lon=-Lon else Lon=Lon; // west = positive, Brasil ca. +48 West } else { // set any Lon,Lat 37.77,-122.42 Lat=37.77; Lon=122.42; } return(ValArray[15]); } function getsatelliteposition(InputAzimuth,Lat,Lon){ var X,Y,Z,R,S,p,Azimuth,torad,tograd,SatteliteLon,Ele_vation,Z2,SatLonEastFormat var return_array=new Array(); pi=Math.PI; torad=pi/180; tograd=180/pi; R =6378.14; //' km S =42164.57; //' km //Lat=1*document.Latitude.Degrees.value; //LatDir=document.Latitude.Direction.value; //Lon=1*document.Longitude.Degrees.value; //LonDir=document.Longitude.Direction.value; //if (LatDir=="South") Lat=-Lat; //if (LonDir=="West") Lon=360-Lon; //Azimuth=1*document.Angles.SunAzimuth.value; Azimuth=InputAzimuth; Z=(Lon*pi/180)- Math.atan( Math.tan(Azimuth*pi/180) * Math.sin(Lat*pi/180) ) ; Z= Rev(Z*180/pi); // for southern hemispheare azimuths between 270-360(0) and 0-90 means satellite is visible //if ( ((LatDir=="North") && (Azimuth>90) && (Azimuth<270)) || ( (LatDir=="South") && ( ((Azimuth>0) && (Azimuth<90)) && ((Azimuth>270) && Azimuth<360)) ) ) if ( ((LatDir=="North") && (Azimuth>90) && (Azimuth<270)) || ( (LatDir=="South") && ( ((Azimuth>=0) && (Azimuth<=90)) || ((Azimuth>=270) && Azimuth<=360)) ) ) { if (Z<0){ Z=360-Z; SatteliteLon=formatvalue(Z,5)+"° West*"; SatLon=Z; } if (Z>0){ if (Z>180){ Z=360-Z ;// ' gir lav verdi for vest SatteliteLon=formatvalue(Z,5)+"° West ("+formatvalue((360-Z),3)+"° East)"; SatLon=-Z;// } else { SatteliteLon=formatvalue(Z,5)+"° East"; SatLon=Z; } } // end if Z>0 //Elevation=Elevation2(SatLon,SiteLat,SiteLon,(Height_above_ocean/1000)); //SatelliteElevation=tograd*atn( (COS(Y-Z)*COS(X)-R/S)/SQRT( SIN(Y-Z)*SIN(Y-Z)+ COS(Y-Z)*COS(Y-Z)*SIN(X)*SIN(X) ) ) //document.Output.Satel.value=tograd*Z /* */ } // if latdir="North" etc... else { SatteliteLon="N/A"; } //' if latdir="North" etc... Ele_vation=-99; if (SatLon<0) SatLonEastFormat=360+SatLon else SatLonEastFormat=SatLon; Ele_vation=Elevation2(SatLonEastFormat,Lat,Lon,0); // //alert(SatLonEastFormat+" "+Ele_vation); if (Ele_vation>0){ if (SatteliteLon=="N/A") return_array[0]="Sat Below Horizon"; else return_array[0]=SatteliteLon+"
Sat
Elevation:"+formatnumber(Ele_vation,2)+"°"; return_array[1]=SatLon; } // end if Ele_vation>0 else { SatteliteLon="Sat Below Horizon"; return_array[0]="Sat Below Horizon"; return_array[1]=""; } return(return_array); } function Elevation2(SatLon,SiteLat,SiteLon,Height_over_ocean) { var Rstation,f,r_eq,r_sat,Ra,Rz,alfa_r,alfa_rx,alfa_ry,refraction,alfa_rz,alfa_r_north,alfa_r_zenith,El_geometric,El_observed,Elevation var x,a0,a1,a2,a3,a4 a0=0.58804392; a1=-0.17941557 a2=0.29906946E-1; a3=-0.25187400E-2; a4=0.82622101E-4; f=(1/298.257) ; // Earth flattning factor r_sat=42164.57; // Distance from earth centre to satellite r_eq=6378.14 ; // Earth radius Rstation= r_eq/( Math.sqrt( 1 - f*(2-f)*Math.sin(Radians(SiteLat))*Math.sin(Radians(SiteLat)) ) ) ; Ra= (Rstation+Height_over_ocean)*Math.cos(Radians(SiteLat)) ; Rz= Rstation*(1-f)*(1-f)*Math.sin(Radians(SiteLat)); alfa_r=r_sat-Rstation ; alfa_rx=r_sat*Math.cos(Radians(SatLon-SiteLon)) -Ra ; alfa_ry=r_sat*Math.sin(Radians(SatLon-SiteLon)) ; alfa_rz=-Rz; alfa_r_north=-alfa_rx*Math.sin(Radians(SiteLat)) + alfa_rz*Math.cos(Radians(SiteLat)) ; alfa_r_zenith=alfa_rx*Math.cos(Radians(SiteLat)) +alfa_rz*Math.sin(Radians(SiteLat)) ; El_geometric=Deg(Math.atan2( alfa_r_zenith , Math.sqrt(alfa_r_north*alfa_r_north+alfa_ry*alfa_ry))); x=Math.abs(El_geometric+0.589); refraction=Math.abs(a0+a1*x+a2*x*x+a3*x*x*x +a4*x*x*x*x) ; if (El_geometric>10.2) { El_observed=El_geometric+0.01617*(Math.cos(Radians(Math.abs(El_geometric)))/Math.sin(Radians(Math.abs(El_geometric))) ); } else { El_observed=El_geometric+refraction ; } //if (alfa_r_zenith<-3000) El_observed=-99; return(El_observed); } function CalculateSunMoonAngles() { var d,Day,Month,Year,Hour,Minute,Seconds var Lat,Lon,LatDir,LonDir,SunAltitude,ElevationDifference var ephem_array=new Array(); var ValArray=new Array(); var MonSatLon,SunSatLon,MyCookieVal var MoonSatLonArray=new Array(); var SunSatLonArray=new Array(); var OutputText,SiteLon,SiteLat,OutMoonAzText,OutMoonElText,OutputSunText,OutSunAzText,OutSunElText MyCookieVal=document.cookie; //alert(MyCookieVal); if (MyCookieVal !== "")// If cookie has value then set users defaults { ValArray=MyCookieVal.split(":"); //' Reads 6 cookie values in to the array SiteLat=ValArray[0]; LatDir=ValArray[1]; if (LatDir=="South") SiteLat=-SiteLat; SiteLon=ValArray[2]; LonDir=ValArray[3]; if (LonDir=="West") SiteLon=360-SiteLon; // alert(Lat+" "+Lon); } else { // set any Lon,Lat 37.77,-122.42 SiteLat=37.77; SiteLon=360-122.42; } Lat=SiteLat; Lon=SiteLon; var today =new Date(); Day=today.getUTCDate(); Month=today.getUTCMonth()+1; Year=today.getUTCFullYear(); Hour= today.getUTCHours() ; Minute=today.getMinutes() ; Seconds=today.getSeconds() ; //alert(Day+"."+Month+"."+Year+" "+Hour+":"+Minute+":"+Seconds); d=daynumber(Day,Month,Year,Hour,Minute,Seconds); output_angles=sun_angles(d,SiteLon,SiteLat); output_moon_angles=moon_angles(d,SiteLon,SiteLat); /* document.Angles.MoonLon.value=output_moon_angles[3]; document.Angles.MoonLat.value=output_moon_angles[11]; document.Angles.MoonRA.value=output_moon_angles[4]; document.Angles.MoonDecl.value=output_moon_angles[2]; document.Angles.MoonAz.value=output_moon_angles[1]; document.Angles.MoonDistance.value=output_moon_angles[13]*6378.14; document.Angles.MoonGeoEl.value=output_moon_angles[10]; // without atmospheric refraction document.Angles.MoonEl.value=output_moon_angles[12]; // with atmospheric refraction if (document.Angles.MoonGeoEl.value>-5) document.Angles.MoonEl.value=formatvalue(output_moon_angles[12],5); else document.Angles.MoonEl.value='N/A';//formatvalue(SunAltitude,5); */ SunAltitude=output_angles[0]; //document.Angles.SunAzimuth.value=formatvalue(output_angles[1],8); /* angles[2]=Decl; angles[3]=sunlon; angles[4]=RA; angles[5]=Rev(GMST0); angles[6]=Rev(M); angles[7]=Rev(w); angles[8]=Rev(e); angles[9]=Rev(oblecl); */ /* document.Angles.SunDeclination.value=output_angles[2]; document.Angles.SunLongitude.value=output_angles[3]; document.Angles.RA.value=output_angles[4]; document.Angles.GMST0.value=output_angles[5]; document.Angles.MeanAnomaly.value=output_angles[6]; document.Angles.Perihelion.value=output_angles[7]; document.Angles.Eccentricity.value=output_angles[8]; document.Angles.Obliquity.value=output_angles[9]; document.Angles.SunGeometricElevation.value=output_angles[10]; */ /* if (document.Angles.SunGeometricElevation.value>-5) document.Angles.SunElevation.value=formatvalue(SunAltitude,5); else document.Angles.SunElevation.value='N/A';//formatvalue(SunAltitude,5); */ //document.Angles.SatelliteLongitude.value=getsatelliteposition(output_angles[1]); // input azimuth SunSatLonArray=getsatelliteposition(output_angles[1],SiteLat,SiteLon); //document.Angles.SatelliteLongitude.value=SunSatLonArray[0]; SunSatLon=SunSatLonArray[1]*1; //alert(SunSatLon); /* if (document.Angles.SatelliteLongitude.value=="Not Available") { document.Angles.SatelliteElevation.value="N/A"; ElevationDifference="N/A"; //ElevationDifference=Math.abs(document.Angles.SunGeometricElevation.value-document.Angles.SatelliteElevation.value); } else { document.Angles.SatelliteElevation.value=formatvalue(Elevation2(SunSatLon,SiteLat,SiteLon,0),5); ElevationDifference=Math.abs(document.Angles.SunElevation.value-document.Angles.SatelliteElevation.value); } */ //document.Angles.SunSatElDifference.value=formatvalue(ElevationDifference,5); //MoonLonArray[0] //MonSatLon=document.Angles.SatelliteLongitudeMoon.value; MoonLonArray=getsatelliteposition(1*output_moon_angles[1],SiteLat,SiteLon); // input azimuthgetsatelliteposition(InputAzimuth,Lat,Lon) //alert(MoonLonArray[0]); //document.Angles.SatelliteLongitudeMoon.value=MoonLonArray[0]; //MonSatLon=MoonLonArray[1]*1; //alert(MonSatLon); //if (document.Angles.SatelliteLongitudeMoon.value=="Not Available") // { // document.Angles.SatelliteElevationMoon.value="N/A"; // ElevationDifference="N/A"; //ElevationDifference=Math.abs(document.Angles.MoonGeoEl.value-document.Angles.SatelliteElevationMoon.value); // } // else // { // document.Angles.SatelliteElevationMoon.value=formatvalue(Elevation2(MonSatLon,SiteLat,SiteLon,0),5); // ElevationDifference=Math.abs(document.Angles.MoonEl.value-document.Angles.SatelliteElevationMoon.value); // } //document.Angles.MoonSatElDifference.value=formatvalue(ElevationDifference,5); // //alert(output_moon_angles[1]); if (isNaN(output_moon_angles[1])) { OutMoonAzText="N/A"; } else OutMoonAzText=formatnumber(1*output_moon_angles[1],2); if (isNaN(output_moon_angles[12])) { OutMoonElText=formatnumber(output_moon_angles[10],2); if (output_moon_angles[10]<0) MoonLonArray[0]="Moon below horizon"; } else { OutMoonElText=formatnumber(1*output_moon_angles[12],2); if (1*output_moon_angles[12]<0) MoonLonArray[0]="Moon below horizon"; //alert(OutMoonElText); } OutputText="\r\n"; OutputText=OutputText+"\r\n"; OutputText=OutputText+"\r\n"; //OutputText=OutputText+"\r\n
Moon position for "+GetSiteLocationNameFromCookie()+":
LongitudeLatitudeDecl.Azimuth(True North)ElevationMoon@Satpos
"+formatnumber(output_moon_angles[3],2)+"°"+formatnumber(output_moon_angles[11],2)+"°"+formatnumber(output_moon_angles[2],2)+"°"+OutMoonAzText+"°"+OutMoonElText+"°"+MoonLonArray[0]+"
"; if (isNaN(output_angles[1])) OutSunAzText="N/A" else OutSunAzText=formatnumber(1*output_angles[1],2); if (isNaN(output_angles[12])) { OutSunElText=formatnumber(output_angles[10],3); if (output_angles[10]<0) SunSatLonArray[0]="Sun below horizon"; } else { OutSunElText=formatnumber(1*output_angles[12],3); if (1*output_angles[12]<0) SunSatLonArray[0]="Sun below horizon"; } OutputText=OutputText+"\r\nSun position for "+GetSiteLocationNameFromCookie()+":"; OutputText=OutputText+"\r\nLongitudeLatitudeDecl.Azimuth(True North)ElevationSun@Satpos"; OutputText=OutputText+"\r\n"+formatnumber(output_angles[3],2)+"°"+formatnumber(output_angles[11],2)+"°"+formatnumber(output_angles[2],2)+"°"+OutSunAzText+"°"+OutSunElText+"°"+SunSatLonArray[0]+""; OutputText=OutputText+"\r\n"; /* document.Angles.SunDeclination.value=output_angles[2]; document.Angles.SunLongitude.value=output_angles[3]; document.Angles.RA.value=output_angles[4]; document.Angles.GMST0.value=output_angles[5]; document.Angles.MeanAnomaly.value=output_angles[6]; document.Angles.Perihelion.value=output_angles[7]; document.Angles.Eccentricity.value=output_angles[8]; document.Angles.Obliquity.value=output_angles[9]; document.Angles.SunGeometricElevation.value=output_angles[10]; */ return(OutputText); } function getSunDeclinationNow(){ var d,Day,Month,Year,Hour,Minute,Seconds var Lat,Lon,LatDir,LonDir,SunAltitude,ElevationDifference var ephem_array=new Array(); var ValArray=new Array(); var MonSatLon,SunSatLon,MyCookieVal var MoonSatLonArray=new Array(); var SunSatLonArray=new Array(); var OutputText,SiteLon,SiteLat,OutMoonAzText,OutMoonElText,OutputSunText,OutSunAzText,OutSunElText MyCookieVal=document.cookie; //alert(MyCookieVal); if (MyCookieVal !== "")// If cookie has value then set users defaults { ValArray=MyCookieVal.split(":"); //' Reads 6 cookie values in to the array SiteLat=ValArray[0]; LatDir=ValArray[1]; if (LatDir=="South") SiteLat=-SiteLat; SiteLon=ValArray[2]; LonDir=ValArray[3]; if (LonDir=="West") SiteLon=360-SiteLon; // alert(Lat+" "+Lon); } else { // set any Lon,Lat 37.77,-122.42 SiteLat=37.77; SiteLon=360-122.42; } Lat=SiteLat; Lon=SiteLon; Day=today.getUTCDate(); Month=today.getUTCMonth()+1; Year=today.getUTCFullYear(); Hour= today.getUTCHours() ; Minute=today.getMinutes() ; Seconds=today.getSeconds() ; //alert(Day+"."+Month+"."+Year+" "+Hour+":"+Minute+":"+Seconds); d=daynumber(Day,Month,Year,Hour,Minute,Seconds); output_angles=sun_angles(d,SiteLon,SiteLat); //alert(output_angles+"SiteLat"+SiteLat); return(output_angles[2]); } function MoonEclipse(){ // use timestep and calculate Moon Latitude. If MoonLatitude = 0 the eclipse at satellite lon=moon Lon. // how can moon Latitude=0 be found without calculating minute for minute ...? } function printresult(){ var listing,today,time_offset,Hour,Minute,Second,Month,Day,Year,UTCDateString,LTDateString,d today= new Date() Day=1*document.TimeAndDate.Day.value; Month=1*document.TimeAndDate.Month.value; Year=1*document.TimeAndDate.Year.value; Hour=1*document.TimeAndDate.Hour.value; Minute=1*document.TimeAndDate.Minute.value; Second=1*document.TimeAndDate.Seconds.value; d=daynumber(Day,Month,Year,Hour,Minute,Second); today=d_to_date_and_time(d); // get time from form time_offset=today.getTimezoneOffset() ; /* Hour= today.getUTCHours() ; Minute=today.getUTCMinutes() ; Second=today.getUTCSeconds() ; Month= today.getUTCMonth()+1; Day= today.getUTCDate() ; Year= today.getUTCFullYear(); */ if (Hour<10) Hour="0"+Hour; if (Minute<10) Minute="0"+Minute; if (Second<10) Second="0"+Second; UTCDateString=Day+"/"+Month+"/"+Year+" "+Hour+":"+Minute+":"+Second+" UTC"; Hour= today.getUTCHours() ; Minute=today.getUTCMinutes() ; Second=today.getUTCSeconds() ; Month= today.getUTCMonth()+1; Day= today.getUTCDate() ; Year= today.getFullYear(); //If (Year<1900) Year=Year+1900; // Fix for Mozilla Firefox if (Hour<10) Hour="0"+Hour; if (Minute<10) Minute="0"+Minute; if (Second<10) Second="0"+Second; LTDateString=Day+"/"+Month+"/"+Year+" "+Hour+":"+Minute+":"+Second+" Local Time"; listing="" listing+="" listing+="" listing+="" listing+="Sun azimuth ~ Satellite Longitude" listing+="" listing+="" listing+="" listing+="

"+UTCDateString+"
" listing+="
"+LTDateString+"
" listing+="
****************************SUN************************************
"; listing+="
Satellite Position:"+document.Angles.SatelliteLongitude.value+"
" listing+="
Sun/Satellite Azimuth:"+document.Angles.SunAzimuth.value+" °
" if (document.Angles.SunElevation.value=="N/A") listing+="
Sun Elevation:"+formatvalue(document.Angles.SunGeometricElevation.value,7)+" °
" else listing+="
Sun Elevation:"+formatvalue(document.Angles.SunElevation.value,7)+" °
" listing+="
Satellite Elevation:"+document.Angles.SatelliteElevation.value+" °
" listing+="
|Satellite Elevation-Sun Elevation|:"+document.Angles.SunSatElDifference.value+" °
"; listing+="
***************************MOON***********************************
" listing+="
Satellite Position:"+document.Angles.SatelliteLongitudeMoon.value+"
" listing+="
Moon/Satellite Azimuth:"+formatvalue(document.Angles.MoonAz.value,8)+" °
" listing+="
Satellite Elevation:"+formatvalue(document.Angles.SatelliteElevationMoon.value,8)+" °
" if (document.Angles.MoonEl.value=="N/A"){ listing+="
Moon Elevation:"+formatvalue(document.Angles.MoonGeoEl.value,7)+" °
" listing+="
|Satellite Elevation-Moon Elevation|:"+formatvalue(document.Angles.MoonSatElDifference.value,8)+" °
" } else { listing+="
Moon Elevation:"+formatvalue(document.Angles.MoonEl.value,7)+" °
" listing+="
|Satellite Elevation-Moon Elevation|:"+formatvalue(document.Angles.MoonSatElDifference.value,7)+" °
" } listing+="" PrintWindow=window.open("","Print_window") //PrintWindow =window.open("","Print_window","menubar=yes,status=yes,toolbar=yes,scrollbars=yes"); //height=800,width=1000 PrintWindow.oldWindow = top //PrintWindow.document.write(document.Output.Satpos.value) PrintWindow.document.write(listing) PrintWindow.document.close() } function CalculateCoordinate() { var degrees,minute,seconds,SiteLon,SiteLat SiteLat=1*document.Latitude.Degrees.value; SiteLon=1*document.Longitude.Degrees.value; degrees=Math.floor(SiteLat); minutes=Math.floor((SiteLat-degrees)*60); seconds= Math.floor(((SiteLat-degrees)*60- minutes)*60); document.Latitude.LatDegrees.value=degrees; document.Latitude.LatMinutes.value=minutes; document.Latitude.LatSeconds.value=seconds; degrees=Math.floor(SiteLon); minutes=Math.floor((SiteLon-degrees)*60); seconds= Math.floor(((SiteLon-degrees)*60- minutes)*60); document.Longitude.LonDegrees.value=degrees; document.Longitude.LonMinutes.value=minutes; document.Longitude.LonSeconds.value=seconds; } function CalculateLat() { var degrees,minutes,seconds,decimaldegrees degrees=1*document.Latitude.LatDegrees.value; minutes=1*document.Latitude.LatMinutes.value; seconds=1*document.Latitude.LatSeconds.value; decimaldegrees= degrees + (minutes/60) + (seconds/(60*60)); document.Latitude.Degrees.value=formatvalue(decimaldegrees,6); } function CalculateLon() { var degrees,minutes,seconds,decimaldegrees degrees=1*document.Longitude.LonDegrees.value; minutes=1*document.Longitude.LonMinutes.value; seconds=1*document.Longitude.LonSeconds.value; decimaldegrees= degrees + (minutes/60) + (seconds/(60*60)); document.Longitude.Degrees.value=formatvalue(decimaldegrees,6); } function set_todays_date(){ var today,Day,Month,Year,Hour,Minute,Seconds today = new Date(); Month= today.getUTCMonth()+1; Day= today.getUTCDate() ; //Year= today.getUTCYear(); Year= today.getUTCFullYear(); Hour=today.getUTCHours(); Minute=today.getUTCMinutes(); Seconds=today.getUTCSeconds(); //If (Year<1900) Year=Year+1900; // Fix for Mozilla Firefox document.TimeAndDate.Day.value=Day; document.TimeAndDate.Month.value=Month; document.TimeAndDate.Year.value=Year; document.TimeAndDate.Hour.value=Hour; document.TimeAndDate.Minute.value=Minute; document.TimeAndDate.Seconds.value=Seconds; // used for testing with date 19/04/1990 00:00 utc /* document.TimeAndDate.Day.value=19; document.TimeAndDate.Month.value=4; document.TimeAndDate.Year.value=1990; document.TimeAndDate.Hour.value=0; document.TimeAndDate.Minute.value=00; document.TimeAndDate.Seconds.value=0; */ } function d_to_date_and_time(d) { var today,t var MinMilli = 1000 * 60; var HrMilli = MinMilli * 60; var DyMilli = HrMilli * 24; today = new Date(); // d+10956= Date() format //window.alert('d= '+d ); d=d+10956; d*DyMilli; today.setTime(d*DyMilli); //t=((today.getTime()/DyMilli)-10956); //window.alert('t= '+t ); time_offset=today.getTimezoneOffset() ; Hour= today.getUTCHours() ; Minute=today.getUTCMinutes() ; Second=today.getUTCSeconds() ; Month= today.getUTCMonth()+1; Day= today.getUTCDate() ; Year= today.getUTCFullYear(); return(today) } // get the time for more days, function sun_angles(d,SiteLon,SiteLat){ var SunSouth,HourAngle,SIDEREALTIME,SatAz,SunSat,Tst,SatelliteAzimuth,pi,NewRA var w,a,e,M,L,oblecl,E,x,y,r,v,sunlon,z,xequat,yequat,zequat,RA,Decl,GMST0,UT,SIDTIME,HA var SunElevation,xhor,yhor,zhor,SunSatElevationDifference,SatElevation,GeometricElevation pi=Math.PI; var angles= new Array(); //*********CALCULATE SUN DATA ********************* w=282.9404 + 4.70935E-5 * d ; //OK a=1; //a=6.6107940559473451507806351067866; //a=0; //a=149476000; //km average distance e= 0.016709 - 1.151E-9 *d ; M= 356.0470 + 0.9856002585 * d; oblecl=23.4393 -3.563E-7 * d ; L=w+Rev(M); L=Rev(L); E=M+ (180/pi)*e*Math.sin(Radians(M))*( 1+e * Math.cos(Radians(M)) ); E=Rev(E); // OK x= a*Math.cos(Radians(E)) -e ; y= a*Math.sin(Radians(Rev(E)))*Math.sqrt(1-e*e); r=Math.sqrt(x*x+y*y); v=Deg(Math.atan2(y,x)); sunlon=Rev(v+w); // trolig ok x=r*Math.cos(Radians(sunlon)); y=r*Math.sin(Radians(sunlon)); z=0; xequat=x; yequat=y*Math.cos(Radians(oblecl)) +z*Math.sin(Radians(oblecl)); zequat=y*Math.sin(Radians(oblecl)) +z*Math.cos(Radians(oblecl)); RA=Rev(Deg(Math.atan2(yequat,xequat))); // OK Decl=Deg(Math.atan2(zequat,Math.sqrt(xequat*xequat + yequat*yequat ) )); // trolig OK // no refraction... GMST0=(L+180); //*********CALCULATE TIME ********************* UT=d-Math.floor(d); //alert("UT="+UT); SIDEREALTIME=GMST0+UT*360+1*SiteLon; // ok HourAngle=SIDEREALTIME-RA; // trolig ok x=Math.cos(HourAngle*pi/180) * Math.cos(Decl*pi/180); y=Math.sin(HourAngle*pi/180) * Math.cos(Decl*pi/180); z=Math.sin(Decl*pi/180); xhor=x*Math.sin(SiteLat*pi/180) - z*Math.cos(SiteLat*pi/180); yhor=y; zhor=x*Math.cos(SiteLat*pi/180) + z*Math.sin(SiteLat*pi/180); SunElevation=Deg( Math.asin(zhor)); // ok GeometricElevation=SunElevation; SunElevation=ElevationRefraction(SunElevation); // atmospheric refraction SunAzimuth=Deg(Math.atan2(yhor,xhor)); //alert(SunAzimuth); angles[0]=SunElevation; if (SiteLat<0) angles[1]=SunAzimuth+180 // added 1 May 2008 else angles[1]=SunAzimuth+180; //alert("Sun Raw Az="+SunAzimuth); angles[2]=Decl; angles[3]=sunlon; angles[4]=RA; angles[5]=Rev(GMST0); angles[6]=Rev(M); angles[7]=Rev(w); angles[8]=Rev(e); angles[9]=Rev(oblecl); angles[10]=GeometricElevation; angles[11]=L; return(angles); } function moon_angles(d,SiteLon,SiteLat){ var SunSouth,HourAngle,SIDEREALTIME,SatAz,SunSat,Tst,SatelliteAzimuth,pi,NewRA var w,a,e,M,L,N,oblecl,E,x,y,r,v,sunlon,z,xequat,yequat,zequat,RA,Decl,GMST0,UT,SIDTIME,HA var SunElevation,xhor,yhor,zhor,SunSatElevationDifference,SatElevation,GeometricElevation pi=Math.PI; var angles= new Array(); var sunangles=new Array(); var E0,E1,xeclip,yeclip,zeclip,Lm,Ls,Ms,Mm,D,F var P_lon1,P_lon2,P_lon3,P_lon4,P_lon5,P_lon6,P_lon7,P_lon8,P_lon9,P_lon10,P_lon11,P_lon12 var P_lat1,P_lat2,P_lat3,P_lat4,P_lat5,P_lat,P_lon,P_moondistance,Moon_RA,Moon_Decl var xh,yh,zh,MoonAzimuth,MoonElevation,Iterations,E_error,Ebeforeit,Eafterit,E_ErrorBefore //*********CALCULATE Moon DATA ********************* N=125.1228-0.0529538083*d; i=5.1454; w=318.0634 + 0.1643573223 * d ; //OK a=60.2666; //a=6.6107940559473451507806351067866; //a=0; //a=149476000; //km average distance e= 0.054900; M= 115.3654 + 13.0649929509 * d; w=Rev(w); M=Rev(M); N=Rev(N); // ok so far //alert('N='+N+'\n i='+i+'\n w='+w+'\n a='+a+'\n e='+e+'\n M='+M); E=M+ (180/pi)*e*Math.sin(Radians(M))*( 1+e * Math.cos(Radians(M)) ); E=Rev(E); // OK Ebeforeit=E; // now iterate until difference between E0 and E1 is less than 0.005_deg // use E0, calculate E1 Iterations=0; E_error=9; while ((E_error>0.0005) && (Iterations<20)) // ok - itererer korrekt { Iterations=Iterations+1; E0=E; E1= E0- (E0- (180/pi)*e*Math.sin(Radians(E0)) -M ) /( 1-e * Math.cos(Radians(E0))) ; //alert('1 E0='+E0+'\nNew E1='+E1+'\nE='+E+'\Diff='+Rev(E0-E1)); E=Rev(E1); //alert(Math.abs(E-E0)); Eafterit=E; if (E10) window.status="Number of Iterations more than 10="+Iterations+" Ebefore="+Ebeforeit+" Eafter="+Eafterit+" E_errorbefore="+formatvalue(E_ErrorBefore,7)+" E_errorafter"+E_error; } //alert(E); x= a*(Math.cos(Radians(E)) -e) ; y= a*Math.sin(Radians(Rev(E)))*Math.sqrt(1-e*e); r=Math.sqrt(x*x+y*y); v=Deg(Math.atan2(y,x)); //alert('E='+E); // ok så langt sunlon=Rev(v+w); // trolig ok x=r*Math.cos(Radians(sunlon)); y=r*Math.sin(Radians(sunlon)); z=0; xeclip=r*( Math.cos(Radians(N))*Math.cos(Radians(v+w)) - Math.sin(Radians(N)) * Math.sin(Radians(v+w))*Math.cos(Radians(i)) ); yeclip=r*( Math.sin(Radians(N))*Math.cos(Radians(v+w)) + Math.cos(Radians(N)) * Math.sin(Radians(v+w))*Math.cos(Radians(i)) ); zeclip=r*Math.sin(Radians(v+w))*Math.sin(Radians(i)); //alert('xeclip='+xeclip+'\nyeclip='+yeclip+'\nzeclip='+zeclip+'\Long='+Rev(v+w)); //ok so far moon_longitude=Rev(Deg(Math.atan2(yeclip,xeclip))); // OK moon_latitude=Deg(Math.atan2(zeclip,Math.sqrt(xeclip*xeclip +yeclip*yeclip ) )); // trolig OK // Now add Perbutations, we actually need Sun mean longitude and Suns mean anomaly //alert('moon_longitude='+moon_longitude+'\nmoon_latitude='+moon_latitude+'\nr='+r); sunangles=sun_angles(d,SiteLon,SiteLat); Ls=sunangles[11]; // Suns mean longitude er feil Ms=sunangles[6]; // Suns mean anomaly Mm=Rev(M); // Moons mean anomaly Lm=Rev(N+w+M) ; // moon mean longitude D=Rev(Lm-Ls); //Moons mean elongation F=Rev(Lm-N); //Moons argument of latitude //alert('Ms='+Ms+'\nMm='+Mm+'\nLs='+Ls+'\nLm='+Lm+'\nD='+D+'\nF='+F); // ok so far // Perbutations Moons Longitude P_lon1= -1.274 * Math.sin(Radians(Mm - 2*D)); // (Evection) P_lon2= +0.658 * Math.sin(Radians(2*D)); // (Variation) P_lon3= -0.186 * Math.sin(Radians(Ms) ) ; // (Yearly equation) P_lon4= -0.059 * Math.sin(Radians(2*Mm - 2*D)); P_lon5= -0.057 * Math.sin(Radians(Mm - 2*D + Ms)); P_lon6= +0.053 * Math.sin(Radians(Mm + 2*D)); P_lon7= +0.046 * Math.sin(Radians(2*D - Ms)); P_lon8= +0.041 * Math.sin(Radians(Mm - Ms)); P_lon9= -0.035 * Math.sin(Radians(D) ); // (Parallactic equation) P_lon10= -0.031 * Math.sin(Radians(Mm + Ms)); P_lon11= -0.015 * Math.sin(Radians(2*F - 2*D)); P_lon12= +0.011 * Math.sin(Radians(Mm - 4*D)); // Perbutations Moons Latitude P_lat1=-0.173 * Math.sin(Radians(F - 2*D)); P_lat2=-0.055 * Math.sin(Radians(Mm - F - 2*D)); P_lat3=-0.046 * Math.sin(Radians(Mm + F - 2*D)); P_lat4=+0.033 * Math.sin(Radians(F + 2*D)); P_lat5=+0.017 * Math.sin(Radians(2*Mm + F)); P_lon=P_lon1+P_lon2+P_lon3+P_lon4+P_lon5+P_lon6+P_lon7+P_lon8+P_lon9+P_lon10+P_lon11+P_lon12; P_lat=P_lat1+P_lat2+P_lat3+P_lat4+P_lat5; P_moondistance=-0.58 * Math.cos(Radians(Mm - 2*D)) -0.46 * Math.cos(Radians(2*D)); //alert('P_lon='+P_lon+'\nP_lat='+P_lat+'\nP_moondistance='+P_moondistance); moon_longitude=moon_longitude+P_lon; moon_latitude=moon_latitude+P_lat; r=r+P_moondistance; //alert('moon_longitude='+moon_longitude+'\nmoon_latitude='+moon_latitude+'\nmoondistance='+r); // OK so far // now calculate RA & Decl // get the Eliptic coordinates xh=r*Math.cos(Radians(moon_longitude))*Math.cos(Radians(moon_latitude)); yh=r*Math.sin(Radians(moon_longitude))*Math.cos(Radians(moon_latitude)); zh=r*Math.sin(Radians(moon_latitude)); // rotate to rectangular equatorial coordinates xequat=xh; yequat=yh*Math.cos(Radians(sunangles[9]))-zh*Math.sin(Radians(sunangles[9])); zequat=yh*Math.sin(Radians(sunangles[9]))+zh*Math.cos(Radians(sunangles[9])); Moon_RA=Rev(Deg(Math.atan2(yh,xh))); // OK Moon_Decl=Deg(Math.atan2(zh,Math.sqrt(xh*xh + yh*yh ) )); // trolig OK Moon_RA=Rev(Deg(Math.atan2(yequat,xequat))); // OK Moon_Decl=Deg(Math.atan2(zequat,Math.sqrt(xequat*xequat + yequat*yequat ) )); // trolig OK //alert('moon_RA='+Moon_RA+'\nMoon_Decl='+Moon_Decl+'\nmoondistance='+r+'\nObecl='+sunangles[9]); GMST0=(Ls+180); //*********CALCULATE TIME ********************* UT=d-Math.floor(d); //alert("UT="+UT); SIDEREALTIME=GMST0+UT*360+1*SiteLon; // ok HourAngle=SIDEREALTIME-Moon_RA; // trolig ok x=Math.cos(HourAngle*pi/180) * Math.cos(Moon_Decl*pi/180); y=Math.sin(HourAngle*pi/180) * Math.cos(Moon_Decl*pi/180); z=Math.sin(Moon_Decl*pi/180); xhor=x*Math.sin(SiteLat*pi/180) - z*Math.cos(SiteLat*pi/180); //alert('sitelat='+SiteLat+'\nsitelon='+SiteLon); yhor=y; zhor=x*Math.cos(SiteLat*pi/180) + z*Math.sin(SiteLat*pi/180); MoonElevation=Deg( Math.asin(zhor)); // ok regner ikke måne elevation helt riktig... MoonElevation=MoonElevation- Deg(Math.asin( 1/r * Math.cos(Radians(MoonElevation)) )); GeometricElevation=MoonElevation; MoonElevation=ElevationRefraction(MoonElevation); // atmospheric refraction MoonAzimuth=Deg(Math.atan2(yhor,xhor)); //alert(MoonAzimuth); //alert(MoonAzimuth); angles[0]=MoonElevation; if (SiteLat<0) angles[1]=MoonAzimuth+180 // added 180 deg else angles[1]=MoonAzimuth+180; //alert("Moon Raw Az="+MoonAzimuth); //alert('Moon Azimuth='+angles[1]+'\nMoon Elevation='+MoonElevation+' Geometric elevation='+GeometricElevation); angles[2]=Moon_Decl; angles[3]=moon_longitude; angles[4]=Moon_RA; angles[5]=Rev(GMST0); angles[6]=Rev(M); angles[7]=Rev(w); angles[8]=Rev(e); angles[9]=Rev(oblecl); angles[10]=GeometricElevation; angles[11]=moon_latitude; angles[12]=MoonElevation; angles[13]=r; return(angles); } function ElevationRefraction(El_geometric) { var El_observed var x,a0,a1,a2,a3,a4 a0=0.58804392; a1=-0.17941557 a2=0.29906946E-1; a3=-0.25187400E-2; a4=0.82622101E-4; El_observed=El_geometric; x=Math.abs(El_geometric+0.589); refraction=Math.abs(a0+a1*x+a2*x*x+a3*x*x*x +a4*x*x*x*x) ; if (El_geometric>10.2) { El_observed=El_geometric+0.01617*(Math.cos(Radians(Math.abs(El_geometric)))/Math.sin(Radians(Math.abs(El_geometric))) ); } else { El_observed=El_geometric+refraction ; } return(El_observed); } //********WORKS OK function SetCookie() { var Lat,Lon,LatDir,LonDir,CookieValue var SitePosCurrentIndex SitePosCurrentIndex=document.Site.Position.selectedIndex; Lat=1*document.Latitude.Degrees.value; LatDir=document.Latitude.Direction.value; Lon=1*document.Longitude.Degrees.value; LonDir=document.Longitude.Direction.value; CookieValue=Lat+":"+LatDir+":"+Lon+":"+LonDir+":"+SitePosCurrentIndex+":"+SatNameCurrentIndex+":"+SetLocation+":"+Calibrate_pulsevalue+":"+Calibrate_pulse_per_ha_degree+":"+calibrate_inc_direction+":"+HA_for_calibrated_position+";expires=Tue, 10 Jul 2040 23:59:59 UTC;"; document.cookie =CookieValue ; // Store cookie } function ReadCookie() { var Lat,Lon,LatDir,LonDir,CookieValue,MyCookieVal var ValArray=new Array(); var SubArray=new Array(); SitePosCurrentIndex =1073 ; // Used only if there are not any cookie stored //SatNameCurrentIndex =40 ; MyCookieVal=document.cookie; //alert(MyCookieVal); if (MyCookieVal !== "") // If cookie has value then set users defaults { ValArray=MyCookieVal.split(":"); //' Reads 6 cookie values in to the array Lat=ValArray[0]; LatDir=ValArray[1]; Lon=ValArray[2]; LonDir=ValArray[3]; SitePosCurrentIndex=ValArray[4]; SatNameCurrentIndex=ValArray[5]; SetLocation= ValArray[6]; Calibrate_pulsevalue=ValArray[7]; Calibrate_pulse_per_ha_degree=ValArray[8]; calibrate_inc_direction=ValArray[9]; HA_for_calibrated_position=ValArray[10]; } document.Site.Position.selectedIndex=SitePosCurrentIndex; document.Latitude.Degrees.value=Lat ; // Set user defaults if cookie already stored on the system document.Latitude.Direction.value=LatDir; // ' Set user defaults if cookie already stored on the system document.Longitude.Degrees.value=Lon ; //' Set user defaults if cookie already stored on the system document.Longitude.Direction.value=LonDir; // ' Set user defaults if cookie already stored on the system } // end function function NotInUseReadPosition() // Store the selected position in the cookie { var Lat,Lon,LatDir,LonDir,CookieValue,MyVal var ValArray=new Array(); var SubArray=new Array(); MyVal=document.Site.Position.value; if (MyVal == null) alert("Cookie damaged - plese run the cookie repair script !"); if (MyVal !== null) { // Check position ValArray=MyVal.split(","); SubArray = ValArray[0].split(":") ; // The first subarray containing Lat:LatDir Lat=SubArray[0]; LatDir=SubArray[1]; SubArray = ValArray[1].split(":"); // The second subarray containing Lon:LonDir Lon=SubArray[0]; LonDir=SubArray[1]; document.Latitude.Degrees.value=Lat ; // Set user defaults if cookie already stored on the system document.Latitude.Direction.value=LatDir ; // Set user defaults if cookie already stored on the system document.Longitude.Degrees.value=Lon ; // Set user defaults if cookie already stored on the system document.Longitude.Direction.value=LonDir ; // Set user defaults if cookie already stored on the system } } // End function function Rev(number) { var x x= number -Math.floor(number/360.0)*360 ; return(x) } function Radians(number) { var rad rad=number*Math.PI/180; return(rad) } function Deg(number) { var rad rad=number*180/Math.PI; return(rad) } function daynumber(Day,Month,Year,Hour,Minute,Second) { //window.alert(Day+" "+Month+" "+Year+" "+Hour+" "+Minute+" "+Second); d=367*Year - Div( (7*(Year+(Div((Month+9),12)))),4 ) + Div((275*Month),9) + Day - 730530 // d is correct //window.alert(d); d=d+ Hour/24 + Minute/(60*24) + Second/(24*60*60) // OK return(d) } function Div(a,b) { return((a-a%b)/b) //OK } function formatnumber(num,places) { var strOP,i,decimals,newdecimals,integer,newstring,numcopy var ss=new Array() numcopy=num; var a = Math.pow(10,Math.abs(places) == places ? places : 2); strOP=String(Math.round(num * a) / a).replace(/^(\d)/," $1"); if (num<0) strOP=" "+strOP; // put " " on negative numbers //num=parseFloat(strOP); ss = strOP.split(".");// split string by . what about zero..? if ((num!==0)&&(ss.length>1)) { decimals=ss[1]; integer=ss[0]; if (decimals.length=0) strOP=" "+strOP; return(strOP) } function formatvalue(input, rsize) // Desimal avrunding { var invalid = "**************************"; var nines = "999999999999999999999999"; var strin = "" + input; var fltin = parseFloat(strin); if (strin.length <= rsize) return strin; if (strin.indexOf("e") != -1 || fltin > parseFloat(nines.substring(0,rsize)+".4")) return invalid.substring(0, rsize); var rounded = "" + (fltin + (fltin - parseFloat(strin.substring(0, rsize)))); return rounded.substring(0, rsize); }