/* 
	JavaScript for Calender
	Yu Sekiguchi
	2010
*/

var aYear = new Array();    // 祝日用の配列
var aDay = new Array();     // 日にち用の配列
// メンテナンス部分 --------------------------------------
// 年間休日リスト（日曜以外）： 月の区切りは"0".配列の終端は"-1" 
aYear["A.D.2005"] = new Array(1,10,0,11,0,21,0,29,0,3,4,5,0,0,18,0,0,19,23,0,10,0,3,23,0,23,-1);
aYear["A.D.2006"] = new Array(2,9,0,11,0,2,0,29,0,3,4,5,0,0,17,0,0,18,23,0,9,0,3,23,0,23,-1);
aYear["A.D.2007"] = new Array(1,8,0,12,0,21,0,30,0,3,4,5,0,0,16,0,0,17,24,0,8,0,3,23,0,24,-1);
aYear["A.D.2008"] = new Array(1,14,0,11,0,20,0,29,0,3,4,5,6,0,0,21,0,0,15,24,0,13,0,3,23,24,0,23,-1);
aYear["A.D.2009"] = new Array(1,12,0,11,0,20,0,29,0,3,4,5,6,0,0,20,0,0,21,22,23,0,12,0,3,23,0,23,-1);
aYear["A.D.2010"] = new Array(1,11,0,11,0,22,0,29,0,3,4,5,0,0,19,0,0,20,23,0,11,0,3,23,0,23,-1);
aYear["A.D.2011"] = new Array(1,10,0,11,0,21,0,29,0,3,4,5,0,0,18,0,0,19,23,0,10,0,3,23,0,23,-1);
aYear["A.D.2012"] = new Array(1,2,9,0,11,0,20,0,29,30,0,3,4,5,0,0,16,0,0,17,22,0,8,0,3,23,0,23,24,-1);

