/***********************************************************
*  入力カレンダー生成 ver.0.01
*
*                                          since 2006.8.31
*                                     copyright tripod Ltd.
*                                      http://www.t-pod.jp
***********************************************************/
/*
var week_name = new Array("日","月","火","水","木","金","土");
*/
var week_name_array = ["日","月","火","水","木","金","土"];


var special_days = [
                   [ 1, [ [1, "元旦"],
                         ["月2", "成人の日"] ] ],
                   [ 2, [ [11,"建国記念日"] ] ],
                   [ 3, [ [21,"春分の日"] ] ],
                   [ 4, [ [29,"昭和の日"] ] ],
                   [ 5, [ [3,"憲法記念日"],
                         [4,"みどりの日"],
                         [5,"こどもの日"] ] ],
                   [ 6, [ ] ],
                   [ 7, [ ["月3","海の日"] ] ],
                   [ 8, [ ] ],
                   [ 9, [ ["月3","敬老の日"],
                          [23,"秋分の日"] ] ],
                   [10, [ ["月2","体育の日"] ] ],
                   [11, [ [3,"文化の日"],
                          [23,"勤労感謝の日"] ] ],
                   [12, [ [23, "天皇誕生日"] ] ]
                 ];


function special_day(year,month,day) {
  var date = new Date(year,month,day);
  var wday = date.getDay();
  var weekcnt = 0, chk1_weekchk, chk2_weekcnt;
  var i,j;
  var spday;
  var chk1 = false;
  var chk2 = false;
  
  for ( j=0;j<special_days[month][1].length;j++ ) {
    i = special_days[month][1][j];
    if ( isNaN( i[0] ) ) {
      weekcnt = Math.floor(((day - 1) / 7 + 1));
      if ((week_name(wday) + weekcnt) == i[0]) {
        return i[1];
      }
      
      chk1_weekcnt = Math.floor(((day - 1 - 1) / 7 + 1));
      chk2_weekcnt = Math.floor(((day + 1 - 1) / 7 + 1));
      if ((week_name(wday - 1) + chk1_weekcnt) == i[0]) {
        chk1 = true;
      } else if ((week_name(wday + 1) + chk2_weekcnt) == i[0]) {
        chk2 = true;
      }
    } else {
      if(i[0] == day) {
        return i[1];
      } else if ((day - 1) == i[0]) {
        chk1 = true;
      } else if ((day + 1) == i[0]) {
        chk2 = true;
      }
    }
  }
  
  if (chk1 && chk2) {
    return "国民の休日";
  } else if (chk1 && wday == 1) {
    return "振替休日";
  }
  
  return "";
}

/*  */
function next_month(date) {
  var month = date.getMonth();
  var year  = date.getFullYear();
  month = month + 1;
  if ( month >= 12 ) {
    month = 0;
    year = year + 1;
  }
  return (new Date(year,month,1));
}

/*  */
function prev_month(date) {
  var month = date.getMonth();
  var year  = date.getFullYear();
  month = month - 1;
  if ( month < 0 ) {
    month = 11;
    year = year - 1;
  }
  return (new Date(year,month,1));
}

/**/
function last_date_in_month(date) {
  var month = date.getMonth();
  var year  = date.getYear();
  var nm_date = next_month(date);
  last_date = new Date();
  last_date.setTime( nm_date.getTime() - (60*60*24*1000) );
  return last_date
/*
  var last_date = new Date();
  last_date.setTime( nm_date.getTime() - (60*60*24*1000));
  return (last_date);
*/
}

/**/
function days_in_month(date){
  return last_date_in_month(date).getDate();
}

/**/
function week_name(wday){
  if (wday < 0) {
    wday = (7 + (wday % 7));
  }
  if (wday > 6) {
    wday = wday % 7;
  }
  return week_name_array[wday];
}
/**/
function week_code(name){
  for (var i = 0;i<7;i++) {
     if (week_name_array[i] == name) { return i }
  }
  return null;
}

