/**
 * @author sugimoto
 */
if (!addEvent)
{
  var addEvent = function(obj, type, func)
  {
    if (window.addEventListener)
    {
      obj.addEventListener(type, func, false);
    }
    else if (window.attachEvent)
    {
      obj.attachEvent('on' + type, func);
    }
    else
    {
      obj['on' + type] = func;
    }
  }
}
if (!removeEvent)
{
  var removeEvent = function(obj, type, func)
  {
    if (window.removeEventListener)
    {
      obj.removeEventListener(type, func, false);
    }
    else if (window.detachEvent)
    {
      obj.detachEvent('on' + type, func);
    }
    else
    {
      obj['on' + type] = null;
    }
  }
}
(function(){
  var n = navigator.userAgent.toLowerCase();
  window.IE = (!window.opera && n.indexOf('msie') > 0 ) ? true : false;
})
 function BlogCalendar()
 {
  //initialize
  var thisClass = this;
  var dObj = new Date();
  var currentYear = dObj.getFullYear();
  var currentMonth = dObj.getMonth();
  var currentDay = dObj.getDay();
  var today = currentYear + '' +  currentMonth + '' +  dObj.getDate();
  dObj.setDate(1);
  var weekArr = ['日', '月', '火', '水', '木', '金', '土'];
  var lastDayArr = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  var calendarNode = document.createElement('div')
  calendarNode.id = 'ci_calendar_id';
  calendarNode.className = 'ci_calendar_box';
 // addEvent(calendarNode, 'mousedown', function(ev){
  //  (IE) ? document.body.onselectstart = function(e){return false;} : ev.preventDefault();
 // });
  var ymTable = document.createElement('table');
  ymTable.className = 'ci_calendar_ym_table';
  var calBody = document.createElement('div');
  calBody.className = 'ci_calendar_body';
  var calBodyTable = document.createElement('table');
  calBodyTable.className = 'ci_calendar_body_table';
  var inputMode = false;
  var isConnect = false;
  var currentTarget = '';
  var currentEntries = {};
  var JSONCache = {};
  this.targetPosition = {};
  this.selectedDate = 0;
  var showFlag = false;
  //changeDate Methods
  this.createCalendatCloseBtn = function(){
    var a = document.createElement('a');
    a.className = 'ci_clanedar_close';
    addEvent(a, 'click', function(){
      thisClass.hide();
    })
    return a;
  }
  this.adjustDate = function()
  {
    dObj.setFullYear(currentYear);
    dObj.setMonth(currentMonth);
    dObj.setDate(1);
    currentDay = dObj.getDay();
    showFlag = false;
    isConnect = true;
    this.start();
  
  }
  this.resetContents = function()
  {
    ymTable.removeChild(ymTable.firstChild);
    calBodyTable.removeChild(calBodyTable.firstChild);
    calBody.removeChild(calBody.firstChild);
    calendarNode.removeChild(calendarNode.firstChild);
  }
  this.nextMonth = function()
  {
    if (isConnect === true)return; // gurad multiconnect
    currentMonth += 1;
    if (currentMonth == 12)
    {
       currentMonth = 0;
       currentYear += 1;
    }
    this.adjustDate();
  }
  this.prevMonth = function()
  {
    if (isConnect === true)return; // gurad multiconnect
    currentMonth -= 1;
    if (currentMonth < 0)
    {
      currentMonth = 11;
      currentYear -= 1;
    }     
    this.adjustDate();
  }
  this.nextYear = function()
  {
    if (isConnect === true)return; // gurad multiconnect
    currentYear += 1;
    this.adjustDate();
  }
  this.prevYear = function()
  {
    if (isConnect === true)return; // gurad multiconnect
    currentYear -= 1;
    this.adjustDate();
  }
  this.genereteCal = function(y, m, day)
  {
    var day = day;
    if((y % 4 ) == 0 && (y % 100) != 0 || (y % 400) == 0)lastDayArr[1] = 29;
    var lastDay = lastDayArr[m];
    var rowArr = Math.ceil((day + lastDay) / 7);
    var dateArr = [];
    for(var l = 0; l < lastDay; l++)dateArr[l+ day] = l + 1;
    var p = day - 1;
    prevM = (m - 1 < 0 ) ? 11 : m;
    while (p >= 0)
    {
      dateArr[p] = [lastDayArr[prevM] - (day - p), 'npDay'];
      p--;
    }
    var count =  7 - dateArr.length % 7;
    for (var n = 0; n < count; n++)dateArr.push([n + 1, 'npday']);      
    //create date state and prev_next_month, year
    var tbYM = document.createElement('tbody');
    var trYM = document.createElement('tr');
    var YM = document.createElement('th');
    YM.className = 'ci_calendar_caption_ym';
    YM.colSpan = '4';
    YM.innerHTML = (y + '年' + (m + 1) + '月');
    trYM.appendChild(YM);
    tbYM.appendChild(trYM);
    var trPN = document.createElement('tr');
    var prY = document.createElement('th');
    var prY_a = document.createElement('a');
    prY_a.href = 'javascript:void(0)';
    prY_a.innerHTML = '&lt;&lt;前年';
    addEvent(prY_a, 'click', function(ev){
      thisClass.prevYear();
    });
    prY.appendChild(prY_a);
    trPN.appendChild(prY);
    var prM = document.createElement('th');
    var prM_a = document.createElement('a');
    prM_a.href = 'javascript:void(0)';
    prM_a.innerHTML = '&lt;前月';
    addEvent(prM_a, 'click', function(){
      thisClass.prevMonth();
    });
    prM.appendChild(prM_a);
    trPN.appendChild(prM);
 //   var bl = document.createElement('th');
 //   bl.className = 'ci_calendar_ym_blank';
 //   trPN.appendChild(bl);
    var neM = document.createElement('th');
    var neM_a = document.createElement('a');
    neM_a.href = 'javascript:void(0)';
    neM_a.innerHTML = '翌月&gt;';
    addEvent(neM_a, 'click', function(){
      thisClass.nextMonth();
    });
    neM.appendChild(neM_a);
    trPN.appendChild(neM);    
    var neY = document.createElement('th');
    var neY_a = document.createElement('a');
    neY_a.href = 'javascript:void(0)';
    neY_a.innerHTML = '翌年&gt;&gt;';
    addEvent(neY_a, 'click', function(){
      thisClass.nextYear();
    });
    neY.appendChild(neY_a);
    trPN.appendChild(neY);
    tbYM.appendChild(trPN);
    ymTable.appendChild(tbYM);
    calendarNode.appendChild(ymTable);

    //create calendar table
    var tb = document.createElement('tbody');
    var tr_week = document.createElement('tr');
    for(var i = 0; i < weekArr.length; i++)
    {
      var th_week = document.createElement('th');     
      if (i == 0) {
        th_week.className = 'ci_calendar_sunday';
      }
      else if (i == 6) {
        th_week.className = 'ci_calendar_saturday';
      }
      else
      {
        th_week.className = 'ci_calendar_week';
      }
      th_week.innerHTML = weekArr[i];
      tr_week.appendChild(th_week);
    }
    tb.appendChild(tr_week);
    for(var j = 0; j < rowArr; j++)
    {
      var tr_body = document.createElement('tr');
      for(var k = 0; k < 7; k++)
      {
        var td_day = document.createElement('td');

        if (typeof dateArr[k + (j * 7)] == 'object') {
          if (k == 0)
          {
            td_day.className = 'ci_calendar_sunday  np_textf';
          }
          else if (k == 6)
          {
            td_day.className = 'ci_calendar_saturday  np_textf';
          }
          else
          {
            td_day.className = 'np_text';
          }
 //         if (dateArr[k + (j * 7)][0] in currentEntries) {
 //           var link = document.createElement('a');
 //           link.href = currentEntries[dateArr[k + (j * 7)][0]];
 //           link.innerHTML = dateArr[k + (j * 7)][0];
 //           td_day.appendChild(link);
 //         }
 //         else {
            td_day.innerHTML = dateArr[k + (j * 7)][0];
  //        }
        }
        else {
          if (k == 0)
          {
            if (dateArr[k + (j * 7)] in currentEntries) {
              td_day.className = 'ci_calendar_sunday withlink';
            }
            else td_day.className = 'ci_calendar_sunday';
          }
          else if (k == 6)
          {
            if (dateArr[k + (j * 7)] in currentEntries) {
              td_day.className = 'ci_calendar_saturday withlink';
            }
            else td_day.className = 'ci_calendar_saturday';
          }
          if (y + '' + m + '' + dateArr[k + (j * 7)] == today) {
            td_day.id = 'ci_calendar_today';
            if (dateArr[k + (j * 7)] in currentEntries) {
              td_day.className = 'withlink';
            }
             td_day.innerHTML = dateArr[k + (j * 7)];
          }
          else {
            if (dateArr[k + (j * 7)] in currentEntries) {
              td_day.className = 'withlink';
            }
            td_day.innerHTML = dateArr[k + (j * 7)];
          }
/*          td_day.event('mouseover', function(ev){
            var target = thisClass.CI.utility.getEventElement(ev);
            target.addStyle('background-color', '#ccc');
          });
          td_day.event('mouseout', function(ev){
              var target = thisClass.CI.utility.getEventElement(ev);
              if (target.className == 'ci_calendar_sunday')
              {
                var bg = '#ffb9b9';
              }
              else if (target.className == 'ci_calendar_saturday')
              {
                var bg = '#84c1ff';
              }
              else
              {
                var bg = '#fff';
              }
            target.addStyle('background-color', bg);
          })
          td_day.event('mouseover', function(ev){
            var target = thisClass.CI.utility.getEventElement(ev);
            if (thisClass.inputMode === true)
            {
              thisClass.target.value = target.innerHTML;
            }           
          })
*/  
        }
        tr_body.appendChild(td_day);

      }
      tb.appendChild(tr_body);
    }
    calBodyTable.appendChild(tb);
    calBody.appendChild(calBodyTable);
    calendarNode.appendChild(calBody);
//    var close = this.createCalendatCloseBtn();
//    calendarNode.appendChild(close);
    return calendarNode;
  }
  //this.cal = this.genereteCal(this.currentYear, this.currentMonth, this.currentDay);
  this.show = function(ev, flag)
  {
    if (showFlag)return;
    var showTarget = document.getElementById('ccm-blog-calendar');
    var mode = (flag) ? flag : false;
//    currentTarget = (target) ? target : document.body;
//    if (currentTarget.tagName.toLowerCase() == 'input' || currentTarget.tagName.toLowerCase() == 'textarea')inputMode = true;
    var cal = thisClass.genereteCal(currentYear, currentMonth, currentDay);
    showTarget.appendChild(cal);
    thisClass.addEvent();
 
    showFlag = true;
    
  }
  this.hide = function()
  {
    this.removeEvent();
    showFlag = false;
  }
  var mouseOverListener = function(ev)
  {
    var evt = ev || window.event;
    var e = evt.target || evt.srcElement;
    if (e.tagName.toLowerCase() != 'td')return;
    if (/withlink/.test(e.className))
    {
      e.style.backgroundColor = '#ffc';
    }
    else e.style.backgroundColor = '#ccc';
    
    e.style.color = '#fff';
  }
  var mouseOutListener = function(ev)
  {
    var evt = ev || window.event;
    var e = evt.target || evt.srcElement;
    if (e.tagName.toLowerCase() != 'td')return;
    if (/withlink/.test(e.className))
    {
      e.style.backgroundColor = '#c4ffe1';
      e.color = '#f00';
    }
    else if (/ci_calendar_sunday/.test(e.className)) {
      if (/np_textf/.test(e.className)) {
        e.style.backgroundColor = '#ffb9b9';
        e.style.color = '#fff';
      }
      else {
        e.style.backgroundColor = '#ffb9b9';
        e.style.color = '#f00';
      }
    }
    else 
      if (/ci_calendar_saturday/.test(e.className)) {
        if (/np_textf/.test(e.className)) {
          e.style.backgroundColor = '#84c1ff';
          e.style.color = '#fff';
        }
        else {
          e.style.backgroundColor = '#84c1ff';
          e.style.color = '#00f';
        }
      }
      else 
        if (e.id == 'ci_calendar_today') {
          e.style.backgroundColor = '#fff';
          e.style.color = '#ff80ff';
        }
        else {
          if (/np_text/.test(e.className)) {
            e.style.backgroundColor = '#fff';
            e.style.color = '#ccc';
          }
          else {
            e.style.backgroundColor = '#fff';
            e.style.color = '#000';
          }
          
        }
  }
  var clickListener = function(ev)
  {
    var evt = ev || window.event;
    var e = evt.target || evt.srcElement;
    if (e.tagName.toLowerCase() != 'td' || !/withlink/.test(e.className))return;
    var qs = location.search;
    if (qs == '')
    {
      var linkTo = location.href + '?eID=' + currentEntries[e.innerHTML];
    }
    else if (qs.indexOf('eID') > 0)
    {
      var linkTo = location.href.replace(/eID=([0-9]+)/, 'eID=' + currentEntries[e.innerHTML]);
    }
    else
    {
      var linkTo = location.href + '&eID=' + currentEntries[e.innerHTML];
    }
    location.href = linkTo;
  }
  this.addEvent = function()
  {
    addEvent(calBodyTable, 'mouseover', mouseOverListener, true);
    addEvent(calBodyTable, 'mouseout', mouseOutListener, true);
    addEvent(calBodyTable, 'click', clickListener, true);
  }
  this.removeEvent = function()
  {
    removeEvent(calBodyTable, 'mouseover', mouseOverListener);
    removeEvent(calBodyTable, 'mouseout', mouseOutListener);
    removeEvent(calBodyTable,'click', clickListener);
    
  }
  this.start = function()
  {
    if ((currentYear + (currentMonth + 1)) in JSONCache) {
      try {
        thisClass.resetContents();
      } 
      catch (e) {
      };
      currentEntries = JSONCache[currentYear + (currentMonth + 1)];
      thisClass.show();
      isConnect = false;
    }
    else {
      $.getJSON(CCM_TOOLS_PATH + '/blog_entry_data.php?year=' + currentYear + '&month=' + (currentMonth + 1), function(resp){
        if (resp != null) {
          ccm_parseJSON(resp, function(){
            try {
              thisClass.resetContents();
            } 
            catch (e) {
            };
            currentEntries = JSONCache[currentYear + (currentMonth + 1)] = resp;
            thisClass.show();
            isConnect = false;
          });
        }
        else {
          try {
            thisClass.resetContents();
          } 
          catch (e) {
          };
          currentEntries = JSONCache[currentYear + (currentMonth + 1)] = {};
          thisClass.show();
          isConnect = false;
        }
      });
    }
  };
 }
 window.BC = new BlogCalendar();

