

//=========日月升降=============
var SZJ={//日月的升中天降,不考慮氣溫和氣壓的影響
 L  : 0,  //站點經度,向東測為正
 fa : 0,  //站點緯度
 dt : 0,  //TD-UT
 E  : 0.409092614, //黃赤交角
 getH:function(h,w){ //h地平緯度,w赤緯,返回時角
  var c = ( Math.sin(h) - Math.sin(this.fa)*Math.sin(w) ) / Math.cos(this.fa)/Math.cos(w);
  if(Math.abs(c)>1) return Math.PI;
  return Math.acos(c);
 },
 Mcoord:function(jd,H0,r){ //章動同時影響恒星時和天體坐標,所以不計算章動。返回時角及赤經緯
   var z = m_coord( (jd+this.dt)/36525, 40,30,8 ); //低精度月亮赤經緯
   z = llrConv( z, this.E ); //轉為赤道坐標
   r.H = rad2rrad( pGST(jd,this.dt) + this.L - z[0] ); //得到此刻天體時角
   if(H0) r.H0 = this.getH( 0.7275*cs_rEar/z[2]-34*60/rad, z[1] ); //升起對應的時角
 },
 Mt : function(jd){ //月亮到中升降時刻計算,傳入jd含義與St()函數相同
  this.dt = dt_T(jd);
  this.E  = hcjj(jd/36525);
  jd -= mod2(0.1726222 + 0.966136808032357*jd - 0.0366*this.dt + this.L/pi2, 1); //查找最靠近當日中午的月上中天,mod2的第1參數為本地時角近似值
  var r = new Array(), sv = pi2*0.966;
  r.z = r.x = r.s = r.j = r.c = r.h = jd;
  this.Mcoord(jd,1,r); //月亮坐標
  r.s += (-r.H0 - r.H )/sv;
  r.j += ( r.H0 - r.H )/sv;
  r.z += (    0 - r.H )/sv;
  r.x += ( Math.PI - r.H )/sv;
  this.Mcoord(r.s,1,r);  r.s += rad2rrad( -r.H0 - r.H )/sv;
  this.Mcoord(r.j,1,r);  r.j += rad2rrad( +r.H0 - r.H )/sv;
  this.Mcoord(r.z,0,r);  r.z += rad2rrad(     0 - r.H )/sv;
  this.Mcoord(r.x,0,r);  r.x += rad2rrad( Math.PI - r.H )/sv;
  return r;
 },
 Scoord:function(jd,xm,r){ //章動同時影響恒星時和天體坐標,所以不計算章動。返回時角及赤經緯
   var z = new Array( XL.E_Lon( (jd+this.dt)/36525, 5 ) + Math.PI - 20.5/rad, 0,1);  //太陽坐標(修正了光行差)
   z = llrConv( z, this.E ); //轉為赤道坐標
   r.H = rad2rrad( pGST(jd,this.dt) + this.L - z[0] ); //得到此刻天體時角
   if(xm==10||xm==1) r.H1 = this.getH(-50*60/rad,  z[1]); //地平以下50分
   if(xm==10||xm==2) r.H2 = this.getH(-6*3600/rad, z[1]); //地平以下6度
   if(xm==10||xm==3) r.H3 = this.getH(-12*3600/rad,z[1]); //地平以下12度
   if(xm==10||xm==4) r.H4 = this.getH(-18*3600/rad,z[1]); //地平以下18度
 },
 St : function(jd){ //太陽到中升降時刻計算,傳入jd是當地中午12點時間對應的2000年首起算的格林尼治時間UT
  this.dt = dt_T(jd);
  this.E  = hcjj(jd/36525);
  jd -= mod2(jd + this.L/pi2, 1); //查找最靠近當日中午的日上中天,mod2的第1參數為本地時角近似值
  var r = new Array(), sv = pi2;
  r.z = r.x = r.s = r.j = r.c = r.h = r.c2 = r.h2 = r.c3 = r.h3 = jd; r.sm = '';
  this.Scoord(jd,10,r); //太陽坐標
  r.s += (-r.H1 - r.H )/sv; //升起
  r.j += ( r.H1 - r.H )/sv; //降落
  r.c += (-r.H2 - r.H )/sv; //民用晨
  r.h += ( r.H2 - r.H )/sv; //民用昏
  r.c2+= (-r.H3 - r.H )/sv; //航海晨
  r.h2+= ( r.H3 - r.H )/sv; //航海昏
  r.c3+= (-r.H4 - r.H )/sv; //天文晨
  r.h3+= ( r.H4 - r.H )/sv; //天文昏
  r.z += (    0 - r.H )/sv; //中天
  r.x += ( Math.PI - r.H )/sv; //下中天
  this.Scoord(r.s,1,r);  r.s += rad2rrad( -r.H1 - r.H )/sv;  if(r.H1==Math.PI) r.sm += '無升起.';
  this.Scoord(r.j,1,r);  r.j += rad2rrad( +r.H1 - r.H )/sv;  if(r.H1==Math.PI) r.sm += '無降落.';

  this.Scoord(r.c, 2,r); r.c += rad2rrad( -r.H2 - r.H )/sv;  if(r.H2==Math.PI) r.sm += '無民用晨.';
  this.Scoord(r.h, 2,r); r.h += rad2rrad( +r.H2 - r.H )/sv;  if(r.H2==Math.PI) r.sm += '無民用昏.';
  this.Scoord(r.c2,3,r); r.c2+= rad2rrad( -r.H3 - r.H )/sv;  if(r.H3==Math.PI) r.sm += '無航海晨.';
  this.Scoord(r.h2,3,r); r.h2+= rad2rrad( +r.H3 - r.H )/sv;  if(r.H3==Math.PI) r.sm += '無航海昏.';
  this.Scoord(r.c3,4,r); r.c3+= rad2rrad( -r.H4 - r.H )/sv;  if(r.H4==Math.PI) r.sm += '無天文晨.';
  this.Scoord(r.h3,4,r); r.h3+= rad2rrad( +r.H4 - r.H )/sv;  if(r.H4==Math.PI) r.sm += '無天文昏.';

  this.Scoord(r.z,0,r);  r.z += (     0 - r.H )/sv;
  this.Scoord(r.x,0,r);  r.x += rad2rrad( Math.PI - r.H )/sv;
  return r;
 },

 rts:new Array(),//多天的升中降
 calcRTS:function(jd,n,Jdl,Wdl,sq){ //jd是當地起始略日(中午時刻),sq是時區
  var i,c,r;
   if(!this.rts.length) {for(i=0;i<32;i++) this.rts[i] = new Array(); }
  this.L = Jdl, this.fa = Wdl, sq/=24; //設置站點參數
  for(i=0;i<=n+1;i++){ r=this.rts[i];  r.Ms=r.Mz=r.Mx=r.Mj="--:--:--"; }
  for(i=-1;i<=n;i++){
   if(i>=0&&i<n){ //太陽
    r = SZJ.St(jd+i+sq);this.Scoord(jd,10,r);
    this.rts[i].s = dToStr(tail(r.s-sq+0.5)); //升
    this.rts[i].z = dToStr(tail(r.z-sq+0.5)); //中
    this.rts[i].x = dToStr(tail(r.x-sq+0.5)); //下中
    this.rts[i].j = dToStr(tail(r.j-sq+0.5)); //降
    this.rts[i].c = dToStr(tail(r.c-sq+0.5)); //晨
    this.rts[i].h = dToStr(tail(r.h-sq+0.5)); //昏
    this.rts[i].ch = dToStr(tail(r.h-r.c)); //光照時間
    this.rts[i].sj = dToStr(tail(r.j-r.s)); //晝長
    this.rts[i].sm =r.sm;}
   r = SZJ.Mt(jd+i+sq); //月亮
   c=floor(r.s-sq+0.5)-jd;  if(c>=0&&c<n) this.rts[c].Ms = dToStr(tail(r.s-sq+0.5));
   c=floor(r.z-sq+0.5)-jd;  if(c>=0&&c<n) this.rts[c].Mz = dToStr(tail(r.z-sq+0.5));
   c=floor(r.x-sq+0.5)-jd; if(c>=0&&c<n) this.rts[c].Mx = dToStr(tail(r.x-sq+0.5));
   c=floor(r.j-sq+0.5)-jd;  if(c>=0&&c<n) this.rts[c].Mj = dToStr(tail(r.j-sq+0.5));
  }
  this.rts.dn = n;
 }
};
function RTS2(jd,vJ,vW,tz){
  SZJ.L  = vJ/radd; //設置站點參數
  SZJ.fa = vW/radd;
  var sq = SZJ.L/pi2*24;
  var s="",sm="",sn="", r,rm,sqa=vJ/15,c=J2000+sqa/24,sqc=(8-sqa)/24;var sqc2='減';var sqc2a='加上';if(sqc<0)sqc2='加',sqc2a='減去';var sqc2b=dToStr((abs(sqc)));
  r=SZJ.St(jd-sq/24);var nbw='北緯';if(vW<0)nbw='南緯';if(vW==0)nbw='南北緯=';var dxj='東經';if(vJ<0)dxj='西經';if(vJ==0)dxj='東西經';
  s +="太陽升起" + dToStr(tail(r.s+c+0.5)) + " 太陽降落 " + dToStr(tail(r.j+c+0.5))+"<br>";
  sm +="航海天亮 " + dToStr(tail(r.c2+c+0.5))+ " 航海天黑 " + dToStr(tail(r.h2+c+0.5))+" ";
  sm +="天文天亮 " + dToStr(tail(r.c3+c+0.5))+ " 天文天黑 " + dToStr(tail(r.h3+c+0.5))+"<br>";
  rm=SZJ.Mt(jd-sq/24);var zhusi="<br>另：計算不考慮海拔高度和空氣密度等因素影響。";
  s +="月亮升起 " + dToStr(tail(rm.s+c+0.5)) + " 月亮降落 " + dToStr(tail(rm.j+c+0.5))+" ";
  s +="月上中天 " + dToStr(tail(rm.z+c+0.5)) + " 月下中天 " + dToStr(tail(rm.x+c+0.5))+"<br>";
 if(r.sm) s = '在極地晝夜期（註：夏晝，冬夜）<br>極地夏季太陽、冬季月亮在天上或在地平線轉圈，無日月出落時間<br>';
 return dxj+vJ+'度 '+nbw+vW+'度日月升降補充：<br>'+s+sn+sm+'◆以上本地時間要轉為中國通用的東8區(東經120°)時間請：'+sqc2a+sqc2b+zhusi;
}
function RTS1(jd,vJ,vW,tz){
 SZJ.calcRTS(jd, 2, (vJ/180*Math.PI), (vW/180*Math.PI), (tz*-1)); //升降計算,使用北時時間,tz=-8指東8區,jd+tz應在當地正午左右(誤差數小時不要緊)
 var s, ob = SZJ.rts[0];var sqa=vJ/15,c=J2000+sqa/24,sqc=(8-sqa)/24;var sqc2='減';var sqc2a='加上';if(sqc<0)sqc2='加',sqc2a='減去';var sqc2b=dToStr((abs(sqc)));
 s  = '日出 <font color=red>'+ob.s + '</font> 日落 '+ob.j +' 日上中天 '+ob.z +' 日下中天 '+ob.x +'<br>';
 s += '月出 '+ob.Ms+ ' 月落 '+ob.Mj+' 月上中天 '+ob.Mz+' 月下中天 '+ob.Mx+'<br>';
 s += '天亮 '+ob.c + ' 天黑 '+ob.h +'';
 s += '日照時間 '+ob.sj+ ' 白天長度 '+ob.ch+'<br>';
 if(ob.sm)s='在極地晝夜期（註：夏晝，冬夜）<br>極地夏季太陽、冬季月亮在天上或在地平線轉圈<br>無日月出落時間，無晨昏時間<br>';
 var v=s;
 return v;
}
 function zdysi2(y1,m1,d1,h1,mi1,sec,zone){
 var mi2=abs(mi1);var jd=JD(y1,m1,d1,h1,mi2,sec,zone)+0.000000001;var Jw=zone*15;
 var J=Jw/radd;var Jwts=abs(round(Jw*10000)/10000);
 var jda2=jd-2451545;var jda2a=jda2;
 var jd2 = jda2+dt_T(jda2);//力學時
 var jd9 =pty_zty(jd2/36525);var dtu=dt_T(jd2);
 jda2 += jd9+J/Math.PI/2+0.5;
 var jda2a=jd-2451545+J/Math.PI/2+0.5;
 var jd4=tail(jda2); var jd5=dToStr(jd4);var jd6=dToStr(tail(jda2a));
 var dxjm=(Jw>0)?'東經':'西經';if(Jw==0)dxjm='東西經';var jd7=m2fm(jd9*86400,2,1);
 var zsqc=(zone-8)/24;var sqc4a='減';if(zsqc<0)sqc4a='加';var sqc3b=dToStr(abs(zsqc));
 var dxts='<a tips6="補充：<br>1、真太陽時與平太陽時時差：'+jd7+'<br>2、中國通用時間(東經120°時間)與'+dxjm+Jwts+'°的本地時間差：'+sqc4a+sqc3b+'<br>3、要轉為中國通用的北京標準時間(120°時間)請：'+sqc4a+sqc3b;
 dxts += '<br>4、ΔT=' + (dtu*86400).toFixed(2) +'秒">';
 var vd=dxts+dxjm+Jwts+'°時間'+jd6+'(<font color="#FF0000">'+dxts+'真太陽時'+jd5+'</a></font>)</a>';
 return vd;
 }

 function zdysi3(jd,zone,faW,kka,jda3){
 var Jw=zone*15;var sqa=Jw/15,c=J2000+sqa/24,sqc=(8-sqa)/24;var sqc2='減';var sqc2a='加上';if(sqc<0)sqc2='加',sqc2a='減去';var sqc2b=dToStr((abs(sqc)));
 var jda2=jd-2451545+0.0000000001;var jda2a=jda2;var smsja=(kka==1)?RTS1(jda3,Jw,faW,zone)+'<br>'+RTS2(jda3,Jw,faW,zone):'<a tips8="'+RTS2(jda3,Jw,faW,zone)+'">'+RTS1(jda3,Jw,faW,zone)+'</a>';
 var jd2 = jda2+dt_T(jda2); //力學時
 var L=Jw/180*Math.PI;var fa=faW/180*Math.PI;var high=0;
  this.T=jd2, this.L=L, this.fa=fa;
  this.dt = dt_T(T); //TD-UT
  this.jd = T - this.dt;    //UT
  T/=36525;
  var zd = nutation2(T);
  this.dL = zd[0];   //黃經章
  this.dE = zd[1];   //交角章動
  this.E  = hcjj(T) + this.dE; //真黃赤交角
  this.gst= pGST(this.jd,this.dt) + this.dL*Math.cos(this.E); //真恒星時(不考慮非多項式部分)
  var z=new Array();
  //=======月亮========
  //月亮黃道坐標
  z=m_coord(T,-1,-1,-1); //月球坐標
  z[0]  = rad2mrad( z[0]+gxc_moonLon(T)+this.dL );  z[1] += gxc_moonLat(T);  //補上月球光行差及章動
  this.mHJ = z[0]; this.mHW = z[1]; this.mR  = z[2]; //月球視黃經,視黃緯,地月質心距

  //月球赤道坐標
  z = llrConv( z, this.E ); //轉為赤道坐標
  this.mCJ = z[0]; this.mCW = z[1]; //月球視赤經,月球赤緯

  //月亮時角計算
  this.mShiJ = rad2mrad(this.gst + L - z[0]); //得到此刻天體時角
  if( this.mShiJ>Math.PI ) this.mShiJ -= pi2;

  //修正了視差的赤道坐標
  parallax(z, this.mShiJ,fa, high); //視差修正
  this.mCJ2 = z[0], this.mCW2 = z[1], this.mR2=z[2];

  //月亮時角坐標
  z[0] += Math.PI/2-this.gst-L;  //轉到相對於地平赤道分點的赤道坐標(時角坐標)

  //月亮地平坐標
  z = llrConv (z, Math.PI/2-fa );    //轉到地平坐標(只改經緯度)
  z[0] = rad2mrad( Math.PI/2-z[0] );
  this.mDJ = z[0]; this.mDW = z[1]; //方位角,高度角
  if(z[1]>0) z[1] += MQC(z[1]); //大氣折射修正
  this.mPJ = z[0]; this.mPW = z[1]; //方位角,高度角

  //=======太陽========
  //太陽黃道坐標
  z = e_coord(T,-1,-1,-1);   //地球坐標
  z[0]  = rad2mrad(z[0]+Math.PI+gxc_sunLon(T)+this.dL);  //補上太陽光行差及章動
  z[1]  =-z[1] + gxc_sunLat(T); //z數組為太陽地心黃道視坐標
  this.sHJ = z[0]; this.sHW = z[1]; this.sR  = z[2]; //太陽視黃經,視黃緯,日地質心距

  //太陽赤道坐標
  z = llrConv( z, this.E ); //轉為赤道坐標
  this.sCJ = z[0]; this.sCW = z[1]; //太陽視赤經,視赤緯

  //太陽時角計算
  this.sShiJ = rad2mrad(this.gst + L - z[0]); //得到此刻天體時角
  if( this.sShiJ>Math.PI ) this.sShiJ -= pi2;

  //修正了視差的赤道坐標
  parallax(z,this.sShiJ,fa,high); //視差修正
  this.sCJ2=z[0], this.sCW2=z[1], this.sR2=z[2];

  //太陽時角坐標
  z[0] += Math.PI/2-this.gst-L;  //轉到相對於地平赤道分點的赤道坐標

  //太陽地平坐標
  z = llrConv( z, Math.PI/2-fa );
  z[0] = rad2mrad( Math.PI/2-z[0] );
  this.sDJ = z[0]; this.sDW = z[1]; //方位角,高度角

  if(z[1]>0) z[1] += MQC(z[1]); //大氣折射修正
  this.sPJ = z[0]; this.sPW = z[1]; //方位角,高度角

  //=======其它========
  //時差計算
  var t=T/10, t2=t*t,t3=t2*t,t4=t3*t,t5=t4*t;
  var Lon = ( 1753470142 + 6283319653318*t + 529674*t2 + 432*t3 - 1124*t4 - 9*t5 )/1000000000 + Math.PI - 20.5/rad; //修正了光行差的太陽平黃經
  Lon = rad2mrad( Lon - (this.sCJ-this.dL*Math.cos(this.E)) ); //(修正了光行差的平黃經)-(不含dL*cos(E)的視赤經)
  if(Lon>Math.PI) Lon-=pi2; //得到時差,單位是弧度
  this.sc  = Lon/pi2;   //時差(單位:日)

  //真太陽與平太陽
  this.pty = this.jd+L/pi2;  //平太陽時'+dToStr(tail(this.pty+0.5))+'
  this.zty = this.jd+L/pi2+this.sc; //真太陽時
  this.mIll = XL.moonIll(T); //月亮被照面比例
  //時差計算
  var t=T/10, t2=t*t,t3=t2*t,t4=t3*t,t5=t4*t;
  var Lon = ( 1753470142 + 6283319653318*t + 529674*t2 + 432*t3 - 1124*t4 - 9*t5 )/1000000000 + Math.PI - 20.5/rad; //修正了光行差的太陽平黃經
  Lon = rad2mrad( Lon - (this.sCJ-this.dL*Math.cos(this.E)) ); //(修正了光行差的平黃經)-(不含dL*cos(E)的視赤經)
  if(Lon>Math.PI) Lon-=pi2; //得到時差,單位是弧度
  this.sc  = Lon/pi2;   //時差(單位:日)

  var rzl='太陽：視黃經 ' + rad2str(this.sHJ,0)+'視黃緯 ' + rad2str(this.sHW,0) +'視赤經 ' + rad2str(this.sCJ,1) +'視赤緯 ' + rad2str(this.sCW,0) +'<br>太陽：方位角 '+rad2str(this.sPJ,0)+'高度角 '+rad2str(this.sPW,0)+'時角 ' +rad2str(this.sShiJ,0)+'<br>月亮：視黃經 ' + rad2str(this.mHJ,0)+'視黃緯 ' + rad2str(this.mHW,0) +'視赤經 ' + rad2str(this.mCJ,1) +'視赤緯 ' + rad2str(this.mCW,0) +'<br>月亮：方位角 '+rad2str(this.mPJ,0)+'高度角 '+rad2str(this.mPW,0)+'時角 ' +rad2str(this.mShiJ,0);
  var vzl2='月被照亮:'+(this.mIll*100).toFixed(3)+'% 地月距離≈'+this.mR.toFixed(2)+'千米.日地距離≈'+(this.sR*149597870).toFixed(2)+'千米';

  var vzl=(kka==1)?'<font color=#000080>'+vzl2+'</font><br><font color=#800080>經'+rad2str2(L)+'緯'+rad2str2(fa)+'</font>的坐標：地方平太陽時：'+dToStr(tail(this.pty+0.5))+'(<font color="#FF0000">地方真太陽時：'+dToStr(tail(this.zty+0.5))+'</font>，時差：'+m2fm(this.sc*86400,2,1)+'，ΔT=' + (this.dt*86400).toFixed(2) +'秒)<br><font color=#000040><a tips8="經'+Jw+'緯'+faW+'計算的日月升降<br>'+smsja+'">'+rzl+'</a></font>':'<font color=#500000>'+smsja+'</font><font color=#FF0000><a tips7="<span class=zh12>'+'經'+Jw+'緯'+faW+'補充：<br>'+rzl+'</span>">註：日月出落是當地平太陽時，轉東經120°(中國通用時間)：'+sqc2a+sqc2b+'</a></font><br><a tips7="<span class=zh12>'+'經'+Jw+'緯'+faW+'補充：<br>'+rzl+'</span>">'+vzl2+'</a>';
 return vzl;
 }
