var daysOfTheWeek = new Array('S', 'M', 'T', 'W', 'T', 'F', 'S');
var monthsOfTheYear = new Array('Janurary', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
var events = new Array();

function generateMonthCalendar(elementId, month)
{
  // get the first day of the month's day of the week
  var firstDay = new Date();
  firstDay.setDate(1);

  firstDay.setYear(firstDay.getFullYear() + (month / 12));
  month = month % 12;
  firstDay.setMonth(month);
  firstDay = stripTime(firstDay);

  var firstDayWeekday = firstDay.getDay();

  //alert(firstDay.getMonth() + "-" + firstDay.getDate() + "-" + firstDay.getYear());

  var lastDay = new Date(firstDay.getFullYear(), month + 1, 0);
  var lastDayOfMonth = lastDay.getDate();
  var calendarHtml = document.getElementById(elementId);
  var monthRowHtml = calendarHtml.insertRow(0);
  var monthCellHtml = monthRowHtml.insertCell(0);


  monthCellHtml.innerHTML = monthsOfTheYear[firstDay.getMonth()];
  monthCellHtml.colSpan = 7;
  monthCellHtml.className = "calendarMonthHeader";

  var currentWeekIndex = 1;
  var currentWeekRowHtml = calendarHtml.insertRow(currentWeekIndex);
  currentWeekIndex++;

  for (var weekDay = 0; weekDay < 7; weekDay++)
  {
    var currentDayElement = currentWeekRowHtml.insertCell(weekDay);
    currentDayElement.className = "weekDayHeader";
    currentDayElement.innerHTML = daysOfTheWeek[weekDay];
  }

  var currentWeekRowHtml = calendarHtml.insertRow(currentWeekIndex);
  currentWeekIndex++;

  for (var weekDay = 0; weekDay < firstDayWeekday; weekDay++)
  {
    var currentDayElement = currentWeekRowHtml.insertCell(weekDay);
    currentDayElement.className = "notDayOfMonth";
    currentDayElement.innerHTML = "&nbsp;";
  }

  for (var i = 1; i <= lastDayOfMonth; i++)
  {
    if (weekDay > 6)
    {
      weekDay = 0;
      currentWeekRowHtml = calendarHtml.insertRow(currentWeekIndex);
      currentWeekIndex++;
    }

    var currentDayDate = new Date(firstDay.getFullYear(), month, i);
    var nextDayDate = new Date(firstDay.getFullYear(), month, i + 1);
    var hasEvents = false;
    var currentDayTitle = "Events:";

    for (var k = 0; k < events.length; k++)
    {
      // Single Day Event
      if (events[k].startDate >= currentDayDate)
      {
        if (events[k].endDate < nextDayDate)
        {
          hasEvents = true;
          if (events[k].startDate.getTime() == events[k].endDate.getTime())
          {
            currentDayTitle += "\r\n" + events[k].description + " at " + events[k].location + " at " + events[k].startDate.toLocaleString() + ".";
          }
          else
          {
            currentDayTitle += "\r\n" + events[k].description + " at " + events[k].location + " from " + events[k].startDate.toLocaleString() + " to " + events[k].endDate.toLocaleTimeString() + ".";
          }
          continue;
        }
      }

      // Multi Day Event if it starts or continues on the current day.
      if (events[k].startDate < nextDayDate)
      {
        if (events[k].endDate >= nextDayDate)
        {
          hasEvents = true;
          currentDayTitle += "\r\n" + events[k].description + " at " + events[k].location + " from " + events[k].startDate.toLocaleString() + " to " + events[k].endDate.toLocaleString() + ".";
          continue;
        }
      }

      if (events[k].endDate >= currentDayDate)
      {
        if (events[k].endDate < nextDayDate)
        {
          hasEvents = true;
          currentDayTitle += "\r\n" + events[k].description + " at " + events[k].location + " from " + events[k].startDate.toLocaleString() + " to " + events[k].endDate.toLocaleString() + ".";
          continue;
        }
      }
    }

    currentDayElement = currentWeekRowHtml.insertCell(weekDay);
    currentDayElement.className = "dayOfMonth";
    currentDayElement.innerHTML = i;

    if (hasEvents)
    {
      currentDayElement.title = currentDayTitle;
      currentDayElement.className += " eventDay";
    }
    weekDay++;
  }

  for (weekDay; weekDay < 7; weekDay++)
  {
    var currentDayElement = currentWeekRowHtml.insertCell(weekDay);
    currentDayElement.className = "notDayOfMonth";
    currentDayElement.innerHTML = "&nbsp;";
  }

}

function generateUpcomingList(tableId, size)
{
  tableElement = document.getElementById(tableId);
  var listedCount = 0;
  var currentDayDate = new Date();
  currentDayDate.setHours(0);
  currentDayDate.setMinutes(0);
  currentDayDate.setSeconds(0);
  
  tableElement.style.tableLayout = "fixed";
  tableElement.style.width = "100%";
  var currentRow = 1;
  for (var i = 0; i < events.length; i++)
  {
    if (listedCount >= size)
    {
      break;
    }
    if (events[i].endDate.getTime() >= currentDayDate.getTime())
    {
      var currentRowElement = tableElement.insertRow(currentRow);
      currentRow++;
      currentCell = 0;

      currentCellElement = currentRowElement.insertCell(currentCell);
      currentCell++;

      currentCellElement.innerHTML = monthsOfTheYear[events[i].startDate.getMonth()] + " " + events[i].startDate.getDate() + "<br />" + events[i].description + " at " + events[i].location;
      currentCellElement.title = getTimeString(events[i]);
      currentCellElement.className = "upcomingEventItem";
      listedCount++;
    }
  }
  
}

function getNewDate(year, month, day, hours, ampm, minutes, seconds)
{
  adjustedMonth = month - 1;

  if (hours != 12)
  {
    if ("PM" ==ampm.toUpperCase())
    {
      adjustedHours = hours + 12;
    }
    else
    {
      adjustedHours = hours;
    }
  }
  else
  {
    if ("PM" == ampm.toUpperCase())
    {
      adjustedHours = hours;
    }
    else
    {
      adjustedHours = 0;
    }
  }

  return new Date(year, adjustedMonth, day, adjustedHours, minutes, seconds);
}

function addEvent(startDate, endDate, text, location)
{
  var newEvent = new Object();
  newEvent.startDate = startDate;
  newEvent.endDate = endDate;
  newEvent.description = text;
  newEvent.location = location;

  events.push(newEvent);
}

function stripTime(passedDateObject)
{
  var dateObject = passedDateObject;
  dateObject.setMilliseconds(0);
  dateObject.setSeconds(0);
  dateObject.setMinutes(0);
  dateObject.setHours(0);

  return dateObject;
}

function getTimeString(event)
{
  var timeString = "";
  if (event.startDate.getTime() == event.endDate.getTime())
  {
    timeString =  event.startDate.toLocaleString();
  }
  else if (event.startDate.toDateString() == event.endDate.toDateString())
  {
    timeString = event.startDate.toLocaleString() + " to " + event.endDate.toLocaleTimeString();
  }
  else
  {
    timeString = event.startDate.toLocaleString() + " to " + event.endDate.toLocaleString();
  }
  
  return timeString;
}

function init()
{
  //addEvent(getNewDate(2009, 9, 1, 9, "PM", 0, 0), getNewDate(2009, 9, 1, 9, "PM", 0, 0), "Outlander Meeting", "Biology Bldg, Room 209");
  //addEvent(getNewDate(2009, 9, 7, 11, "AM", 0, 0), getNewDate(2009, 9, 7, 3, "PM", 0, 0), "BBQ Social", "Riverside Park");
  //addEvent(getNewDate(2009, 9, 12, 9, "AM", 0, 0), getNewDate(2009, 9, 13, 2, "PM", 0, 0), "Camping", "Little Econ");
  //addEvent(getNewDate(2009, 9, 19, 10, "AM", 0, 0), getNewDate(2009, 9, 20, 5, "PM", 0, 0), "Travel Country Outdoors Porch Sale", "1101 East Altamonte Drive"); 
  //addEvent(getNewDate(2009, 9, 26, 10, "AM", 0, 0), getNewDate(2009, 9, 26, 9, "PM", 0, 0), "Day Canoe", "DeLeon Springs");
  //addEvent(getNewDate(2009, 10, 6, 9, "PM", 0, 0), getNewDate(2009, 10, 6, 9, "PM", 0, 0), "Outlander Meeting", "Biology Bldg, Room 415");
  //addEvent(getNewDate(2009, 10, 23, 8, "AM", 0, 0), getNewDate(2009, 10, 25, 5, "PM", 0, 0), "Dog Trials", "Lazy J Ranch in Williston, FL");
  //addEvent(getNewDate(2009, 10, 10, 9, "AM", 30, 0), getNewDate(2009, 10, 10, 2, "PM", 30, 0), "Social (Swimming and Tubing)", "Rock Springs");
  //addEvent(getNewDate(2009, 11, 3, 9, "PM", 0, 0), getNewDate(2009, 11, 3, 9, "PM", 0, 0), "Outlander Meeting", "Biology Bldg, Room 415");
  
  // Second Semester
  //addEvent(getNewDate(2010, 1, 12, 9, "PM", 0, 0), getNewDate(2010, 1, 12, 9, "PM", 0, 0), "Outlander Meeting", "Biology Bldg, Room 415");
  //addEvent(getNewDate(2010, 2, 2, 9, "PM", 0, 0), getNewDate(2010, 2, 2, 9, "PM", 0, 0), "Outlander Meeting", "Biology Bldg, Room 415");
  //addEvent(getNewDate(2010, 2, 20, 8, "AM", 0, 0), getNewDate(2010, 2, 21, 5, "PM", 0, 0), "Dog Trials", "Lazy J Ranch in Williston, FL");
  //addEvent(getNewDate(2010, 3, 2, 9, "PM", 0, 0), getNewDate(2010, 3, 2, 9, "PM", 0, 0), "Outlander Meeting", "Biology Bldg, Room 415");
  addEvent(getNewDate(2010, 3, 26, 8, "AM", 0, 0), getNewDate(2010, 3, 28, 5, "PM", 0, 0), "Dog Trials", "Lazy J Ranch in Williston, FL");
  addEvent(getNewDate(2010, 4, 6, 9, "PM", 0, 0), getNewDate(2010, 4, 6, 9, "PM", 0, 0), "Outlander Meeting", "Biology Bldg, Room 415");
  
  var currentDay = new Date();
  generateMonthCalendar('currentMonthTable', currentDay.getMonth());
  generateMonthCalendar('nextMonthTable', currentDay.getMonth() + 1);
  generateUpcomingList('upcomingEventListTable', 3);
}