//====================================================================
// 年間祝日定義情報保持クラス スクリプト
//====================================================================

/*
'------------------------------------------------------------------------------
' 関数名	:MakeHolidayDefineString
' 機能		:祝日定義情報(CHolidayDefine)コンストラクタ文字列を生成する
' 返り値	:祝日定義情報(CHolidayDefine)コンストラクタ文字列
' 引き数	:dt - (入)祝日(Date型)
' 				 name - (入)祝日名称
' 機能説明:なし
' 備考		:なし
*/
function MakeHolidayDefineString(dt, name) {
	var rval;

	rval = (dt.getMonth() + 1).toString(10);
	rval += "|" + (dt.getDate()).toString(10);
	rval += "|" + name;
	rval += "|" + dt.getFullYear().toString(10);
	rval += "|" + dt.getFullYear().toString(10);
	return rval;
}
/*
'------------------------------------------------------------------------------
' 関数名	:MakeMMDDKeyString
' 機能		:指定日付からユニークキー文字列を生成する
' 返り値	:ユニークキー文字列
' 引き数	:dt - (入)指定日付(Date型)
' 機能説明:なし
' 備考		:なし
*/
function MakeMMDDKeyString(dt) {
	return ((dt.getMonth() + 1) * 100 + dt.getDate()).toString(10);
}
/*
'------------------------------------------------------------------------------
' 関数名	:CHolidayYearDefine
' 機能		:年間祝日定義情報保持クラスコンストラクタ
' 返り値	:なし
' 引き数	:yyyy - (入)指定西暦年
' 機能説明:なし
' 備考		:なし
*/
function CHolidayYearDefine(yyyy) {
	var aHoliday, oHoliday, dt, edt, i;
	var nxtHoliday, nxtDt, j;

	aHoliday = new Array();
	this.m_holiday_define = new Array();
	for (i = 0; i < CHOLIDAY_TABLE.length; i++) {
		oHoliday = new CHolidayDefine(CHOLIDAY_TABLE[i]);
		dt = oHoliday.getHolidayDate(yyyy);
		if (dt != null) {
			if (oHoliday.getHolidayType() == CHTYPE_HOLIDAY) {
				aHoliday[MakeMMDDKeyString(dt)] = oHoliday;
				//振替休日
				if (dt.getDay() == 0) {
					if (yyyy >= 1973) {
						//振替休日(1973年4月12日制定、最初の適用は、1986年5月4日)
						edt = getNthDate(dt, 1);
						oHoliday = new CHolidayDefine(MakeHolidayDefineString(edt, "振替休日"));
						aHoliday[MakeMMDDKeyString(edt)] = oHoliday;
					}
					if (yyyy >= 2007) {
						//振替休日(2007年1月1日制定、最初の適用は、2008年5月6日)
						for (j = i + 1; j < CHOLIDAY_TABLE.length; j++) {
							nxtHoliday = new CHolidayDefine(CHOLIDAY_TABLE[j]);
							nxtDt = nxtHoliday.getHolidayDate(yyyy);
							if (getDateSpan(nxtDt, dt) != (j - i)) {
								edt = getNthDate(dt, (j - i));
								oHoliday = new CHolidayDefine(MakeHolidayDefineString(edt, "振替休日"));
								aHoliday[MakeMMDDKeyString(edt)] = oHoliday;
								break;
							} else {
								// 後で祝日になる
								oHoliday = new CHolidayDefine(MakeHolidayDefineString(nxtDt, "DUMMY"));
								aHoliday[MakeMMDDKeyString(nxtDt)] = oHoliday;
							}
						}
					}
				}
			} else {
				if (dt.getDay() != 0) {
					aHoliday[MakeMMDDKeyString(dt)] = oHoliday;
				}
			}
		}
	}
	//現在は必要ないが、CHOLIDAY_TABLEが日付順にならないような条件を含んだ場合は、ここでソートする
	if (yyyy > 1985) {
		//国民の休日(1985年12月27日制定、最初の適用は1986年5月4日)
		dt = null;
		for (i in aHoliday) {
			if (aHoliday[i].getHolidayType() == CHTYPE_HOLIDAY) {
				if (dt == null) {
					dt = aHoliday[i].getHolidayDate(yyyy);
					this.m_holiday_define[i] = aHoliday[i];
				} else {
					edt = aHoliday[i].getHolidayDate(yyyy);
					if (getDateSpan(edt, dt) == 2) {
						dt = getNthDate(dt, 1);
						oHoliday = new CHolidayDefine(MakeHolidayDefineString(dt, "国民の休日"));
						this.m_holiday_define[MakeMMDDKeyString(dt)] = oHoliday;
					}
					this.m_holiday_define[i] = aHoliday[i];
					dt = edt;
				}
			} else {
				this.m_holiday_define[i] = aHoliday[i];
			}
		}
	} else {
		for (i in aHoliday) {
			this.m_holiday_define[i] = aHoliday[i];
		}
	}
	//public
	this.IsHoliday = CHolidayYearDefine_IsHoliday;
	this.getHolidayName = CHolidayYearDefine_getHolidayName;
	this.getMonthHolidayList = CHolidayYearDefine_getMonthHolidayList;
}
/*
'------------------------------------------------------------------------------
' 関数名	:IsHoliday
' 機能		:指定日付が祝日か判定する
' 返り値	:true:祝日 false:祝日以外
' 引き数	:dt - (入)指定日付(Date型)
' 機能説明:なし
' 備考		:なし
*/
function CHolidayYearDefine_IsHoliday(dt) {
	return (this.m_holiday_define[MakeMMDDKeyString(dt)] != null);
}
/*
'------------------------------------------------------------------------------
' 関数名	:getHolidayName
' 機能		:祝日名称を返す
' 返り値	:祝日名称
' 引き数	:dt - (入)指定日付(Date型)
' 機能説明:なし
' 備考		:なし
*/
function CHolidayYearDefine_getHolidayName(dt) {
	return this.m_holiday_define[MakeMMDDKeyString(dt)].getHolidayName();
}
/*
'------------------------------------------------------------------------------
' 関数名	:getMonthHolidayList
' 機能		:月間祝日一覧文字列を返す
' 返り値	:月間祝日一覧文字列
' 引き数	:yyyy - (入)西暦年
' 				 mm  - (入)月
' 機能説明:なし
' 備考		:例 "1|元日$15|成人の日"
*/
function CHolidayYearDefine_getMonthHolidayList(yyyy, mm) {
	var i, dt, rval;

	mm--;
	rval = "";
	for (i in this.m_holiday_define) {
		dt = this.m_holiday_define[i].getHolidayDate(yyyy);
		if (dt.getMonth() == mm) {
			if (rval != "") { rval += "$"; }
			rval += dt.getDate() + "|" + this.m_holiday_define[i].getHolidayName();
		}
	}
	return rval;
}
/*------<< EOF >>------*/