// 日記が書かれた日にち設定リスト
aDay["d201202"] = new Array(1,2);
aDay["d201201"] = new Array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18,19,20,21,23,24,25,26,27,30,31);
aDay["d201112"] = new Array(1,2,5,6,8,9,12,13,14,15,16,17,19,20,21,22,26,27,28,29,30,31);
aDay["d201111"] = new Array(1,2,3,4,7,8,9,10,12,14,15,16,17,18,19,21,22,24,25,26,29,30);
aDay["d201110"] = new Array(1,3,4,5,6,7,8,11,12,13,14,15,16,17,18,19,20,21,24,25,26,27,31);
aDay["d201109"] = new Array(1,2,5,6,7,8,9,12,13,14,15,16,20,21,22,23,24,26,27,28,29,30);
aDay["d201108"] = new Array(1,2,3,4,5,6,8,9,10,11,12,15,16,17,18,19,20,22,23,24,25,26,27,29,30);
aDay["d201107"] = new Array(1,4,5,6,7,8,11,12,13,14,15,19,20,21,22,25,26,27,28,29);
aDay["d201106"] = new Array(1,2,3,7,8,9,10,14,15,16,17,18,20,21,22,23,24,27,28,29,30);
aDay["d201105"] = new Array(2,3,4,5,6,9,10,11,12,13,14,16,17,18,19,20,23,24,25,26,27,30,31);
aDay["d201104"] = new Array(1,4,5,6,7,8,11,12,13,14,15,16,18,19,21,22,26,27,28);
aDay["d201103"] = new Array(1,2,3,4,7,8,9,10,11,14,15,16,17,18,22,23,24,25,28,29,30,31);
aDay["d201102"] = new Array(1,2,4,7,8,9,10,12,14,15,16,17,18,19,21,22,28);
aDay["d201101"] = new Array(1,2,3,4,5,6,7,8,9,11,12,13,14,15,17,18,19,20,21,22,23,24,25,26,27,28,31);
aDay["d201012"] = new Array(1,2,3,6,7,8,9,10,13,14,15,16,17,18,20,22,24,27,30,31);
aDay["d201011"] = new Array(1,2,3,4,5,6,7,8,11,12,13,15,16,17,19,20,22,24,25,29,30);
aDay["d201010"] = new Array(1,2,4,5,6,7,8,12,13,14,15,16,17,18,19,20,21,22,25,26,27,29);
aDay["d201009"] = new Array(1,2,3,6,7,8,9,10,13,14,15,16,17,20,22,24,25,27,28,29,30);
aDay["d201008"] = new Array(1,2,3,4,5,6,9,10,11,17,18,19,20,23,24,25,27,28);
aDay["d201007"] = new Array(1,2,5,6,7,8,9,12,13,14,15,16,17,20,21,22,23,26,27,28,29,30);
aDay["d201006"] = new Array(1,2,3,7,8,9,10,11,14,15,16,17,18,19,21,22,23,24,25,28,29,30);
aDay["d201005"] = new Array(3,4,5,6,7,10,11,12,13,14,15,17,18,19,20,21,24,25,26,27,28,31);
aDay["d201004"] = new Array(1,2,5,6,7,8,9,12,13,14,15,16,17,19,20,21,22,23,26,27,28,30);
aDay["d201003"] = new Array(1,2,3,4,5,8,9,10,11,12,15,16,17,18,19,23,24,25,26,29,30,31);
aDay["d201002"] = new Array(1,3,4,8,9,10,11,12,13,15,16,17,18,19,20,22,23,24,25,26);
aDay["d201001"] = new Array(1,4,5,6,7,8,9,10,12,13,14,15,16,18,19,20,21,22,25,26,27,28,29,31);
aDay["d200912"] = new Array(2,3,4,7,8,9,10,11,14,15,16,17,18,19,21,22,24,25,26);
aDay["d200911"] = new Array(1,2,3,4,5,6,7,9,10,11,12,13,14,16,17,18,19,20,24,25,26,27,30);
aDay["d200910"] = new Array(1,2,4,5,6,7,8,9,13,14,16,17,18,19,20,21,22,23,24,26,27,29,30,31);
aDay["d200909"] = new Array(1,2,3,4,7,8,9,10,11,14,15,16,17,18,24,25,26,28,29,30);
aDay["d200908"] = new Array(2,3,4,5,6,10,11,12,17,18,19,20,21,22,27,28,29,30,31);
aDay["d200907"] = new Array(1,2,3,6,7,8,9,10,13,14,15,16,17,18,22,23,24,27,28,29,30,31);
aDay["d200906"] = new Array(1,2,3,4,5,8,9,10,11,12,13,15,16,17,18,19,20,22,23,24,25,26,29,30);
aDay["d200905"] = new Array(1,2,3,4,5,6,8,9,11,12,13,14,18,19,20,21,22,23,25,27,28,29);
aDay["d200904"] = new Array(1,2,3,6,7,8,9,10,13,14,15,16,17,18,20,21,22,23,24,27,28,30);
aDay["d200903"] = new Array(2,3,4,5,6,9,10,11,12,13,16,17,18,19,23,24,25,27,30,31);
aDay["d200902"] = new Array(1,3,4,5,6,9,10,11,12,13,14,16,17,18,19,20,21,22,23,24,25,26,27);
aDay["d200901"] = new Array(7,8,9,10,13,14,15,16,17,19,20,21,22,23,24,25,26,28,29,30,31);
aDay["d200812"] = new Array(1,2,3,4,5,8,9,10,11,12,15,16,17,18,19,22,24,25,30,31);
aDay["d200811"] = new Array(1,2,3,10,11,12,13,14,15,17,18,19,20,21,25,26,27);
aDay["d200810"] = new Array(22,23,24,27,29,30,31);
//-----------------------------------------------------

