/* the whole calender object */
var kroot = root + 'jsCalendar/pics/';
var kalendar = null;
var kkonfig = null;
var uhr = null;
var ukonfig = null;

/* initial ist der gewuenschte Modus die Tages-Uebersicht von heute */
var gewuenschterModus    = CALENDAR_CHOOSE_DAY;			// 0 = Tag, 1 = Arbeit, 2 = Woche, 3 = Monat
/* initial ist die Granulation bei 5 Minuten */
var gewuenschtesGranulat = (30 * 60 * 1000);	// die Anzahl an Abschnitten in Millisekunden
/* Anzahl an Granulaten pro Stunde */
var granulatMenge        = (60 * 60 * 1000) / gewuenschtesGranulat;

/* bezueglich des gewaehlten Modus kann nun einer der Filter benutzt werden */
var dteFilter         = null;
var dteAnzeige        = null;
var dteMonatHLinks    = null;
var dteMonatLinks     = null;
var dteMonatRechts    = null;
var dteMonatHRechts   = null;

/* soll der Uebersichtsmodus auch veraendert werden? */
var changeMode = false;

/* initial ist der gewuenschte Tag der heutige Tag */
var heutigerTag       = new Date();	// was ist heute fuer ein Tag?
var angewaehlterTag   = new Date();	// welcher Tag ist aktuell angewaehlt?
var angewaehlteZeit   = new Date();	// welche Zeit ist aktuell angewaehlt?
var ersterTagHLinks   = new Date(); ersterTagHLinks.setDate ( 0); ersterTagHLinks.setDate (1);
var ersterTagLinks    = new Date(); ersterTagLinks.setDate  ( 1); ersterTagLinks.setDate  (1);
var ersterTagRechts   = new Date(); ersterTagRechts.setDate (32); ersterTagRechts.setDate (1);
var ersterTagHRechts  = new Date(); ersterTagHRechts.setDate(64); ersterTagHRechts.setDate(1);

function setDay(day, modus) {
	heutigerFilter     = getFilter(0, new Date());	// was ist heute fuer ein Tag?
	heutigerTag        = heutigerFilter.start;

	// NOTE: Hier wird nicht ueberprueft, ob der angewaehlte Tag am Anfang von Tag/Woche/Monat ist
	angewaehlterFilter = getFilter(modus, day);	// welcher Tag ist aktuell angewaehlt?
	angewaehlterTag    = angewaehlterFilter.start;

	ersterTagHLinks    = new Date(angewaehlterTag.getTime()); ersterTagHLinks.setDate ( 0); ersterTagHLinks.setDate (1);
	ersterTagLinks     = new Date(angewaehlterTag.getTime()); ersterTagLinks.setDate  ( 1); ersterTagLinks.setDate  (1);
	ersterTagRechts    = new Date(angewaehlterTag.getTime()); ersterTagRechts.setDate (32); ersterTagRechts.setDate (1);
	ersterTagHRechts   = new Date(angewaehlterTag.getTime()); ersterTagHRechts.setDate(64); ersterTagHRechts.setDate(1);
}

function setTime(time) {
	angewaehlteZeit    = time;
}

function slideMonth(monate) {
	if (monate > 0) {
		while (--monate >= 0) {
			ersterTagHLinks.setDate (32); ersterTagHLinks.setDate (1);
			ersterTagLinks.setDate  (32); ersterTagLinks.setDate  (1);
			ersterTagRechts.setDate (32); ersterTagRechts.setDate (1);
			ersterTagHRechts.setDate(32); ersterTagHRechts.setDate(1);
		}
	}
	else if (monate < 0) {
		monate = -monate;
		while (--monate >= 0) {
			ersterTagHLinks.setDate ( 0); ersterTagHLinks.setDate (1);
			ersterTagLinks.setDate  ( 0); ersterTagLinks.setDate  (1);
			ersterTagRechts.setDate ( 0); ersterTagRechts.setDate (1);
			ersterTagHRechts.setDate( 0); ersterTagHRechts.setDate(1);
		}
	}
}

function slideMonthRebuild(monate) {
	// monate - Number();

	if (monate != 0)
		slideMonth(monate);

	dteMonatHLinks  = getFilter(                2, ersterTagHLinks , false);
	dteMonatLinks   = getFilter(                2, ersterTagLinks  , false);
	dteMonatRechts  = getFilter(                2, ersterTagRechts , false);
	dteMonatHRechts = getFilter(                2, ersterTagHRechts, false);

	buildKalender();
}

function activateDate(jahr, monat, tag) {
	if (jahr < ersterTagLinks.getFullYear()) {
		while (jahr < ersterTagLinks.getFullYear())
			slideMonth(-1);
	}
	else if (jahr > ersterTagLinks.getFullYear()) {
		while (jahr > ersterTagLinks.getFullYear())
			slideMonth(+1);
	}

	if (monat < ersterTagLinks.getMonth()) {
		while (monat < ersterTagLinks.getMonth())
			slideMonth(-1);
	}
	else if (monat > ersterTagLinks.getMonth()) {
		while (monat > ersterTagLinks.getMonth())
			slideMonth(+1);
	}

	angewaehlterTag.setTime(ersterTagLinks.getTime());
	angewaehlterTag.setDate(tag);

	// nur dazu da um alle Filter wieder auf den neusten Stand zu kriegen
	slideMonthRebuild(0);
}

