var year  = "";  //対象の年（４桁）
var month = ""; //対象の月（１縲怩Q桁）
var date  = "";  //対象の日（１縲怩Q桁）
var day   = ""; //対象の曜日
var diff = 0; //現在の月との差異

var sun = "#FF555B";  //日曜の文字色
var nor = "#606060";  //平日の文字色
var sat = "#57A2F6";  //土曜の文字色
var non = "#808080";  //リンクなし

//================================================
// ■calender
// 引数…なし
// 戻り値…なし
// 概要…カレンダーを作成する
//================================================
function calendar()
{
  var maxdate = new Array(31,28,31,30,31,30,31,31,30,31,30,31); //月毎の日数

  //対象日付取得
  if(this.diff < 0) {
    this.date = 100;
    if(this.month > Math.abs(this.diff)) {
      this.month += this.diff;
    }else {
      tmp_diff = this.diff + this.month;
      exc = tmp_diff % 12;
      year_diff = (tmp_diff - exc) / 12 - 1;
      this.month = 12 + exc;
      this.year += year_diff;
    }
  }else if(this.diff > 0) {
    this.date = 0;
    if(13 - this.month > Math.abs(this.diff)) {
      this.month += this.diff;
    }else {
      tmp_diff = this.diff - (13 - this.month);
      exc = tmp_diff % 12;
      year_diff = (tmp_diff - exc) / 12 + 1;
      this.month = exc + 1;
      this.year += year_diff;
    }
  }
  this.diff = 0;

  //うるう年
  if(this.month == 2){
    if(this.year % 4 == 0){
      if((this.year % 100 == 0) && (this.year % 400 != 0)){
      }else {
         maxdate[1] = 29;
      }
    }
  }

  //出力HTML作成
  var html = "";
  html += "<table>";
  html += "<tr class='title'>";
  html += " <td><a href='' onClick='return backMonth()' class='mark'>≪</a></td>";
  html += " <td colspan='5'><a href='' onClick='return getMyDataMonth(0)'>" + this.year + "年" + this.month + "月</a></td>";
  html += " <td><a href='' onClick='return nextMonth()' class='mark'>≫</a></td>";
  html += "</tr>";
  html += "<tr class='dat_day'>" + defTD("日", this.sun, false, null) + defTD("月", nor, false, null) + defTD("火", nor, false, null) + defTD("水",nor, false, null)
                             + defTD("木", this.nor, false, null) + defTD("金", nor, false, null) + defTD("土", sat, false, null) + "</tr>";
  html += "<tr class='dat'>";

  //先月分は空白
  for(dayIndex = 0; dayIndex < (new Date(this.year,this.month-1,1)).getDay(); dayIndex++){
    html += defTD("&nbsp;", nor, false, null);
  }

  //対象月のカレンダー作成
  for(i = 1; i <= maxdate[this.month - 1]; i++) {
    if(i != 1 && dayIndex == 0) {
      html += "<tr class='dat'>";
    }
    //検索条件文字列作成
    var y_str = String(this.year);
    var m_str = String(this.month);
    if(m_str < 10) m_str = "0" + m_str;
    var d_str = String(i);
    if(d_str < 10) d_str = "0" + d_str;
    //この日付のファイルが存在しない場合はリンクを表示しない
    if(this.filelist_str.indexOf(y_str + m_str + d_str) == -1) {
      switch(dayIndex) {
        case 0:   //一番左の列（日曜）の場合
          html += defTD(i, this.non, false, null);
          break;
        case 6:   //一番右の列（土曜）の場合
          html += defTD(i, this.non, false, null);
          html += "</tr>";
          break;
        default:  //その他（平日）の場合
          html += defTD(i, this.non, false, null);
          break;
      }
    //この日付のファイルが存在する場合はリンクを表示する
    }else {
      //表示中の場合
      if(i == this.date) {
        html += defTD(i,"#000000", true, "#DDA0DD");
      }else {
        switch(dayIndex) {
          case 0:   //一番左の列（日曜）の場合
            html += defTD(i, this.sun, true, null);
            break;
          case 6:   //一番右の列（土曜）の場合
            html += defTD(i, this.sat, true, null);
            html += "</tr>";
            break;
          default:  //その他（平日）の場合
            html += defTD(i, this.nor, true, null);
            break;
        }
      }
    }
    dayIndex++;
    dayIndex %= 7;
  }
  if(dayIndex != 7) {
    html += "</tr>";
  }
  html += "</table>";
  //出力
  document.getElementById('cal').innerHTML = html;
}

//================================================
// ■defTD
// 引数…str:曜日及び日付の文字
//       iro:文字色(RGB)
//       flag:記事存在フラグ
//       bg:背景色
// 戻り値…カレンダー１日分の文字列
// 概要…カレンダーのTD部を作成する
//================================================
function defTD(str, iro, flag, bg) {
  if(flag) {
    str = "<a href='blog.html' onClick='return getMyData("+str+")' style='color:"+ iro + ";'>"+str+"</a>";
    if(bg) var out = "<td style='background-color:" + bg + ";'>" + str + "</td>";
    else var out = "<td style='color:"+ iro + ";'>" + str + "</td>";
  }else {
    var out = "<td style='color:"+ iro + ";'>" + str + "</td>";
  }
  return out;
}

//================================================
// ■nextMonth
// 引数…なし
// 戻り値…false
// 概要…次の月へ移動処理
//================================================
function nextMonth(){
  this.diff = 1;
  this.date = 1;
  //カレンダー再描画
  calendar();
  return false;
}

//================================================
// ■backMonth
// 引数…なし
// 戻り値…false
// 概要…前の月へ移動処理
//================================================
function backMonth(){
  this.diff = -1;
  this.date = 1;
  //カレンダー再描画
  calendar();
  return false;
}

//================================================
// ■getMyData
// 引数…date:選択した日
// 戻り値…false
// 概要…選択データを取得する
//================================================
function getMyData(date) {
  this.date = date;
  //ファイル名を生成してデータを取得する
  var f_name = mkFileName(this.year, this.month, this.date);
  var contents = getData(f_name);
  //出力
  dispContents(contents);
  //次の記事、前の記事リンク表示
  dispNextAndBefore(f_name);
  //カレンダー再描画
  calendar();
  return false;
}

//================================================
// ■getMyDataMonth
// 引数…diff:現在の月からの変化量
// 戻り値…false
// 概要…選択データを取得する
//================================================
function getMyDataMonth(diff) {
  this.diff = diff;
  this.date = 0;  //対象の日は存在しない
  //カレンダー再描画
  calendar();
  //対象月の存在するファイル名を取得
  var filelist = getMonthFileName();
  //対象月の全内容（5行目）を取得する
  var contentslist = getMonthData(filelist);
  //表示
  dispMonthData(contentslist);
  //次の月、前の月リンク表示
  dispNextAndBeforeMonth();
  return false;
}

