// #require "mootools.js"
// #require "dayChecker.js"

// 月の日数
function getDaysOfMonth(year, month) {
	var result = 30;
	switch(month - 0) {
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10:
	case 12:
		result = 31;
		break;
//	case 4:
//	case 6:
//	case 9:
//	case 11:
//		result = 30;
//		break;
	case 2:
		var isLeap = !(year % 400) || !(year % 4) && (year % 100);
		result = (isLeap) ? 29 : 28;
		break;
	}
	return result;
}

// 日付（キャプションに表示する年月）の書式文字列
Sb2YMFormat = '%B %Y';

// 一番最近の月別アーカイブリンク（＝当月にエントリーがない場合の"«"のリンク先）
var recent_archive = "http://www.antimon2.atnifty.com/2008/12/";

// カレンダーデータ
var cal_data = new Array();
//function addCalData(id, yyyymm) {
function registerCalendarDest(id, yyyymm) {
	var obj;
	if (arguments.length < 2) {
		obj = {"id": id};
	} else {
		if (('' + yyyymm).indexOf("/", 0) >= 0) {
			var tmparr = new Array();
			tmparr = yyyymm.split("/");
			obj = {"id": id, "yyyymm": tmparr[0] + tmparr[1], "yyyy/mm": yyyymm };
		} else {
			yyyymm -= 0;
			var mm = yyyymm % 100;
			var yyyy = (yyyymm - mm) / 100;
			obj = {"id": id, "yyyymm": yyyymm, "yyyy/mm": yyyy + "/" + mm };
		}
	}
	cal_data.push(obj);
}

// カレンダーセット関数（コールバック）
function cb_setCalendar (id, data) {
	var dst = $(id);
	if (typeof(dst) == 'undefined' || dst == null)	return;
	if (typeof(data) == 'undefined') {
		var tmp_month = "" + currentMonth;
		while (tmp_month.length < 2)	tmp_month = '0' + tmp_month;
		data = {"year": "" + currentYear, "month": tmp_month};
	}
	var a_title = data["year"] + "&#24180;" + data["month"] + "&#26376;";
	if (typeof(Sb2YMFormat) != 'undefined' && Sb2YMFormat != '%B %Y') {
		var Y = data["year"];
		var m = data["month"];
		var formats = {
			"Y": Y,
			"y": Y.substr(2),
			"b": m.replace(/^0/, ''),
			"B": m.replace(/^0/, ''),
			"m": m
		};
		a_title = Sb2YMFormat;
		for (var pat in formats) {
//			var re = new RegExp("%" + pat, "g");
//			a_title = a_title.replace(re, formats[pat]);
			a_title = eval("a_title.replace(/%" + pat + "/g, formats[pat]);");
		}
	}
	var result = ''
		+ '<table summary="投稿した日にリンクする月別のカレンダー">'
		+ '<caption class="calendarhead">';
	if (data["previous"]) {
		result += '<a href="' + data["previous"] + '">&laquo;</a>&nbsp;';
	} else if (recent_archive) {
		result += '<a href="' + recent_archive + '">&laquo;</a>&nbsp;';
	} else {
		result += '&laquo; ';
	}
	if (data["archive"]) {
		result += '<a href="' + data["archive"] + '">' + a_title + '</a>';
	} else {
		result += a_title;
	}
	if (data["next"]) {
		result += '&nbsp;<a href="' + data["next"] + '">&raquo;</a>';
	} else {
		result += '&nbsp;&raquo;';
	}
	result += '</caption>';
	result += '<thead>'
		+ '<tr>'
		+ '<th abbr="Sunday"><span class="calendar"><span class="holiday">Sun</span></span></th>'
		+ '<th abbr="Monday"><span class="calendar">Mon</span></th>'
		+ '<th abbr="Tuesday"><span class="calendar">Tue</span></th>'
		+ '<th abbr="Wednesday"><span class="calendar">Wed</span></th>'
		+ '<th abbr="Thursday"><span class="calendar">Thu</span></th>'
		+ '<th abbr="Friday"><span class="calendar">Fri</span></th>'
		+ '<th abbr="Saturday"><span class="calendar"><span class="saturday">Sat</span></span></th>'
		+ '</tr>'
		+ '</thead>'
	;
	var md1 = getFirstMonday(data["year"], data["month"]);
	var days = getDaysOfMonth(data["year"], data["month"]);
	result += '<tbody>';
	var topBlanks = (9 - md1) % 7;
	if (topBlanks) {
		result += '<tr>';
		for (var i = 0; i < topBlanks; i++) {
			result += '<td>&nbsp;</td>';
		}
	}
	for (var day = 1; day <= days; day++) {
		if (isSunday(data["year"], data["month"], day)) {
			result += '<tr>';
		}
		result += '<td>';
		if (isToday(data["year"], data["month"], day)) {
			result += '<span class="today">';
		} else {
			result += '<span class="calendar">';
		}
		if (isHoliday(data["year"], data["month"], day)) {
			result += '<span class="holiday">';
		} else if (isSaturday(data["year"], data["month"], day)) {
			result += '<span class="saturday">';
		}
		if (data[day]) {
			result += '<a href="' + data[day].link + '">' + day + '</a>';
		} else {
			result += day;
		}
		if (isHoliday(data["year"], data["month"], day)
		 || isSaturday(data["year"], data["month"], day)) {
			result += '</span>';
		}
		result += '</span></td>';
		if (isSaturday(data["year"], data["month"], day)) {
			result += '</tr>';
		}
	}
	var bottomBlanks = ((42 - days - topBlanks) % 7);
	if (bottomBlanks) {
		for (var i = 0; i < bottomBlanks; i++) {
			result += '<td>&nbsp;</td>';
		}
		result += '</tr>';
	}
	result += '</tbody>';
	result += '</table>';
	dst.innerHTML = result;
}

// カレンダーセット関数
function setCalendar() {
	var arr1 = new Array();
	var arr2 = new Array();
	cal_data.each( function(obj) {
		var id = obj.id;
		var yyyymm = currentYear * 100 + currentMonth;
		if (obj["yyyymm"]) {
			yyyymm = obj["yyyymm"] - 0;
		}
		var idx = arr1.indexOf(yyyymm);
		if (idx < 0) {
			arr1.push(yyyymm);
			arr2.push([id]);
		} else {
			arr2[idx].push(id);
		}
	} );
	arr1.each( function(yyyymm, idx) {
		var idList = arr2[idx];
		var y = ("" + yyyymm).substr(0, 4);
		var m = ("" + yyyymm).substr(4);
		var url = "http://www.antimon2.atnifty.com/" + y + "/" + m + "/Sb2CalendarData.json";
		var func = function(list) {
			return function (data) {
				list.each( function(id) {
					cb_setCalendar(id, data);
				} );
			};
		};
		var func2 = function(list) {
			return function (status) {
				list.each( function(id) {
					cb_setCalendar(id);
				} );
			};
		};
		try {
			new Json.Remote(url, {
				method: "get",
				onComplete: func(idList),
				onFailure: func2(idList)
			}).send();
		} catch (e) {
			idList.each( function(id) {
				cb_setCalendar(id, undefined);
			} );
		}
	} );
}

// カレンダーロード
function loadCalendar() {
	setCurrentDate();
	setCalendar();
}
// ページロードイベントハンドラ
// window.onload = loadCalendar;
