

	function getTage(jahr, monat) {
		// jahr  - Number()
		// monat - Number()
		if (monat >= 12)
			document.getElementByID("trace-me").tracer = this_is_a_hit;

		/* für korrekte Ergebnisse */
		if (jahr < 999)
			jahr += 1900;
		/* das ist leider nicht mehr gregorianisch!!! */
		if (jahr < 1583)
			return -1;

		switch (monat) {
			/* 31er */
			case 0: case 2: case 4: case 6: case 7: case  9: case 11:
				return                                                                        31      ; break;
			/* 30er */
			        case 3: case 5:         case 8: case 10:
			        return                                                                    30      ; break;
			/* 28er & 29er */
			case 1:
				return ((((jahr % 4) == 0) && (((jahr % 100) != 0) || ((jahr % 400) == 0))) ? 29 : 28); break;
		}

		return -1;
	}

	function getWoche(msec) {
		// jahr  - Number()
		// monat - Number()
		// tag   - Number()
		anfang = new Date(msec);
		anfang.setMonth(0);
		anfang.setDate(1);

		return parseInt((msec - anfang.getTime()) / (7 * 24 * 60 * 60 * 1000)) + 1;
	}

	function get12(hours) {
		return (((hours + 11) % 12) + 1);
	}

	function getAMPM(hours) {
		return (((hours + 23) % 24) + 1) <= 12;
	}

	function slideTermin(termin, tage) {
		// termin - Date();
		// tage   - Number();
		termin.setTime(termin.getTime() + (tage * 24 * 60 * 60 * 1000));
	}

	function slideKalender(modus, tag, prev) {
		// modus - Number();
		// tag   - Date();
		// prev  - Boolean();
		distance = 0;

		switch (modus) {
			case CALENDAR_CHOOSE_DAY:		/* Tagesuebersicht *******************************************************/
				if (prev == true)
					distance = -1;
				else
					distance = +1;
				break;
			case CALENDAR_CHOOSE_WORKWEEK:	/* Arbeitswochenuebersicht ***********************************************/
			case CALENDAR_CHOOSE_FULLWEEK:	/* Wochenuebersicht ******************************************************/
				if (prev == true)
					distance = -7;
				else
					distance = +7;
				break;
			case CALENDAR_CHOOSE_MONTH:		/* Monatsuebersicht ******************************************************/
				jahr  = tag.getFullYear();
				monat = tag.getMonth();

				if (prev == true) {
					if (--monat < 0) {
						--jahr;
						monat = 11;
					}
					distance = -getTage(jahr, monat);
				}
				else
					distance = +getTage(jahr, monat);

				break;
			default: /* Standarduebersicht ***************************************************/
				document.getElementByID("trace-me").tracer = this_is_a_hit;
				break;
		}

		// wenn die Verschiebung gueltig ist, ansonsten abbruch
		if (distance != 0) {
			neuertag = new Date();
			neuertag.setTime(tag.getTime());
			neuertag.setDate(tag.getDate() + distance);

			activateDate(neuertag.getFullYear(), neuertag.getMonth(), neuertag.getDate());

			return true;
		}

		return false;
	}

	function getFilter(modus, tag, io) {
		// modus - Number();
		// tag   - Date();
		// io    - Boolean();

		switch (modus) {
			case CALENDAR_CHOOSE_DAY:
			default:
				/* ********************************************************************************
				 * Tages-Filter:
				 *
				 * berechne Datums-Objekte fuer das Interval gewuenschter Tag 0:00 bis gewuenschter Tag 23:59
				 */
				var tagAnfang  = new Date(tag);
				tagAnfang.setHours       (0);
				tagAnfang.setMinutes     (0);
				tagAnfang.setSeconds     (0);
				tagAnfang.setMilliseconds(0);
				var tagEnde    = new Date(tag);
				tagEnde.setHours         (23);
				tagEnde.setMinutes       (59);
				tagEnde.setSeconds       (59);
				tagEnde.setMilliseconds  (999);

				return new myTermin(tagAnfang, tagEnde, -1, "", "", null, false, "", "", false);
				break;

			case CALENDAR_CHOOSE_WORKWEEK:
			case CALENDAR_CHOOSE_FULLWEEK:
				/* ********************************************************************************
				 * Wochen-Filter
				 *
				 * berechne Datums-Objekte fuer das Interval letzter Montag vor gewuenschter Tag 0:00 bis naechsten Sonntag nach gewuenschter Tag 23:59
				 */
				var wocAnfang  = new Date(tag);
	//			wocAnfang.setYear        (komplexe berechnung des letzten Montags/*letztes oder diese Jahr*/);
	//			wocAnfang.setMonth       (komplexe berechnung des letzten Montags/*letzter oder dieser Monat*/);
	//			wocAnfang.setDate        (komplexe berechnung des letzten Montags);
	//			slideTermin(wocAnfang, 0 - ((wocAnfang.getDay() + 6) % 7));
				wocAnfang.setDate	     (wocAnfang.getDate() + (0 - ((wocAnfang.getDay() + 6) % 7)));
				wocAnfang.setHours       (0);
				wocAnfang.setMinutes     (0);
				wocAnfang.setSeconds     (0);
				wocAnfang.setMilliseconds(0);
				var wocEnde    = new Date(tag);
	//			wocEnde.setYear          (komplexe berechnung des naechsten Sonntags/* dieses oder naechstes Jahr*/);
	//			wocEnde.setMonth         (komplexe berechnung des naechsten Sonntags/* dieser oder naechster Monat*/);
	//			wocEnde.setDate          (komplexe berechnung des naechsten Sonntags);
	//			slideTermin(wocAnfang, 6 - ((wocAnfang.getDay() + 6) % 7));
				wocEnde.setDate	         (wocAnfang.getDate() + ((modus == 1) ? 6 : 4));
				wocEnde.setHours         (23);
				wocEnde.setMinutes       (59);
				wocEnde.setSeconds       (59);
				wocEnde.setMilliseconds  (999);

				return new myTermin(wocAnfang, wocEnde, -1, "", "", null, false, "", "", false);
				break;

	        case CALENDAR_CHOOSE_MONTH:
				/* ********************************************************************************
				 * Monats-Filter
				 *
				 * berechne Datums-Objekte fuer das Interval erster Monatstag vor gewuenschter Tag 0:00 bis letzter Monatstag nach gewuenschter Tag 23:59
				 */
				var monAnfang  = new Date(tag);
				monAnfang.setDate        (1);
				monAnfang.setHours       (0);
				monAnfang.setMinutes     (0);
				monAnfang.setSeconds     (0);
				monAnfang.setMilliseconds(0);
				var monEnde    = new Date(tag);
	//			monEnde.setDate          (komplexe berechnung des letzten Monatstages/*27, 28, 29 oder 30*/);
				monEnde.setDate          (getTage(monEnde.getFullYear(), monEnde.getMonth()));
				monEnde.setHours         (23);
				monEnde.setMinutes       (59);
				monEnde.setSeconds       (59);
				monEnde.setMilliseconds  (999);

				if (io == true) {
					// 6x7 Elemente, die darzustellen sind
					letzterTag         = ((monEnde.getDay() + 6) % 7);
					letzterUeberschuss = 6 - letzterTag;
					anzahlTage         = monEnde.getDate();
					anfangTag          = ((monAnfang.getDay() + 6) % 7);
					anfangUeberschuss  = (6 * 7) - (anzahlTage + letzterUeberschuss);

					monAnfang.setDate(monAnfang.getDate() - (anfangUeberschuss));
					monEnde.setDate  (monEnde.getDate()   + (letzterUeberschuss));
				}

				return new myTermin(monAnfang, monEnde, -1, "", "", null, false, "", "", false);
				break;
		}
	}

	function getWidendDate(datum) {
		datum.setHours       (23);
		datum.setMinutes     (59);
		datum.setSeconds     (59);
		datum.setMilliseconds(999);

		return datum;
	}

	function getStrippedDate(datum) {
		datum.setHours       (0);
		datum.setMinutes     (0);
		datum.setSeconds     (0);
		datum.setMilliseconds(0);

		return datum;
	}

	function getActualDate() {
		return getStrippedDate(new Date());
	}

	function getNonPastDate(tag) {
		var checktime = getStrippedDate(new Date(tag));
		var befortime = getStrippedDate(new Date());

		while (checktime.getTime() < befortime.getTime())
			checktime.setYear(checktime.getFullYear() + 1);

		return checktime;
	}

	function getNonBeforeDate(tag, before) {
		var checktime = getStrippedDate(new Date(tag));
		var befortime = getStrippedDate(new Date(before));

		if (checktime.getTime() < befortime.getTime())
			checktime = befortime;

		return checktime;
	}