function clearView(jahr, monat, tag, modus) {
	var pop;

	pop   = document.getElementById('PopMonth');
	pop.style.visibility = 'hidden';

	pop   = document.getElementById('PopWeek');
	pop.style.visibility = 'hidden';
}

function activateView(jahr, monat, tag, modus) {
	clearView();

	if (modus != gewuenschterModus)
		changeMode = true;
	gewuenschterModus = modus;

	activateDate(jahr, monat, tag);

	// rufe einen Handler auf, falls er existiert
	//try {
	if (kkonfig.hookset[gewuenschterModus] != null)
		kkonfig.hookset[gewuenschterModus](kkonfig.id, angewaehlterTag);
	//}
	//catch (e) {
	//}

	// NOTE: Nur um sicher zu gehen
	changeMode = false;
}

function selectMonth(first, year, month) {
	var pop;

	// first - Boolean();
	// year  - Number();
	// month - Number();
	var years  = new Array(7);
	var months = new Array(7);

//	if (first != true)
//		month++;

	years [3] = year ;
	months[3] = month;
	if ((months[3]    ) <  0) { years [3] = years [3] - 1; months[3] = 11; }
	if ((months[3]    ) > 11) { years [3] = years [3] + 1; months[3] =  0; }
	if ((months[3] - 1) <  0) { years [2] = years [3] - 1; months[2] = 11; } else { years [2] = years [3] - 0; months[2] = months[3] - 1; }
	if ((months[2] - 1) <  0) { years [1] = years [2] - 1; months[1] = 11; } else { years [1] = years [2] - 0; months[1] = months[2] - 1; }
	if ((months[1] - 1) <  0) { years [0] = years [1] - 1; months[0] = 11; } else { years [0] = years [1] - 0; months[0] = months[1] - 1; }
	if ((months[3] + 1) > 11) { years [4] = years [3] + 1; months[4] =  0; } else { years [4] = years [3] + 0; months[4] = months[3] + 1; }
	if ((months[4] + 1) > 11) { years [5] = years [4] + 1; months[5] =  0; } else { years [5] = years [4] + 0; months[5] = months[4] + 1; }
	if ((months[5] + 1) > 11) { years [6] = years [5] + 1; months[6] =  0; } else { years [6] = years [5] + 0; months[6] = months[5] + 1; }

	pop   = document.getElementById('PopWeek');

	pop.style.visibility = 'hidden';

	pop   = document.getElementById('PopMonth');

	if (first) {
		pop.style.top    = -113;
		pop.style.left   =   12;
	}
	else {
		pop.style.top    = -113;
		pop.style.left   =  131;
	}

	pop.style.width  = 107;
	pop.style.height = 126;

	popTabelle  = '<table border="0" cellpadding="0" cellspacing="0" bgcolor="#C0C0C0" style="border-width: 1px; border-top-color: #FFFFFF; border-left-color: #FFFFFF; border-bottom-color: #000000; border-right-color: #000000;">';
	popTabelle += '<tr><td width="107" height="18" class="Grau" align="center" style="vertical-align: baseline;"><a class="cl" href="javascript:activateView(' + years[0] + ', ' + months[0] + ', 1, 2)">' + MonatsNamen[months[0]] + ' (' + years[0] + ')' + '</a></td></tr>';
	popTabelle += '<tr><td width="107" height="18" class="Grau" align="center" style="vertical-align: baseline;"><a class="cl" href="javascript:activateView(' + years[1] + ', ' + months[1] + ', 1, 2)">' + MonatsNamen[months[1]] + ' (' + years[1] + ')' + '</a></td></tr>';
	popTabelle += '<tr><td width="107" height="18" class="Grau" align="center" style="vertical-align: baseline;"><a class="cl" href="javascript:activateView(' + years[2] + ', ' + months[2] + ', 1, 2)">' + MonatsNamen[months[2]] + ' (' + years[2] + ')' + '</a></td></tr>';
	popTabelle += '<tr><td width="107" height="18" class="Grau" align="center" style="vertical-align: baseline; font-weight: bold;"><a class="cl" href="javascript:clearView();">' + MonatsNamen[months[3]] + ' (' + years[3] + ')' + '</a></td></tr>';
	popTabelle += '<tr><td width="107" height="18" class="Grau" align="center" style="vertical-align: baseline;"><a class="cl" href="javascript:activateView(' + years[4] + ', ' + months[4] + ', 1, 2)">' + MonatsNamen[months[4]] + ' (' + years[4] + ')' + '</a></td></tr>';
	popTabelle += '<tr><td width="107" height="18" class="Grau" align="center" style="vertical-align: baseline;"><a class="cl" href="javascript:activateView(' + years[5] + ', ' + months[5] + ', 1, 2)">' + MonatsNamen[months[5]] + ' (' + years[5] + ')' + '</a></td></tr>';
	popTabelle += '<tr><td width="107" height="18" class="Grau" align="center" style="vertical-align: baseline;"><a class="cl" href="javascript:activateView(' + years[6] + ', ' + months[6] + ', 1, 2)">' + MonatsNamen[months[6]] + ' (' + years[6] + ')' + '</a></td></tr>';
	popTabelle += '</table>';
	pop.innerHTML    = popTabelle;

	pop.style.visibility = 'visible';

//	return true;
}