// グローバル変数
var aDays = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); // 月毎の日数
var aWeek = new Array("日", "月", "火", "水", "木", "金", "土");  // 曜日表示文字列
var objParent;        // 親オブジェクト
var tCalendar;        // カレンダーオブジェクト（テーブル）
var nYear = 0;        // 年の初期値
var nMonth = 0;      // 月の初期値
var nToday = 31;      // 日の初期値

// 初期化（最初に呼び出す）
function InitCalendar(year, month) {
    if (tCalendar) objParent.removeChild(tCalendar);
	var parent_id = "cal";
    var nDate = new Date();        // 現在の年、月の取得
	nYear = year;
	nMonth = month;
	nToday = nDate.getDate();      // 今日の日にち
    if (document.getElementById) {
        objParent = document.getElementById(parent_id);
        SetCalendar(year, month);
    }
}

// カレンダーの表示
// 引数 : year（表示年）, month（表示月）
function SetCalendar(year, month) {
    // 変数
    var nDate = new Date();            // 現在のDateオブジェクト
    var nDays;            // 表示月の日数
    var nFirstDay;       // 表示月初日の曜日インデックス
    var bToday;          // 表示月に今日が含まれるかどうか
    var i, j, t;

    nYear = year;
    nMonth = month
    bToday = (nYear == nDate.getFullYear() && nMonth == nDate.getMonth() + 1)? true: false;

    // ひと月の日数
    nDays = aDays[nMonth-1];
    if (nMonth == 2) {    /* 閏月のチェック */
        if (nYear % 400 == 0) nDays =29;
        else if (nYear % 100 == 0) nDays = 28;
        else if (nYear % 4 == 0) nDays= 29;
    }
	
    // 年月の描画
    tCalendar = document.createElement("table");
    with (tCalendar) {
        style.width = "160px";
        style.margin = "0";
        style.tableLayout = "fixed";
        style.border = "1px solid #009900";
        style.backgroundColor = "#f5ffea";
        style.fontSize = "12px";
        style.lineHeight = "16px";
		style.cursor = "move";
    }
    var tbCalendar = document.createElement("tbody");

    // 見出し行（年月）
    var trCaption = document.createElement("tr");
    var tdCaption = document.createElement("td");
    var strCaption = document.createTextNode(nYear + "年 " + nMonth + "月")
	var brCaption = document.createElement("br");
    with (tdCaption) {
        colSpan = "7";
        style.padding = "0px";
        style.borderBottom = "1px solid #cccccc";
        style.textAlign = "center";
    }
    trCaption.appendChild(tdCaption);    // 見出しセル
    tdCaption.appendChild(strCaption);

	/*

    tdCaption.appendChild(brCaption);

	// 月移動ボタン（リンク）
    var aHref = new Array("SetPrevMonth()", "SetThisMonth()", "SetNextMonth()");
	var aTarget = new Array("前月", "今月", "翌月");
    for (i = 0; i < 3; i++) {
        var lnk = document.createElement("a");
        lnk.style.marginLeft = "5px";
        lnk.style.fontSize= "11px";
        lnk.style.color = "green";
        lnk.href = "javascript:" + aHref[i];
		//var g = nMonth - 1 + i;
		//lnk.id = "h210" + g;
        lnk.appendChild(document.createTextNode(aTarget[i]));
        tdCaption.appendChild(lnk);
    }
	*/

    tbCalendar.appendChild(trCaption);  // 見出し行

    // 曜日行
    var trWeek = document.createElement("tr");
    for (i = 0; i < 7; i++) {
        var tdWeek = document.createElement("td");
        with (tdWeek) {
            style.padding = "0";
            style.textAlign = "center";
            appendChild(document.createTextNode(aWeek[i]));
        }
        trWeek.appendChild(tdWeek);
    }
    tbCalendar.appendChild(trWeek);  // 曜日行

    // 日にち行
    nDate.setFullYear(nYear);
    nDate.setMonth(nMonth-1);
    nDate.setDate(1);                // Dateオブジェクトに表示月の1日をセット
    nFirstDay = nDate.getDay();  // 月初の曜日インデックス

    // 月末まで表示
    var row = document.createElement("tr");
    var cell = new Array(nDays);
    for (i = -nFirstDay, j = 0; i < nDays; i++) {
        cell[i] = document.createElement("td");
        with (cell[i]) {
            style.padding = "0";
            style.textAlign = "center";
            if (i < 0) {    /* 一日まで空白で埋める */
                appendChild(document.createTextNode(" "));
            } else {
				// 日にちを設定
				var day = i+1;
				if (day < 10) {
					day = "0" + day;
				}
				var month = nMonth;
				if (month < 10) {
					month = "0" + month;
				}
				var dayId = "d" + nYear + month + day;
				// 今日までの日付にアンカーを入れる。
				if(document.getElementById(dayId)) {
					var elem = appendChild(document.createElement("a"));
					elem.href = "#" + dayId;
	                elem.appendChild(document.createTextNode(i+1));    // 日付
				} else {
					var aRefDays = aDay["d" + nYear + month];
					var Ref = "false";
					for (t = 0; t < aRefDays.length; t++) {
						if(day == aRefDays[t]) {
							var elem = appendChild(document.createElement("a"));
							elem.href = "#" + dayId;
	        	    	    elem.appendChild(document.createTextNode(i+1));    // 日付
							Ref = "true";
							break;
						}
					}
					if(Ref == "false") {
						appendChild(document.createTextNode(i+1));    // 日付
					}
				}
                // 背景色
                if (j == 0) style.backgroundColor = "#ffcccc";    //日曜日
                else if (j == 6) style.backgroundColor = "#ccccff"; // 土曜日
                else style.backgroundColor = "transparent";     // 平日
            }
            row.appendChild(cell[i]);
        }
        if (++j == 7 && i != nDays-1) {    /* 土曜でかつ月末以外の時 */
            tbCalendar.appendChild(row);
            row = document.createElement("tr");
            j = 0;
        } 
    }

    // 祭日の背景色を変更 
    var aRefHoliday = aYear["A.D."+nYear];       // 祭日配列の参照
    if (aRefHoliday) {
        for (i=0, j=1; j+1<=nMonth; i++) {    /* 該当月までスキップ */
            if (aRefHoliday[i] == -1) break;
            if (aRefHoliday[i] == 0) j++;
        }
        while (aRefHoliday[i] > 0) {    /* 該当月の終り(0か-1)までループ */
            cell[aRefHoliday[i++]-1].style.backgroundColor = "#ffcccc";
　      }
    }

    // 今日が含まれる時は該当部分の背景色を変更
    if (bToday) cell[nToday-1].style.backgroundColor = "#99ff99";
    tbCalendar.appendChild(row);

    //テーブルの表示
    tCalendar.appendChild(tbCalendar);
    objParent.appendChild(tCalendar);
}


// 前月の表示
function SetPrevMonth() {
    if (nMonth == 1) {    /* 表示が1月の時は年を調整 */
        nMonth = 12;
        nYear--;
    } else {
        nMonth--;
    }
    if (tCalendar) objParent.removeChild(tCalendar);
    SetCalendar(nYear, nMonth);
}

// 翌月の表示
function SetNextMonth() {
    if (nMonth == 12) {    /* 表示が12月の時は年を調整 */
        nMonth = 1;
        nYear++;
    } else {
        nMonth++;
    }
    if (tCalendar) objParent.removeChild(tCalendar);
    SetCalendar(nYear, nMonth);
}


// 今月の表示
function SetThisMonth() {
    if (tCalendar) objParent.removeChild(tCalendar);
    var nDate = new Date();        // 現在の年、月の取得
	nYear = nDate.getFullYear();    // 現在の年
	nMonth = nDate.getMonth() + 1;    // 現在の月
	nToday = nDate.getDate();      // 今日の日にち
    SetCalendar(nYear, nMonth);
}

var dd1 = new YAHOO.util.DD("calendar", "myGroup");
