var _calendarMonths = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
var _calendarWeekDays = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
var _calendarHeader = null;
var _calendarCells = null;
var _calendarData = null;
var _calendarDataSource = null;
var _calendar = null;

function CalendarCell(day, month, year, data)
{
  this.day = day;
  this.month = month;
  this.year = year;
  this.data = data;
}

function CreateCalendar()
{
  var obj = new Object();
  var date = new Date();
  obj.month = date.getMonth();
  obj.year = date.getFullYear();

  function getCells()
  {
    var numDays = new Array(31, -1, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

    if (this.month == 1)
    {
      numDays = ((this.year % 100 != 0) && (this.year % 4 == 0)) || (this.year % 400 == 0) ? 29 : 28;
    }
    else
    {
      numDays = numDays[this.month];
    }

    var date = new Date(this.year, this.month, 1);
    var day = date.getDay();
    var cells = new Array(42);

    for (var i = 1; i <= 42; i++)
    {
      cells[i - 1] = (i - day >= 1) && (i - day <= numDays) ? i - day : -1;
    }

    return cells;
  }

  function prevMonth()
  {
    if (this.month > 0)
    {
      this.month--;
    }
    else
    {
      this.month = 11;
      this.year--;
    }
  }

  function nextMonth()
  {
    if (this.month < 11)
    {
      this.month++;
    }
    else
    {
      this.month = 0;
      this.year++;
    }
  }

  obj.getCells = getCells;
  obj.prevMonth = prevMonth;
  obj.nextMonth = nextMonth;
  return obj;
}

function GoToPrevMonth()
{
  _calendar.prevMonth();
  PrintCalendar();
}

function GoToNextMonth()
{
  _calendar.nextMonth();
  PrintCalendar();
}

function CalendarCellMsOver(cell)
{
  cell.style.cursor = "pointer";
  cell.style.backgroundColor = "#e6e6e6";
}

function CalendarCellMsOut(cell)
{
  cell.style.backgroundColor = "white";
}

function ShowCalendarEvents(day)
{
  var html = "";

  for (var i = 0; i < _calendarDataSource.length; i++)
  {
    if (_calendarDataSource[i].day == day && _calendarDataSource[i].month == _calendar.month && _calendarDataSource[i].year == _calendar.year)
    {
      html += _calendarDataSource[i].data.getHtml();
    }
  }

  _calendarData.innerHTML = html;
}

function PrintCalendar()
{
  var calSelectedDays = new Array();

  for (var i = 0; i < _calendarDataSource.length; i++)
  {
    if (_calendarDataSource[i].month == _calendar.month && _calendarDataSource[i].year == _calendar.year)
    {
      calSelectedDays[calSelectedDays.length] = _calendarDataSource[i].day;
    }
  }

  _calendarHeader.innerHTML = _calendarMonths[_calendar.month] + ' ' + _calendar.year;
  var cells = _calendar.getCells();
  var html = '<' + 'table cellpadding="0" cellspacing="1"><' + 'tr>';

  for (var i = 0; i < 7; i++)
  {
    html += '<' + 'th>' + _calendarWeekDays[i].substring(0, 3) + '<' + '/th>';
  }

  html += '<' + '/tr>';

  for (var i = 0; i < cells.length; i += 7)
  {
    if (cells[i] == -1 && cells[i + 6] == -1)
    {
      break;
    }

    html += '<' + 'tr>';

    for (var j = 0; j < 7; j++)
    {
      var day = cells[i + j];

      if (day == -1)
      {
        html += '<' + 'td>&nbsp;<' + '/td>';
        continue;
      }

      var selected = false;

      for (var k = 0; k < calSelectedDays.length; k++)
      {
        if (day == calSelectedDays[k])
        {
          selected = true;
          break;
        }
      }

      html += '<' + 'td onmouseover="CalendarCellMsOver(this)" onmouseout="CalendarCellMsOut(this)"' + (selected ? ' onclick="ShowCalendarEvents(' + day + ')" class="selected"' : '') + '>' + day + '<' + '/td>';
    }

    html += '<' + '/tr>';
  }

  html += '<' + '/table>';
  _calendarCells.innerHTML = html;
}

function InitCalendar(calHeaderId, calCellsId, calDataId, calDataSource)
{
  _calendarHeader = document.getElementById(calHeaderId);
  _calendarCells = document.getElementById(calCellsId);
  _calendarData = document.getElementById(calDataId);
  _calendarDataSource = calDataSource;
  _calendar = CreateCalendar();
  PrintCalendar();
}
