//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
//-- 初期設定 --
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
//ラジアン
function radian(){
	return 3.1416/180.0;
}

//傾斜角
function ep(){
	return 23.439;
}

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
//-- Main --
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
function hinode(longitude,latitude,altitude){
    t0=julius2000()/365.25;
    kk=-0.8-0.035*Math.sqrt(altitude);
    d0=0.25;
		
	for(i=1;i<5;i++){
        t=(julius2000()+d0)/365.25;
        tk=-Math.acos((Math.sin(kk*radian())-Math.sin(taiyouSekiiWithTaiyouJikaku(t)*radian())*Math.sin(latitude*radian()))/Math.cos(taiyouSekiiWithTaiyouJikaku(t)*radian())/Math.cos(latitude*radian()))/radian();
        tt=kouseiji(longitude, t0, d0)-taiyouSekikeiWithTaiyouJikaku(t);
        dd=(tk-tt)/360;
        if(0.5<dd)	{dd--;}
        if(-0.5>dd) {dd++;}
        d0+=dd;
    }
    
    hd= Math.floor(d0*24);
    md= Math.floor((d0*24-hd)*60+0.5);
    if(md==60){	md=0;	hd=hd+1;}
    
    return timeAdjust(hd,md);
}

function hinoiri(longitude,latitude,altitude){
    t0=julius2000()/365.25;
    kk=-0.8-0.035*Math.sqrt(altitude);
    d0=0.75;
		
	for(i=1;i<5;i++){
        t=(julius2000()+d0)/365.25;
        tk=Math.acos((Math.sin(kk*radian())-Math.sin(taiyouSekiiWithTaiyouJikaku(t)*radian())*Math.sin(latitude*radian()))/Math.cos(taiyouSekiiWithTaiyouJikaku(t)*radian())/Math.cos(latitude*radian()))/radian();
        tt=kouseiji(longitude, t0, d0)-taiyouSekikeiWithTaiyouJikaku(t);
        dd=(tk-tt)/360;
        if(0.5<dd)	{dd--;}
        if(-0.5>dd) {dd++;}
        d0+=dd;
    }
    
    hd= Math.floor(d0*24);
    md= Math.floor((d0*24-hd)*60+0.5);
    if(md==60){	md=0;	hd=hd+1;}
    
    return timeAdjust(hd,md);
}

function yoake(longitude,latitude,altitude){
    t0=julius2000()/365.25;
    kk=-7.3;
    d0=0.20;
		
	for(i=1;i<5;i++){
        t=(julius2000()+d0)/365.25;
        tk=-Math.acos((Math.sin(kk*radian())-Math.sin(taiyouSekiiWithTaiyouJikaku(t)*radian())*Math.sin(latitude*radian()))/Math.cos(taiyouSekiiWithTaiyouJikaku(t)*radian())/Math.cos(latitude*radian()))/radian();
        tt=kouseiji(longitude, t0, d0)-taiyouSekikeiWithTaiyouJikaku(t);
        dd=(tk-tt)/360;
        if(0.5<dd)	{dd--;}
        if(-0.5>dd) {dd++;}
        d0+=dd;
    }
    
    hd= Math.floor(d0*24);
    md= Math.floor((d0*24-hd)*60+0.5);
    if(md==60){	md=0;	hd=hd+1;}
    
    return timeAdjust(hd,md);
}


function higure(longitude,latitude,altitude){
    t0=julius2000()/365.25;
    kk=-7.3;
    d0=0.80;
		
	for(i=1;i<5;i++){
        t=(julius2000()+d0)/365.25;
        tk=Math.acos((Math.sin(kk*radian())-Math.sin(taiyouSekiiWithTaiyouJikaku(t)*radian())*Math.sin(latitude*radian()))/Math.cos(taiyouSekiiWithTaiyouJikaku(t)*radian())/Math.cos(latitude*radian()))/radian();
        tt=kouseiji(longitude, t0, d0)-taiyouSekikeiWithTaiyouJikaku(t);
        dd=(tk-tt)/360;
        if(0.5<dd)	{dd--;}
        if(-0.5>dd) {dd++;}
        d0+=dd;
    }
    
    hd= Math.floor(d0*24);
    md= Math.floor((d0*24-hd)*60+0.5);
    if(md==60){	md=0;	hd=hd+1;}
    
    return timeAdjust(hd,md);
}

