/*
 * Changes:
 * 2007-02-12	hayo	Dritter Dienstag als Termin eingefügt	
 */

exclusionList = new Array();
eventList = new Array();
var today = new Date();
today = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0);


/**
 * Debugausgabe
 **/
function terminDbg(str)
{
	//document.write("<pre>"+str+"</pre>");
}


/**
 * Sortiermethode für die Terminliste, die nach dem Datum sortiert
 **/
function eventListCompare(a, b)
{
	return a[0] - b[0];
}


/**
 * Streicht einen regulären Termin aus der Terminliste.
 * NOTE: Muss vor fillEventList() aufgerufen werden.
 * Wertebereiche:
 * day   : 1 - 31
 * month : 1 - 12
 **/
function addExclusion(day, month, year)
{
	var date = new Date(year, month-1, day, 0, 0, 0);
	terminDbg("addExclusion(); date = " + date);
	exclusionList.push(date);
}


/**
 * Fügt einen Termin in die Terminliste ein.
 * Kann z.B. für unregelmäßige Termine verwendet werden.
 * NOTE: Sollte vor fillEventList() aufgerufen werden
 *
 * PARAMETER:
 * day   - Tage des Monats (Zahl zwischen 1 und max. 31)
 * month - Monat des Jahres (Zahl zwischen 1 und 12)
 * year  - Jahresangabe (z.B. 2004, muss eine vierstellige Zahl sein)
 **/
function addExtraEvent(day, month, year, infoString)
{
	var date = new Date(year, month-1, day, 0, 0, 0);
	//terminDbg("addExtraEvent(date = " + date + ", infoString = " + infoString + ")");
	addEvent(date, infoString);
}


/**
 * Fügt einen Termin in die Terminliste ein.
 *
 * PARAMETER:
 * date       - Datum als Date-Objekt
 * infoString - Terminbeschreibung als String-Objekt
 **/
function addEvent(date, infoString)
{
	//terminDbg("addEvent(date = " + date + ", infoString = " + infoString + ")");
	// Pruefen, ob das Datum >= Heute ist
	if (date >= today)
		eventList.push(new Array(date, infoString));
}


/**
 * Fügt eine 0 an einstellige Zahlen an
 **/
function padNumber(num)
{
	if (num < 10 && num > -10)
		return "0" + String(num);
	return String(num);
}


/**
 * Formatiert eine Datumsangabe für die Ausgabe.
 * Parameter:
 * date - zu formatierendes Date-Objekt
 **/
function formatDate(date)
{
	return padNumber(date.getDate()) + "." +
		padNumber(date.getMonth()+1) + "." +
		date.getFullYear();
}


/**
 * Calculates the first tuesday for the passed month & year.
 **/
function firstTuesday(month, year)
{
	var basedate = new Date(year, month, 1, 0, 0, 0);
	var dayFirstTue = ((9 - basedate.getDay()) % 7 ) + 1;
	return new Date(year, month, dayFirstTue, 0, 0, 0);
}


function appendEvent(eventDate, infoString)
{
	//terminDbg("appendEvent(eventDate = " + eventDate + ", infoString = " + infoString + ")");
	var exclude = false;

	for (var i = 0; i < exclusionList.length; ++i)
	{
		if ((exclusionList[i] - eventDate) == 0)
		{
			terminDbg("EXCLUDING " + eventDate);
			exclude = true;
			break;
		}
	}

	if (exclude == false)
		addEvent(eventDate, infoString);
}


/**
 * Fügt alle regulären Termine für einen Monat eines Jahres zur Eventliste
 * hinzu, wenn er nicht in der Ausnahmeliste steht.
 **/
function addRegularEvents(month, year)
{
	//terminDbg("addRegularEvents(month = " + month + ", year = " + year + ")");

	var firstTue = firstTuesday(month, year); // calc first tuesday in month
	appendEvent(firstTue, "Allgemeines Treffen");

	var secTue = new Date();
	secTue.setTime(firstTue.getTime());
	secTue.setDate(firstTue.getDate() + 7); // add 7 days, 2nd tuesday in month
	appendEvent(secTue, "Linux-Treffen");

	var thirdTue = new Date();
	thirdTue.setTime(secTue.getTime());
	thirdTue.setDate(secTue.getDate() + 7); // add 14 days, 3rd tuesday in month
	appendEvent(thirdTue, "Spezial-Treffen");

	var fourthTue = new Date();
	fourthTue.setTime(firstTue.getTime());
	fourthTue.setDate(firstTue.getDate() + 21); // add 21 days, 4th tuesday in month
	appendEvent(fourthTue, "Netzwerk-Treffen");
}


/**
 * Füllt die Terminliste mit allen regulären Terminen des aktuellen und
 * des nächsten Monats auf und sortiert die Liste.
 **/
function fillEventList()
{
	var currentYear = today.getFullYear();
	var currentMonth = today.getMonth();

	// Alle Events des aktuellen Monats hinzufügen
	addRegularEvents(currentMonth, currentYear);

	currentMonth++; // nächster Monat
	if (currentMonth > 11)
	{
		currentMonth = 0;
		currentYear++;
	}

	// Alle Events des folgenden Monats hinzufügen
	addRegularEvents(currentMonth, currentYear);


	// Events nach ihrem Datum sortieren, da sonst die
	// Extratermine an der falschen Stelle stehen.
	eventList.sort(eventListCompare);
}


function writeEventTable()
{
	fillEventList();

	document.write("<table>\n");
	document.write("<thead><tr><th>Datum</th><th>Beschreibung</th></tr></thead>\n");
	document.write("<tbody>\n");
	for (var i = 0; i < eventList.length; ++i)
	{
		document.write("<tr>");
		document.write("<td>" + formatDate(eventList[i][0]) + "</td>");
		document.write("<td>" + eventList[i][1] + "</td>");
		document.write("</tr>\n");
	}
	document.write("</tbody>\n");
	document.write("</table>\n");
}