function selectWeek(first, msec) {
	var pop;

	// first - Boolean();
	// msec  - Number();
	var dates  = new Array(7);
	var kws    = new Array(7);

	// wir sollten sichergehen, dass die Berechnungen auch korrekt sind
	var mdat   = new Date(msec);
	var mdat   = dateDate(mdat, 3, true);
	var msec   = mdat.getTime();

	if (first != true)
		msec += getTage(mdat.getFullYear(), mdat.getMonth()) * (24 * 60 * 60 * 1000);

	dates[0] = new Date(msec - (3 * 7 * 24 * 60 * 60 * 1000));
	dates[1] = new Date(msec - (2 * 7 * 24 * 60 * 60 * 1000));
	dates[2] = new Date(msec - (1 * 7 * 24 * 60 * 60 * 1000));
	dates[3] = new Date(msec                                );
	dates[4] = new Date(msec + (1 * 7 * 24 * 60 * 60 * 1000));
	dates[5] = new Date(msec + (2 * 7 * 24 * 60 * 60 * 1000));
	dates[6] = new Date(msec + (3 * 7 * 24 * 60 * 60 * 1000));

	kws[0] = getWoche(dates[0].getTime());
	kws[1] = getWoche(dates[1].getTime());
	kws[2] = getWoche(dates[2].getTime());
	kws[3] = getWoche(dates[3].getTime());
	kws[4] = getWoche(dates[4].getTime());
	kws[5] = getWoche(dates[5].getTime());
	kws[6] = getWoche(dates[6].getTime());

	pop   = document.getElementById('PopMonth');

	pop.style.visibility = 'hidden';

	pop   = document.getElementById('PopWeek');

	if (first) {
		pop.style.top    = -113;
		pop.style.left   =   12;
	}
	else {
		pop.style.top    = -113;
		pop.style.left   =  131;
	}

	pop.style.width  = 107;
	pop.style.height = 126;

	popTabelle  = '<table border="0" cellpadding="0" cellspacing="0" bgcolor="#C0C0C0" style="border-width: 1px; border-top-color: #FFFFFF; border-left-color: #FFFFFF; border-bottom-color: #000000; border-right-color: #000000;">';
	popTabelle += '<tr><td width="107" height="18" class="Grau" align="center" style="vertical-align: baseline;"><a class="cl" href="javascript:activateView(' + dates[0].getFullYear() + ', ' + dates[0].getMonth() + ', ' + dates[0].getDate() + ', 1)">KW&nbsp;' + kws[0] + ' (' + dates[0].getFullYear() + ')' + '</a></td></tr>';
	popTabelle += '<tr><td width="107" height="18" class="Grau" align="center" style="vertical-align: baseline;"><a class="cl" href="javascript:activateView(' + dates[1].getFullYear() + ', ' + dates[1].getMonth() + ', ' + dates[1].getDate() + ', 1)">KW&nbsp;' + kws[1] + ' (' + dates[1].getFullYear() + ')' + '</a></td></tr>';
	popTabelle += '<tr><td width="107" height="18" class="Grau" align="center" style="vertical-align: baseline;"><a class="cl" href="javascript:activateView(' + dates[2].getFullYear() + ', ' + dates[2].getMonth() + ', ' + dates[2].getDate() + ', 1)">KW&nbsp;' + kws[2] + ' (' + dates[2].getFullYear() + ')' + '</a></td></tr>';
	popTabelle += '<tr><td width="107" height="18" class="Grau" align="center" style="vertical-align: baseline; font-weight: bold;"><a class="cl" href="javascript:clearView();">KW&nbsp;' + kws[3] + ' (' + dates[3].getFullYear() + ')' + '</a></td></tr>';
	popTabelle += '<tr><td width="107" height="18" class="Grau" align="center" style="vertical-align: baseline;"><a class="cl" href="javascript:activateView(' + dates[4].getFullYear() + ', ' + dates[4].getMonth() + ', ' + dates[4].getDate() + ', 1)">KW&nbsp;' + kws[4] + ' (' + dates[4].getFullYear() + ')' + '</a></td></tr>';
	popTabelle += '<tr><td width="107" height="18" class="Grau" align="center" style="vertical-align: baseline;"><a class="cl" href="javascript:activateView(' + dates[5].getFullYear() + ', ' + dates[5].getMonth() + ', ' + dates[5].getDate() + ', 1)">KW&nbsp;' + kws[5] + ' (' + dates[5].getFullYear() + ')' + '</a></td></tr>';
	popTabelle += '<tr><td width="107" height="18" class="Grau" align="center" style="vertical-align: baseline;"><a class="cl" href="javascript:activateView(' + dates[6].getFullYear() + ', ' + dates[6].getMonth() + ', ' + dates[6].getDate() + ', 1)">KW&nbsp;' + kws[6] + ' (' + dates[6].getFullYear() + ')' + '</a></td></tr>';
	popTabelle += '</table>';
	pop.innerHTML    = popTabelle;

	pop.style.visibility = 'visible';

//	return true;
}

