// 固定祝日
// 01/01元日、02/11建国記念の日、04/29みどりの日、05/03憲法記念日、05/05こどもの日、11/03文化の日、11/23秋分の日、12/23天皇誕生日
var holidayMonth = new Array( 1, 2, 4, 5, 5,11,11,12);
var holidayDay   = new Array( 1,11,29, 3, 5, 3,23,23);
// ハッピーマンデー
// 01/第2週：成人の日、07/第3週：海の日、09/第3週：敬老の日、10/第2週：体育の日
var happyMonth = new Array( 1, 7, 9,10);
var happyWeek  = new Array( 2, 3, 3, 2);
// 営業休業日指定
// 04/23─04/27、05/01─05/02
var NoSalesMonth = new Array(12,12,12,12,1,1,1,1,1,5,5, 8, 8, 8, 8, 8, 8);
var NoSalesDay   = new Array(28,29,30,31,1,2,3,4,5,2,6,12,13,14,15,16,17);

var cyear = cdate.getFullYear();			// カレンダー表示年
var cmonth = cdate.getMonth() + 1;			// カレンダー表示月
var cwidth = 10;							// カレンダー１日分のセル幅
var cheight= 9;								// カレンダー１日分のセル高さ
var cborder_color = '#CCCCCC';				// 外枠カラー
var ctitle_bgcolor = '#EEEEEE';				// タイトル背景カラー
var ctitle_fontcolor = '#666666';			// タイトル文字カラー
var csun_header_bgcolor = '#FFFFFF';		// 日曜日ヘッダー背景カラー
var csat_header_bgcolor = '#FFFFFF';		// 土曜日ヘッダー背景カラー
var cheader_bgcolor = '#FFFFFF';			// 月─金ヘッダー背景カラー
var csun_header_fontcolor = '#FF0000';		// 日曜日ヘッダー文字カラー
var csat_header_fontcolor = '#0000FF';		// 土曜日ヘッダー文字カラー
var cheader_fontcolor = '#696969';			// 月─金ヘッダー文字カラー
var choliday_bgcolor = '#FFB6C1';			// 祝日・休日背景カラー
var cbgcolor  = '#FFFFFF';					// 月─金背景カラー
var choliday_fontcolor = '#666666';			// 祝日・休日文字カラー
var cfontcolor  = '#666666';				// 月─金文字カラー

// 2か月分のカレンダーを作成
function showCalendar() {
	var csource;

	//当月表示
	csource = getCalendarSource (cyear,cmonth,cwidth,cheight,cborder_color,ctitle_bgcolor,ctitle_fontcolor,
	csun_header_bgcolor,csat_header_bgcolor,cheader_bgcolor,csun_header_fontcolor,csat_header_fontcolor,
	cheader_fontcolor,choliday_bgcolor,cbgcolor,choliday_fontcolor,cfontcolor);
	innerHTML( 'cpanel', csource );

	//翌月表示
	if (cdate.getMonth() == 11) {
		cyear = cdate.getFullYear() + 1;
		cmonth = 1;
	} else {
		cmonth = cdate.getMonth() + 2;
	}
	csource = getCalendarSource (cyear,cmonth,cwidth,cheight,cborder_color,ctitle_bgcolor,ctitle_fontcolor,
	csun_header_bgcolor,csat_header_bgcolor,cheader_bgcolor,csun_header_fontcolor,csat_header_fontcolor,
	cheader_fontcolor,choliday_bgcolor,cbgcolor,choliday_fontcolor,cfontcolor);
	innerHTML( 'cpane2', csource );
}