function tsukinode(longitude,latitude){
	return "";
	t0=julius2000()/365.25;
    d0=0.5;
		
	for(i=1;i<6;i++){
        t=(julius2000()+d0)/365.25;
		ctk=-(Math.sin(tukiSekiiWithTaiyouJikaku(t)*radian())*Math.sin(latitude*radian()))/Math.cos(tukiSekiiWithTaiyouJikaku(t)*radian())/Math.cos(latitude*radian());
		
		tk=-Math.acos(ctk)/radian();
		
		tt=kouseiji(longitude, t0, d0)-tukiSekikeiWithTaiyouJikaku(t);
		
		return tukiKouiWithTaiyouJikaku(t);
		
		
		dd=(tk-tt)/360;
        if(0.5<dd)	{dd--;}
        if(-0.5>dd) {dd++;}
        d0+=dd;
    }
    
	if(0<d0 && d0<1.04){
		hd= Math.floor(d0*24);
		md= Math.floor((d0*24-hd)*60+0.5);
		if(md==60){	md=0; hd=hd+1;}
		return timeAdjust(hd,md);
	}
	
	return "";
}

function tsukinoiri(longitude,latitude){
	return "";
	t0=julius2000()/365.25;
    d0=0.5;
		
	for(i=1;i<5;i++){
        t=(julius2000()+d0)/365.25;
		ctk=-(Math.sin(tukiSekiiWithTaiyouJikaku(t)*radian())*Math.sin(latitude*radian()))/Math.cos(tukiSekiiWithTaiyouJikaku(t)*radian())/Math.cos(latitude*radian());
		tk=-Math.cos(ctk)/radian();
		tt=kouseiji(longitude, t0, d0)-tukiSekikeiWithTaiyouJikaku(t);
        if(0.5<dd)	{dd--;}
        if(-0.5>dd) {dd++;}
        d0+=dd;
    }
    
	if(d0<0.4){
		d0=d0+0.5;
	}else{
		if(d0>0.6){
			d0=d0-0.5;
		}else{
			d0=0.5;
		}
	}

	for(i=1;i<5;i++){
		t=(julius2000()+d0)/365.25;
		ctk=-(Math.sin(tukiSekiiWithTaiyouJikaku(t)*radian())*Math.sin(latitude*radian()))/Math.cos(tukiSekiiWithTaiyouJikaku(t)*radian())/Math.cos(latitude*radian());
		tk=Math.cos(ctk)/radian();
		tt=kouseiji(longitude, t0, d0)-tukiSekikeiWithTaiyouJikaku(t);
        if(0.5<dd)	{dd--;}
        if(-0.5>dd) {dd++;}
        d0+=dd;
	}
        
	if(0<d0 && d0<1.04){
		hd= Math.floor(d0*24);
		md= Math.floor((d0*24-hd)*60+0.5);
		if(md==60){	md=0; hd=hd+1;}
		return timeAdjust(hd,md);
	}
				
	return "-";
}
	
//--------------------------------------------------------------------------------------------------------//
// -- 太陽時角--
//--------------------------------------------------------------------------------------------------------//
function taiyouJikaku(baseT){
	return (julius2000()+baseT)/365.25;
}
	
//--------------------------------------------------------------------------------------------------------//
// -- 経度緯度--
//--------------------------------------------------------------------------------------------------------//
function longitudeStr(longitude){
    if(longitude>0){
        return "東経 "+longitude;
    }else{
        return "西経 "+(longitude*(-1));
    }
    return "東経 "+longitude;
}

function latitudeStr(latitude){
     if(latitude>0){
        return "北緯 "+latitude;
    }else{
        return "南緯 "+(latitude*(-1));
    }
    return "南緯 "+latitude;
}

//--------------------------------------------------------------------------------------------------------//
// -- Sun--
//--------------------------------------------------------------------------------------------------------//
function taiyouSekiiWithTaiyouJikaku(t){
	var taiyouKoukei=taiyouKoukeiWithTaiyouJikaku(t);
	var sdl=Math.sin(taiyouKoukei*radian())*Math.sin(ep()*radian());
	return Math.sin(sdl)/radian();
}

function taiyouSekikeiWithTaiyouJikaku(t){
    var taiyouKoukei=taiyouKoukeiWithTaiyouJikaku(t);
    var tal=Math.tan(taiyouKoukei*radian())*Math.cos(ep()*radian());
    var al =Math.atan(tal)/radian();
    al=al+360;
    al=al-Math.floor(al/180)*180;
    if(taiyouKoukei>180){al=al+180};
    return al;
}