/*************************************************************************************************/
function selectHour(stunde) {
//	activateTime(hor, minute, ampm);

	if (ukonfig.mode == CLOCK_CHOOSE_12HOURS) {
		var ampm = getAMPM(angewaehlteZeit.getHours());

		angewaehlteZeit.setHours((get12(parseInt(stunde)) + (ampm ? 0 : 12)) % 24);
	}
	else
		angewaehlteZeit.setHours(parseInt(stunde));

	// rufe einen Handler auf, falls er existiert
	//try {
	if (ukonfig.hookset[0] != null)
		ukonfig.hookset[0](ukonfig.id, angewaehlteZeit);
	//}
	//catch (e) {
	//}
}

function selectMinute(minute) {

//	activateTime(hor, minute, ampm);
	angewaehlteZeit.setMinutes(parseInt(minute));

	// rufe einen Handler auf, falls er existiert
	//try {
	if (ukonfig.hookset[1] != null)
		ukonfig.hookset[1](ukonfig.id, angewaehlteZeit);
	//}
	//catch (e) {
	//}
}

function selectAMPM(ampm) {

//	activateTime(hor, minute, ampm);
	angewaehlteZeit.setHours((get12(angewaehlteZeit.getHours()) + (ampm == 'am' ? 0 : 12)) % 24);

	// rufe einen Handler auf, falls er existiert
	//try {
	if (ukonfig.hookset[2] != null)
		ukonfig.hookset[2](ukonfig.id, angewaehlteZeit);
	//}
	//catch (e) {
	//}
}

function selectSet() {

	// rufe einen Handler auf, falls er existiert
	//try {
	if (ukonfig.hookset[3] != null)
		ukonfig.hookset[3](ukonfig.id, angewaehlteZeit);
	//}
	//catch (e) {
	//}
}

/*************************************************************************************************/
function zClass(monat, tag, grayed) {
	var dater;

	// monat  - Date();
	// tag    - Number();
	// grayed - Boolean();
	dater    = new Date(monat.getTime());
	dater.setDate(tag);

	/* background-color ist weiss */
	/* color ist schwarz */
	var custom   = false;
	var classs   = 'ZahlB';
	var styleeBC = '#FFFFFF';	// BC - background-color
	var styleeBI = null;		// BI - background-image
	var styleeC  = '#000000';	// C  - color
	var styleeFW = 'normal';	// FW - font-weight

	if (grayed) {
		/* color ist grau */
		classs  = 'ZahlG';
		styleeC = '#808080';
	}

	if (heutigerTag.getTime() == dater.getTime()) {
		/* background-image ist roter Kasten */
		custom   = true;
		styleeBI = 'url(' + kroot + 'zahlen/angewaehlt.png)';
	}

	if (0) {
		custom   = true;
		styleeFW = 'bold';
	}

	switch (gewuenschterModus) {
		case CALENDAR_CHOOSE_DAY:	/* Tagesuebersicht *******************************************************/
			if (angewaehlterTag.getTime() == dater.getTime()) {
				/* background-color ist grau */
				/* color ist weiss */
				custom = true;
				styleeBC = '#C0C0C0';
				styleeC  = '#FFFFFF';
			}
			break;
		case CALENDAR_CHOOSE_WORKWEEK:	/* Arbeitswochenuebersicht ***********************************************/
		case CALENDAR_CHOOSE_FULLWEEK:	/* Wochenuebersicht ******************************************************/
			woche = new Date(angewaehlterTag.getTime());
			woche.setDate(woche.getDate() + (0 - ((woche.getDay() + 6) % 7)));

			ende = new Date(woche.getTime());
			ende.setDate(woche.getDate() + ((gewuenschterModus == 1) ? 7 : 5));

			if ((dater.getTime() >= woche.getTime()) &&
			    (dater.getTime() <  ende.getTime())) {
				/* background-color ist grau */
				/* color ist weiss */
				custom = true;
				styleeBC = '#C0C0C0';
				styleeC  = '#FFFFFF';
			}
			break;
		case CALENDAR_CHOOSE_MONTH:	/* Monatsuebersicht ******************************************************/
	    default:
			break;
	}

	if (!custom)
		modification = ' class="' + classs + '"';
	else
		modification = ' style="' +
			'font-family: Arial; ' +
			'font-size: 11px; ' +
			'font-weight: ' + styleeFW + '; ' +
			'text-align: right; ' +
			'vertical-align: baseline; ' +
			'background-color: ' + styleeBC + '; ' +
			'color: ' + styleeC + (styleeBI != null ? '; ' +
			'background-image: ' + styleeBI : '') + ';"';

	return '<td ' + modification + ' style="padding-right: 2px;"><a class="cl" href="javascript:activateView(' + monat.getFullYear() + ', ' + monat.getMonth() + ', ' + tag + ', 0)" style="font-weight: ' + styleeFW + '; color: ' + styleeC + ';">' + tag + '</a></td>\n';
}

