/// 曜日表示文字列
var weekCaption = [ "日", "月", "火", "水", "木", "金", "土" ];

// /
// / 引数dで渡された年月のカレンダー表示用のHTML文字列を生成
// /
function CreateCalendarHtml(d) {
	var result = "";

	if (d == null) {
		d = new Date;
	}
	var year = AdjustedYear(d);
	var month = d.getMonth();
	var monthView = month + 1;

	var today = new Date(year, d.getMonth(), 1);
	var week = today.getDay();

	// holiday Map start
	var holidays = document.getElementById(formId + ":holidays").value
	var holidayArray = holidays.split(',');

	var map = new Object(); // new Array() でもよい(注1)
	for ( var i = 0; i < holidayArray.length; i++) {
		// yyyy/MM/dd
		var hDay = holidayArray[i];
		var hDay_Param = hDay.split('/');
		if ((hDay_Param[0] == year) && (hDay_Param[1] == monthView)) {
			map[hDay] = hDay;
		}
	}
	// holiday Map end

	result += "<table class=\"calendar\" cellspacing=\"0\" >";

	// Header
	result += "<tr>";
	result += "<th colspan=\"7\">";
	result += "<a href=\"javascript:;\" onClick=\"ShowPrevious()\">＜</a>";
	result += FormatDateTime("yyyy年M月", d);
	result += "<a href=\"javascript:;\" onClick=\"ShowNext()\">＞</a>";
	result += "</th>";
	result += "</tr>";

	// 曜日
	result += "<tr>";
	result += "<th class=\"holyday\">" + weekCaption[0] + "</th>";
	result += "<th class=\"weekday\">" + weekCaption[1] + "</th>";
	result += "<th class=\"weekday\">" + weekCaption[2] + "</th>";
	result += "<th class=\"weekday\">" + weekCaption[3] + "</th>";
	result += "<th class=\"weekday\">" + weekCaption[4] + "</th>";
	result += "<th class=\"weekday\">" + weekCaption[5] + "</th>";
	result += "<th class=\"saturday\">" + weekCaption[6] + "</th>";
	result += "</tr>";

	// カレンダー本体
	result += "<tr>";

	for ( var i = 0; i < today.getDay(); i++) // 先月
	{
		result += "<td class=\"lastMonth\">&nbsp;</td>";
	}

	var targetday;

	while ((today.getDate() == 1) || (today.getDay() > 0)) {
		targetday = map[FormatDateTime("yyyy/MM/dd", today)];
		if (targetday == undefined) {
			result += CreateDateColumnHtml(today, false);
		} else {
			var params = targetday.split('/');
			var targetdayChange = new Date(params[0], parseInt(params[1]) - 1,
					params[2]);
			result += CreateDateColumnHtml(targetdayChange, true);
		}
		//result += CreateDateColumnHtml(today);
		today.setDate(today.getDate() + 1);
	}

	result += "</tr>";

	while (today.getMonth() == month) {
		result += "<tr>";
		for ( var i = 0; i < 7; i++) {
			//alert(today.getMonth() + " / " + month);
			if (today.getMonth() == month) {
				targetday = map[FormatDateTime("yyyy/MM/dd", today)];

				if (targetday == undefined) {
					result += CreateDateColumnHtml(today, false);
				} else {
					var params2 = targetday.split('/');
					var targetdayChange2 = new Date(params2[0],
							parseInt(params2[1]) - 1, params2[2]);
					result += CreateDateColumnHtml(targetdayChange2, true);
				}
				//result += CreateDateColumnHtml(today);
			} else // 翌月
			{
				result += "<td class=\"nextMonth\">&nbsp;</td>";
			}
			today.setDate(today.getDate() + 1);
		}
	}

	result += "</tr>";
	result += "</table>";

	return result;
}

///
// / 引数 d で渡された年月のカレンダー表示用の HTML 文字列を生成
// / flag - true: holiday, flase: bisunessday
function CreateDateColumnHtml(d, flag) {
	var result = "";
	// var today = new Date;

	// if (FormatDateTime("yyyyMMdd", d) == FormatDateTime("yyyyMMdd", today)) {
	// result += "<td class=\"today\">";
	// } else if (d.getDay() == 0) {
	// result += "<td class=\"holyday\">";
	// } else if (d.getDay() == 6) {
	// result += "<td class=\"saturday\">";
	// } else {
	// result += "<td>";
	// }

	if (flag) {
		result += "<td class=\"holyday\">";
	} else {
		result += "<td class=\"businessday\">";
	}

	result += d.getDate() + "</td>";
	return result;
}

