<!--
// calender.js var.1.00
// 						 var.1.10(2006/10/16)
// 						 var.1.11(2007/07/21)
// 						 var.1.12(2008/05/18)
// 						 var.1.13(2009/02/15)
// 						 var.1.14(2011/05/06)
var WeekDays = new Array("日","月","火","水","木","金","土");
var Mdays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);

// 日付を返す
function setGappi(gappi){
	var date = gappi.split('/');
	return ((date[1] * 1) + '月' + (date[2] * 1) + '日(' + WeekDays[GetWeekDays((date[0] * 1), (date[1] * 1), (date[2] * 1))] + ')');
}
// yy,mm の月の日数を返す
function GetMonthDays(yy,mm){
	Mdays[1] = 28;	// 閏年の処理開始
	if ((yy % 4) == 0) Mdays[1] = 29;
	if ((yy % 100) == 0) Mdays[1] = 28;
	if ((yy % 400) == 0) Mdays[1] = 29;	// 閏年の処理終了

	return Mdays[mm - 1];
}

// yy,mm,dd から年通日を計算する 1/1 は、1.0 とする
function GetYearDays(yy,mm,dd){
	var m,days;
	days = dd;
	m = GetMonthDays(yy,mm);	// 閏処理のためのダミー

	for (m = 0; m < (mm - 1); m++) days += Mdays[m];
	return days;
}

// 1600/1/1 からの通日を計算する
function Get1600Days(yy,mm,dd){
	var days,tmp;
	tmp = yy - 1600;
	days = Math.floor((tmp - 1) * 365.25 + 1.01);
	days -= Math.floor((tmp - 1 + 0.01) / 100); 
	days += Math.floor((tmp - 1 + 0.01) / 400);
	days += GetYearDays(yy,mm,dd);
	return days;
}

// 曜日のインデックス（0-6）を返す。
// 通日計算にはGet1600Days() をしようする。
function GetWeekDays(yy,mm,dd){
	var days;
	var TDate = new Date();
	
	days = Math.floor(Get1600Days(yy,mm,dd) + 6);
	days = days - Math.floor(days / 7) * 7;
	return days;
}

// 曜日の文字を返す('日' .. '土')
function GetWeekDayStr(yy,mm,dd)
{
	var idx;
	idx = GetWeekDays(yy,mm,dd);
	return WeekDays[idx];
}

// year,month から、春分・秋分の日付を計算する。
// month : 3 or 9  
var Syunbunpar1 = new Array(19.8277,20.8357,20.8431,21.8510);
var Syunbunpar2 = new Array(22.2588,23.2588,23.2488,24.2488);
function Syunbun(year,month){	// 春分の日、秋分の日を計算して答えを返す。1980-2099 : month = 3 or 9
	var ans,p1,tyear;

	if ((year >= 1851) && (year <= 1899)) p1 = 0;
	else if ((year >= 1900) && (year <= 1979)) p1 = 1;
	else if ((year >= 1980) && (year <= 2099)) p1 = 2;
	else if ((year >= 2100) && (year <= 2150)) p1 = 3;
	else return 0;	// エラー（範囲外）

	tyear = 1980;
	
	tyear = (year - tyear);
	if (month == 3) // 春分の日
	{
		ans = Math.floor(Syunbunpar1[p1] + 0.2421904 * tyear - Math.floor((tyear + 0.1)/4));
	}
	else if (month == 9) // 秋分の日
	{
		ans = Math.floor(Syunbunpar2[p1] + 0.2421904 * tyear - Math.floor((tyear + 0.1)/4));
	}
	else ans = 0;	// 春分でも秋分でもない
	return ans;
}

var dayend,month,year = -9999;
var gengou = new Array();
gengou[0] = new Array(1868, "明治");
gengou[1] = new Array(1912, "大正");
gengou[2] = new Array(1926, "昭和");
gengou[3] = new Array(1989, "平成");

// 西暦年を元号に変換。明治～平成まで。月のチェックをしていないので、元年の表示はちょっと変。
function GetGengouY(year){
	var i,ie,yy;
	yy = '';
	ie = gengou.length;
	for (i = ie ; i > 0 ; i--)
	{
		if (year >= gengou[i][0])
		{
			yy = gengou[i][1] + (year - gengou[i][0] + 1).toString(10) + '年';
			break;
		}
	}
	return yy;
}