// カレンダーソースを作成
function getCalendarSource (pyear,pmonth,pwidth,pheight,pborder_color,ptitle_bgcolor,ptitle_fontcolor,
		psun_header_bgcolor,psat_header_bgcolor,pheader_bgcolor,psun_header_fontcolor,psat_header_fontcolor,
		pheader_fontcolor,holiday_bgcolor,pbgcolor,holiday_fontcolor,pfontcolor) {

	// 変数の宣言
	var furikae = false;		// 振替休日フラグ
	var before = 0;				// 国民の休日取得用(前日格納)

	// カレンダー一日あたりのセル幅を設定
	fwidth = ' width="'  + pwidth + '"';
	fheight = ' height="' + pheight + '"';

	// 当日日付の取得
	fdate = new Date();
	fnow_year = fdate.getFullYear();
	fnow_month = fdate.getMonth();
	fyear = pyear;
	fmonth = pmonth - 1;
	ftoday = fdate.getDate();

	// 日付設定の変更
	fdate.setFullYear(fyear);
	fdate.setDate(1);
	fdate.setMonth(fmonth);

	// ヘッダー、日付を配列に設定する
	fweeks  = new Array( "日", "月", "火", "水", "木", "金", "土" );
	fmonths = new Array( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );

	// 閏年対応
	if( ( ( fyear % 4 ) == 0 && ( fyear % 100 ) != 0 ) || ( fyear % 400 ) == 0 ) {
		fmonths[ 1 ] = 29;
	}

	// 表示配列の設定
	fweek = fdate.getDay();
	fcals = new Array( 7 * 6 );

	// カレンダーの初期化
	for( i = 0; i < 7 * 6; i ++ ) {
		fcals[ i ] = '　';
	}

	// 日付の設定
	for( i = 0; i < fmonths[ fmonth ]; i ++ ) {
		fcals[ i + fweek ] = i + 1;
	}

	frow = ( fmonths[ fmonth ] + fweek ) / 7;
	frow = Math.ceil( frow );

	// カレンダーHTMLソースの作成
	var fsource = '';

	pborder_color = ( pborder_color    != '' ) ? ( ' bgcolor="' + pborder_color  + '"' ) : pborder_color;
	ptitle_bgcolor = ( ptitle_bgcolor   != '' ) ? ( ' bgcolor="' + ptitle_bgcolor + '"' ) : ptitle_bgcolor;
	ptitle_fontcolor = ( ptitle_fontcolor != '' ) ? ( ' style="color: ' + ptitle_fontcolor + ';"' ) : ptitle_fontcolor;

	// 年月の出力
	fsource += "<table border=\"0\" cellspacing=\"1\" cellpadding=\"1\"" + pborder_color + " style=\"font: 12px; color: #666666;\">\n";
	fsource += "<tr>\n"
	fsource += "<td align=\"center\" colspan=\"7\"" + ptitle_bgcolor + fheight + ptitle_fontcolor + ">";
	fsource += fyear + "年" + ( fmonth + 1 ) + "月";
	fsource += "</td></tr>\n";
	fsource += "<tr>\n";

	// ヘッダーカラーの設定
	psun_header_bgcolor = ' bgcolor="' + psun_header_bgcolor + '"';
	psat_header_bgcolor = ' bgcolor="' + psat_header_bgcolor + '"';
	pheader_bgcolor = ' bgcolor="' + pheader_bgcolor     + '"';
	psun_header_fontcolor = ' style="color: ' + psun_header_fontcolor + ';"';
	psat_header_fontcolor = ' style="color: ' + psat_header_fontcolor + ';"';
	pheader_fontcolor = ' style="color: ' + pheader_fontcolor     + ';"';

	for( i = 0; i < 7; i ++ ) {
		// 一行(１週間)ループ
		fsource += "<td align=\"center\"" + fwidth;
		fsource += ( i == 0 ) ? fheight : '';

		// 日曜のセルの色
		if( i == 0 ) {
			fsource += psun_header_bgcolor + psun_header_fontcolor + ">";
		// 土曜のセルの色
		} else if( i == 6 ) {
			fsource += psat_header_bgcolor + psat_header_fontcolor + ">";
		// 月─金のセルの色
		} else {
			fsource += pheader_bgcolor + pheader_fontcolor + ">";
		}
		fsource += fweeks[ i ];
		fsource += "</td>\n";
	}
	fsource += "</tr>\n";

	holiday_bgcolor = ' bgcolor="' + holiday_bgcolor + '"';
	holiday_fontcolor = ' style="color: ' + holiday_fontcolor + ';"';
	pbgcolor = ' bgcolor="' + pbgcolor + '"';
	pfontcolor = ' style="color: ' + pfontcolor + ';"';

	for( i = 0; i < frow; i ++ ) {
		// 行ループ
		fsource += "<tr>\n";
		for( j = 0; j < 7; j ++ ) {
			// 列ループ
			fsource += "<td align=\"center\"";
			fsource += ( j == 0 ) ? fheight : '';

			fvalue = fcals[ j + ( i * 7 ) ];

			// 日付非表示設定
			if (fvalue == '　') {
				fsource += " bgcolor=\"#FFFFFF\">&nbsp;";
			// 日付表示設定
			} else {
				// 祝日チェック
				if (isHoliday(pmonth,fvalue)) {
					fsource += holiday_bgcolor + holiday_fontcolor + ">";
					fsource += fvalue;
					furikae = (j==0);
					before = fvalue;
				// ハッピーマンデーチェック
				} else if (isHappy(pmonth,fvalue,j)) {
					fsource += holiday_bgcolor + holiday_fontcolor + ">";
					fsource += fvalue;
					before = fvalue;
				// 春分・秋分チェック
				} else if (isShunbun(pyear,pmonth,fvalue)) {
					fsource += holiday_bgcolor + holiday_fontcolor + ">";
					fsource += fvalue;
					furikae = (j==0);
					before = fvalue;
				// 日曜・土曜のセルの色
				} else if( j == 0 || j == 6) {
					fsource += holiday_bgcolor + holiday_fontcolor + ">";
					fsource += fvalue;
				} else {
					// 国民の休日
					if (before > 0 && j != 0) {
						if (isHoliday(pmonth, fvalue+1) || isShunbun(pyear,pmonth,fvalue+1)) {
							furikae = true;
						}
					}
					// 振替休日
					if (furikae) {
						fsource += holiday_bgcolor + holiday_fontcolor + ">";
						fsource += fvalue;
					} else {
						// 営業休業日取得
						if (isNoSalesday(pmonth, fvalue)) {
							fsource += holiday_bgcolor + holiday_fontcolor + ">";
							fsource += fvalue;
						} else {
							fsource += pbgcolor + pfontcolor + ">";
							fsource += fvalue;
						}
					}
					furikae = false;
					before = 0;
				}
			}
			fsource += "</td>\n";
		}
		fsource += "</tr>\n";
	}

	fsource += "</table>\n";
	return fsource;
}

