var daysOfWeekOffset = [6, 0, 1, 2, 3, 4, 5];
var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ];

var currentDate = new Date();

function initializeCalendar() {
  var today = new Date();

  showMonth(today.getMonth(), today.getFullYear(), today);
}

function nextMonth() {
  var today = new Date();

  var month = currentDate.getMonth() + 1;
  currentDate.setMonth(month);
  showMonth(currentDate.getMonth(), currentDate.getFullYear(), today);
}

function prevMonth() {
  var today = new Date();

  var month = currentDate.getMonth() - 1;
  currentDate.setMonth(month);
  showMonth(currentDate.getMonth(), currentDate.getFullYear(), today);
}

function showMonth(month, year, today) {
  document.getElementById("month").firstChild.nodeValue = months[month] + " " + year;


  var firstDayOfMonth = new Date(year, month);
  var offset = daysOfWeekOffset[firstDayOfMonth.getDay()];

  for(var i = 0; i < offset; i++) {
    notInMonth(i);
  }

  var curDate = firstDayOfMonth;
  for(var j = offset; j < 42; j++) {
    var dayEvents = getEvents(curDate);

    if(curDate.getMonth() != month) {
      notInMonth(j);
    }
    else if(areDatesEqual(curDate, today)) {
      forToday(j, curDate, dayEvents);
    }
    else {
      inMonth(j, curDate, dayEvents);
    }

    curDate.setDate(curDate.getDate() + 1);
  }
}

function notInMonth(cellNumber) {
  var cell =   document.getElementById("cell" + cellNumber);
  cell.className = "calendar not_in_month";
  removeAllChildNodes(cell);
}

function inMonth(cellNumber, date, dateEvents) {
  var cell = document.getElementById("cell" + cellNumber);
  cell.className = "calendar in_month";

  removeAllChildNodes(cell);

  var dateDiv = document.createElement("div");
  dateDiv.className = "date";
  dateDiv.appendChild(document.createTextNode(date.getDate()));
  cell.appendChild(dateDiv);

  appendEvent(cell, dateEvents);
}

function forToday(cellNumber, date, dateEvents) {
  var cell = document.getElementById("cell" + cellNumber);
  cell.className = "calendar today";

  removeAllChildNodes(cell);

  var dateDiv = document.createElement("div");
  dateDiv.className = "date";
  dateDiv.appendChild(document.createTextNode(date.getDate()));
  cell.appendChild(dateDiv);

  appendEvent(cell, dateEvents);
}

function appendEvent(parent, dateEvents) {
  if(parent && dateEvents) {
    for(var i = 0; i < dateEvents.length; i++) {
      var eventDiv = document.createElement('div')
      eventDiv.className = "event";
      eventDiv.appendChild(document.createTextNode(dateEvents[i].event));
      parent.appendChild(eventDiv);
    }
  }
}

function getEvents(date) {
  if(!events) {
    return null;
  }

  var eventsToReturn = new Array();

  for(var i = 0; i < events.length; i++) {
    if(   (events[i].day == "*" || events[i].day == date.getDate())
       && (events[i].month == "*" || (events[i].month - 1) == date.getMonth())
       && (events[i].year == "*" || events[i].year == date.getFullYear())
      ) {

      eventsToReturn.push(events[i]);
    }
  }

  return eventsToReturn;
}

function removeAllChildNodes(parent) {
  if ( parent.hasChildNodes() ) {
    while ( parent.childNodes.length >= 1 ) {
        parent.removeChild( parent.firstChild );       
    } 
  }
}

function areDatesEqual(date1, date2) {
  return (date1.getDate() == date2.getDate()) &&
         (date1.getMonth() == date2.getMonth()) &&
         (date1.getFullYear() == date2.getFullYear());
}