
	jsix.init.register(function () {

		var DIV_REGEXP = /div/i;

		var CLASSNAME_HOME_BOX = "home_Box";
		var CLASSNAME_HOME_BOX_REGEXP = new RegExp("\\b" + CLASSNAME_HOME_BOX + "\\b"); // \\b ist eine Wortgrenze

		var CLASSNAME_HOME_HEAD = "home_Reiterleiste";
		var CLASSNAME_HOME_HEAD_REGEXP = new RegExp("\\b" + CLASSNAME_HOME_HEAD + "\\b"); // \\b ist eine Wortgrenze

		var CLASSNAME_HOME_TAIL = "home_Boxeninhalt";
		var CLASSNAME_HOME_TAIL_REGEXP = new RegExp("\\b" + CLASSNAME_HOME_TAIL + "\\b");

		var CLASSNAME_HOME_TAB = "home_Reiter_(Kunden|NewsInfo|Weltweit)";
		var CLASSNAME_HOME_TAB_REGEXP = new RegExp("\\b" + CLASSNAME_HOME_TAB + "\\b");

		var CLASSNAME_HOME_TAB_HOVER = "home_Reiter_hover";
		var CLASSNAME_HOME_TAB_HOVER_REGEXP = new RegExp("\\b" + CLASSNAME_HOME_TAB_HOVER + "\\b");

		var CLASSNAME_HOME_TAB_ACTIVE = "home_Reiter_aktiv";
		var CLASSNAME_HOME_TAB_ACTIVE_REGEXP = new RegExp("\\b" + CLASSNAME_HOME_TAB_ACTIVE + "\\b");

		// keine Wortgrenze rechts wegen (home_SchattenRechts_Kunden_|home_SchattenRechts_NewsInfoWeltweit_)
		var CLASSNAME_HOME_VSHADOW_REGEXP = new RegExp("\\b(home_SchattenRechts_[a-zA-Z_]*_[12])\\b");
		var CLASSNAME_HOME_VSHADOW_ACTIVE_REGEXP = new RegExp("\\bhome_SchattenRechts_[a-zA-Z_]*_[12]_aktiv\\b");

		var CLASSNAME_HOME_VSHADOW_REGEXP_TAB = new RegExp("\\b(home_Reiter_[a-zA-Z_]*_Trennstrich)\\b");
		var CLASSNAME_HOME_VSHADOW_ACTIVE_REGEXP_TAB = new RegExp("\\bhome_Reiter_[a-zA-Z_]*_Trennstrich_aktiv_(rechts|links)\\b");

		var CLASSNAME_DIV_HIDDEN = "div_hidden";
		var CLASSNAME_DIV_HIDDEN_REGEXP = new RegExp("\\b" + CLASSNAME_DIV_HIDDEN + "\\b");

		/**
		 * Zeitpunkt, wann die Cookies fuer die Homepage ablaufen sollen: 31.12.2099 um 23:59:59 Uhr
		 * new Date("Monat Tag, Jahr Stunden:Minuten:Sekunden");
		 * Hinweis: ein abgelaufener Cookie fuehrt dazu, dass das Merken der Reiter nicht mehr funktioniert.
		 */
		var EXPIRES_DATE = new Date("december 31, 2099 23:59:59").toGMTString();

		/**
		 * Name des Cookies fuer die Fontsize
		 */
		var cookie_BayernLB_Internet_Homepage = "BayernLB_Internet_Homepage";


		var matchDivBox = function(node) {
			if (node.nodeType == jsix.html.nodetype.ELEMENT && DIV_REGEXP.exec(node.nodeName)) {
				// the node is an element with name div, i.e. a <div>
				if (jsix.html.hasCssClass(node, CLASSNAME_HOME_BOX, CLASSNAME_HOME_BOX_REGEXP)) {
					// the node does look like <div class="home_box">
					return node;
				}
			}
			return jsix.undefined;
		}

		var matchDivHead = function(node) {
			if (node.nodeType == jsix.html.nodetype.ELEMENT && DIV_REGEXP.exec(node.nodeName)) {
				// the node is an element with name div, i.e. a <div>
				if (jsix.html.hasCssClass(node, CLASSNAME_HOME_HEAD, CLASSNAME_HOME_HEAD_REGEXP)) {
					// the node does look like <div class="home_head">
					return node;
				}
			}
			return jsix.undefined;
		}

		var matchDivTail = function(node) {
			if (node.nodeType == jsix.html.nodetype.ELEMENT && DIV_REGEXP.exec(node.nodeName)) {
				// the node is an element with name div, i.e. a <div>
				if (jsix.html.hasCssClass(node, CLASSNAME_HOME_TAIL, CLASSNAME_HOME_TAIL_REGEXP)) {
					// the node does look like <div class="home_tail">
					return node;
				}
			}
			return jsix.undefined;
		}

		var matchDivTab = function(node) {
			if (node.nodeType == jsix.html.nodetype.ELEMENT && DIV_REGEXP.exec(node.nodeName)) {
				// the node is an element with name div, i.e. a <div>
				if (jsix.html.hasCssClass(node, CLASSNAME_HOME_TAB, CLASSNAME_HOME_TAB_REGEXP)) {
					// the node does look like <div class="home_tab">
					return node;
				}
			}
			return jsix.undefined;
		}

		var matchDivVshadowTab = function(node) {
			if (node.nodeType == jsix.html.nodetype.ELEMENT && DIV_REGEXP.exec(node.nodeName)) {
				// the node is an element with name div, i.e. a <div>
				if (jsix.html.hasCssClass(node, jsix.undefined, CLASSNAME_HOME_VSHADOW_REGEXP_TAB)) {
					return node;
				}
			}
			return jsix.undefined;
		}

		var matchDivVshadowBox = function(node) {
			if (node.nodeType == jsix.html.nodetype.ELEMENT && DIV_REGEXP.exec(node.nodeName)) {
				// the node is an element with name div, i.e. a <div>
				if (jsix.html.hasCssClass(node, jsix.undefined, CLASSNAME_HOME_VSHADOW_REGEXP)) {
					// the node does look like <div class="home_vshadow_light"> or <div class="home_vshadow_dark">
					return node;
				}
			}
			return jsix.undefined;
		}

		var mouseoverListener = function(node) {
			jsix.html.addCssClass(node, CLASSNAME_HOME_TAB_HOVER, CLASSNAME_HOME_TAB_HOVER_REGEXP);
		};

		var mouseoutListener = function(node) {
			jsix.html.delCssClass(node, CLASSNAME_HOME_TAB_HOVER, CLASSNAME_HOME_TAB_HOVER_REGEXP);
		}

		var setCookie = function(nodeDivBoxName, noTab) {
			if (!navigator.cookieEnabled) return;
			var cookie = cookie_BayernLB_Internet_Homepage + "." + nodeDivBoxName + '=' + noTab + ';path=/;expires=' + EXPIRES_DATE;
			document.cookie = cookie;
		}
		var getCookie = function(nodeDivBoxName) {
			if (!navigator.cookieEnabled) return 0;
			var cookies = document.cookie;
			if (cookies) {
				var regexp = new RegExp("\\b" + cookie_BayernLB_Internet_Homepage + "." + nodeDivBoxName + "=([0-9]*)");
				var match = regexp.exec(cookies);
				if (match) {
					var noTab = parseInt(match[1]);
					return noTab;
				}
			}
			return 0;
		}

		// find the surrounding <div class="home_box">
		// find the list of all <div class="home_box_body_content"> within the <div class="home_box">

		// iterator through all <div class="home_box_body_content">,
		// set the visible one to be invisible and
		// set the one at position nodePositionHead to be visible
		var createClickListener = function(
			nodeDivBoxName, noTab, isRightmostTab, tab, tabs, tail, tails, 
			vshadowsBox,
			vshadowsTabAll,
			vshadowsTabLeft,
			vshadowsTabRight
		) {
			var listener = function() {
	//			if (jsix.html.hasCssClass(tab, CLASSNAME_HOME_TAB_ACTIVE, CLASSNAME_HOME_TAB_ACTIVE_REGEXP)) return;

				jsix.html.delCssClass(tabs, CLASSNAME_HOME_TAB_ACTIVE, CLASSNAME_HOME_TAB_ACTIVE_REGEXP);
				jsix.html.addCssClass(tab, CLASSNAME_HOME_TAB_ACTIVE, CLASSNAME_HOME_TAB_ACTIVE_REGEXP);

				jsix.html.addCssClass(tails, CLASSNAME_DIV_HIDDEN, CLASSNAME_DIV_HIDDEN_REGEXP);
				jsix.html.delCssClass(tail, CLASSNAME_DIV_HIDDEN, CLASSNAME_DIV_HIDDEN_REGEXP);

				if (isRightmostTab) {
					if (vshadowsBox) {
						for (var i = 0; i < vshadowsBox.length; i++) {
							var nodeVshadow = vshadowsBox[i];
							var match = CLASSNAME_HOME_VSHADOW_REGEXP.exec(nodeVshadow.className);
							if (match) {
								var classNameShadow = match[1];
								var classNameShadowActive = classNameShadow + "_aktiv";
								jsix.html.addCssClass(nodeVshadow, classNameShadowActive);
							}
						}
					}
				}
				else {
					jsix.html.delCssClass(vshadowsBox, jsix.undefined, CLASSNAME_HOME_VSHADOW_ACTIVE_REGEXP);
				}

				jsix.html.delCssClass(vshadowsTabAll, jsix.undefined, CLASSNAME_HOME_VSHADOW_ACTIVE_REGEXP_TAB);
				if (vshadowsTabLeft) {
					for (var i = 0; i < vshadowsTabLeft.length; i++) {
						var nodeVshadow = vshadowsTabLeft[i];
						var match = CLASSNAME_HOME_VSHADOW_REGEXP_TAB.exec(nodeVshadow.className);
						if (match) {
							var classNameShadow = match[1];
							var classNameShadowActive = classNameShadow + "_aktiv_links";
							jsix.html.addCssClass(nodeVshadow, classNameShadowActive);
						}
					}
				}
				if (vshadowsTabRight) {
					for (var i = 0; i < vshadowsTabRight.length; i++) {
						var nodeVshadow = vshadowsTabRight[i];
						var match = CLASSNAME_HOME_VSHADOW_REGEXP_TAB.exec(nodeVshadow.className);
						if (match) {
							var classNameShadow = match[1];
							var classNameShadowActive = classNameShadow + "_aktiv_rechts";
							jsix.html.addCssClass(nodeVshadow, classNameShadowActive);
						}
					}
				}
				setCookie(nodeDivBoxName, noTab);
			}
			return listener;
		}

		var findTabShadow = function(tab, toTheLeft) {
			if (!jsix.isDefined(tab)) return jsix.undefined;
			var td = tab.parentNode;
			if (!jsix.isDefined(td)) return jsix.undefined;
			do { td = toTheLeft ? td.previousSibling : td.nextSibling; } while (td && !jsix.string.equalsIgnoreCase(td.nodeName, "td"));
			if (!jsix.isDefined(td)) return jsix.undefined;
			return jsix.html.find({
				'root'  : td,
				'match' : matchDivVshadowTab
			});
		}

		/**
		 * Finde mit zunaechst alle Attribute der Form class="home_tab", hierzu uebergeben wir
		 * der Funktion find eine Funktion 'match', die die folgenden Eigenschaften prueft:
		 *  - Der gesuchte Knoten muss ein Attributknoten sein (node.nodeType == jsix.html.nodetype.ATTRIBUTE)
		 *  - Das Attribut muss den Namen 'class' haben (node.nodeName == "class")
		 *  - Das Attribut muss als einen Wert den Begriff 'home_tab' enthalten (CLASSNAME_HOME_TAB_REGEXP.exec(node.nodeValue))
		 *
		 * Wir interessieren uns aber eigentlich nicht fuer das Attribut, sondern fuer das umgebende <div>-Element.
		 * Sprich: <div class="home_tab">
		 * Auf dieses Element kann vom Attribut aus mit node.ownerElement zugegriffen werden.
		 * Die Funktion 'match' gibt dieses <div>-Element zurueck.
		 */
		var nodesDivBox = jsix.html.find({
//			'root'  : document.getElementsByTagName("body")[0],
			'match' : matchDivBox,
			'prune' : matchDivBox
		});

		if (nodesDivBox) {
			for (var noBox = 0; noBox < nodesDivBox.length; noBox++) {
				var nodeDivBox = nodesDivBox[noBox];
				var nodeDivBoxName = nodeDivBox.getAttribute("name");
				var noTabCookie = getCookie(nodeDivBoxName); // die Nummer des zuletzt gewaehlten Tabs in dieser Box aus den Cookies auslesen

				var tabs =
					jsix.html.find({
						'root'  : nodeDivBox,
						'match' : matchDivTab,
						'prune' : matchDivTab
					});

				var tails =
					jsix.html.find({
						'root'  : nodeDivBox,
						'match' : matchDivTail,
						'prune' : matchDivTail
					});

				var vshadowsBox =
					jsix.html.find({
						'root'  : nodeDivBox.nextSibling,
						'prune' : matchDivBox,
						'match' : matchDivVshadowBox,
						'traverse' : function(node) { return node.nextSibling; }
					});

				if (tabs && tabs.length > 0 && tails && tails.length > 0) {

					var n = Math.min(tabs.length, tails.length);
					for (var noTab = 0; noTab < n; noTab++) {
						var tab = tabs[noTab];
						var tail = tails[noTab];

						var vshadowsTabLeft = findTabShadow(tab, true);
						var vshadowsTabRight = findTabShadow(tab, false);
						var vshadowsTabAll =
							jsix.html.find({
								'root'  : nodeDivBox,
								'match' : matchDivVshadowTab
							});

						var clickListener = createClickListener(
							nodeDivBoxName, 
							noTab, noTab == n - 1, tab, tabs, tail, tails, 
							vshadowsBox,
							vshadowsTabAll,
							vshadowsTabLeft,
							vshadowsTabRight
						);

						if (n > 1) {
							jsix.html.addListener(tab, jsix.html.eventtype.MOUSEOVER, mouseoverListener);
							jsix.html.addListener(tab, jsix.html.eventtype.MOUSEOUT, mouseoutListener);
							jsix.html.addListener(tab, jsix.html.eventtype.CLICK, clickListener);
						}
					}
				}
			}
		}

	});