// 祝日チェック
function isHoliday(m, d) {
	for (var i=0; i<holidayMonth.length; ++i) {
		if (m == holidayMonth[i] && d == holidayDay[i]) {
			return true;
		}
	}
	return false;
}

// ハッピーマンデーチェック
function isHappy(m, d, w) {
	if (w!=1) return false;
	for (var i=0; i<happyMonth.length; ++i) {
		if (m == happyMonth[i] && Math.floor((d-1)/7)+1 == happyWeek[i]) {
			return true;
		}
	}
	return false;
}

// 春分・秋分チェック
function isShunbun(y, m, d) {
	var shun;
	if (m == 3) {
		shun = Math.floor(20.69115 + (y-2000)*0.242194 - Math.floor((y-2000)/4));
		if (shun == d) return true;
	} else if (m == 9) {
		shun = Math.floor(23.09 + (y-2000)*0.242194 - Math.floor((y-2000)/4));
		if (shun == d) return true;
	}
	return false;
}

// 営業休日チェック
function isNoSalesday(m, d) {
	for (var i=0; i<NoSalesMonth.length; ++i) {
		if (m == NoSalesMonth[i] && d == NoSalesDay[i]) {
			return true;
		}
	}
	return false;
}

// HTMLドキュメントを挿入
function innerHTML( id, text ) {
	try {
		if( document.all ) {
			document.all( id ).innerHTML = text;
			return;
		}
	} catch(e) {}
	try {
		if( document.getElementById ) {
			document.getElementById( id ).innerHTML = text;
		}
	} catch(e) {}
	try {
		if( document.layers ) {
			document.layers[ id ].document.open();
			document.layers[ id ].document.write( text );
			document.layers[ id ].document.close();
		}
	} catch(e) {}
}