//以下オリジナル
var holiday = new Array();
holiday[0]  = new Array("00","00","99","1989","9000","振替休日");
holiday[1]  = new Array("01","01","","1949","9000","元日");
holiday[2]  = new Array("01","15","","1949","1999","成人の日");
holiday[3]  = new Array("01","","21","2000","9000","成人の日");
holiday[4]  = new Array("02","11","","1967","9000","建国記念の日");
holiday[5]  = new Array("03","","98","1949","9000","春分の日");
holiday[6]  = new Array("04","29","","1949","1988","天皇誕生日");
holiday[7]  = new Array("04","29","","1989","2006","みどりの日");
holiday[8]  = new Array("04","29","","2007","9000","昭和の日");
holiday[9]  = new Array("05","03","","1949","9000","憲法記念日");
holiday[10]  = new Array("05","04","96","1986","2006","国民の休日");
holiday[11]  = new Array("05","04","","2007","9000","みどりの日");
holiday[12] = new Array("05","05","","1949","9000","こどもの日");
holiday[13] = new Array("07","20","","1996","2002","海の日");
holiday[14] = new Array("07","","31","2003","9000","海の日");
holiday[15] = new Array("09","15","","1966","2002","敬老の日");
holiday[16] = new Array("09","","31","2003","9000","敬老の日");
holiday[17] = new Array("09","","97","2003","9000","国民の休日");
holiday[18] = new Array("09","","98","1948","9000","秋分の日");
holiday[19] = new Array("10","10","","1966","1999","体育の日");
holiday[20] = new Array("10","","21","2000","9000","体育の日");
holiday[21] = new Array("11","03","","1948","9000","文化の日");
holiday[22] = new Array("11","23","","1948","9000","勤労感謝の日");
holiday[23] = new Array("12","23","","1989","9000","天皇誕生日");
var maxMonthData = 3;	//とりあえず3ヶ月分のバッファ
var monthData = new Array(maxMonthData);
var ii, jj;
for (ii = 0; ii < maxMonthData; ii++){
	monthData[ii] = new Array(32);
	for (jj = 0; jj < 32; jj++){
		monthData[ii][jj] = new Array(4);
	}
}

// 日付の文字列をセット
function setDateStr(year, month, index){
	var j, matu;
		for (j = 1; j <= monthData[index][0][0]; j++){
			if (j == monthData[index][0][0]) matu = '1'; //末日以外は0、末日は1をつける
			else matu = '0';
			if (monthData[index][j][2] > 0) {
				monthData[index][j][3] = year + '/' + ('0'+ month).substr(('0' + month).length - 2, 2) + '/' + ('0'+ monthData[index][j][0]).substr(('0' + monthData[index][j][0]).length - 2, 2) + ':' + monthData[index][j][1] + ':10' + matu;
			} else if (monthData[index][j][2] == 0) {
				monthData[index][j][3] = year + '/' + ('0'+ month).substr(('0' + month).length - 2, 2) + '/' + ('0'+ monthData[index][j][0]).substr(('0' + monthData[index][j][0]).length - 2, 2) + ':' + monthData[index][j][1] + ':11' + matu;
			} else {
				monthData[index][j][3] = year + '/' + ('0'+ month).substr(('0' + month).length - 2, 2) + '/' + ('0'+ monthData[index][j][0]).substr(('0' + monthData[index][j][0]).length - 2, 2) + ':' + monthData[index][j][1] + ':00' + matu;
			}
		}
}

// 月の末日と曜日をセット
function setWeekday(year, month, index){
	var j, week;
	var Weekday = GetWeekDays(year, month, 1);
		monthData[index][0][0] = GetMonthDays(year, month);
		for (j = 1; j <= monthData[index][0][0]; j++){
			monthData[index][j][0] = j;
			week = Math.floor((j + 6) / 7);
			monthData[index][j][1] = (week * 10) + Weekday;
			monthData[index][j][2] = -1;
			monthData[index][j][3] = 0;
			if (++Weekday >= 7) {
				Weekday = 0;
			}
		}
		for (; j < 32; j++){
			monthData[index][j][0] = -1;
		}
}

// 年の祝日の日付をセット
function setHoliday(year, month, index){
	var i,j,month,day,days,yearS,yearE,weekday;
	setWeekday(year, month, index);
	for (i = 1; i < holiday.length; i++) {
		day = Number(holiday[i][1]);
		days = Number(holiday[i][2]);
		yearS = Number(holiday[i][3]);
		yearE = Number(holiday[i][4]);

		if ((year >= yearS) && (year <= yearE) && (month == Number(holiday[i][0]))) {
			if (days == 0) {	// 通常
				monthData[index][day][2] = i;
				setFurikae(year,month,index, day);
			} else if (days == 98) {
				monthData[index][Syunbun(year,month)][2] = i;	// 春分秋分の日の計算
				setFurikae(year,month,index, Syunbun(year,month));
			} else if (days == 97) {	// 秋分の日の前の「国民の休日」を計算
				if (GetWeekDays(year,month,Syunbun(year,month) - 1) == 2)	// 火曜日なら国民の休日
					monthData[index][Syunbun(year,month) - 1][2] = i;
			} else if (days == 96) {	// 秋分の日の前以外の「国民の休日」を計算
				if (GetWeekDays(year,month,day) > 1)	// 火曜日以降は国民の休日
					monthData[index][day][2] = i;
					setFurikae(year,month,index, day);
			} else if ((days >= 10) && (days < 60)) {
				weekday = (Math.floor(days / 10) - 1) * 7 + 1;
				for (j = weekday; j < (weekday + 7); j++) {	// 第何週の何曜日という祝日の計算 21 : 第２週の月曜
					if (monthData[index][j][1] == days) {
						monthData[index][j][2] = i;
						setFurikae(year,month,index, j);
						break;
					}
				}
			}
		}
	}
	setDateStr(year, month, index);
}

