
/* Autor: gerrit kubiak, gerrit@squap.com, www.squap.com - erstellt am: 08. Dezember 2007 */
/* konform zu JavaScript 1.5 & DOM 1.0 - janis version 2.3 excalibur*/
/* copyright 2007 gerrit kubiak und Squap.com - alle Rechte vorbehalten */

var zeitGeber     = null;
var zeitFktF      =   [];
var reaktorF      =   {};
var initiatorF    =   {};
var fensterX      = 0, fensterY = 0, offsetX = 0, offsetY = 0, minY = 0, minX = 0;
var ereignisTypen = {load:'load', resize:'resize', mouseover:'mouseover', mouseout:'mouseout'};
var wochenTage    = ['mo', 'di', 'mi', 'do', 'fr', 'sa', 'so'];
var monatsNamen   = ['jan', 'feb', 'm&auml;r', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dez'];

function Element(id) {
	return (id.indexOf('_n') >= 0) ?
		document.getElementsByName(id)[0] :
		document.getElementById(id);
		return true;
}
function aktualisiereFensterwerte() {
	fensterX = (document.documentElement.clientWidth  || document.body.clientWidth  || document.body.scrollWidth);
	fensterY = (document.documentElement.clientHeight || document.body.clientHeight || document.body.scrollHeight);
	offsetX  = parseInt(window.scrollX || document.documentElement.scrollLeft || document.body.scrollLeft, 10);
	offsetY  = parseInt(window.scrollY || document.documentElement.scrollTop  || document.body.scrollTop, 10);
	return true;
}
function fzReaktor(e) {
	e.x   = e.offsetLeft;
	e.y   = e.offsetTop;
	e.xG  = e.x;
	e.yG  = e.y;
	e.b   = e.offsetWidth;
	e.h   = e.offsetHeight;
	e.bG  = e.b;
	e.hG  = e.h;
	e.t   =   0;
	e.r   = e.b;
	e.u   = e.h;
	e.l   =   0;
	e.tG  = e.t;
	e.rG  = e.r;
	e.uG  = e.u;
	e.lG  = e.l;
	e.setzeEigenschaft = function(parameterS) {
		var eigenschaft = parameterS[0].split('.');
		if (eigenschaft[1]) {
			e[eigenschaft[0]][eigenschaft[1]] = parameterS[1];
		}
		else {
			e[eigenschaft[0]] = parameterS[1];
		}
		return true;
	};
	e.fzTextS          = function(parameterS) {
		if (!e.textS) {
			e.textS     = [];
			e.textS[0]  = e.innerHTML;
		}
		e.textS[parameterS[1]] = parameterS[0];
		return true;
	};
	e.setzeTextS       = function(parameterS) {
		e.innerHTML = e.textS[parameterS[0]];
		return true;
	};
	e.textAnim         = function(parameterS) {
		// laufrichtung: nach links, nach rechts, nach oben, nach unten
		// laufdelta: die anzahl pixel, um die verschoben wird, also geschwindigkeit
		// textabstand: abstand zwischen textende und textanfang in pixel
		return true;
	}
	e.setzeB           = function(parameterS) {
		e.b            = parameterS[0];
		e.style.width  = e.b + 'px';
		return true;
	};
	e.aendereB         = function(parameterS) {
		var abstand    = parseInt(parameterS[0] - e.b + 0.5);
		var betrag     = Math.abs(abstand);
		if (betrag > 0) {
			var v      = parameterS[2] ? abstand / parameterS[1] : abstand / betrag * parameterS[1];
			e.setzeB([e.b + v]);
			return false;
		}
		else {
			e.setzeB([parseInt(e.b + 0.25)]);
			return true;
		}
	};
	e.setzeH           = function(parameterS) {
		e.h            = parameterS[0];
		e.style.height = e.h + 'px';
		return true;
	};
	e.aendereH         = function(parameterS) {
		var abstand    = parseInt(parameterS[0] - e.h + 0.5);
		var betrag     = Math.abs(abstand);
		if (betrag > 0) {
			var v      = parameterS[2] ? abstand / parameterS[1] : abstand / betrag * parameterS[1];
			e.setzeH([e.h + v]);
			return false;
		}
		else {
			e.setzeH([parseInt(e.h + 0.25)]);
			return true;
		}
	};
	e.setzeX           = function(parameterS) {
		e.x            = parameterS[0];
		e.style.left   = e.x + 'px';
		return true;
	};
	e.aendereX         = function(parameterS) {
		var abstand    = parseInt(parameterS[0] - e.x + 0.5);
		var betrag     = Math.abs(abstand);
		if (betrag > 0) {
			var v      = parameterS[2] ? abstand / parameterS[1] : abstand / betrag * parameterS[1];
			e.setzeX([e.x + v]);
			return false;
		}
		else {
			e.setzeX([parseInt(e.x - 0.25)]);
			return true;
		}
	};
		// der betrag von ziel - x muß größer 0 sein - problem: wann landet x schon exakt auf ziel, d.h. wann wird betrag bei zielankunft schon exakt 0???
		// bei der dynamik muß erst mit a/2 gestartet werden, damit die linear ansteigende Geschwindigkeitsgerade das Wegrechteck genau teilt
		// var ziel = parameterS[0];
		// var anzahlschritte = parameterS[1];
		// var modus = parameterS[2];
		
		// var abstand = ziel - e.x;
		// var betrag  = Math.abs(abstand);
		
		// var schrittweite = abstand / anzahlschritte;
		
		// wenn modus = 0, dann statisch
			// d.h. nur ziel, kein v, kein a
		// wenn modus = 1, dann dynamisch linear
			// d.h. ziel, v, aber kein a
		// wenn modus = 2, dann dynamisch progressiv
		
		// if (modus == 0) {
			// e.vX = abstand;
			// e.aX = 0;
			// fzZeitFkt(0, e.neuX, [ziel]);
		// }
		// if (modus == 1) {
			// e.vX = schrittweite;
			// e.aX = 0;
			// fzZeitFkt(0, e.neuX, [ziel]);
		// }
		// if (modus == 2) {
			// e.vX = 0;
			// e.aX = schrittweite * schrittweite / abstand;
			// e.neuX([ziel]);
			// e.aX *= 2;
			// fzZeitFkt(1, e.neuX, [ziel]);
		// }
		// if (modus == 3) {
			// e.vX = 2 * schrittweite;
			// e.aX = - schrittweite * schrittweite / abstand;
			// e.neuX([ziel]);
			// e.aX *= 2;
			// fzZeitFkt(1, e.neuX, [ziel]);
		// }
		// if (modus == 4) {
			// e.vX = 0;
			// e.aX = 2 * schrittweite * schrittweite / abstand;
			// fzZeitFkt(0, e.neuX, [ziel]);
			// fzZeitFkt(anzahlschritte / 3, e.drehum, []);

	// e.drehum = function() {
		// e.aX = -e.aX;
		// return true;
	// }
	// e.neuX = function(parameterS) {
		// Element('test').innerHTML = e.vX;
		// var ziel = parameterS[0];
		
		// var abstand = parseInt(ziel - e.x + 0.5);
		// var betrag  = Math.abs(abstand);
		
		// if (betrag > 0) {
			// e.vX += e.aX;
			// e.x  += e.vX;
			// e.setzeX([e.x]);
			// return false;
		// }
		// else {
			// return true;
		// }
	// };
	// e.vX = 0; müssen noch vor e.setzeX und e.aendereX
	// e.aX = 0;

	e.setzeY           = function(parameterS) {
		e.y            = parameterS[0];
		e.style.top    = e.y + 'px';
		return true;
	};
	e.aendereY         = function(parameterS) {
		var abstand    = parseInt(parameterS[0] - e.y + 0.5);
		var betrag     = Math.abs(abstand);
		if (betrag > 0) {
			var v      = parameterS[2] ? abstand / parameterS[1] : abstand / betrag * parameterS[1];
			e.setzeY([e.y + v]);
			return false;
		}
		else {
			e.setzeY([parseInt(e.y - 0.25)]);
			return true;
		}
	};
	e.bildZoom         = function(parameterS) { // fokuspunkt x, fokuspunkt y (je -100% bis +100%), zoomfaktor, schrittweite
		var bZuH     = e.bG / e.hG;
		var zoom     = parameterS[2];
		var sWeite   = parameterS[3];
		
		var bEnde    = e.bG * zoom;
		var hEnde    = e.hG * zoom;

		var bWeite   = sWeite * bZuH;
		var hWeite   = sWeite;
		
		var xEnde    = e.bG * (1 - zoom) * (parameterS[0] + 50) / 100;
		var yEnde    = e.hG * (1 - zoom) * (parameterS[1] + 50) / 100;
		
		var xWeite   = (bEnde - e.b) != 0 ? Math.abs((e.x - xEnde) / (bEnde - e.b)) * bWeite : bWeite;
		var yWeite   = (hEnde - e.h) != 0 ? Math.abs((e.y - yEnde) / (hEnde - e.h)) * hWeite : hWeite;
		
		fzZeitFkt(0, e.aendereB, [bEnde, bWeite, false]);
		fzZeitFkt(0, e.aendereH, [hEnde, hWeite, false]);

		fzZeitFkt(0, e.aendereX, [xEnde, xWeite, false]);
		fzZeitFkt(0, e.aendereY, [yEnde, yWeite, false]);

		return true;
	};
	e.setzeT           = function(parameterS) {
		e.t            = parameterS[0];
		e.style.clip   = 'rect(' + e.t + 'px ' + e.r + 'px ' + e.u + 'px ' + e.l + 'px)';
		return true;
	};
	e.setzeR           = function(parameterS) {
		e.r            = parameterS[0];
		e.style.clip   = 'rect(' + e.t + 'px ' + e.r + 'px ' + e.u + 'px ' + e.l + 'px)';
		return true;
	};
	e.setzeU           = function(parameterS) {
		e.u            = parameterS[0];
		e.style.clip   = 'rect(' + e.t + 'px ' + e.r + 'px ' + e.u + 'px ' + e.l + 'px)';
		return true;
	};
	e.setzeL           = function(parameterS) {
		e.l            = parameterS[0];
		e.style.clip   = 'rect(' + e.t + 'px ' + e.r + 'px ' + e.u + 'px ' + e.l + 'px)';
		return true;
	};
	e.aendereT         = function(parameterS) {
		var abstand    = parseInt(parameterS[0] - e.t + 0.5);
		var betrag     = Math.abs(abstand);
		if (betrag > 0) {
			var v      = parameterS[2] ? abstand / parameterS[1] : abstand / betrag * parameterS[1];
			e.setzeT([e.t + v]);
			return false;
		}
		else {
			e.setzeT([parseInt(e.t + 0.5)]);
			return true;
		}
	};
	e.aendereR         = function(parameterS) {
		var abstand    = parseInt(parameterS[0] - e.r + 0.5);
		var betrag     = Math.abs(abstand);
		if (betrag > 0) {
			var v      = parameterS[2] ? abstand / parameterS[1] : abstand / betrag * parameterS[1];
			e.setzeR([e.r + v]);
			return false;
		}
		else {
			e.setzeR([parseInt(e.r + 0.5)]);
			return true;
		}
	};
	e.aendereU         = function(parameterS) {
		var abstand    = parseInt(parameterS[0] - e.u + 0.5);
		var betrag     = Math.abs(abstand);
		if (betrag > 0) {
			var v      = parameterS[2] ? abstand / parameterS[1] : abstand / betrag * parameterS[1];
			e.setzeU([e.u + v]);
			return false;
		}
		else {
			e.setzeU([parseInt(e.u + 0.5)]);
			return true;
		}
	};
	e.aendereL         = function(parameterS) {
		var abstand    = parseInt(parameterS[0] - e.l + 0.5);
		var betrag     = Math.abs(abstand);
		if (betrag > 0) {
			var v      = parameterS[2] ? abstand / parameterS[1] : abstand / betrag * parameterS[1];
			e.setzeL([e.l + v]);
			return false;
		}
		else {
			e.setzeL([parseInt(e.l + 0.5)]);
			return true;
		}
	};
	e.setzeTRUL        = function(parameterS) {
		e.t            = parameterS[0];
		e.r            = parameterS[1];
		e.u            = parameterS[2];
		e.l            = parameterS[3];
		e.style.clip   = 'rect(' + e.t + 'px ' + e.r + 'px ' + e.u + 'px ' + e.l + 'px)';
		return true;
	};
	e.aendereTRUL      = function(parameterS) {
		var abstandHor = parseInt(parameterS[0] - e.l + 0.5);
		var abstandVer = parseInt(parameterS[1] - e.t + 0.5);
		var betragHor  = Math.abs(abstandHor);
		var betragVer  = Math.abs(abstandVer);
		if ((betragHor > 0) || (betragVer > 0)) {
			var vHor   = (betragHor > 0) ? (parameterS[3] ? abstandHor / parameterS[2] : abstandHor / betragHor * parameterS[2]) : 0;
			var vVer   = (betragVer > 0) ? (parameterS[3] ? abstandVer / parameterS[2] : abstandVer / betragVer * parameterS[2]) : 0;
			e.setzeTRUL([e.t + vVer / 2, e.r - vHor / 2, e.u - vVer / 2, e.l + vHor / 2]);
			return false;
		}
		else {
//			if (parameterS[0] === 0) e.setzeTRUL([e.tG, e.rG, e.uG, e.lG]);
			return true;
		}
	};
	e.posRahmen        = function(parameterS) {
		aktualisiereFensterwerte();
		e.setzeX([eval(parameterS[0]) ? eval(parameterS[1]) : e.xG]);
		e.setzeY([eval(parameterS[2]) ? eval(parameterS[3]) : e.yG]);
		e.setzeB([eval(parameterS[4]) ? eval(parameterS[5]) : e.bG]);
		e.setzeH([eval(parameterS[6]) ? eval(parameterS[7]) : e.hG]);
		return true;
	};
	e.kalender         = function(parameterS) {
		// 0: schalter  binär: 2^0 hoch = 1, quer = 0; 2^1 mit kalenderwoche = 1; 2^2 mit tagkürzel = 1; 2^3 mit effekt3D = 1
		// 1: wochen  wieviele wochen pro Zeitraum?
		// 2: divId, in dem der Titeltext eingeblendet wird, 3: divId, in dem der inhaltstext eingeblendet wird
		// nimmt die Grundfarbe aus der style-angabe für die schriftfarbe von dem elternelement - muß im html dokument deklariert sein
		// erstelle variable für jetzt, für anfang des kalenders = montag der woche von jetzt und für ende des kalenders = sonntag der woche von jetzt + anzahl wochen
		var jetzt             = new Date();
		var tagDieserWoche    = function(datum, tag) { // 0 = montag
			datum.setTime(datum.getTime() + (tag - ((datum.getDay() + 6) % 7)) * 86400000);
			return datum;
		};
		var anfang            = tagDieserWoche(new Date(), 0);
		var ende              = tagDieserWoche(new Date(jetzt.getTime() + parameterS[1] * 7 * 86400000), 6);
		var anfangDo          = tagDieserWoche(new Date(anfang.getTime()), 3);
		var kw1Do             = tagDieserWoche(new Date(anfang.getFullYear(), 0, 4), 3);
		var kw1InKalender     = Math.floor(1.5 + (anfangDo.getTime() - kw1Do.getTime())  / 86400000 / 7);
		var anzahlTge         = Math.floor(1.5 + (ende.getTime()     - anfang.getTime()) / 86400000);
		var anzahlMte         = 12 * (ende.getYear() - anfang.getYear()) + ende.getMonth() - anfang.getMonth() + 1;
		var grundFarbe        = e.style.color;
		var box1Id            = parameterS[2];
		var box2Id            = parameterS[3];
		var box1              = Element(box1Id);
		var box2              = Element(box2Id);
		if (!(box1Id in reaktorF)) {
			reaktorF[box1Id] = box1Id;
			fzReaktor(box1);
		}
		if (!(box2Id in reaktorF)) {
			reaktorF[box2Id] = box2Id;
			fzReaktor(box2);
		}
		var erstelleKalenderF = function(feld, anfang, ende) {
			// erstelle kalenderF, das chronologisch von anfang bis ende geht, setze tagzeiger vorher auf anfang
			// kalenderF[i] = [datum, einblendtext titel, einblendtext inhalt, hintergrundfarbe, rahmenfarbe, schriftfarbe]
			// prioliste (von niedrigster zu höchster): ohne, tabellenüberschrift, normaler tag, urlaub, krankheit, wochenende, feierTag
			var i, j;
			var anfangUrlaub, endeUrlaub, anfangFeier, endeFeier;
			var tag = new Date(anfang.getTime());
			for (i = 0; i < anzahlTge; i++) {
				// setze eintrag auf normalen Tag mit leerem Text
				feld[i] = [new Date(tag.getTime()), '', '', 'transparent', '#ffffff', '#aaaaaa'];
				// setze eintrag auf urlaub oder krankheit, wenn vorhanden
				for (j = 0; j < urlaubsTage.length; j++) {
					anfangUrlaub = new Date(urlaubsTage[j][0], urlaubsTage[j][1] - 1, urlaubsTage[j][2]);
					endeUrlaub   = new Date(urlaubsTage[j][3], urlaubsTage[j][4] - 1, urlaubsTage[j][5]);
					if ((anfangUrlaub.getTime() <= tag.getTime()) && (tag.getTime() <= endeUrlaub.getTime())) {
						feld[i] = [new Date(tag.getTime()), urlaubsTage[j][6], urlaubsTage[j][7], grundFarbe, '#ffffff', '#eeeeee'];
					}
				}
				// setze eintrag auf wochenende, wenn samstag oder sonntag
				if (tag.getDay() == 6 || tag.getDay() === 0) {
					feld[i] = [new Date(tag.getTime()), '', '', '#cccccc', '#ffffff', '#ffffff'];
				}
				// setze eintrag auf feierTage, wenn vorhanden
				for (j = 0; j < feierTage.length; j++) {
					anfangFeier = new Date(feierTage[j][0], feierTage[j][1] - 1, feierTage[j][2]);
					endeFeier   = new Date(anfangFeier.getTime() + 86400000);
					if ((anfangFeier.getTime() <= tag.getTime()) && (tag.getTime() <= endeFeier.getTime())) {
						feld[i] = [new Date(tag.getTime()), feierTage[j][3], feierTage[j][4], '#cccccc', '#ffffff', grundFarbe];
					}
				}
				tag.setTime(tag.getTime() + 86400000);
			}
			return feld;
		};
		var kalenderF         = erstelleKalenderF([], anfang, ende);
		// ermittel alle schalter und errechne kProWoche, kProZeitraum; berechne anzahl der monate
		var hoch              = Boolean( parameterS[0] & 1);
		var kwZeile           = Boolean((parameterS[0] & 2) / 2);
		var tagZeile          = Boolean((parameterS[0] & 4) / 4);
		var effekt3D          = Boolean((parameterS[0] & 8) / 8);
		var kProWoche         = kwZeile  + 7;
		var kProZeitraum      = tagZeile + parameterS[1] + 1;
		// setze variablen zur erstellung des Kalenders
		var i, j;
		var idLauf = 0, tagLauf = 0, infoboxLauf = 1;
		var tagDo  = new Date();
		var kAufbauV, kAufbau;
		var kXVersatz, kYVersatz;
		var kSchalter, kId, kZIndex, kX, kY, kB, kH, kT, kR, kU, kL, kHGrund, kRahmen, kFarbe, kZHoehe, kTHoehe, kRDicke, kText;
		// errechne Parameter, die für alle Kästchen gleich sind:
		kZIndex   = 250;
		kB        = hoch ? Math.floor(e.b / kProWoche)    : Math.floor(e.b / kProZeitraum);
		kXVersatz = hoch ? (e.b - kB * kProWoche) / 2     : (e.b - kB * kProZeitraum) / 2;
		kH        = hoch ? Math.floor(e.h / kProZeitraum) : Math.floor(e.h / kProWoche);
		kYVersatz = hoch ? e.h - kH * kProZeitraum        : e.h - kH * kProWoche;
		kT        = 0;
		kR        = kB;
		kU        = kH;
		kL        = 0;
		kZHoehe   = kH - 2;
		kTHoehe   = kZHoehe - 6;
		kRDicke   = 1;
		for (i = 0; i < kProZeitraum; i++) {
			for (j = 0; j < kProWoche; j++) {
				kAufbauV   = 2;
				kAufbau    = idLauf;
				kSchalter  = 6 + effekt3D * 128;
				if (!effekt3D) {
					kSchalter |= hoch ? !j * 8 : !j;
					kSchalter |= hoch ? !i : !i * 8;
				}
				kId       = 'k' + idLauf;
				kX        = (hoch ? j : i) * kB + kXVersatz;
				kY        = (hoch ? i : j) * kH + kYVersatz;
				if (kwZeile && (j === 0) && tagZeile && (i === 0)) {
					kHGrund = 'transparent';
					kRahmen = effekt3D ? '#888888' : '#ffffff';
					kFarbe  = '#ffffff';
					kText   = '';
				}
				else if (kwZeile && (j === 0)) {
					kHGrund = '#cccccc';
					kRahmen = effekt3D ? '#888888' : '#ffffff';
					kFarbe  = '#555555';
					tagDo.setTime(kalenderF[tagLauf][0].getTime());
					tagDo   = tagDieserWoche(tagDo, 3);
					kw1Do   = new Date(tagDo.getFullYear(), 0, 4);
					kw1Do   = tagDieserWoche(kw1Do, 3);
					kText   = Math.floor(1.5 + (tagDo.getTime() - kw1Do.getTime()) / 86400000 / 7);
				}
				else if (tagZeile && (i === 0)) {
					kHGrund = '#cccccc';
					kRahmen = effekt3D ? '#888888' : '#ffffff';
					kFarbe  = '#555555';
					kText   = wochenTage[j - kwZeile];
				}
				else {
					if ((kalenderF[tagLauf][0].getTime() == anfang.getTime()) || (kalenderF[tagLauf][0].getDate() == 1)) {
						var monat = (kalenderF[tagLauf][0].getMonth() - anfang.getMonth() + 12) % 12 + anfang.getMonth();
						var mSchalter = 0;
						var mId = 'm' + (monat - anfang.getMonth());
						var mZIndex = 150;
						var kwKorrektur = (monat * 13 / 3 + 0.5 + 2 / 3 - kw1InKalender + 1);
						var mX  = hoch ? kwZeile * kB + 5 : kwKorrektur * kB;
						var mY  = hoch ? kwKorrektur * kH : tagZeile * kH * 2.5;
						var mB  = 5 * kB - 5;
						var mH  = hoch ? 3 * kH : 2 * kH;
						var mT  = (mY < 0) ? -mY + kYVersatz : 0;
						var mR  = ((mX + mB) > ((kwZeile + parameterS[1] + 1) * kB)) ? (mB - (mX + mB - (parameterS[1] + kwZeile + 1) * kB)) : mB;
						var mU  = ((mY + mH) > ((tagZeile + parameterS[1] + 1) * kH)) ? (mH - (mY + mH - (parameterS[1] + tagZeile + 1) * kH)) : mH;
						var mL  = (mX < 0) ? -mX + kXVersatz : 0;
						var mHGrund = '#ffffff';
						var mRahmen = '#ffffff';
						var mFarbe  = '#dddddd';
						var mZHoehe = mH - 2;
						mZHoehe *= (mH > (0.6 * mB)) ? 0.6 * mB / mH : 1;
						var mTHoehe = mZHoehe - 4;
						var mRDicke = 1;
						var mText   = monatsNamen[monat % 12];
						e.erstelleDiv([mSchalter, mId, mZIndex, mX, mY, mB, mH, mT, mR, mU, mL, mHGrund, mRahmen, mFarbe, mZHoehe, mTHoehe, mRDicke, mText]);
						fzZeitFkt(kAufbauV * kAufbau + 9, Element(mId).setzeEigenschaft, ['style.visibility', 'visible']);
					}
					kHGrund = kalenderF[tagLauf][3];
					kRahmen = effekt3D ? '#888888' : kalenderF[tagLauf][4];
					kFarbe  = kalenderF[tagLauf][5];
					kText   = kalenderF[tagLauf][0].getDate();
					if (kalenderF[tagLauf][0].getTime() == jetzt.getTime()) {
						kalenderF[tagLauf][1] = '<b>heute</b>';
						kalenderF[tagLauf][2] = jetzt.getDate() + '.' + (jetzt.getMonth() + 1) + '.' + jetzt.getFullYear();
						kRahmen   = grundFarbe;
						kSchalter |= effekt3D ? 0 : 9;
					}
					if (kalenderF[tagLauf][1]) {
						box1.fzTextS([kalenderF[tagLauf][1], infoboxLauf]);
						box2.fzTextS([kalenderF[tagLauf][2], infoboxLauf]);
						if (!(kId in initiatorF)) {
							initiatorF[kId] = kId;
						}
						infoboxLauf++;
					}
					tagLauf++;
				}
				e.erstelleDiv([kSchalter, kId, kZIndex, kX, kY, kB, kH, kT, kR, kU, kL, kHGrund, kRahmen, kFarbe, kZHoehe, kTHoehe, kRDicke, kText]);
				if (kId in initiatorF) {
					fzAnimator(Element(kId));
					Element(kId).fzEreignis('mouseover', 0, box1.setzeTextS, [infoboxLauf-1]);
					Element(kId).fzEreignis('mouseout', 0,  box1.setzeTextS, [0]);
					Element(kId).fzEreignis('mouseover', 0, box2.setzeTextS, [infoboxLauf-1]);
					Element(kId).fzEreignis('mouseout', 0,  box2.setzeTextS, [0]);
				}
				fzZeitFkt(kAufbauV * kAufbau, Element(kId).setzeEigenschaft, ['style.visibility', 'visible']);
				idLauf++;
			}
		}
		return true;
	};
	e.erstelleDiv      = function(parameterS) {
		//  grundeinstellung ist mit rahmen komplett und schriftart normal
		//  0: schalter	binär: 2^0 rahmenOben = 1; 2^1 rahmenRechts = 1; 2^2 rahmenUnten = 1; 2^3 rahmenLinks = 1;
		//                            2^4 fett = 1; 2^5 kursiv = 1; 2^6 unterstrichen = 1, 2^7 = effekt3D = 1
		//  1: id, 2: z-index
		//  3: left, 4: top
		//  5: width, 6: height
		//  7: clip top, 8: clip right, 9: clip bottom, 10: left
		// 11: Hintergrundfarbe, 12: Rahmenfarbe, 13: Schriftfarbe
		// 14: Zeilenhöhe, 15: Schritgröße, 16: Rahmendicke
		// 17: der zu schreibende text
		var foxX = 0, foxY = 0;
		var k  = document.createElement('div');
		if (!(parameterS[1] in reaktorF)) {
			reaktorF[parameterS[1]] = parameterS[1];
			fzReaktor(k);
		}
		var rahmenOben    = Boolean( parameterS[0] &   1)        ? 'solid ' : 'none ';
		var rahmenRechts  = Boolean((parameterS[0] &   2) /   2) ? 'solid ' : 'none ';
		var rahmenUnten   = Boolean((parameterS[0] &   4) /   4) ? 'solid ' : 'none ';
		var rahmenLinks   = Boolean((parameterS[0] &   8) /   8) ? 'solid'  : 'none';
		var fett          = Boolean((parameterS[0] &  16) /  16);
		var kursiv        = Boolean((parameterS[0] &  32) /  32);
		var unterstrichen = Boolean((parameterS[0] &  64) /  64);
		var effekt3D      = Boolean((parameterS[0] & 128) / 128);
		k.setzeX([parameterS[3]]);
		k.setzeY([parameterS[4]]);
		k.setzeT([parameterS[7]]);
		k.setzeR([parameterS[8]]);
		k.setzeU([parameterS[9]]);
		k.setzeL([parameterS[10]]);
		k.setzeEigenschaft(['style.textAlign',       'center']);
		k.setzeEigenschaft(['style.paddingLeft',     '1px']);
		k.setzeEigenschaft(['style.position',        'absolute']);
		k.setzeEigenschaft(['style.visibility',      'hidden']);
		k.setzeEigenschaft(['id',                    parameterS[1]]);
		k.setzeEigenschaft(['style.zIndex',          parameterS[2]]);
		k.setzeEigenschaft(['style.backgroundColor', parameterS[11]]);
		k.setzeEigenschaft(['style.color',           parameterS[13]]);
		k.setzeEigenschaft(['style.lineHeight',      parameterS[14] + 'px']);
		k.setzeEigenschaft(['style.fontSize',        parameterS[15] + 'px']);
		k.setzeEigenschaft(['innerHTML',             parameterS[17]]);
		k.setzeEigenschaft(['style.fontWeight',      (fett)          ? 'bold'      : 'normal']);
		k.setzeEigenschaft(['style.fontStyle',       (kursiv)        ? 'italic'    : 'normal']);
		k.setzeEigenschaft(['style.textDecoration',  (unterstrichen) ? 'underline' :   'none']);
		if (Boolean(parameterS[0] & 15)) {
			k.setzeEigenschaft(['style.borderColor', parameterS[12]]);
			k.setzeEigenschaft(['style.borderStyle', rahmenOben + rahmenRechts + rahmenUnten + rahmenLinks]);
			k.setzeEigenschaft(['style.borderWidth', parameterS[16] + 'px']);
		}
		if (!document.all) {
			foxX = (Boolean((parameterS[0] &  2) /  2) + Boolean((parameterS[0] &  8) /  8)) * parameterS[16] + 1;
			foxY = (Boolean(parameterS[0] & 1) + Boolean((parameterS[0] &  4) /  4)) * parameterS[16];
		}
		k.setzeB([parameterS[5] - foxX - effekt3D]);
		k.setzeH([parameterS[6] - foxY - effekt3D]);
		e.appendChild(k);
		return true;
	};
	return true;
}
function fzWechsler(e) {
	e.fzBildS = function(parameterS) {
		if (!e.bildS) {
			e.bildS        = [];
			e.bildS[0]     = new Image();
			e.bildS[0].src = e.src;
		}
		e.bildS[parameterS[1]]     = new Image();
		e.bildS[parameterS[1]].src = parameterS[0];
		return true;
	};
	e.setzeBildS = function(parameterS) {
		e.src  = e.bildS[parameterS[0]].src;
		return true;
	};
}
function fzZeitFkt() { 
	// eigentlich dürfen die alten funktionen, wenn von neuen überschrieben, erst dann gelöscht werden, wenn der timer runtergezählt wurde und dann immer noch beide vorhanden sind
	var i;
	for (i = 0; i < zeitFktF.length; i++) {
		if ((fzZeitFkt.arguments[1] == zeitFktF[i][1]) && (fzZeitFkt.arguments[0] == zeitFktF[i][0])) {
			zeitFktF.splice(i, 1); // zeitFktF[i][4] = 'true'; wäre dann korrekter eintrag
		}
	}
	zeitFktF[zeitFktF.length] = fzZeitFkt.arguments;
	if (zeitGeber === null) {
		zeitGeber = setInterval(zeitSchleife, 16);
	}
}
function zeitSchleife() {
	var i;
	for (i = 0; i < zeitFktF.length; i++) {
		if (zeitFktF[i][0] === 0) {
			zeitFktF[i][3] = zeitFktF[i][1](zeitFktF[i][2]);
		}
	}
	beendeSchleife();
}
function beendeSchleife() {
	for (i = zeitFktF.length - 1; i >= 0; i--) {
		if (zeitFktF[i][0] > 0) {
			zeitFktF[i][0]--;
		}
		if (zeitFktF[i][3]) { // if (zeitFktF[i][3] || zeitFktF[i][4])  wäre dann korrekte abfrage
			zeitFktF.splice(i, 1);
		}
	}
	if (zeitFktF.length === 0) {
		clearInterval(zeitGeber);
		zeitGeber = null;
	}
}
function loescheZeit() {
	zeitGeber = null;
	zeitFktF  =   [];
}
function fzAnimator(e) {
	var i;
	e.ereignisFktF = [];
	e.fzEreignis = function(ereignis, verzoegerung, reaktorAktionFkt, parameterS) {
		var eigenschaft, bedingung;
		var ereignisFkt;
		var animatorFkt = function() {
			fzZeitFkt(verzoegerung, reaktorAktionFkt, parameterS);
		};
		if (ereignis == 'load') {
			animatorFkt();
		}
		else {
			if (ereignis in ereignisTypen) {
				if (typeof(detachEvent) == 'undefined') { // ist nicht ie
					e.addEventListener(ereignis, animatorFkt, false);
				}
				else {
					e.attachEvent('on' + ereignis, animatorFkt);
				}
			}
			else {
				ereignis    = ereignis.split(':');
				eigenschaft = ereignis[0];
				bedingung   = ereignis[1];
				e.ereignisFktF[e.ereignisFktF.length] = [eigenschaft, bedingung, animatorFkt, true];
				ereignisFkt = function(a, b, c) {
					for (i = 0; i < e.ereignisFktF.length; i++) {
						eigenschaft = e.ereignisFktF[i][0];
						bedingung   = e.ereignisFktF[i][1];
						animatorFkt = e.ereignisFktF[i][2];
						erstLauf    = e.ereignisFktF[i][3];
						if (eval(e[eigenschaft] + bedingung) && erstLauf) {
							e.ereignisFktF[i][3] = false;
							animatorFkt();
						}
						else if (!eval(e[eigenschaft] + bedingung)) {
							e.ereignisFktF[i][3] = true;
						}
					}
					return c;
				};
				if (typeof(detachEvent) == 'undefined') { // ist nicht ie
					e.watch(eigenschaft, ereignisFkt);
				}
				else {
					e.onpropertychange = ereignisFkt;
				}
			}
		}
		return true;
	};
	return true;
}
function definiereAnim() {
	var i;
	var feldN;
	var seitenN = document.URL.replace(/\\/g, '/');
	seitenN = (seitenN.indexOf('.html') > 0) ?
		seitenN.substring(seitenN.lastIndexOf('/') + 1, seitenN.lastIndexOf('.')) :
		'index';
	this.fzAnim = function(initiatorId, ereignis, aktionFkt, verzoegerung, reaktorId, parameterS) {
		var reaktorE;
		var initiatorE;
		reaktorE = Element(reaktorId);
		if (!(reaktorId in reaktorF)) {
			reaktorF[reaktorId] = reaktorId;
			if (reaktorId.indexOf('_n') < 0) {
				fzReaktor(reaktorE);
			}
			else {
				fzWechsler(reaktorE);
			}
		}
		if (aktionFkt == 'posRahmen') {
			if (reaktorE.b + reaktorE.x > minX) {
				minX = reaktorE.b + reaktorE.x;
			}
			if (reaktorE.h + reaktorE.y > minY) {
				minY = reaktorE.h + reaktorE.y;
			}
		}
		if (parameterS.join(' ').indexOf('p:') >= 0) {
			parameterS = aM[parameterS.join(' ').split(':')[1]][parameterS.join(' ').split(':')[2]][5];
		}
		initiatorE = (initiatorId == 'window') ? window : Element(initiatorId);
		if (!(initiatorId in initiatorF)) {
			initiatorF[initiatorId] = initiatorId;
			fzAnimator(initiatorE);
		}
		initiatorE.fzEreignis(ereignis, verzoegerung, reaktorE[aktionFkt], parameterS);
		return true;
	};
	for (feldN in aM) {
		if (feldN == 'alle' || feldN == seitenN) {
			for (i = 0; i < aM[feldN].length; i++) {
				fzAnim(aM[feldN][i][0], aM[feldN][i][1], aM[feldN][i][2],
				       aM[feldN][i][3], aM[feldN][i][4], aM[feldN][i][5]);
			}
		}
	}
	for (feldN in tM) {
		if (feldN == 'alle' || feldN == seitenN) {
			for (i = 0; i < tM[feldN].length; i++) {
				Element(tM[feldN][i][0]).fzTextS([tM[feldN][i][1], tM[feldN][i][2]]);
			}
		}
	}
	for (feldN in bM) {
		if (feldN == 'alle' || feldN == seitenN) {
			for (i = 0; i < bM[feldN].length; i++) {
				Element(bM[feldN][i][0]).fzBildS([bM[feldN][i][1], bM[feldN][i][2]]);
			}
		}
	}
	return true;
}
if (typeof(detachEvent) == 'undefined') {window.addEventListener('load', definiereAnim, false);}
else {window.attachEvent('onload', definiereAnim);}
if (typeof(detachEvent) == 'undefined') {window.addEventListener('unload', loescheZeit, false);}
else {window.attachEvent('onunload', loescheZeit);}

function pruefeFormular() {
	var formular = document.formular_f;
	var absenden = true;
	if (formular.vorname_f.value == '') {
		formular.vorname_f.value = 'Ihr Vorname fehlt';
		absenden = false;
	}
	if (formular.nachname_f.value == '') {
		formular.nachname_f.value = 'Ihr Nachname fehlt';
		absenden = false;
	}
	if (formular.email_f.value == '') {
		formular.email_f.value = 'Die Emailadresse fehlt';
		absenden = false;
	}
	return absenden;
}

