/* JavaScript Sun Calculator c 2001 Juergen Giesen http://www.jgiesen.de */ var string1="ex1"; var dat, myDay, myMonth, myYear, myHour, myMinute, JD, UT, OK, offset, timezone1, timezone2, dIM, DEC, RA, EOT var lat, longit, offset, htb, DIM, locOffset; var month = new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); var UTRISE, UTSET, RISE, SETT, ABOVE; 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; ABOVE = (yMinus>0.0); QUAD(yMinus,yPlus); switch (NZ) { case 0: break; case 1: if (yMinus<0.0) {UTRISE = HOUR+zero1; RISE=true;} else {UTSET = HOUR+zero1; SETT=true;} break; case 2: if (YE<0.0) {UTRISE = HOUR+zero2; UTSET=HOUR+zero1;} else {UTRISE = HOUR+zero1; UTSET=HOUR+zero2;} RISE=true; SETT=true; 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; 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 str; if (min>=10) str=Math.floor(time)+":"+min; else str=Math.floor(time)+":0"+min; if (min==60) str=Math.floor(time+1)+":00"; return str; } 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 getTZone() { var utHour = Math.floor(UT); timezone1=document.getElementById("myform").timezone.options[document.getElementById("myform").timezone.selectedIndex].value; timezone2=document.getElementById("myform").timezone2.value; if (timezone2!=0) offset=-60*timezone2; else offset=-60*timezone1; RISE = false; SETT = false; locOffset = -offset/60; newHour = utHour + locOffset; if (newHour>=24) { newHour=newHour-24; document.getElementById("myform").Stunde.options[newHour].selected=true; myDay=myDay+1; document.getElementById("myform").Tag.options[myDay-1].selected=true; } if (newHour<0) { newHour=newHour+24; document.getElementById("myform").Stunde.options[newHour].selected=true; myDay=myDay-1; document.getElementById("myform").Tag.options[myDay-1].selected=true; } var str = " " + myYear+", "+myDay+" "+ document.getElementById("myform").Monat.options[myMonth-1].value; str = str +" , "+newHour+":"; if (myMinute<10) str=str+"0"+myMinute; else str=str+myMinute; document.getElementById("myform").text1.value=str; RISE = false; SETT = false; locOffset = -offset/60; for (var i=-locOffset; i<-locOffset+24; i++) { // i=GMT riseset(myDay, myMonth, myYear, i) if (RISE && SETT) break; } if (RISE || SETT) { if (RISE) {UTRISE=UTRISE + locOffset;if (UTRISE>24) UTRISE = UTRISE-24;if (UTRISE<0) UTRISE = UTRISE+24;} if (SETT) {UTSET=UTSET + locOffset;if (UTSET>24) UTSET = UTSET-24;if (UTSET<0) UTSET = UTSET+24;} if (UTSET>UTRISE) lengthOfDay=UTSET-UTRISE; else lengthOfDay=24-(UTRISE-UTSET); } if (RISE) str=HoursMinutes(UTRISE); else {if (ABOVE) str="не восходит"; else str="--.--"} document.getElementById("myform").riseTime.value=str; if (SETT) str=HoursMinutes(UTSET); else {if (ABOVE) {str="не заходит"; lengthOfDay=24} else {str="--.--";lengthOfDay=0}} document.getElementById("myform").setTime.value=str; //lengthOfDay=Math.round((100*lengthOfDay)/100); lengthOfDay=SWHM(lengthOfDay); document.getElementById("myform").text4.value=lengthOfDay; } function table() { tDat = new Date(); daysInMonth(myMonth,myYear) if (lat>=0) ns=" Северной"; else ns=" Южной"; if (longit>=0) ew=" Восточной"; else ew=" Западной"; var str = "Восход, Заход, Долгота дня, Transit, and Max. Altitude"+"\n"; str = str + "Для Широты=" + lat + ns + ", Долгота=" + longit + ew+"\n"; document.getElementById("myform").area.value+=str; for (var i=1; i<=dIM; i++) { JD=JulDay (i, myMonth,myYear, 12) EOT = eot(i, myMonth,myYear, 12) myDay=i RISE = false; SETT = false; for (var j=-locOffset; j<-locOffset+24; j++) { // i=GMT riseset(i, myMonth, myYear, j) if (RISE && SETT) break; } if (RISE || SETT) { if (RISE) {UTRISE=UTRISE + locOffset;if (UTRISE>24) UTRISE = UTRISE-24;if (UTRISE<0) UTRISE = UTRISE+24;} if (SETT) {UTSET=UTSET + locOffset;if (UTSET>24) UTSET = UTSET-24;if (UTSET<0) UTSET = UTSET+24;} if (UTSET>UTRISE) lengthOfDay=UTSET-UTRISE; else lengthOfDay=24-(UTRISE-UTSET); } if (RISE) str1=HoursMinutes(UTRISE); else {if (ABOVE) str1="не восходит"; else str1="--.--"} if (SETT) str2=HoursMinutes(UTSET); else {if (ABOVE) {str2="не заходит"; lengthOfDay=24} else {str2="--.--";lengthOfDay=0}} //lengthOfDay=Math.round((100*lengthOfDay)/100); lengthOfDay=SWHM(lengthOfDay); document.getElementById("myform").text4.value=lengthOfDay; if (i<10) s="0"; else s=""; var trans = 12.0 - EOT/60.0 - longit/15.0; var GHA = computeGHA (myDay, myMonth, myYear, trans); trans = trans-offset/60.0; str3 = HoursMinutes(trans); var elev = computeHeight(DEC, lat, longit, GHA); elev = Math.round(elev*10)/10; if (elev % 1 !=0) str4 = elev; else str4 = elev+".0"; document.getElementById("myform").area.value+=myYear + " " +month[myMonth-1]+" "+s+myDay+" "+str1 + " " + str2 + " " + lengthOfDay +" "+str3+" "+str4+"\n" } } function daysInMonth(m, y) { var n=31 m=m-1 if ((m==0) || (m==2) || (m==4) || (m==6) || (m==7) || (m==9) || (m==11)) n=31 if ((m==3) || (m==5) || (m==8) || (m==10)) n=30; if (m==1) { n=28; if ((y % 4) == 0) n=29 if ((y % 100) == 0) n=28 if ((y % 400) == 0) n=29 } dIM=n; } function DateTime() { var str = " " + myYear+", "+myDay+" "+ document.getElementById("myform").Monat.options[myMonth-1].value+" , "+myHour+":" if (myMinute<10) str=str+"0"+myMinute; else str=str+myMinute; document.getElementById("myform").text1.value=str; str = " " + Math.round(1000*DEC)/1000 document.getElementById("myform").text2.value=str; lat = document.getElementById("myform").latitude.value longit = document.getElementById("myform").longitude.value if (offset>=1320) offset=offset-1440; var nn=-2*offset/60 if (offset<0) nn=nn-1; if (timezone1!=0 && timezone2==0) { document.getElementById("myform").timezone.options[Math.abs(nn)].selected=true; document.getElementById("myform").timezone2.value=0; } var GHA = computeGHA (myDay, myMonth, myYear, UT); var elev = computeHeight(DEC, lat, longit, GHA); elev = Math.round(elev*100)/100; RISE = false; SETT = false; for (var i=-locOffset; i<-locOffset+24; i++) { // i=GMT riseset(myDay, myMonth, myYear, i) if (RISE && SETT) break; } if (RISE || SETT) { if (RISE) {hRise1=UTRISE + locOffset;if (hRise1>24) hRise1-=24;if (hRise1<0) hRise1+=24;} if (SETT) {hSet1=UTSET + locOffset;if (hSet1>24) hSet1-=24;if (hSet1<0) hSet1+=24;} if (hSet1>hRise1) lengthOfDay=hSet1-hRise1; else lengthOfDay=24-(hRise1-hSet1); } if (RISE) str=HoursMinutes(hRise1); else {if (ABOVE) str="не восходит"; else str="--.--";} document.getElementById("myform").riseTime.value=str; if (SETT) str=HoursMinutes(hSet1); else {if (ABOVE) {str="не заходит"; lengthOfDay=24;} else {str="--.--";lengthOfDay=0}} document.getElementById("myform").setTime.value=str; //lengthOfDay=Math.round((100*lengthOfDay)/100); lengthOfDay=SWHM(lengthOfDay); document.getElementById("myform").text4.value=lengthOfDay; } function SWHM(ut) { ut = Math.floor(ut*60.0+0.5)/60.0; var h = Math.floor(ut); var m = Math.floor(60.0*(ut-h)+0.5); if (h<10) {h = "0" + h}; if (m<10) {m = "0" + m}; var Result=h+"ч. "+m+"м."; return Result; } function thisHour() { dat=new Date() document.getElementById("myform").Stunde.options[dat.getHours()].selected=true myHour=dat.getHours() } function thisMinute() { dat=new Date() document.getElementById("myform").Minute.options[dat.getMinutes()].selected=true myMinute=dat.getMinutes() } function thisUT() { dat=new Date() 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 document.getElementById("myform").UTime.value=str } function thisJulDay() { yy = dat.getYear() if (yy<1000) yy=yy+1900 document.getElementById("myform").JulDay.value=" " + Math.round(10000*JD)/10000 } function thisDay() { dat=new Date() document.getElementById("myform").Tag.options[dat.getDate()-1].selected=true myDay=dat.getDate() } function thisMonth() { dat=new Date() document.getElementById("myform").Monat.options[dat.getMonth()].selected=true myMonth=dat.getMonth()+1 } function thisYear() { dat=new Date() yy=dat.getYear()-2000 if (yy<0) {yy=yy+1900; myYear=dat.getYear()+1900} else myYear=dat.getYear() document.getElementById("myform").Jahr.options[yy].selected=true } function theDay() { daysInMonth(myMonth,myYear) for (var i=0;i=1320) offset=offset-1440 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 document.getElementById("myform").UTime.value=str } function theMinute() { for (var i=0;i5) E = E - 360.0 E = E*4; // deg. to min E = Math.round(1000*E)/1000 return E } function getLatitude() { str=document.getElementById("myform").latitude.value; var n=str.length; for (var i=0; i90) {alert("Широта должна быть меньше либо равна 90 градусов!"); document.getElementById("myform").latitude.value=0; }; lat= Number(str); } function getLongitude() { str=document.getElementById("myform").longitude.value; var n=str.length; for (var i=0; i180) {alert("Долгота должна быть меньше или равна 180 градусов!"); document.getElementById("myform").longitude.value=0; }; longit= Number(str); DateTime(); }