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 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 0:	/* Tagesuebersicht *******************************************************/
			if (prev == true)
				distance = -1;
			else
				distance = +1;
			break;
		case 3:	/* Arbeitswochenuebersicht ***********************************************/
		case 1:	/* Wochenuebersicht ******************************************************/
			if (prev == true)
				distance = -7;
			else
				distance = +7;
			break;
		case 2:	/* Monatsuebersicht ******************************************************/
			jahr  = tag.getYear();
			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.getYear(), neuertag.getMonth(), neuertag.getDate());

		return true;
	}

	return false;
}

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

	switch (modus) {
		case 0:
		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 3:
		case 1:
			/* ********************************************************************************
			 * 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 2:
			/* ********************************************************************************
			 * 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.getYear(), 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;
	}
}