function taiyouKoukeiWithTaiyouJikaku(t){
    ls=2080.46+360.00769*t;									ls=ls+(1.9146-0.00005*t)*Math.sin((357.583+359.991*t)*radian());	ls=ls+0.02*Math.sin((355.05+719.981*t)*radian());
	ls=ls+0.0048*Math.sin((234.95+19.341*t)*radian());		ls=ls+0.002  *Math.sin((247.1  +329.64*t)*radian());				ls=ls+0.0018*Math.sin((297.8+4452.67*t)*radian());
	ls=ls+0.0018*Math.sin((251.3  +0.2*t)*radian());		ls=ls+0.0015*Math.sin((343.2 +450.37*t)*radian());					ls=ls+0.0013*Math.sin((  81.4 +225.18*t)*radian());
	ls=ls+0.0008*Math.sin((132.5 +659.29*t)*radian());		ls=ls+0.0007*Math.sin((153.3 +90.38*t)*radian());					ls=ls+0.0007*Math.sin((206.8 +30.35*t)*radian());
	ls=ls+0.0006*Math.sin((29.8 +337.18*t)*radian());		ls=ls+0.0005*Math.sin((207.4+1.5*t)*radian());						ls=ls+0.0005*Math.sin((291.2+22.81*t)*radian());
	ls=ls+0.0004*Math.sin((234.9+315.56*t)*radian());		ls=ls+0.0004*Math.sin((157.3+299.3*t)*radian());					ls=ls+0.0004*Math.sin((21.1+720.02*t)*radian());
	ls=ls+0.0003*Math.sin((352.5+1079.97*t)*radian());		ls=ls+0.0003*Math.sin((329.7+44.43*t)*radian());					ls = ls-Math.floor(ls/360)*360;
	ls+=0.008;
	return ls;
}