function createMiniKalender(first, two) {
	cntKalender = new String('' +
	'<table border="0" cellspacing="0" cellpadding="0">\n' +
	'	<tr>\n' +
	'		<td width="119" height="18" align="center" valign="middle" colspan="7">\n' +
	'		<table border="0" cellspacing="0" cellpadding="0">\n' +
	'		<tr>\n' +
		(two ?
			(first ? (
	'			<td width="12"  height="18" align="center" valign="middle" class="Grau" background="' + kroot + 'kalendar/monat-hinten.png"><a class="cl" title="' + Beschreibungen[8] + '" href="javascript:activateDate(' + ersterTagHLinks.getFullYear() + ', ' + ersterTagHLinks.getMonth() + ', 1)"><img src="' + kroot + 'kalendar/monat-links.png" /></a></td>\n' +
	'			<td width="107" height="18" align="center" valign="middle" class="Grau" background="' + kroot + 'kalendar/monat-hinten.png"><a class="cl" title="' + Beschreibungen[12] + '" href="javascript:selectMonth(true, ' + ersterTagLinks.getFullYear () + ', ' + ersterTagLinks.getMonth () + ')">' + MonatsNamen[ersterTagLinks.getMonth ()] + '&nbsp;(' + ersterTagLinks.getFullYear() + ')</a></td>\n'
				 ) : (
	'			<td width="107" height="18" align="center" valign="middle" class="Grau" background="' + kroot + 'kalendar/monat-hinten.png"><a class="cl" title="' + Beschreibungen[12] + '" href="javascript:selectMonth(false, ' + ersterTagRechts.getFullYear () + ', ' + ersterTagRechts.getMonth () + ')">' + MonatsNamen[ersterTagRechts.getMonth()] + '&nbsp;(' + ersterTagRechts.getFullYear() + ')</a></td>\n' +
	'			<td width="12"  height="18" align="center" valign="middle" class="Grau" background="' + kroot + 'kalendar/monat-hinten.png"><a class="cl" title="' + Beschreibungen[9] + '" href="javascript:activateDate(' + ersterTagRechts.getFullYear() + ', ' + ersterTagRechts.getMonth() + ', 1)"><img src="' + kroot + 'kalendar/monat-rechts.png" /></a></td>\n'
				 )
			)
			 :
			(first ? (
	'			<td width="12"  height="18" align="center" valign="middle" class="Grau" background="' + kroot + 'kalendar/monat-hinten.png"><a class="cl" title="' + Beschreibungen[8] + '" href="javascript:activateDate(' + ersterTagHLinks.getFullYear() + ', ' + ersterTagHLinks.getMonth() + ', 1)"><img src="' + kroot + 'kalendar/monat-links.png" /></a></td>\n' +
	'			<td width="95"  height="18" align="center" valign="middle" class="Grau" background="' + kroot + 'kalendar/monat-hinten.png"><a class="cl" title="' + Beschreibungen[12] + '" href="javascript:selectMonth(true, ' + ersterTagLinks.getFullYear () + ', ' + ersterTagLinks.getMonth () + ')">' + MonatsNamen[ersterTagLinks.getMonth ()] + '&nbsp;(' + ersterTagLinks.getFullYear() + ')</a></td>\n' +
	'			<td width="12"  height="18" align="center" valign="middle" class="Grau" background="' + kroot + 'kalendar/monat-hinten.png"><a class="cl" title="' + Beschreibungen[9] + '" href="javascript:activateDate(' + ersterTagRechts.getFullYear() + ', ' + ersterTagRechts.getMonth() + ', 1)"><img src="' + kroot + 'kalendar/monat-rechts.png" /></a></td>\n'
				 ) : (
	'			<td width="12"  height="18" align="center" valign="middle" class="Grau" background="' + kroot + 'kalendar/monat-hinten.png"><a class="cl" title="' + Beschreibungen[8] + '" href="javascript:activateDate(' + ersterTagHLinks.getFullYear() + ', ' + ersterTagHLinks.getMonth() + ', 1)"><img src="' + kroot + 'kalendar/monat-links.png" /></a></td>\n' +
	'			<td width="95"  height="18" align="center" valign="middle" class="Grau" background="' + kroot + 'kalendar/monat-hinten.png"><a class="cl" title="' + Beschreibungen[12] + '" href="javascript:selectMonth(false, ' + ersterTagRechts.getFullYear () + ', ' + ersterTagRechts.getMonth () + ')">' + MonatsNamen[ersterTagRechts.getMonth()] + '&nbsp;(' + ersterTagRechts.getFullYear() + ')</a></td>\n' +
	'			<td width="12"  height="18" align="center" valign="middle" class="Grau" background="' + kroot + 'kalendar/monat-hinten.png"><a class="cl" title="' + Beschreibungen[9] + '" href="javascript:activateDate(' + ersterTagRechts.getFullYear() + ', ' + ersterTagRechts.getMonth() + ', 1)"><img src="' + kroot + 'kalendar/monat-rechts.png" /></a></td>\n'
				 )
			)
		) +
	'		</tr>\n' +
	'		</table>\n' +
	'		</td>\n' +
	'	</tr>\n' +
	'\n' +
		(first ? (
	'	<tr><td class="ZahlB"><a class="cl" title="' + Beschreibungen[13] + '" href="javascript:selectWeek(true, ' + angewaehlterTag.getTime() + ');"><img src="' + kroot + TagesNamenB[0] + '" /></a></td>\n' +
	'	    <td class="ZahlB"><a class="cl" title="' + Beschreibungen[13] + '" href="javascript:selectWeek(true, ' + angewaehlterTag.getTime() + ');"><img src="' + kroot + TagesNamenB[1] + '" /></a></td>\n' +
	'	    <td class="ZahlB"><a class="cl" title="' + Beschreibungen[13] + '" href="javascript:selectWeek(true, ' + angewaehlterTag.getTime() + ');"><img src="' + kroot + TagesNamenB[2] + '" /></a></td>\n' +
	'	    <td class="ZahlB"><a class="cl" title="' + Beschreibungen[13] + '" href="javascript:selectWeek(true, ' + angewaehlterTag.getTime() + ');"><img src="' + kroot + TagesNamenB[3] + '" /></a></td>\n' +
	'	    <td class="ZahlB"><a class="cl" title="' + Beschreibungen[13] + '" href="javascript:selectWeek(true, ' + angewaehlterTag.getTime() + ');"><img src="' + kroot + TagesNamenB[4] + '" /></a></td>\n' +
	'	    <td class="ZahlB"><a class="cl" title="' + Beschreibungen[13] + '" href="javascript:selectWeek(true, ' + angewaehlterTag.getTime() + ');"><img src="' + kroot + TagesNamenB[5] + '" /></a></td>\n' +
	'	    <td class="ZahlB"><a class="cl" title="' + Beschreibungen[13] + '" href="javascript:selectWeek(true, ' + angewaehlterTag.getTime() + ');"><img src="' + kroot + TagesNamenB[6] + '" /></a></td></tr>\n'
		) : (
	'	<tr><td class="ZahlB"><a class="cl" title="' + Beschreibungen[13] + '" href="javascript:selectWeek(false, ' + angewaehlterTag.getTime() + ');"><img src="' + kroot + TagesNamenB[0] + '" /></a></td>\n' +
	'	    <td class="ZahlB"><a class="cl" title="' + Beschreibungen[13] + '" href="javascript:selectWeek(false, ' + angewaehlterTag.getTime() + ');"><img src="' + kroot + TagesNamenB[1] + '" /></a></td>\n' +
	'	    <td class="ZahlB"><a class="cl" title="' + Beschreibungen[13] + '" href="javascript:selectWeek(false, ' + angewaehlterTag.getTime() + ');"><img src="' + kroot + TagesNamenB[2] + '" /></a></td>\n' +
	'	    <td class="ZahlB"><a class="cl" title="' + Beschreibungen[13] + '" href="javascript:selectWeek(false, ' + angewaehlterTag.getTime() + ');"><img src="' + kroot + TagesNamenB[3] + '" /></a></td>\n' +
	'	    <td class="ZahlB"><a class="cl" title="' + Beschreibungen[13] + '" href="javascript:selectWeek(false, ' + angewaehlterTag.getTime() + ');"><img src="' + kroot + TagesNamenB[4] + '" /></a></td>\n' +
	'	    <td class="ZahlB"><a class="cl" title="' + Beschreibungen[13] + '" href="javascript:selectWeek(false, ' + angewaehlterTag.getTime() + ');"><img src="' + kroot + TagesNamenB[5] + '" /></a></td>\n' +
	'	    <td class="ZahlB"><a class="cl" title="' + Beschreibungen[13] + '" href="javascript:selectWeek(false, ' + angewaehlterTag.getTime() + ');"><img src="' + kroot + TagesNamenB[6] + '" /></a></td></tr>\n'
		))
	);

	var restday = 0;
	var doneday = 0;

	/* ************************************************************************
	 * erste Zeile
	 */
	if (first) {
		smday = (dteMonatLinks.start.getDay() + 6) % 7;
		tmday =  dteMonatHLinks.stop.getDate();

		if (smday < (5 + (31 - dteMonatLinks.stop.getDate()))) {
		cntKalender += '<tr>\n'
		for (s = 0; s <     7; s++) cntKalender += zClass(dteMonatHLinks.stop , tmday - smday - 7 + s + 1, true);
		cntKalender += '</tr>\n'
		}

		cntKalender += '<tr>\n'
		for (s = 0; s < smday; s++) cntKalender += zClass(dteMonatHLinks.stop , tmday - smday     + s + 1, true);
		for (s = smday; s < 7; s++) cntKalender += zClass(dteMonatLinks.start ,       - smday     + s + 1, false);
		cntKalender += '</tr>\n'

		doneday = (7 - smday);
		restday = dteMonatLinks.stop.getDate() - doneday;
	}
	else {
		smday = (dteMonatRechts.start.getDay() + 6) % 7;
		tmday =  dteMonatLinks.stop.getDate();

		cntKalender += '<tr>\n'
	//	for (s = 0; s < smday; s++) cntKalender += zClass(dteMonatLinks.stop  , tmday - smday     + s + 1, true);
		for (s = 0; s < smday; s++) cntKalender += '<td class="ZahlG"> &nbsp;&nbsp;</td>\n';
		for (s = smday; s < 7; s++) cntKalender += zClass(dteMonatRechts.start,       - smday     + s + 1, false);
		cntKalender += '</tr>\n'

		doneday = (7 - smday);
		restday = dteMonatRechts.stop.getDate() - doneday;
	}

	/* ************************************************************************
	 * mittlere Zeilen
	 */
	for (b = 0; b < parseInt(restday / 7); b++) {
		cntKalender += '<tr>\n'
		for (s = 0; s < 7; s++) cntKalender += zClass(first ? dteMonatLinks.start : dteMonatRechts.start, ++doneday, false);
		cntKalender += '</tr>\n'
	}
	restday = restday % 7;

	/* ************************************************************************
	 * letzte Zeile
	 */
	if (first) {
		if (restday > 0) {
		cntKalender += '<tr>\n'
		for (s = 0; s < restday; s++) cntKalender += zClass(dteMonatLinks.start, ++doneday, false);
		if (two)
		for (s = restday; s < 7; s++) cntKalender += '<td class="ZahlB"> &nbsp;&nbsp;</td>\n';
		else
		for (s = restday; s < 7; s++) cntKalender += zClass(dteMonatRechts.start, s - restday + 1, true);
		cntKalender += '</tr>\n'
		}
	}
	else {
		cntKalender += '<tr>\n'
		for (s = 0; s < restday; s++) cntKalender += zClass(dteMonatRechts.start, ++doneday, false);
		for (s = restday; s < 7; s++) cntKalender += zClass(dteMonatHRechts.start, s - restday + 1, true);
		cntKalender += '</tr>\n'

		smday = (dteMonatRechts.start.getDay() + 6) % 7;
		tmday =  dteMonatLinks.stop.getDate();

		if ((smday + doneday + (7 - restday)) < (6 * 7)) {
		cntKalender += '<tr>\n'
		for (c = 0; c < 7; c++) cntKalender += zClass(dteMonatHRechts.start, s - restday + 1 + c, true);
		cntKalender += '</tr>\n'
		}
	}

	cntKalender += '</table>\n';

	return cntKalender;
}

