/*
 *  file: calendar.js
 *
 *  Copyright © 2003 by Andreas Mödinger
 */


var now = new Date ();
now = new Date (now.getFullYear (), now.getMonth (), now.getDate ());

var urlArgs = new Array ();
var displayEvents = DISPLAY_EVENTS;
var calendarYear = now.getFullYear ();
var calendarMonth = now.getMonth ();
var eventDate = null;
var holidays = new Array ();
var events = new Array ();


function isLeapYear (year)
{
  return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
}


function getDaysOfMonth (year, month)
{
  if (month == 1)
  {
    return isLeapYear (year) ? 29 : 28;
  }
  else if (month == 3 || month == 5 || month == 8 || month == 10)
  {
    return 30;
  }
  return 31;
}


function getWeekDay (year, month)
{
  var weekDay = FIRST_DAYS_OF_YEAR[year - FIRST_YEAR];
  for (var m = 0; m < month; m++)
  {
    weekDay += getDaysOfMonth (year, m);
  }
  return weekDay % 7;
}


function parseUrlArgs ()
{
  var search = window.location.search;
  var pos = search.indexOf ("?");
  if (pos != -1)
  {
    search = search.substring (pos + 1, search.length);
  }
  var args = search.split ("&");
  for (var index = 0; index < args.length; index++)
  {
    var name = args[index];
    var value = "";
    pos = name.indexOf ("=");
    if (pos != -1)
    {
      value = name.substring (pos + 1, name.length);
      name = name.substring (0, pos);
      urlArgs[name] = unescape (value);
    }
  }

  if (urlArgs["display"])
  {
    displayEvents = parseInt (urlArgs["display"]);
  }
  if (urlArgs["year"])
  {
    calendarYear = parseInt (urlArgs["year"]);
    calendarMonth = 0;
  }
  if (urlArgs["month"])
  {
    calendarMonth = parseInt (urlArgs["month"]) - 1;
  }
  if (urlArgs["eyear"] && urlArgs["emonth"] && urlArgs["eday"])
  {
    eventDate = new Date (parseInt (urlArgs["eyear"]),
                          parseInt (urlArgs["emonth"]) - 1,
                          parseInt (urlArgs["eday"]));
    if (!urlArgs["year"] && !urlArgs["month"])
    {
      calendarYear = eventDate.getFullYear ();
      calendarMonth = eventDate.getMonth ();
    }
  }
}


function makeHref (args)
{
  var href = "";
  for (var name in args)
  {
    if (href != "")
    {
      href += "&";
    }
    href += name + "=" + escape (args[name]);
  }
  for (name in urlArgs)
  {
    if (!args[name])
    {
      if (href != "")
      {
        href += "&";
      }
      href += name + "=" + escape (urlArgs[name]);
    }
  }
  if (href != "")
  {
    href = "?" + href;
  }
  return "index.html" + href;
}


function Holiday (official, name)
{
  this.official = official;
  this.name = name;
}


function initHolidays ()
{
  var daysOfMonth = getDaysOfMonth (calendarYear, calendarMonth);
  for (var day = 1; day <= daysOfMonth; day++)
  {
    holidays[day - 1] = null;
  }
}


function addHoliday (fromDay, fromMonth, toDay, toMonth,
                     official, name)
{
  if (fromMonth - 1 <= calendarMonth && toMonth - 1 >= calendarMonth)
  {
    var firstDay = 1;
    if (fromMonth - 1 == calendarMonth)
    {
      firstDay = fromDay;
    }
    var lastDay = getDaysOfMonth (calendarYear, calendarMonth);
    if (toMonth - 1 == calendarMonth)
    {
      lastDay = toDay;
    }
    for (var day = firstDay; day <= lastDay; day++)
    {
      if (holidays[day - 1] == null)
      {
        holidays[day - 1] = new Holiday (official, name);
      }
    }
  }
}


function Event (display, name, link)
{
  this.display = display;
  this.name = name;
  this.link = link;
}


function initEvents ()
{
  var daysOfMonth = getDaysOfMonth (calendarYear, calendarMonth);
  for (var day = 1; day <= daysOfMonth; day++)
  {
    events[day - 1] = null;
  }
}


function addEvent (fromDay, fromMonth, toDay, toMonth,
                   display, name, link)
{
  if (fromMonth - 1 <= calendarMonth && toMonth - 1 >= calendarMonth &&
      (display & displayEvents) != 0)
  {
    var firstDay = 1;
    if (fromMonth - 1 == calendarMonth)
    {
      firstDay = fromDay;
    }
    var lastDay = getDaysOfMonth (calendarYear, calendarMonth);
    if (toMonth - 1 == calendarMonth)
    {
      lastDay = toDay;
    }
    for (var day = firstDay; day <= lastDay; day++)
    {
      var dayEvents = events[day - 1];
      if (dayEvents == null)
      {
        dayEvents = new Array ();
        events[day - 1] = dayEvents;
      }
      dayEvents[dayEvents.length] = new Event (display, name, link);
    }
  }
}