// 日曜日なら翌日は振り替え休日
function setFurikae(year,month,index, day){
	var i = day;
	while ((i < monthData[index][0][0]) && 
				((GetWeekDays(year,month,i) == 0) && (monthData[index][i][2] > 0))){
		i++;
	}
	if (i > day){
		monthData[index][i][2] = 0;
	}
}
// データ形式
// データはセミコロンで区切る（その期間を除く場合は頭に!をつける）
// データの評価は順に行われるので並び順に注意する
// [!]開始年月日-終了年月日;[!]開始年月日-終了年月日;[!]開始年月日-終了年月日;・・・・
// 年月日の書き方
//年/月/日(曜日をyyyy/mm/dd:na:hhのように書く
//yyyyは(1900-9999)、mmは(01-12)、ddは(00:末日,01-31)
//aは曜日(0:日,1:月,2:火,3:水,4:木,5:金,6:土)
//nは第何週を数字で表す(1-5)
//hhは祝日にマッチする(00:祝日以外,11:祝日,10:振替休日以外の祝日,01:振替休日)
//それぞれワイルドカード'.'ですべての数字にマッチする
//範囲を指定する場合はワイルドカードは使用できない。yyyy/mm/dd以降は無視される

function remakeData(str){
	var lt, day;
	lt = str.split('/', 3); // スラッシュで年月日を分割
	if (lt.length == 1)	lt.unshift('..'); // 月の指定がなければワイルドカードで埋める
	if (lt.length == 2)	lt.unshift('....'); // 年の指定がなければワイルドカードで埋める
	if (lt[0].length < 3) lt[0] = 1900 + lt[0]; // 3文字未満は1900年を足す
	else if (lt[0].length < 4) lt[0] = ('0000' + lt[0]).substr(('0000' + lt[0]).length - 4, 4); // 4文字未満は0で埋める
	if (lt[1].length == 0) lt[1] = '..'; // 省略の場合はワイルドカードで埋める
	else if (lt[1].length < 2) lt[1] = ('00' + lt[1]).substr(('00' + lt[1]).length - 2, 2); // 2文字未満は0で埋める
	day = lt[2].split(':', 3); // コロンで曜日を分割
	if (day.length == 1) day.push('..') // 曜日の指定がなければワイルドカードで埋める
	if (day.length == 2) day.push('.') // 祝日の指定がなければワイルドカードで埋める
	if (day[0].length == 0) day[0] = '..'; // 省略の場合はワイルドカードで埋める
	else if (day[0].length < 2) day[0] = ('00' + day[0]).substr(('00' + day[0]).length - 2, 2); // 2文字未満は0で埋める
	if (day[1].length < 2) day[1] = ('..' + day[1]).substr(('..' + day[1]).length - 2, 2); // 2文字未満は.で埋める
	if (day[2].length < 2) day[2] = ('..' + day[2]).substr(('..' + day[2]).length - 2, 2); // 2文字未満は.で埋める
	if (day[0] == '00') { // 末日は1でマッチ
		day[2] += '1';
		day[0] = '..';
	} else {
		day[2] += '.';
	}
	lt[2] = day.join(':');
	return lt.join('/');
}
//ckStrに比較文字列を入れるとその日のデータを配列で返す
function makeData(ckStr){ 
	var i, j;
	var lt, dt;
	var sFlag, dFlag;
	var sStr, eStr;
	var resStr = new Array();
	for (i = 1; i < tList.length; i++){
		if (tList[i][2] == '')continue;
		lt = tList[i][2].split(';');  // セミコロンでデータ分割
		dFlag = false;
		for (j = 0; j < lt.length; j++){
			if (sFlag = (lt[j].charAt(0) == '!')){
				lt[j] = lt[j].substr(1);
			}
			dt = lt[j].split('-', 2); // ハイフンで開始と終了分割
			sStr = remakeData(dt[0]);
			if (dt.length == 2){
				eStr = remakeData(dt[1]);
				if ((ckStr.substr(0,10) >= sStr.substr(0,10)) && (ckStr.substr(0,10) <= eStr.substr(0,10))) {
					if (sFlag) dFlag = false;
					else dFlag |= true;
				}
			} else {
				if (ckStr.search(sStr) != -1)	{
					if (sFlag) dFlag = false;
					else dFlag |= true;
				}
			}
		}
		if (dFlag) resStr.push(i);
	}
	return resStr;
}

// -->

