// クッキーキー
var calendarCookieKey = "right_calendar";

// カレンダーデータを取得するURLを設定
var strRequestUrl;
function setRequestUrl(url){
	strRequestUrl = url;
}

// カレンダーのリミットを設定
var numLimitYear;
var numLimitMonth;
function setLimitCalendar(y, m){
	numLimitYear = y;
	numLimitMonth = m;
}

// 現在日付を設定
var numNowYear;
var numNowMonth;
var numNowDay;
function setNowCalendar(y, m, d){
	numNowYear = y;
	numNowMonth = m;
	numNowDay = d;
}

// 現在日付の背景色を設定
var strNowDateBGColor = "#999999";
// 現在日付の文字色を設定
var strNowDateStrColor = "#FFFFFF";

// クッキーの取得
function getCookieCal(key, defaultValue) {
	var theCookie = document.cookie + ";";
	start = theCookie.indexOf(key + "=");
	if (start != -1) {
		end = theCookie.indexOf (";", start);
		return unescape(theCookie.substring(start + key.length + 1, end));
	}
	return defaultValue;
}

// クッキーの設定
function setCookieCal(key, value) {

	var strPath = "/servlet/nk/";

	/*
	// ローカルパスの取得
	// 3パスまで有効
	var strLocal = location.pathname;
	var arrLocal = strLocal.split("/");
	for(var i = 1; i < arrLocal.length && i < 4; i++){
		strPath = strPath + "/" + arrLocal[i];
	}
	*/

	document.cookie = key + "=" + value + ";" + "path=" + strPath + ";";
}