//--------------------------------------------------------------------------------------------------------//
// -- Moon --
//--------------------------------------------------------------------------------------------------------//
function tukiKoukeiWithTaiyouJikaku(t){
	am=0.004*Math.sin((119.5+1.33*t)*radian())+0.002*Math.sin((55+19.34*t)*radian());
	am=am+0.0006*Math.sin((71+0.2*t)*radian())+0.0006*Math.sin((54+19.3*t)*radian());
		
	ls=2018.3161+4812.67881*t;
	ls=ls+6.2887*Math.sin((134.961+4771.9886*t+am)*radian());	ls=ls+1.274  *Math.sin((100.738+4133.3536*t)*radian());		ls=ls+0.6583*Math.sin((235.7+8905.3422*t)*radian());
	ls=ls+0.2136*Math.sin((269.926+9543.9773*t)*radian());		ls=ls+0.1856*Math.sin((177.525+359.9905*t)*radian());		ls=ls+0.1143*Math.sin((6.546+9664.0404*t)*radian());
	ls=ls+0.0588*Math.sin((214.22+638.635*t)*radian());			ls=ls+0.0572*Math.sin((103.21+3773.363*t)*radian());		ls=ls+0.0533*Math.sin((10.66+13677.331*t)*radian());
	ls=ls+0.0459*Math.sin((238.18+8545.352*t)*radian());		ls=ls+0.041  *Math.sin((137.43+4411.998*t)*radian());		ls=ls+0.0348*Math.sin((117.84+4452.671*t)*radian());
	ls=ls+0.0305*Math.sin((312.49+5131.979*t)*radian());		ls=ls+0.0153*Math.sin((130.84+758.698*t)*radian());			ls=ls+0.0125*Math.sin((141.51+14436.029*t)*radian());
	ls=ls+0.011  *Math.sin((231.59+4892.052*t)*radian());		ls=ls+0.0107*Math.sin((336.44+13038.696*t)*radian());		ls=ls+0.01    *Math.sin((44.89+14315.966*t)*radian());
	ls=ls+0.0085*Math.sin((201.5+8266.71*t)*radian());			ls=ls+0.0079*Math.sin((278.2+4493.34*t)*radian());			ls=ls+0.0068*Math.sin((53.2+9265.33*t)*radian());
	ls=ls+0.0052*Math.sin((197.2+319.32*t)*radian());			ls=ls+0.005  *Math.sin((295.4+4812.66*t)*radian());			ls=ls+0.0048*Math.sin((235+19.34*t)*radian());
	ls=ls+0.004  *Math.sin((13.2+13317.34*t)*radian());			ls=ls+0.004  *Math.sin((145.6+18449.32*t)*radian());		ls=ls+0.004  *Math.sin((119.5+1.33*t)*radian());
	ls=ls+0.0039*Math.sin((111.3+17810.68*t)*radian());			ls=ls+0.0037*Math.sin((349.1+5410.62*t)*radian());			ls=ls+0.0027*Math.sin((272.5+9183.99*t)*radian());
	ls=ls+0.0026*Math.sin((107.2+13797.39*t)*radian());			ls=ls+0.0024*Math.sin((211.9+988.63*t)*radian());			ls=ls+0.0024*Math.sin((252.8+9224.66*t)*radian());
	ls=ls+0.0022*Math.sin((240.6+8185.36*t)*radian());			ls=ls+0.0021*Math.sin((87.5+9903.97*t)*radian());			ls=ls+0.0021*Math.sin((175.1+719.98*t)*radian());
	ls=ls+0.0021*Math.sin((105.6+3413.37*t)*radian());			ls=ls+0.002  *Math.sin((55+19.34*t)*radian());				ls=ls+0.0018*Math.sin((4.1+4013.29*t)*radian());
	ls=ls+0.0016*Math.sin((242.2+18569.38*t)*radian());
	ls=ls+0.0012*Math.sin((339+12678.71*t)*radian());			ls=ls+0.0011*Math.sin((276.5+19208.02*t)*radian());			ls=ls+0.0009*Math.sin((218+8586*t)*radian());
	ls=ls+0.0008*Math.sin((188+14037.3*t)*radian());			ls=ls+0.0008*Math.sin((204+7906.7*t)*radian());				ls=ls+0.0007*Math.sin((140+4052*t)*radian());
	ls=ls+0.0007*Math.sin((275+4853.3*t)*radian());				ls=ls+0.0007*Math.sin((216+278.6*t)*radian());				ls=ls+0.0006*Math.sin((128+1118.7*t)*radian());
	ls=ls+0.0005*Math.sin((247+22582.7*t)*radian());			ls=ls+0.0005*Math.sin((181+19088*t)*radian());				ls=ls+0.0005*Math.sin((114+17450.7*t)*radian());
	ls=ls+0.0005*Math.sin((332+5091.3*t)*radian());				ls=ls+0.0004*Math.sin((313+398.7*t)*radian());				ls=ls+0.0004*Math.sin((278+120.1*t)*radian());
	ls=ls+0.0004*Math.sin((71+9584.7*t)*radian());				ls=ls+0.0004*Math.sin((20+720*t)*radian());					ls=ls+0.0003*Math.sin((83+3814*t)*radian());
	ls=ls+0.0003*Math.sin((66+3494.7*t)*radian());				ls=ls+0.0003*Math.sin((147+18089.3*t)*radian());			ls=ls+0.0003*Math.sin((311+5492*t)*radian());
	ls=ls+0.0003*Math.sin((161+40.7*t)*radian());				ls=ls+0.0003*Math.sin((280+23221.3*t)*radian());
	return ls-Math.floor(ls/360)*360;
}
	