/*  */
function input_calendar(name,date,on_click,target) {
  var j = 0;
  var i = 0;
  var today = new Date();
  var year = date.getFullYear();
  var month = date.getMonth();
  
  
  /* オフセット計算 */
  var onclick = document.getElementById(on_click);
  var otmp = onclick;
  var mtop = 0;
  var mleft = 0;
  while( otmp != document.body ){
    mtop  += otmp.offsetTop;
    mleft += otmp.offsetLeft;
    otmp  =  otmp.offsetParent;
  }
  var top  = mtop;
  var left = mleft + onclick.offsetWidth;
  
  /* 日数 */
  var days = days_in_month(date);
  var offset = date.getDay();
  var rows = Math.ceil(((offset + days) / 7.0));
  
  /* html 生成 */
  var html = '';
  
  html += "<DIV class='popup_calendar' name='calendar' style='background-color:white;position:absolute;top:" + top + ";left:" + left + ";'>\n";
  
  html += "<TABLE class='popup_calendar_table' border='0' cellpadding='0' cellspaceing='1'><TBODY>\n";
  
  /* ヘッダ */
  var next_event = "onmousedown=next_calendar('"+target+"'," + year+ ","+month+");";
  var prev_event = "onmousedown=prev_calendar('"+target+"'," + year+ ","+month+");";
  
  html += "<TR>";
  html += "<TD class='popup_calendar_prev_h'>";
  html += "<DIV id='popup_calendar_prev' " + prev_event + ">←</DIV>";
  html += "</TD>";
  html += "<TD class='popup_calendar_month_h' colspan='5'>" + year + "." + (month+1) + "</TD>";
  html += "<TD class='popup_calendar_next_h'><DIV id='popup_calendar_next' " + next_event + ">→</DIV></TD>";
  html += "</TR>";
  
  /* 曜日 */
  html += "<TR>";
/*  html += "<TD class='popup_calendar_sunday_h'>" + "日" + "</TD>";*/
  html += "<TD class='popup_calendar_sunday_h'>" + week_name(0) + "</TD>";
  
  var weeks = new Array("月","火","水","木","金");
  for (i=1;i<6;i++) {
    html += "<TD class='popup_calendar_weekday_h'>" + week_name(i) + "</TD>";
  }
  html += "<TD class='popup_calendar_saturday_h'>" + week_name(6) + "</TD>";
  html += "</TR>";
  
  /* 日付 */
  var day = 1 - offset;
  var today_day = 100;
  var click_event;
  
  if (today.getFullYear() == year && today.getMonth() == month) {
    today_day = today.getDate();
  }
  for (i = 0; i<rows; i++) {
    html += "<TR>";
    for (j=0;j<7;j++){
      if(day > 0 && day <= days){
        click_event = "onmousedown=insert_date('"+target+"',"+year+","+month+","+day+");hide_popup_calendar('"+name+"');";
        
        if (today_day == day) {
          html += "<TD class='popup_calendar_today_d'><DIV id='popup_calendar_today' "+ click_event +">" + day + "</DIV></TD>";
        } else if (special_day(year,month,day) != "") {
          html += "<TD class='popup_calendar_sunday_d'><DIV id='popup_calendar_sunday' "+ click_event +">" + day + "</DIV></TD>";
        } else if (j==0){
          html += "<TD class='popup_calendar_sunday_d'><DIV id='popup_calendar_sunday' "+ click_event +">" + day + "</DIV></TD>";
        } else if (j==6){
          html += "<TD class='popup_calendar_saturday_d'><DIV id='popup_calendar_weekday' "+ click_event +">"+day+"</DIV></TD>";
        } else {
          html += "<TD class='popup_calendar_weekday_d'><DIV id='popup_calendar_saturday' "+ click_event +">"+day+"</DIV></TD>";
        }
      } else {
        html += "<TD class='popup_calendar_none_d'></TD>";
      }
      day++;
    }
    html += "</TR>";
  }
  
  /* フッタ */
  html += "<TR>";
  html += "<TD class='popup_calendar_footer_h' colspan='7'>";
  html += "<INPUT type='button' value='閉じる' onclick=hide_popup_calendar('"+name +"'); />";
  html += "<INPUT type='button' value='クリア' onclick=clear_date('"+target+"');hide_popup_calendar('"+name +"'); /></TD>";
  html += "</TR>";
  
  
  html += "</TBODY></TABLE>\n";
  
  html += "</DIV>\n";
  
  return html;
}


/**/
function show_popup_calendar(name,date,onclick,target) {
  var popup = document.getElementById(name);
  html = input_calendar(name,date,onclick,target);
  popup.style.display = 'block';
  popup.innerHTML = html;
}
/**/
function hide_popup_calendar(name){
  var popup = document.getElementById(name);
  popup.style.display = 'none';
}

/**/
function next_calendar(target,year,month){
  var date = new Date(year,month,1);
  var name = target + "_cal";
  var onclick = target + "_click";
  var next = next_month(date);
  show_popup_calendar(name,next,onclick,target);
}
/**/
function prev_calendar(target,year,month){
  var date = new Date(year,month,1);
  var name = target + "_cal";
  var onclick = target + "_click";
  var prev = prev_month(date);
  show_popup_calendar(name,prev,onclick,target);
}

/**/
function insert_date(target,year,month,day){
  var date = new Date(year,month,day);
  var html = year + "年" + (month+1) + "月" + day + "日" + " (" + week_name(date.getDay()) + ")";
  var idate = year + "-" + (month+1) + "-" + day;
  document.getElementById(target+"_i").innerHTML = html;
  document.getElementById(target).value = idate;
/*
  document.getElementById(target+'(1i)').value = year;
  document.getElementById(target+'(2i)').value = month+1;
  document.getElementById(target+'(3i)').value = day;
*/
}
function clear_date(target){
  var html = "----年 --月 --日 (--)";
  document.getElementById(target+"_i").innerHTML = html;
  document.getElementById(target).value = '';
/*
  document.getElementById(target+'(1i)').value = '';
  document.getElementById(target+'(2i)').value = '';
  document.getElementById(target+'(3i)').value = '';
*/
}


/**/
function today_calendar(target){
  var year = "";
/*
  year  = document.getElementById(target+'(1i)').value;
  month = document.getElementById(target+'(2i)').value - 1;
  day   = document.getElementById(target+'(3i)').value;
*/
  if (year == "") {
    var date = new Date();
  } else {
    var date = new Date(year,month,day);
  }
  date.setDate(1);
  var name = target + "_cal";
  var onclick = target + "_click";
  show_popup_calendar(name,date,onclick,target);
}