function buildKalender() {
	dteFilter       = getFilter(gewuenschterModus, angewaehlterTag , true );
	dteAnzeige      = getFilter(                0, angewaehlterTag , false);

	dteMonatHLinks  = getFilter(                2, ersterTagHLinks , false);
	dteMonatLinks   = getFilter(                2, ersterTagLinks  , false);
	dteMonatRechts  = getFilter(                2, ersterTagRechts , false);
	dteMonatHRechts = getFilter(                2, ersterTagHRechts, false);

	var kal = document.getElementById('KalenderLinks');
	var kar = document.getElementById('KalenderRechts');

	if (kal) kal.innerHTML = createMiniKalender(true,  kar && kal);
	if (kar) kar.innerHTML = createMiniKalender(false, kal && kar);
}

function buildUhr() {
	if (ukonfig.mode == CLOCK_CHOOSE_12HOURS) {
		document.getElementById('UhrStunde').value = d2num(get12(angewaehlteZeit.getHours  ()));
		document.getElementById('UhrMinute').value = d2num(      angewaehlteZeit.getMinutes() );
		document.getElementById('UhrAMPM'  ).selectedIndex = getAMPM(angewaehlteZeit.getHours()) ? 0 : 1;
	}
	else {
		document.getElementById('UhrStunde').value = d2num(angewaehlteZeit.getHours  ());
		document.getElementById('UhrMinute').value = d2num(angewaehlteZeit.getMinutes());
	}
}