function tukiKouiWithTaiyouJikaku(t){
	bbm=0.0267*Math.sin((234.95+19.341*t)*radian())+0.0043*Math.sin((322.1+19.36*t)*radian());
	bbm=bbm+0.004*Math.sin((119.5+1.33*t)*radian())+0.0026*Math.sin((55+19.34*t)*radian());												bbm=bbm+0.0005*Math.sin((307+19.4*t)*radian());
	bm=5.1282*Math.sin((93.273+4832.0202*t+bbm)*radian());				bm=bm+0.2806*Math.sin((228.235+9604.0088*t)*radian());			bm=bm+0.2777*Math.sin((138.311+60.0316*t)*radian());
	bm=bm+0.1732*Math.sin((142.427+4073.322*t)*radian());				bm=bm+0.0554*Math.sin((194.01+8965.374*t)*radian());			bm=bm+0.0463*Math.sin((172.55+698.667*t)*radian());
	bm=bm+0.0326*Math.sin((328.96+13737.362*t)*radian());				bm=bm+0.0172*Math.sin((3.18+14375.997*t)*radian());				bm=bm+0.0093*Math.sin((277.4+8845.31*t)*radian());
	bm=bm+0.0088*Math.sin((176.7+4711.96*t)*radian());					bm=bm+0.0082*Math.sin((144.9+3713.33*t)*radian());				bm=bm+0.0043*Math.sin((307.6+5470.66*t)*radian());
	bm=bm+0.0042*Math.sin((103.9+18509.35*t)*radian());					bm=bm+0.0034*Math.sin((319.9+4433.31*t)*radian());
	bm=bm+0.0025*Math.sin((196.5+8605.38*t)*radian());					bm=bm+0.0022*Math.sin((331.4+13377.37*t)*radian());				bm=bm+0.0021*Math.sin((170.1+1058.66*t)*radian());
	bm=bm+0.0019*Math.sin((230.7+9244.02*t)*radian());					bm=bm+0.0018*Math.sin((243.3+8206.68*t)*radian());				bm=bm+0.0018*Math.sin((270.8+5192.01*t)*radian());
	bm=bm+0.0017*Math.sin((99.8+14496.06*t)*radian());					bm=bm+0.0016*Math.sin((135.7+420.02*t)*radian());				bm=bm+0.0015*Math.sin((211.1+9284.69*t)*radian());
	bm=bm+0.0015*Math.sin((45.8+9964*t)*radian());						bm=bm+0.0014*Math.sin((219.2+299.96*t)*radian());				bm=bm+0.0013*Math.sin((95.8+4472.03*t)*radian());
	bm=bm+0.0013*Math.sin((155.4+379.35*t)*radian());					bm=bm+0.0012*Math.sin((38.4+4812.68*t)*radian());				bm=bm+0.0012*Math.sin((148.2+4851.36*t)*radian());
	bm=bm+0.0011*Math.sin((138.3+19147.99*t)*radian());					bm=bm+0.001*Math.sin((18+12978.66*t)*radian());					bm=bm+0.0008*Math.sin((70+17870.7*t)*radian());
	bm=bm+0.0008*Math.sin((326+9724.1*t)*radian());						bm=bm+0.0007*Math.sin((294+13098.7*t)*radian());				bm=bm+0.0006*Math.sin((224+5590.7*t)*radian());
	bm=bm+0.0006*Math.sin((52+13617.3*t)*radian());						bm=bm+0.0005*Math.sin((280+8485.3*t)*radian());					bm=bm+0.0005*Math.sin((239+4193.4*t)*radian());
	return bm;
}

function tukiSekiiWithTaiyouJikaku(t){
	bm=tukiKouiWithTaiyouJikaku(t);

	ls=tukiKoukeiWithTaiyouJikaku(t);
	u=Math.cos(bm*radian())*Math.cos(ls*radian());
	v=-Math.sin(bm*radian())*Math.sin(ep()*radian())+Math.cos(bm*radian())*Math.sin(ls*radian())*Math.cos(ep()*radian());
	w=Math.sin(bm*radian())*Math.cos(ep()*radian())+Math.cos(bm*radian())*Math.sin(ls*radian())*Math.sin(ep()*radian());
	tal=v/u;
	tdl=w/Math.sqrt(u*u+v*v);
		
	al=Math.tan(tal)/radian();
	al = al+360;
	al = al-Math.floor(al/180)*180;
	if(Math.abs(ls-al)>160 && Math.abs(ls-al)<330) {al=al+180};
		
	dl= Math.tan(tdl)/radian();
	return dl;
}

function tukiSekikeiWithTaiyouJikaku(t){
	bm=tukiKouiWithTaiyouJikaku(t);
	ls=tukiKoukeiWithTaiyouJikaku(t);
	u=Math.cos(bm*radian())*Math.cos(ls*radian());
	v=-Math.sin(bm*radian())*Math.sin(ep()*radian())+Math.cos(bm*radian())*Math.sin(ls*radian())*Math.cos(ep()*radian());
	tal=v/u;
	al=Math.tan(tal)/radian();
	al = al+360;
	al = al-Math.floor(al/180)*180;
	if(Math.abs(ls-al)>160 && Math.abs(ls-al)<330) {al=al+180;}
	return al;
}
	
//--------------------------------------------------------------------------------------------------------//
// -- Etc --
//--------------------------------------------------------------------------------------------------------//
function kouseiji(east,jikaku,t){
    th=685.4606+360.007700536*jikaku+0.00000003879*jikaku*jikaku+360.0*t+east;
    th = th-Math.floor(th/360)*360;
    return th;
}