var WeekDays = new Array("日","月","火","水","木","金","土");
var Mdays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);

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];
}

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;
}

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;
}

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;	// エラー（範囲外）

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

var dayend,month,year = -9999;
var gengouY = new Array(1868,1912,1926,1989);
var gengou  = new Array("明治","大正","昭和","平成");
var iwaimend = new Array(-1,-1); // 月末日が祝日となる月をセット。最後は -1
var iwaimends= new Array("","");	// 月末が祝日になる場合の祝日名
var iwaiday = new Array();
var iwaidayS = new Array();
var iwaidayE = new Array();
var IwaiOrg = "101,102,151,211,320,398,429,503,504,505,506,761,961,997,999,1051,1103,1123,1223,1227,1228,1229,1230,1231,9000";
var IwaiOrgS = "1949,2008,2008,2008,1949,2000,1967,1949,1949,1989,1949,1986,1949,1996,2003,1966,2003,2003,1948,1966,2000,1948,1948,1989,2007,9000";
var IwaiOrgE = "9000,9000,9000,9000,1999,9000,9000,9000,1988,9000,9000,-99,9000,2002,9000,2002,9000,-99,9000,1999,9000,9000,9000,9000,9000,9000,";
var iwaistr = new Array("元日","年始休日","成人の日","建国記念の日","春分の日","春分の日","昭和の日","憲法記念日","みどりの日","こどもの日","休日","海の日","敬老の日","国民の休日","秋分の日","体育の日","文化の日","勤労感謝の日","天皇誕生日","年末休日","年末休日","年末休日","年末休日","年末休日","終わり");

// 祝日の日付データの初期化。年が変わるときは必ず実行してね。
function InitIwai(){
	var i;
	iwaiday = IwaiOrg.split(",");
	iwaidayS = IwaiOrgS.split(",");
	iwaidayE = IwaiOrgE.split(",");
	for (i = 0; ; i++){
		iwaiday[i] = eval(iwaiday[i]);
		if (iwaiday[i] >= 5000) break;
	}
}

function GetGengouY(year){
	var i,ie,yy;
	yy = '';
	ie = gengouY.length;
	for (i = ie ; i > 0 ; i--){
		if (year >= gengouY[i]){
			yy = gengou[i] + (year - gengouY[i] + 1).toString(10) + '年';
			break;
		}
	}
	return yy;
}
// 移動祝日の日付計算(iwaiday[] の数字設定)
function Initvariable(year){
	var i,j,day,tmp,mon;

	for (i = 0; iwaiday[i] < 5000 ; i++) {
		tmp = iwaiday[i] % 100;
		if (tmp == 98) iwaiday[i] = 300 + Syunbun(year,3);	// 春分の日の計算
		if (tmp == 99) iwaiday[i] = 900 + Syunbun(year,9);	// 秋分の日の計算
		if (iwaidayE[i] == -99) {	// 国民の休日
			if (tmp == 97) {	// 秋分の日の前の「国民の休日」を計算
				iwaiday[i] = Syunbun(year,9) - 1;
				if (GetWeekDays(year,9,iwaiday[i]) == 2) iwaidayE[i] = 9000;	// 火曜日なら国民の休日
				iwaiday[i] += 900;
			} else {
				mon = Math.floor(iwaiday[i] / 100);
				if (GetWeekDays(year,mon,tmp) > 1) iwaidayE[i] = 9000;	// 火曜日以降は国民の休日
			}
		}
		if ((tmp >	31) && (tmp < 90)) {
			mon = Math.floor(iwaiday[i] / 100);
			day = tmp % 10;
			tmp = (Math.floor(tmp / 10) - 4) * 7 + 1;
			for (j = tmp; j < (tmp + 7); j++) {	// 第何週の何曜日という祝日の計算 51 : 第２週の月曜
				if (GetWeekDays(year,mon,j) == day) {
					iwaiday[i] = mon * 100 + j;
					break;
				}
			}
		}
	}
}

// 春分、秋分の日付の設定(iwaiday[] の数字設定)
function InitSyunbun(year,month){
	var i,day,tmp;
	
	i = 0;
	day =0;
	
	tmp = -9999;
	if (month == 3) tmp = 321;
	if (month == 9) tmp = 922;
	if (tmp < 0) return;

	for(i = 0; day < 5000 ; i++)
	{
		day = iwaiday[i];
		if (day == tmp)
		{
			iwaiday[i] = Syunbun(year,month) + month * 100;	// 春分と秋分の日付の計算
			break;
		}
	}
}