function showKalender(initialConfig, initialZeit, punktX, punktY) {
	kkonfig = initialConfig;
	gewuenschterModus = initialConfig.mode;

//	kroot = root + 'jsCalendar/pics/';
	if ((kalendar = document.getElementById("Kalender")) == null)
		return;

	kalendar.style.visibility = 'hidden';
	kalendar.innerHTML =
		'<table border="0" cellspacing="0" cellpadding="0" style="border: 1px solid black;">' +
		'<tr>' +
		'	<td align="right" valign="top" width="119" height="123">' +
		'		<div id="KalenderLinks">' +
		'		</div>' +
		'	</td>' +
			(initialConfig.view == CALENDAR_VIEW_TWO ? (
		'	<td align="center" valign="top" width="12" height="123">' +
		'		<div id="KalenderMitte">' +
		'		<table border="0" cellspacing="0" cellpadding="0">' +
		'		<tr>' +
		'			<td class="Grau" width="12" height="18" background="' + kroot + 'kalendar/monat-mitte.png">' +
		'			</td>' +
		'		</tr>' +
		'		<tr>' +
		'			<td class="Weiss" width="12" height="105">' +
		'			</td>' +
		'		</tr>' +
		'		</table>' +
		'		</div>' +
		'	</td>' +
		'	<td align="left" valign="top" width="119" height="123">' +
		'		<div id="KalenderRechts">' +
		'		</div>' +
		'	</td>'
			) : (
		''
			)) +
		'</tr>' +
		'<tr>' +
			(initialConfig.view == CALENDAR_VIEW_TWO ? (
		'	<td class="Aufgabe" colspan="3" style="width: 250px; background-image: url(' + kroot + 'aufgaben/trenner2.png);" /></td>'
			) : (
		'	<td class="Aufgabe" colspan="1" style="width: 119px; background-image: url(' + kroot + 'aufgaben/trenner1.png);" /></td>'
			)) +
		'</tr>' +
		'</table>' +
		'<div style="position: absolute;">' +
		'	<div id="PopMonth" style="position: relative; top: -112px; left: 10px; visibility: hidden; z-index: 0;">' +
		'	</div>' +
		'</div>' +
		'<div style="position: absolute;">' +
		'	<div id="PopWeek" style="position: relative; top: -112px; left: 10px; visibility: hidden; z-index: 0;">' +
		'	</div>' +
		'</div>';

	var initialDate = new Date();
	if (initialZeit != '')
		initialDate.setTime(new Number(initialZeit));
	setDay(initialDate, gewuenschterModus);

	buildKalender();

	var centerX = punktX - ((initialConfig.view == CALENDAR_VIEW_TWO) ? (250 >> 1) : (119 >> 1));
	var centerY = punktY - ((initialConfig.view == CALENDAR_VIEW_TWO) ? (129 >> 1) : (129 >> 1));

	kalendar.style.zIndex = 20;
	kalendar.style.left = centerX + 'px';
	kalendar.style.top  = centerY + 'px';
	kalendar.style.visibility = 'visible';
}

