2012年8月18日土曜日

【JavaScript】フルAjaxで月間カレンダー

フルAjaxで月間カレンダー。
データベースに保存されている予定があれば取得してカレンダー上にも表示できるようにするためゼロから書いた。
/monthからのresponseにJSONオブジェクト



が返ってくる想定。

今月は「getMonthCalendar('now');」で
前の月は「getMonthCalendar('minus');」、
次の月は「getMonthCalendar('plus');」で取れる。



//月間カレンダーデータを取得するメソッド
function getMonthCalendar(status){
  var today = new Date();
  var trunkcode = "{{items['trunkcode']}}";
  var recid = "{{items['user_record_id']}}";
  var department = $('#month_selected_dep').val();
  var my_department = '{{items["my_department"]}}';
  var selected_department = "";
  if(department!=""&&department!=null){
    selected_department = department;
  }else{
    selected_department = my_department;
  }
  var year,month = "";
  if(calendar_month==""||calendar_year==""){
    year = today.getFullYear();
    month = today.getMonth()+1;
    calendar_month = month;
    calendar_year = year;
  }else{
    if(status=='now'){
      year = today.getFullYear();
      month = today.getMonth()+1;
      calendar_month = month;
      calendar_year = year;
    }else if(status=='minus'){
      calendar_month-=1
      if(Number(calendar_month)==0){
        calendar_month = 12;
        calendar_year -=1;
      }
    }else if(status=='plus'){
      calendar_month+=1
      if(Number(calendar_month)==13){
        calendar_month = 1;
        calendar_year +=1;
      }
    }
  }
  
  //指定された年月の1日の末日を取得する
  var firstday = new Date(calendar_year,calendar_month-1,1);
  var lastday = new Date(calendar_year,calendar_month,0);
  var compdate = lastday.getDate() - firstday.getDate() + 1;
  var json = '{"trunkcode":"'+trunkcode+'","year":"'+calendar_year+'","month":"'+calendar_month+'","record_id":"'+recid+'","department":"'+selected_department+'"}';
  $.post(
    '/month',
    json,
    function(response){
      $('#schedule_tbody_month').empty();
      monthCalLabel(calendar_year,calendar_month);  //月間カレンダーの表示期間を表示するメソッド
      
      //カレンダーテーブルを生成
      var cal_table = $('<table>');
      var table_head_week = $('<tr>');
      table_head_week.append($('<td>').attr('style','background-color:#FF4747;color:white;text-align:center;').append("日"));
      table_head_week.append($('<td>').attr('style','background-color:#666;color:white;text-align:center;').append("月"));
      table_head_week.append($('<td>').attr('style','background-color:#666;color:white;text-align:center;').append("火"));
      table_head_week.append($('<td>').attr('style','background-color:#666;color:white;text-align:center;').append("水"));
      table_head_week.append($('<td>').attr('style','background-color:#666;color:white;text-align:center;').append("木"));
      table_head_week.append($('<td>').attr('style','background-color:#666;color:white;text-align:center;').append("金"));
      table_head_week.append($('<td>').attr('style','background-color:#1975FF;color:white;text-align:center;').append("土"));
      
      
      //先月分を生成する必要があるかどうか、当月の1日の曜日(f_date.getDay()が0じゃない場合)を見て判断する
      var f_date = new Date(calendar_year,calendar_month-1,1);
      if(f_date.getDay()!=0){
        var l_tr = $('<tr>');
        var l_date = new Date(calendar_year,calendar_month-1,0);
        for(var s=0;s<=l_date.getDay();s++){
          lc_date = new Date(calendar_year,calendar_month-1,0-s);
          var l_td = $('<td>').append(lc_date.getDate());
          l_tr.prepend(l_td);
        }
        //当月分のカレンダーを生成
        for(var i=1;i<=compdate;i++){
          var c_date = new Date(calendar_year,calendar_month-1,i);
          var c_td = $('<td>').append(c_date.getDate());
          if(c_date.getDay()==0){
            $('#schedule_tbody_month').append(l_tr);
            l_tr = $('<tr>');
            l_tr.append(c_td);
          }else{
            l_tr.append(c_td);
          }
        }
        
        //来月分のカレンダーを生成
        //alert(lastday.getDay());
        if(lastday.getDay()!=6){
          for(var s=1;s<=7;s++){
            var ll_check_day = new Date(calendar_year,calendar_month,s);
            if(ll_check_day.getDay()==6){
              var ll_td = $('<td>').append(s);
              l_tr.append(ll_td);
              break;
            }else{
              var ll_td = $('<td>').append(s);
              l_tr.append(ll_td);
            }
          }
        }
        $('#schedule_tbody_month').append(l_tr);
      }else{
        //当月分のカレンダーを生成
        for(var i=1;i<=compdate;i++){
          var c_date = new Date(calendar_year,calendar_month-1,i);
          var c_td = $('<td>').append(c_date.getDate());
          if(c_date.getDay()==0){
            $('#schedule_tbody_month').append(l_tr);
            l_tr = $('<tr>');
            l_tr.append(c_td);
          }else{
            l_tr.append(c_td);
          }
        }
        
        //翌月の1週目を生成する必要があるかチェックする
        //alert(lastday.getDay());
        if(lastday.getDay()!=6){
          for(var s=1;s<=7;s++){
            var ll_check_day = new Date(calendar_year,calendar_month,s);
            if(ll_check_day.getDay()==6){
              var ll_td = $('<td>').append(s);
              l_tr.append(ll_td);
              break;
            }else{
              var ll_td = $('<td>').append(s);
              l_tr.append(ll_td);
            }
          }
        }
        $('#schedule_tbody_month').append(l_tr);
      }
      $('#schedule_tbody_month').prepend(table_head_week);
    }
  );
}

0 件のコメント:

コメントを投稿