// カレンダーデータ取得開始
var xmlHttp;
function loadCalendarData(){

	// ブラウザに対応したオブジェクトを取得
	xmlHttp = null;
	if(window.XMLHttpRequest){
		xmlHttp = new XMLHttpRequest();
	}else if(window.ActiveXObject){
		try{
			xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
		}catch(e){
			xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}

	// オブジェクトの取得のチェック
	if(xmlHttp != null) {
		// データ取得完了時のイベント設定
		xmlHttp.onreadystatechange = eventCalendarData;

		// 日付の取得
		var today = new Date();
		
		var year = today.getFullYear();
		var month = today.getMonth() + 1;
		
		// クッキーの取得
		var year  = parseInt(getCookieCal(calendarCookieKey+"_year",  today.getFullYear()));
		var month = parseInt(getCookieCal(calendarCookieKey+"_month", today.getMonth() + 1));
		// クッキーの設定
		setCookieCal(calendarCookieKey+"_year", year);
		setCookieCal(calendarCookieKey+"_month", month);

		// 0埋め
		var strYear = year + "";
		if(year < 1000){
			strYear = "0" + strYear;
		}else if(year < 100){
			strYear = "00" + strYear;
		}else if(year < 10){
			strYear = "000" + strYear;
		}
		var strMonth = month + "";
		if(month < 10){
			strMonth = "0" + strMonth;
		}

		// リンク作成
		var strTempRequestUrl = strRequestUrl;
		strTempRequestUrl = strTempRequestUrl.replace("/\.html", "/" + strYear + strMonth + ".html");

		xmlHttp.open("GET", strTempRequestUrl, true);
		xmlHttp.setRequestHeader("If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT");
		xmlHttp.send(null);

//		var strTempRequestUrl = strRequestUrl;
//		xmlHttp.open("POST", strTempRequestUrl, true);
//		xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8'); 
//		xmlHttp.send("year=" + year + "&month=" + month);

	}else{
		// オブジェクトの取得に失敗した場合
		errorCalendar();
	}
}

// カレンダーデータの取得完了時
function eventCalendarData(){
	// データの取得が完了した場合
	if (xmlHttp.readyState == 4 && xmlHttp.status == 200){

		var LF = String.fromCharCode(10);	// 改行コード (LF)
		var COMMA = ",";					// ,

		var strLink;
		var strArrayLinkDay;

		// 取得したデータからリンクが必要な箇所を取得
		try{
			strLine = xmlHttp.responseText.split(LF);
			strLink = strLine[0];
			if(!!strLine[1]){
				strArrayLinkDay = strLine[1].split(COMMA);
			}else{
				strLink = ""
				strArrayLinkDay = null;
			}
		}catch(e){
			strLink = ""
			strArrayLinkDay = null;
		}

		// 日付の取得
		var today = new Date();
		
		var year = today.getFullYear();
		var month = today.getMonth() + 1;

		var year  = parseInt(getCookieCal(calendarCookieKey+"_year",  today.getFullYear()));
		var month = parseInt(getCookieCal(calendarCookieKey+"_month", today.getMonth() + 1));

		// カレンダーの表示
		dispCalendar(year, month, strLink, strArrayLinkDay);
	}
}

// カレンダーの更新
function updateCalendar(year, month){
	// クッキーの設定
	setCookieCal(calendarCookieKey+"_year", year);
	setCookieCal(calendarCookieKey+"_month", month);

	// カレンダーの更新
	loadCalendarData();
}

// カレンダーの表示
function dispCalendar(year, month, link, arrayLinkNum){

	var toDay = new Date();							// システム日付
	var thisMonth = new Date(year, month - 1, 1);	// 表示月
	var nextMonth = getNextMonth(thisMonth,  1);	// 次の月
	var prevMonth = getNextMonth(thisMonth, -1);	// 前の月
	var numLastDay  = getLastDay(year, month);		// 表示月の最終日

	var val;

	val = ""
	val += "<div id=\"calendarwrap\" class=\"sidecolumn\">"
	val += "<h2>カレンダー</h2>"
	val += "<table>"
	val += "<tr class=\"header\">"

	// 前の月へのリンク
	if(year > numLimitYear || (year == numLimitYear && month > numLimitMonth)){
		val += "<td colspan=\"2\" class=\"prev\">"
		val += "<a href=\"#\" onClick=\"updateCalendar(" + prevMonth.getFullYear() + "," + (prevMonth.getMonth() + 1) + "); return false;\">&laquo;&nbsp;前月</a>";
		val += "</td>"
	}else{
		val += "<td colspan=\"2\" class=\"prev\">"
		val += "";
		val += "</td>"
	}

	// 表示月
	val += "<td colspan=\"3\">"
	val += year + "年 " + month + "月";
	val += "</td>"

	// 次の月へのリンク
	if(year != toDay.getFullYear() || month != toDay.getMonth() + 1){
		val += "<td colspan=\"2\" class=\"next\">"
		val += "<a href=\"#\" onClick=\"updateCalendar(" + nextMonth.getFullYear() + "," + (nextMonth.getMonth() + 1) + "); return false;\">翌月&nbsp;&raquo;</a>";
		val += "</td>"
	}else{
		val += "<td colspan=\"2\" class=\"next\">"
		val += "";
		val += "</td>"
	}

	// 曜日の表示
	val += "<tr class=\"youbi\">";
	val += "<td>日</td>"
	val += "<td>月</td>"
	val += "<td>火</td>"
	val += "<td>水</td>"
	val += "<td>木</td>"
	val += "<td>金</td>"
	val += "<td>土</td>"
	val += "</tr>";

	// スペースの取得(開始)
	var tgtDayStart = new Date(year, month - 1, 1);
	var numSpaceStart = tgtDayStart.getDay();

	// スペースの取得(終了)
	var tgtDayEnd = new Date(year, month - 1, numLastDay);
	var numSpaceEnd = 6 - tgtDayEnd.getDay();
	if(numSpaceEnd == 6){
		numSpaceEnd = 0;
	}

	// 日の表示
	val += "<tr>";
	for(i = 1; i <= numSpaceStart; i++){
		val += "<td></td>";
	}
	for(i = 1; i <= numLastDay; i++){
		val += dispDay(year, month, i, link, arrayLinkNum);
		if((thisMonth.getDay() + i) % 7 == 0){
			val += "</tr><tr>";
		}
	}
	for(i = 1; i <= numSpaceEnd; i++){
		val += "<td></td>";
	}
	val += "</tr>";
	val += "</table>";
	val += "</div>";

	// HTMLの置き換え
	document.getElementById("calendar").innerHTML = val;
}

// 日の表示(HTMLの取得)
function dispDay(year, month, day, link, arrayLinkNum) {

	// 現在日付のチェック
	if(year == numNowYear && month == numNowMonth && day == numNowDay){
		day = "<td bgcolor='" +strNowDateBGColor+ "'><font color='" +strNowDateStrColor+ "'>"+day+"</font></td>";
		return day;
	}

	// リンクが必要な箇所にはリンクを追加
	if(link != ""){
		var flgLink = false;
		for(var i = 0; i < arrayLinkNum.length; i++){
			if(arrayLinkNum[i] == day){
				flgLink = true;
				break;
			}
		}
		if(flgLink == true){

			// 0埋め
			var strYear = year + "";
			if(year < 1000){
				strYear = "0" + strYear;
			}else if(year < 100){
				strYear = "00" + strYear;
			}else if(year < 10){
				strYear = "000" + strYear;
			}
			var strMonth = month + "";
			if(month < 10){
				strMonth = "0" + strMonth;
			}
			var strDay = day + "";
			if(day < 10){
				strDay = "0" + strDay;
			}
			// リンク作成
			var strLink = link;
			strLink = strLink.replace("//", "/" + strYear + strMonth + strDay + "/");
			strLink = strLink.replace("/.", "/" + strYear + strMonth + strDay + ".");

			day = "<td class=\"anchor\"><a href=\"" + strLink + "\">"+day+"</a></td>";
		}else{
			day = "<td>"+day+"</td>";
		}
	}else{
		day = "<td>" + day + "</td>";
	}
	return day;
}

// カレンダーの表示に失敗した場合の表示
function errorCalendar(){
	document.getElementById("calendar").innerHTML = "";
}

// 月の最終日を取得
function getLastDay(year, month){
	var lastdate = 31;

	switch(month){
	case 4:
	case 6:
	case 9:
	case 11:
		lastdate = 30;
		break;
	case 2:
		if(year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)){
			lastdate = 29;
		} else {
			lastdate = 28;
		}
		break;
	}
	return lastdate;
}

// 次の月を取得
function getNextMonth(thisDate, i){
	var year = thisDate.getFullYear();
	var month = thisDate.getMonth();
	month += i;

	if(month > 12){
		year++;
		month -= 12;
	}else if(month < 1){
		year--;
		month += 12;
	}
	return new Date(year, month, 1);
}

