(function(){

/* ========== 休みを定義 ========== */

/* 休みの設定方法
holiday[年] = [];
holiday[年][月] = [休みの日,休みの日,休みの日,休みの日,休みの日,休みの日];
*/

var holiday = [];

// 2011年分
holiday[2011] = [];
holiday[2011][10] = [3,10,17,24,31];
holiday[2011][11] = [7,14,21,28];
holiday[2011][12] = [5,12,19,28,29,30,31];

// 2012年分
holiday[2012] = [];
holiday[2012][1] = [1,2,3,4,10,16,23,30];
holiday[2012][2] = [6,13,20,27];
holiday[2012][3] = [5,12,19,26];
holiday[2012][4] = [2,9,16,23,24,30];
holiday[2012][5] = [3,4,5,6,7,14,21,28];
holiday[2012][6] = [4,5,11,18,25];
holiday[2012][7] = [2,9,16,23,30];
holiday[2012][8] = [6,10,11,12,13,14,15,16,20,27];
holiday[2012][9] = [3,10,17,24];
holiday[2012][10] = [1,8,15,22,29];
holiday[2012][11] = [5,12,19,26];
holiday[2012][12] = [3,10,17,24,28,29,30,31];

// 2013年分
holiday[2013] = [];
holiday[2013][1] = [1,2,3,4,7,14,21,28];
holiday[2013][2] = [4,11,18,25];
holiday[2013][3] = [4,11,18,25];
holiday[2013][4] = [1,8,15,22,29];
holiday[2013][5] = [6,13,20,27];
holiday[2013][6] = [3,10,17,24];
holiday[2013][7] = [1,8,15,22,29];
holiday[2013][8] = [5,12,19,26];
holiday[2013][9] = [2,9,16,23,30];
holiday[2013][10] = [7,14,21,28];
holiday[2013][11] = [4,11,18,25];
holiday[2013][12] = [2,9,16,23,30];

// 2014年分
holiday[2014] = [];
holiday[2014][1] = [6,13,20,27];
holiday[2014][2] = [3,10,17,24];
holiday[2014][3] = [3,10,17,24,31];
holiday[2014][4] = [7,14,21,28];
holiday[2014][5] = [5,12,19,26];
holiday[2014][6] = [2,9,16,23,30];
holiday[2014][7] = [7,14,21,28];
holiday[2014][8] = [4,11,18,25];
holiday[2014][9] = [1,8,15,22,29];
holiday[2014][10] = [6,13,20,27];
holiday[2014][11] = [3,10,17,24];
holiday[2014][12] = [1,8,15,22,29];

// 2015年分
holiday[2015] = [];
holiday[2015][1] = [5,12,19,26];
holiday[2015][2] = [2,9,16,23];
holiday[2015][3] = [2,9,16,23,30];
holiday[2015][4] = [6,13,20,27];
holiday[2015][5] = [4,11,18,25];
holiday[2015][6] = [1,8,15,22,29];
holiday[2015][7] = [6,13,20,27];
holiday[2015][8] = [3,10,17,24,31];
holiday[2015][9] = [7,14,21,28];
holiday[2015][10] = [5,12,19,26];
holiday[2015][11] = [2,9,16,23,30];
holiday[2015][12] = [7,14,21,28];

// 2016年分
holiday[2016] = [];
holiday[2016][1] = [4,11,18,25];
holiday[2016][2] = [1,8,15,22,29];
holiday[2016][3] = [7,14,21,28];
holiday[2016][4] = [4,11,18,25];
holiday[2016][5] = [2,9,16,23,30];
holiday[2016][6] = [6,13,20,27];
holiday[2016][7] = [4,11,18,25];
holiday[2016][8] = [1,8,15,22,29];
holiday[2016][9] = [5,12,19,26];
holiday[2016][10] = [3,10,17,24,31];
holiday[2016][11] = [7,14,21,28];
holiday[2016][12] = [5,12,19,26];

/* ========== 以下、修正しないでください。========== */

var yobi_ja = ['日', '月', '火', '水', '木', '金', '土'];

var check = false;

function TnCalendar(parent){
  if (typeof parent === 'string') {
    parent = document.getElementById(parent);
  }
  this.parent = parent;
}
    
window.TnCalendar = TnCalendar;

TnCalendar.prototype = {
  topCreate: topCreate,
  create: create,
  update: update,
  remove: remove,
  set_caption: set_caption,
  set_body: set_body,
  set_date: set_date,
  onclick_date: onclick_date,
  onclick_month: onclick_month
};
    
function onclick_date(id, year, month, date){
  return false;
}
    
function onclick_month(id, year, month){
  this.update(+year, +month);
  return false;
}
    
function remove(){
  this.parent.removeChild(this.table);
}
    
function update(year, month){
  this.remove();
  this.create(year, month);
}
    
function set_date(year, month){
  var today = new Date();
  this.month =parseInt(month, 10)|| (today.getMonth()+1);
  this.year = parseInt(year, 10) || today.getFullYear();
}
    
function set_caption(year, month){
  var today = new Date;
  var this_month = today.getMonth()+1;
  var this_year = today.getFullYear();
  
  var caption = document.createElement('caption');
  var div = document.createElement('div');
  
  if(check == true){
	  var next = document.createElement('a');
	  next.href = '#month-' + ((month == 12) ? year+1 : year)+ '-' + (month==12?1:month+1);
	  next.className = 'next';
	  next.innerHTML = '→';
  }
  var current = document.createElement('span');
  var text = document.createTextNode(year + '年' + month + '月');
  current.appendChild(text);
  
  if(check == true){
	  if(year != this_year || month != this_month){
		  var prev = document.createElement('a');
		  prev.href = '#month-' + ((month == 1) ? year-1 : year) + '-' + (month==1?12:month-1);
		  prev.className = 'prev';
		  prev.innerHTML = '←';
		  div.appendChild(prev);
	  }
  }
  div.appendChild(current);
  if(check == true){
	  div.appendChild(next);
  }
  caption.appendChild(div);
  this.table.appendChild(caption);
}
    
function set_body(year, month){
  var tbody = document.createElement('tbody');
  var first = new Date(year, month - 1, 1);
  var last = new Date(year, month, 0);
  var first_day = first.getDay();
  var last_date = last.getDate();
  var date = 1;
  var skip = true;
  for (var row = 0; row < 7; row++) {
    var tr = document.createElement('tr');
    for (var col = 0; col < 7; col++){
      if (row === 0){
        var th = document.createElement('th');
        var day = yobi_ja[col];
        th.appendChild(document.createTextNode(day));
        th.className = 'calendar day-head day' + col;
        tr.appendChild(th);
      } else {
        if (row === 1 && first_day === col){
          skip = false;
        }
        if (date > last_date) {
          skip = true;
        }
        var td = document.createElement('td');
        td.className = 'calendar day' + col;
        if (!skip) {
          td.appendChild(document.createTextNode(date));
		  for(var i =0; i < holiday[year][month].length; i++){
			  if(holiday[year][month][i] == date){
			      td.className = td.className + ' holiday';  
			  }
		   }
          date++;
        } else {
          td.innerHTML='<span class="blank">&nbsp;</span>';
        }
        tr.appendChild(td);
      }
    }
    tbody.appendChild(tr);
  }
  this.table.appendChild(tbody);
}

function topCreate(){
	check = true;
	this.create();
}

function create(year, month){
  var that = this;
  var table = document.createElement('table');
  table.className = 'calendar-table';
  this.table = table;
  table.onclick = function(e){
  var evt = e || window.event;
  var target = evt.target || evt.srcElement;
  if(check == true){
    if (target.tagName === 'A' &&
        target.hash.indexOf('#day-') === 0) {
      return that.onclick_date.apply(that,
             target.hash.match(/day-(\d+)-(\d+)-(\d+)/));
    } else if (target.tagName === 'A' &&
               target.hash.indexOf('#month-') === 0) {
      return that.onclick_month.apply(that,
             target.hash.match(/month-(\d+)-(\d+)/));
    }
  }
  };
  this.set_date(year, month);
  this.set_caption(this.year, this.month);
  this.set_body(this.year, this.month);
  this.parent.appendChild(table);
}
})();
