Calendar = function() {
  var currYear;
  var currMonth;
  var currDay;
  var thisYear;
  var thisMonth;
  var thisDay;
  var blockId;
  var obj = this;

  var months = new Array ("","January","February","March","April","May","June","July","August","September","October","November","December");
  var days = new Array (0,31,28,31,30,31,30,31,31,30,31,30,31);

  this.loadParams = function(params){
    blockId = params['blockId'];
    currYear = params['year'];
    currMonth = params['month'];
    currDay = params['day'];
    thisYear = currYear;
    thisMonth = currMonth;
    thisDay = currDay;
  }
  function getDays(year,month){
    if (month > 12){
      month = month - 12;
      year = year + 1;
    } else if (month <= 0){
      month = 12;
      year = year - 1;
    }
    var maxDays = days[month];
    if (month == 2 && year % 4 == 0){
      maxDays = 29;
    }
    return maxDays;
  }
  this.changeDate = function(addYear,addMonth,addDay){
    thisYear = parseInt(thisYear) + parseInt(addYear);
    thisMonth = parseInt(thisMonth) + parseInt(addMonth);
    thisDay = parseInt(thisDay) + parseInt(addDay);
    if (thisDay > getDays(thisYear,thisMonth)){
      thisDay = 1;
      thisMonth = thisMonth + 1;
    } else if (thisDay <= 0){
      thisDay = getDays(thisYear,thisMonth);
      thisMonth = thisMonth - 1;
    }
    if (thisMonth > 12){
      thisMonth = thisMonth - 12;
      thisYear = thisYear + 1;
    } else if (thisMonth <= 0){
      thisMonth = 12;
      thisYear = thisYear - 1;
    }
    this.drawCalendar();
  }
  this.drawCalendar = function(){
    var cal = document.getElementById(blockId);
    while (cal.childNodes.length > 0){
      cal.removeChild(cal.childNodes[0]);
    }

    var oTable = document.createElement("table");
    var oThead = document.createElement("thead");
    var oTbody = document.createElement("tbody");

    // Year Row
    var oTr = document.createElement("tr");
    // Previous Year
    var oTh = document.createElement("th");
    var oA = document.createElement("a");
    oA.onclick = function(){
      obj.changeDate(-1,0,0);
    }
    var oText = document.createTextNode("<");
    oA.appendChild(oText);
    oTh.appendChild(oA);
    oTr.appendChild(oTh);
    // Year
    if (navigator.userAgent.indexOf("MSIE") > 0){
      var oTh = document.createElement('<th colspan="5">');
    } else {
      var oTh = document.createElement("th");
      oTh.setAttribute("colspan","5");
    }
    var oText = document.createTextNode(thisYear);
    oTh.appendChild(oText);
    oTr.appendChild(oTh);
    // Next Year
    var oTh = document.createElement("th");
    var oA = document.createElement("a");
    oA.onclick = function(){
      obj.changeDate(1,0,0);
    }
    var oText = document.createTextNode(">");
    oA.appendChild(oText);
    oTh.appendChild(oA);
    oTr.appendChild(oTh);
    oThead.appendChild(oTr);

    // Month Row
    var oTr = document.createElement("tr");
    // Previous Month
    var oTh = document.createElement("th");
    var oA = document.createElement("a");
    oA.onclick = function(){
      obj.changeDate(0,-1,0);
    }
    var oText = document.createTextNode("<");
    oA.appendChild(oText);
    oTh.appendChild(oA);
    oTr.appendChild(oTh);
    // Month
    if (navigator.userAgent.indexOf("MSIE") > 0){
      var oTh = document.createElement('<th colspan="5">');
    } else {
      var oTh = document.createElement("th");
      oTh.setAttribute("colspan","5");
    }
    var oText = document.createTextNode(months[thisMonth]);
    oTh.appendChild(oText);
    oTr.appendChild(oTh);
    // Next Month
    var oTh = document.createElement("th");
    var oA = document.createElement("a");
    oA.onclick = function(){
      obj.changeDate(0,1,0);
    }
    var oText = document.createTextNode(">");
    oA.appendChild(oText);
    oTh.appendChild(oA);
    oTr.appendChild(oTh);
    oThead.appendChild(oTr);
    oTable.appendChild(oThead);

    // Calendar Date block
    dFirst = new Date(thisYear,(thisMonth-1),1);
    var firstDay = dFirst.getDay();
    if (firstDay == 0){
      firstDay = 7;
    }
    var monthDays = getDays(thisYear,thisMonth);
    var weeks = Math.ceil((firstDay + monthDays - 1) / 7);
    var maxDays = weeks * 7;

    for (i = 0; i < weeks; i ++){
      var oTr = document.createElement("tr");
      for (j = i * 7; j < i * 7 + 7; j ++){
        var oTd = document.createElement("td");
        if (j >= firstDay - 1 && j < firstDay + monthDays - 1){
          if (thisDay == (j - firstDay + 2) && thisMonth == currMonth && thisYear == currYear){
            oTd.className = "selected";
          }
          var oA = document.createElement("a");
          oA.setAttribute("year",thisYear);
          oA.setAttribute("month",thisMonth);
          oA.setAttribute("day",(j - firstDay + 2));
          oA.onclick = function(){
            obj.clickDate(this.getAttribute("year"),this.getAttribute("month"),this.getAttribute("day"));
          }
          var oText = document.createTextNode((j - firstDay + 2));
          oA.appendChild(oText);
          oTd.appendChild(oA);
        }
        oTr.appendChild(oTd);
      }
      oTbody.appendChild(oTr);
    }
    oTable.appendChild(oTbody);

    cal.appendChild(oTable);
  }
}