// year,monthのカレンダを作る。today が 0以下なら、「今日」のマークは入れない
// 月齢等の表示用に、拡張文字列挿入フラグ exflag & 挿入文字列 exstr をパラメータに追加
// exflag が 1 なら、日付表示後に拡張文字列を挿入する 2000.04.08
// 振替休日処理の一部追加＆変更 2001.01.25
function calender_main(wd,year,month,today,exflag,exstr){
	var i,dflag,day;
	var iwaid = new Array(0,0,0,0,0,0);
	var iwais = new Array("","","","","","");
	var iws,iw1,iw2;

	InitIwai();	// 祝日日付配列の初期化
	Initvariable(year);	// 移動する祝日の処理

	dayend = GetMonthDays(year,month);

	iw2 = 1;
	for (i = 0; iwaiday[i] < 5000 ; i++){
		if ((year >= iwaidayS[i]) && (year <= iwaidayE[i])) {	// 祝日が有効となる年の範囲判定
			if (Math.floor((iwaiday[i] + 0.1) / 100) == month){
				iwaid[iw2] = iwaiday[i] % 100;
				iwais[iw2] = iwaistr[i];
				iw2++;
			}
		}
	}

	if (today <= 0) today = -99;	// today が 0 以下なら、今日の日付チェックは不要

	wd.document.writeln('<table width="100%"  border="" bordercolor="#999999" bgcolor="#ffffff" cellspacing="" cellpadding="">');
	wd.document.writeln('<tr bgcolor="#444444" align="center"><th colspan="7" ><font size="2" color="#ffffff">' + year + '年' + month + '月' + '</font></th></tr>');
	for (i = 0; i < 7 ; i++){
		if (i == 0) wd.document.write('<tr bgcolor="#cccccc"><th width="26px" bgcolor="#cccccc">' + WeekDays[i] + '</font></th>');
		else if (i == 6) wd.document.writeln('<th width="26px" bgcolor="#cccccc">' + WeekDays[i] + '</th></tr>');
		else wd.document.write('<th width="26px">' + WeekDays[i] + '</th>');
	}

	day = GetWeekDays(year,month,0);	// 0日の曜日を求める（日曜日 = 0）

	iws = 1;
	if (day == 0){
		tmp = month - 1;
		if (tmp < 1) tmp = 12;
		for (i = 0; iwaimend[i] >= 0 ; i++){
			if (tmp == iwaimend[i]) {
				iws = 0;		// 前月末が日曜かつ祝日の場合の処理
				iwaid[0] = 1;
				iwais[0] = iwaimends[i] + '(振替)';
			}
		}
	}

	day = -day;
	if (day == -6) day = 1;	// 前月末日が土曜日なら先頭の空白は入れる必要なし
	for (;;)
	{
		wd.document.write('<tr align="center">');
		for (i = 0; i < 7 ; i++){
			dflag = i;

			for (iw1 = iws; iw1 < iw2 ; iw1++){
				if (iwaid[iw1] == day){
					if (i == 0) {	// 日曜日なら翌日が振り替え休日
						iwaid[iw1]++;
						iwais[iw1] = iwais[iw1] + '(振替)';
					} else dflag = 0;	// 祝日（休みにする）
				}
			}
//if (day == today) dflag = -1;

			if (dflag == -1) wd.document.write('<td bgcolor="#ffffcc"><font color="#000000">');
			else if (dflag == 0) wd.document.write('<td bgcolor="#ffcccc"><font color="#666666">');
			else if (dflag == 6) wd.document.write('<td bgcolor="#ffcccc"><font color="#666666">');
			else wd.document.write('</font><td>');
			if ((day >= 1) && (day <= dayend)){
				wd.document.write(day);
				if (exflag == 1) // exflag = 1 なら、拡張文字列の挿入
				{
					wd.document.write(exstr);
				}
			}
			else wd.document.write('&nbsp;');
			wd.document.writeln('</font></td>');
			day++;
		}
		wd.document.writeln('</tr>');
		if (day > dayend) break;
	}
	wd.document.writeln('</table>');
}

// 現在のページに拡張表示文字列を挿入しないシンプルなカレンダーを表示を指示するための関数
// 単に内部でcalender_main()を呼び出すだけ
function calender(YY,MM,DD)
{
	calender_main(this,YY,MM,DD,0,"");
}

// -->