//====================================================================
// 祝日定義情報保持クラス スクリプト
//====================================================================
var CHOLIDAY_DEF_SEP = "|";						/* セパレータ */

/* 祝日定義 インデックス */
var CHIDX_MONTH			= 0;			/* 月 */
var CHIDX_DATE			= 1;			/* 日 (VE:春分の日 AE:秋分の日 H2:第２月曜 H3:第３月曜 */
var CHIDX_NAME			= 2;			/* 名称 */
var CHIDX_SYEAR			= 3;			/* 開始年 */
var CHIDX_EYEAR			= 4;			/* 終了年 */
var CHIDX_TYPE			= 5;			/* 種別 (H:祝祭日 E:拡張休日（社休日など） */
/* 
var 祝日種別 */
var CHTYPE_HOLIDAY	= "H"			/* 祝祭日 */
var CHTYPE_EXTRA		= "E"			/* 拡張休日 */
/*
'------------------------------------------------------------------------------
' 関数名	:getVEDate
' 機能		:指定西暦年の春分の日を求める
' 返り値	:春分の日(Date型)（計算範囲外の場合はnull）
' 引き数	:yyyy - (入)指定年（1851〜2150）
' 機能説明:なし
' 備考		:なし
*/
function getVEDate(yyyy) {
	var factor, tyear, dd, rval;

	if (yyyy >= 1851 && yyyy <= 2150) {
		if ((yyyy >= 1851) && (yyyy <= 1899)) { factor = 19.8277; tyear = 1983; }
		else if ((yyyy >= 1900) && (yyyy <= 1979)) { factor = 20.8357; tyear = 1983; }
		else if ((yyyy >= 1980) && (yyyy <= 2099)) { factor = 20.8431; tyear = 1980; }
		else if ((yyyy >= 2100) && (yyyy <= 2150)) { factor = 21.8510; tyear = 1980; }
		tyear = yyyy - tyear;
		dd = Math.floor(factor + 0.2421904 * tyear - Math.floor((tyear + 0.1) / 4));
		rval = new Date(yyyy, 2, dd);
	}
	return rval;
}
/*
'------------------------------------------------------------------------------
' 関数名	:getAEDate
' 機能		:指定西暦年の秋分の日を求める
' 返り値	:秋分の日(Date型)（計算範囲外の場合はnull）
' 引き数	:yyyy - (入)指定年
' 機能説明:なし
' 備考		:なし
*/
function getAEDate(yyyy) {
	var factor, tyear, dd, rval;

	if (yyyy >= 1851 && yyyy <= 2150) {
		if ((yyyy >= 1851) && (yyyy <= 1899)) { factor = 22.2588; tyear = 1983; }
		else if ((yyyy >= 1900) && (yyyy <= 1979)) { factor = 23.2588; tyear = 1983; }
		else if ((yyyy >= 1980) && (yyyy <= 2099)) { factor = 23.2488; tyear = 1980; }
		else if ((yyyy >= 2100) && (yyyy <= 2150)) { factor = 24.2488; tyear = 1980; }
		tyear = yyyy - tyear;
		dd = Math.floor(factor + 0.2421904 * tyear - Math.floor((tyear + 0.1) / 4));
		rval = new Date(yyyy, 8, dd);
	}
	return rval;
}
/*
'------------------------------------------------------------------------------
' 関数名	:CHolidayDefine
' 機能		:祝日定義情報保持クラスコンストラクタ
' 返り値	:なし
' 引き数	:sHoliday - (入)祝日定義文字列
' 機能説明:なし
' 備考		:なし
*/
function CHolidayDefine(sHoliday) {
	this.m_defs = new Array();
	this.m_defs = sHoliday.split(CHOLIDAY_DEF_SEP);

	//public
	this.getHolidayName = CHolidayDefine_getHolidayName;
	this.getHolidayDate = CHolidayDefine_getHolidayDate;
	this.getHolidayType = CHolidayDefine_getHolidayType;
	//private
	this.IsAvailHoliday = CHolidayDefine_IsAvailHoliday;
}
/*
'------------------------------------------------------------------------------
' 関数名	:getHolidayName
' 機能		:祝日名称を返す
' 返り値	:祝日名称
' 引き数	:なし
' 機能説明:なし
' 備考		:なし
*/
function CHolidayDefine_getHolidayName() {
	return this.m_defs[CHIDX_NAME];
}
/*
'------------------------------------------------------------------------------
' 関数名	:getHolidayDate
' 機能		:指定西暦年の祝日を求める
' 返り値	:祝日(Date型)（祝日でない場合はnull）
' 引き数	:yyyy - (入)指定西暦年
' 機能説明:なし
' 備考		:なし
*/
function CHolidayDefine_getHolidayDate(yyyy) {
	var rval;

	rval = null;
	if (this.IsAvailHoliday(yyyy)) {
		switch(this.m_defs[CHIDX_DATE]) {
			case "VE":		/* 春分の日 */
				rval = getVEDate(yyyy);
				break;
			case "AE":		/* 秋分の日 */
				rval = getAEDate(yyyy);
				break;
			case "H2":		/* ハッピーマンデー（第２月曜日） */
				rval = getDateByNthWeekday(yyyy + this.m_defs[CHIDX_MONTH], 2, 1);
				break;
			case "H3":		/* ハッピーマンデー（第３月曜日） */
				rval = getDateByNthWeekday(yyyy + this.m_defs[CHIDX_MONTH], 3, 1);
				break;
			default:
				rval = new Date(yyyy, this.m_defs[CHIDX_MONTH] - 1, this.m_defs[CHIDX_DATE]);
				break;
		}
	}
	return rval;
}
/*
'------------------------------------------------------------------------------
' 関数名	:IsAvailHoliday
' 機能		:指定西暦年で有効な祝日か判定する
' 返り値	:true:有効 false:無効
' 引き数	:なし
' 機能説明:なし
' 備考		:なし
*/
function CHolidayDefine_IsAvailHoliday(yyyy) {
	var sy, ey, rval;

	rval = false;
	sy = parseInt(this.m_defs[CHIDX_SYEAR]);
	ey = this.m_defs[CHIDX_EYEAR];
	if (yyyy >= sy) {
		if (ey.length > 0) {
			if (yyyy <= parseInt(ey)) { rval = true; }
		} else {
			rval = true;
		}
	}
	return rval;
}
/*
'------------------------------------------------------------------------------
' 関数名	:getHolidayType
' 機能		:祝日種別を返す
' 返り値	:祝日種別
' 引き数	:なし
' 機能説明:なし
' 備考		:なし
*/
function CHolidayDefine_getHolidayType() {
	return this.m_defs[CHIDX_TYPE];
}
/*------<< EOF >>------*/