function writeMonthSelection ()
{
  document.writeln ("<table class=\"calendar\" width=\"100%\" border=\"1\" cellspacing=\"0\" cellpadding=\"0\">");
  document.writeln ("<tr>");
  if (calendarYear > FIRST_YEAR)
  {
    var args = new Array ();
    args["year"] = String (calendarYear - 1);
    args["month"] = String (12);
    document.write ("<td class=\"text\" align=\"center\" nowrap=\"\">");
    document.write ("<a href=\"javascript:location.replace ('" + makeHref (args) + "');\">");
    document.write (MONTH_ABBREVIATIONS[11] + " " + (calendarYear - 1));
    document.write ("</a>");
    document.writeln ("</td>");
  }
  for (var month = 0; month < 12; month++)
  {
    var tdClass = "text";
    var aClass = "";
    if (month == calendarMonth)
    {
      tdClass = "selected";
      aClass = "selected";
    }
    var args = new Array ();
    args["year"] = String (calendarYear);
    args["month"] = String (month + 1);
    document.write ("<td class=\"" + tdClass + "\" align=\"center\" nowrap=\"\">");
    document.write ("<a class=\"" + aClass + "\" href=\"javascript:location.replace ('" + makeHref (args) + "');\">");
    document.write (MONTH_ABBREVIATIONS[month]);
    document.write ("</a>");
    document.writeln ("</td>");
  }
  if (calendarYear < FIRST_YEAR+FIRST_DAYS_OF_YEAR.length-1)
  {
    var args = new Array ();
    args["year"] = String (calendarYear + 1);
    args["month"] = String (1);
    document.write ("<td class=\"text\" align=\"center\" nowrap=\"\">");
    document.write ("<a href=\"javascript:location.replace ('" + makeHref (args) + "');\">");
    document.write (MONTH_ABBREVIATIONS[0] + " " + (calendarYear + 1));
    document.write ("</a>");
    document.writeln ("</td>");
  }
  document.writeln ("</tr>");
  document.writeln ("</table>");
}


function writeDisplaySelection ()
{
  document.writeln ("<table class=\"calendar\" width=\"100%\" border=\"1\" cellspacing=\"0\" cellpadding=\"0\">");
  document.writeln ("<tr>");
  for (var index = 0; index < DISPLAY_TEXTS.length; index++)
  {
    var tdClass = "text";
    var aClass = "";
    if (DISPLAY_VALUES[index] == displayEvents)
    {
      tdClass = "selected";
      aClass = "selected";
    }
    var args = new Array ();
    args["display"] = String (DISPLAY_VALUES[index]);
    document.write ("<td class=\"" + tdClass + "\" align=\"center\" nowrap=\"\">");
    document.write ("<a class=\"" + aClass + "\" href=\"javascript:location.replace ('" + makeHref (args) + "');\">");
    document.write (DISPLAY_TEXTS[index]);
    document.write ("</a>");
    document.writeln ("</td>");
  }
  document.writeln ("</tr>");
  document.writeln ("</table>");
}


function writeCalendar ()
{
  document.writeln ("<table class=\"calendar\" width=\"100%\" border=\"1\" cellspacing=\"0\" cellpadding=\"0\">");
  var weekDay = getWeekDay (calendarYear, calendarMonth);
  var daysOfMonth = getDaysOfMonth (calendarYear, calendarMonth);
  for (var day = 1; day <= daysOfMonth; day++)
  {
    document.writeln ("<tr>");
    var tdClass = "text";
    if (String (new Date (calendarYear, calendarMonth, day)) == String (now) ||
        (eventDate != null &&
         String (new Date (calendarYear, calendarMonth, day)) == String (eventDate)))
    {
      tdClass = "dayselected";
    }
    document.write ("<td class=\"" + tdClass + "\" valign=\"top\" nowrap=\"\">");
    if (day < 10)
    {
      document.write ("0");
    }
    document.write (day);
    document.write (".");
    if (calendarMonth + 1 < 10)
    {
      document.write ("0");
    }
    document.write (calendarMonth + 1);
    document.write (".");
    document.writeln ("</td>");

    tdClass = "text";
    if (weekDay == 6 || (holidays[day - 1] != null &&
                         holidays[day - 1].official))
    {
      tdClass = "holiday";
    }
    document.write ("<td class=\"" + tdClass + "\" valign=\"top\" nowrap=\"\">");
    document.write (DAY_ABBREVIATIONS[weekDay]);
    document.writeln ("</td>");

    document.write ("<td class=\"text\" valign=\"top\" nowrap=\"\">");
    if (holidays[day - 1] != null)
    {
      document.write (holidays[day - 1].name);
    }
    else
    {
      document.write ("&nbsp;");
    }
    document.writeln ("</td>");

    document.write ("<td class=\"text\" valign=\"top\" width=\"100%\" nowrap=\"\">");
    var dayEvents = events[day - 1];
    if (dayEvents != null)
    {
      for (index = 0; index < dayEvents.length; index++)
      {
        if (index != 0)
        {
          document.write (", ");
        }
        if (dayEvents[index].link != "")
        {
          document.write ("<a href=\"" + dayEvents[index].link + "\">");
        }
        document.write (dayEvents[index].name);
        if (dayEvents[index].link != "")
        {
          document.write ("</a>");
        }
      } 
    }
    else
    {
      document.write ("&nbsp;");
    }
    document.writeln ("</td>");
    document.writeln ("</tr>");
    weekDay = (weekDay + 1) % 7;
  }
  document.writeln ("</table>");
}


parseUrlArgs ();
initHolidays ();
initEvents ();

