<!--
// 暦注計算
//
// 九星計算（陽・陰遁転換日。標準間隔の日付はスキップしている）
var KyuuseiName = new Array('一白','二黒','三碧','四緑','五黄','六白','七赤','八白','九紫');
var KyuuseiName2= new Array('水星','土星','木星','木星','土星','金星','金星','土星','火星');
var NKyuusei = new Array(-1,-1,-1);	// 現在の遁の開始、期間、開始星を返す為の配列

var NKjisa = (65.0 / 3600.0 + 9.0) / 24.0;	// 日本の時差 + 最近のΔT :: 手抜き

// 指定年月の節月（定気法）の開始日のJD を返す（1583以降に限る）
function GetSetsugetsu(yy,mm) {
	var lng,dd;
	if (mm >= 12) {
		yy += 1;
	}
	lng = (315 + (mm - 1) * 30) % 360;
	dd = top.Sunlongdays(yy,lng) + NKjisa;
	return top.Ymd2Jd(yy,1,dd);
}

// 九星の呼び名を得る

// 西暦年の九星を得る(0-8 が戻り値)
function Year2Kyuusei(yy)
{
	return 8 - ((yy + 115) % 9);
}
// 節年月の九星を得る(0-8 が戻り値)
function Month2Kyuusei(yy,mm)
{
	return 8 - (((yy + 116) * 12 + mm) % 9);
}
// 西暦年の九星名（短）を得る
function Year2KyuuseiNameS(yy) {
	var ans;
	ans = Year2Kyuusei(yy);
	return KyuuseiName[ans];
}
// 西暦年の九星名（長）を得る
function Year2KyuuseiNameL(yy) {
	var ans;
	ans = Year2Kyuusei(yy);
	return KyuuseiName[ans] + KyuuseiName2[ans];
}
// 節年月の九星名（短）を得る
function Month2KyuuseiNameS(yy,mm) {
	var ans;
	ans = Month2Kyuusei(yy,mm);
	return KyuuseiName[ans];
}
// 節年月の九星名（長）を得る
function Month2KyuuseiNameL(yy,mm) {
	var ans;
	ans = Month2Kyuusei(yy,mm);
	return KyuuseiName[ans] + KyuuseiName2[ans];
}


// JD から九星の呼び名（短）を得る
function Jd2KyuuseiNameS(JD)
{
	var ans;
	ans = Jd2Kyuusei(JD);
	if (ans >= 0) return KyuuseiName[ans];
	return '';
}

// JD から九星の呼び名（長）を得る
function Jd2KyuuseiNameL(JD)
{
	var ans;
	ans = Jd2Kyuusei(JD);
	if (ans >= 0) {
		return (KyuuseiName[ans] + KyuuseiName2[ans]);
	}
	return '';
}

// JD から日家9星を求める（答えは 0-8）
function Jd2Kyuusei(JD)
{
	var flag,base;
	JD = Math.floor(JD);
	if ((JD < NKyuusei[0]) || (JD - NKyuusei[0] >= NKyuusei[1])){
		if (GetTenton(JD) < 0) return -1;	// 計算範囲外の日付
	}
	if (NKyuusei[2] < 0) {flag = -1;}
	else { flag = 1;}
	base = flag * NKyuusei[2] - 1 + 270;
	base += (JD - NKyuusei[0]) * flag;
	return base % 9;
}


// JD を含む9星の転遁の開始とユリウス日と期間、開始の星番号を得る
// 星番号が負なら、陰遁。正なら陽遁
// 戻り値は NKyuusei[0,1,2] の、 2450830,210,-1 のようにして返す
// 冬至、夏至の日が甲子(0)〜癸巳(29)なら、直前の甲子、
// 甲午(30)〜癸亥(59)なら、直後の甲子が転遁日
// 2005.06.09〜2010.04.27までは甲子(0)〜壬辰(28),癸巳(29)〜癸亥(59)としていた。
function GetTenton(JD) {
	var KJD = new Array(2);
	var KJDF = new Array(2);
	var njd = new Array(2);
	var kan = new Array(2);
	var n,yy,yyt,yyn,mm,dd,days,flag,lg;

	JD = Math.floor(JD);
	if ((JD < NKyuusei[0]) || (JD >= NKyuusei[0] + NKyuusei[1])) {
		yy = Math.floor(JD / 365.2422 - 4712);	// およその西暦計算
		n = 1;	// 見つけたら n = 0;
		yyt = yy + 0.25;
// ---------- 転遁のJD を探索 ------------
		while (n != 0) {
			yyn = Math.floor(yyt);
			lg = (yyt - Math.floor(yyt)) * 360.0;
			dd = top.Sunlongdays(yyn,lg) + NKjisa;
			days = top.Ymd2Jd(yyn,1,dd);
			KJD[0] = Math.floor(days);	// 夏至・冬至のJD 整数
			days = Math.floor(days - Math.floor(days / 60.0) * 60.0);
			days = (days + 50) % 60; // 六十干支番号
			if (days < 30) {
				KJD[0] -= days;
			} else {
				KJD[0] += (60 - days);
			}

			if (KJD[0] > JD) {
				yyt -= 0.5;	// 半年前の転遁時期計算
			} else {
				yyt += 0.5;
				yyn = Math.floor(yyt);
				lg = (yyt - yyn) * 360.0;
				dd = top.Sunlongdays(yyn,lg) + NKjisa;
				days = top.Ymd2Jd(yyn,1,dd);
				KJD[1] = Math.floor(days);	// 夏至・冬至のJD 整数

				days = Math.floor(days - Math.floor(days / 60.0) * 60.0);
				days = (days + 50) % 60; // 六十干支番号
				if (days < 30) {
					KJD[1] -= days;
				} else {
					KJD[1] += (60 - days);
				}
				if (KJD[1] <= JD) {
					yyt += 0.5;	// 半年後の転遁時期計算
				} else {
					n = 0;	// 発見！
				}
			}
		}
// ---------- 転遁のJD を探索 ------------

		NKyuusei[0] = KJD[0];
		NKyuusei[1] = 180;
		if ((yyt - yyn) > 0.5) {
			flag = -9;	// 夏至〜冬至：陰遁
			if (JD - NKyuusei[0] >= 180) {	// 閏処理
				flag = -9;
				NKyuusei[1] = 30;
				NKyuusei[0] += 180;
				if (JD - NKyuusei[0] >= 30) {
					flag = 7;
					NKyuusei[0] += 30;
				}
			}
			NKyuusei[2] = flag;
		} else {
			flag = 1;	// 冬至〜夏至：陽遁
			if (JD - NKyuusei[0] >= 180) {	// 閏処理
				flag = 1;
				NKyuusei[1] = 30;
				NKyuusei[0] += 180;

				if (JD - NKyuusei[0] >= 30) {
					flag = -3;
					NKyuusei[0] += 30;
				}
			}
			NKyuusei[2] = flag;
		}
	}
	return NKyuusei[0];	// 開始のユリウス日を返す。
}
//-->