///
// / カレンダー表示用HTMLを document.writeする
// /
function WriteCalendar(d) {
	document.write(CreateCalendarHtml(d));
}

///////////////////////////////////////////////////////////////////////////////
// Common 関数群
// /////////////////////////////////////////////////////////////////////////////

// /
// / 日付型を書式指定文字列に変換
// / @ToDo 対応書式を増やすこと
// /
// / 書式文字列
// / yyyy - 年 西暦 4桁
// / yy - 年 西暦 下2桁
// / MM - 月 0詰め 2桁
// / M - 月
// / dd - 日 0詰め 2桁
// / d - 日
function FormatDateTime(formatStr, date) {
	var result = formatStr;
	var yyyy = AdjustedYear(date);
	var M = date.getMonth() + 1;
	var MM = Right("0" + M, 2);
	var d = date.getDate();
	var dd = Right("0" + d, 2);
	result = result.replace("yyyy", yyyy);
	result = result.replace("yy", Right(yyyy, 2));
	result = result.replace("MM", MM);
	result = result.replace("M", M);
	result = result.replace("dd", dd);
	result = result.replace("d", d);
	return result;
}

//
// 引数 s で渡された文字列の 右側 len 文字分の部分文字列を取得して返す
// len が s の文字列長よりも大きい場合、s をそのまま返す
//
function Right(s, len) {
	var result = "" + s;
	if (len >= result.length) {
		return result;
	} else {
		return result.substr(result.length - len, result.length);
	}
}

//
// Date型から 年(西暦)部分を取得して返す
//
// Netscape仕様対応
// Netscape では対象年が1900年以降の場合、1900年からの差分年数を返す
function AdjustedYear(d) {
	var result = d.getYear();
	if (result < 2000) {
		result += 1900;
	}
	return result;
}

///////////////////////////////////////////////////////////////////////////////
// 描画系
// /////////////////////////////////////////////////////////////////////////////

// /
// / 入力済みの年月を基に該当月のカレンダーを表示
// /
function ShowCalendar() {
	document.getElementById("calendar").innerHTML = CreateCalendarHtml(GetCurrentDate());
}

///
// / 翌月カレンダー表示(btnNext.onClick)
// /
function ShowNext() {
	var d = GetCurrentDate();
	d.setMonth(d.getMonth() + 1);

	document.getElementById("year").value = AdjustedYear(d);
	document.getElementById("month").value = d.getMonth() + 1;
	ShowCalendar();
}

///
// / 先月カレンダー表示(btnPrevious.onClick)
// /
function ShowPrevious() {
	var d = GetCurrentDate();
	d.setMonth(d.getMonth() - 1);

	document.getElementById("year").value = AdjustedYear(d);
	document.getElementById("month").value = d.getMonth() + 1;
	ShowCalendar();
}

///
// / 入力中の年、月を基に当月初日の日付を返す
// /
function GetCurrentDate() {
	var result = new Date(document.getElementById("year").value, 
			(document.getElementById("month").value - 1), 1);
	return result;
}

///
// / 初期化処理(body.onLoad)
// /
function Initialize() {
	var d = new Date();
	var year = AdjustedYear(d);
	document.getElementById("year").value = year;
	document.getElementById("month").value = d.getMonth() + 1;
	
	var query = window.location.search.substring(1);
		
	var params = query.split('&');
	if(params.length  < 3){
		params = params[0].split('=');
	}
	
	if (1 < params.length) {
		// MemberHoliday.js
		holiday(params[1]);
	} else {
		ShowCalendar();
	}
}

function holiday(memberCode) {
	MemberHolidayServiceImpl.getMemberHolidayList(memberCode, makeHoliday);
}

function makeHoliday(holidays) {
	// 休日がない場合
	if (0 < holidays.length) {
		var year = document.getElementById("year").value;
		var month = document.getElementById("month").value;

		dwr.util.setValue(formId + ":holidays", holidays);
	}

	ShowCalendar();
}