function hideKalender() {
	if (kalendar != null) {
		kalendar.style.visibility = 'hidden';
		kalendar.style.zIndex = -2;
		kalendar = null;
	}
}

function showUhr(initialConfig, initialZeit, punktX, punktY) {
	ukonfig = initialConfig;

//	uroot = root + 'jsCalendar/pics/';
	if ((uhr = document.getElementById("Uhr")) == null)
		return;

	uhr.style.visibility = 'hidden';
	uhr.innerHTML =
		'<table cellspacing="0" cellpadding="0"><tr>' +
		'	<td style="width: 50px;"><div' +
		'		style="position: relative; margin-right: 22px;"><input type="text"' +
		'			style="position: absolute; z-index: 2; width: 100%;" id="UhrStunde"' +
		'			onchange="selectHour(this.value);" value="" /></div><select' +
		'			style="position: relative; z-index: 1; width: 100%;" id="UhrStundeS"' +
		'			onchange="var std = document.getElementById(\'UhrStunde\'); std.value = this.value; std.onchange();">' + (initialConfig.mode == CLOCK_CHOOSE_24HOURS ?
		'			<option value="00">00</option>' : '') +
		'			<option value="01">01</option>' +
		'			<option value="02">02</option>' +
		'			<option value="03">03</option>' +
		'			<option value="04">04</option>' +
		'			<option value="05">05</option>' +
		'			<option value="06">06</option>' +
		'			<option value="07">07</option>' +
		'			<option value="08">08</option>' +
		'			<option value="09">09</option>' +
		'			<option value="10">10</option>' +
		'			<option value="11">11</option>' +
		'			<option value="12">12</option>' + (initialConfig.mode == CLOCK_CHOOSE_24HOURS ?
		'			<option value="13">13</option>' +
		'			<option value="14">14</option>' +
		'			<option value="15">15</option>' +
		'			<option value="16">16</option>' +
		'			<option value="17">17</option>' +
		'			<option value="18">18</option>' +
		'			<option value="19">19</option>' +
		'			<option value="20">20</option>' +
		'			<option value="21">21</option>' +
		'			<option value="22">22</option>' +
		'			<option value="23">23</option>' : '') +
		'		</select></td><td style="width: 50px;"><div' +
		'		style="position: relative; margin-right: 22px;"><input type="text"' +
		'			style="position: absolute; z-index: 2; width: 100%;" id="UhrMinute"' +
		'			onchange="selectMinute(this.value);" value="" /></div><select' +
		'			style="position: relative; z-index: 1; width: 100%;" id="UhrMinuteS"' +
		'			onchange="var min = document.getElementById(\'UhrMinute\'); min.value = this.value; min.onchange();">' +
		'			<option value="00">00</option>' +
		'			<option value="15">15</option>' +
		'			<option value="30">30</option>' +
		'			<option value="45">45</option>' +
		'		</select></td>' + (initialConfig.mode == CLOCK_CHOOSE_12HOURS ? '<td style="width: 50px;"><select' +
		'			style="position: relative; z-index: 1; width: 100%;" id="UhrAMPM"' +
		'			onchange="selectAMPM(this.value);">' +
		'			<option value="am">am</option>' +
		'			<option value="pm">pm</option>' +
		'		</select></td>' : '') + '<td style="width: 50px;"><input' +
		'			type="button" value="set" onclick="selectSet();" /></td></tr></table>';

	var initialDate = new Date();
	if (initialZeit != '')
		initialDate.setTime(new Number(initialZeit));
	setTime(initialDate);

	buildUhr();

	var centerX = punktX - ((initialConfig.mode == CLOCK_CHOOSE_12HOURS) ? (200 >> 1) : (150 >> 1));
	var centerY = punktY - ((initialConfig.mode == CLOCK_CHOOSE_12HOURS) ? ( 20 >> 1) : ( 20 >> 1));

	uhr.style.zIndex = 20;
	uhr.style.left = centerX + 'px';
	uhr.style.top  = centerY + 'px';
	uhr.style.visibility = 'visible';
}

function hideUhr() {
	if (uhr != null) {
		uhr.style.visibility = 'hidden';
		uhr.style.zIndex = -2;
		uhr = null;
	}
}
