/** Elementcache */
var elmCache = {};
/** Instanz des Navigationsmanagers */
var naviMgr;
/** Liste der Navigationsobjekte */
var navi;
/** Cookie für Usereinstellungen */
var meinSTV = new Cookie("meinSTV", 365, openPopup);
meinSTV.clear(["favoriten=", "bezirk=", "altersklasse="]);
//meinSTV.clear();
//meinSTV.alert();
/** Voreinstellung für Vereinsdarstellung */
var vereinDarstellung = "Visitenkarte";
/** Voreinstellung für Ligendarstellung */
var ligaDarstellung = "Tabelle";

/** Array mit allen Einstellungen */
var einstellungen = {
	"bez": new Einstellung("bez"),
	"ak":  new Einstellung("ak")
};

/**
 * Gibt ein Element aus dem Elementcache zurück
 * bzw. trägt es bei Nichtvorhandensein dort ein
 *
 * @param {String} id Element-ID
 * @return {Object} ElmByID-Objekt
 */
function getElm(id)
{
	if (!elmCache[id]) {
		if (!document.getElementById(id))
			return false;
		elmCache[id] = new ElmByID(id);
	}
	return elmCache[id];
}

/**
 * Gibt die Breite eines Frames zurück
 *
 * @return {Number}
 */
function getFrameWidth(fr)
{
	return (document.body.offsetWidth)
		? ((fr) ? frames[fr].document : document).body.offsetWidth
		: ((fr) ? frames[fr] : window).innerWidth;
}

/**
 * Gibt die Höhe eines Frames zurück
 *
 * @return {Number}
 */
function getFrameHeight(fr)
{
	return (document.body.offsetHeight)
		? ((fr) ? frames[fr].document : document).body.offsetHeight
		: ((fr) ? frames[fr] : window).innerHeight;
}

/**
 * Initialisierungsfunktion
 */
function init()
{
	naviMgr	= new NaviMgr(contents);
	navi	= naviMgr.getList();

	// Navigationsliste durchlaufen
	for (var lfdNr in navi) {
		var node = navi[lfdNr];

		// Status setzen
		navi[lfdNr].active = false;
		navi[lfdNr].opened = false;

		if (node.hasChildren()) {
			// Unterebenen merken und nochmal explizit display=none
			// setzen, weil die isDisplay()-Methode den per CSS-Datei
			// gesetzten Wert von display nicht erkennt
			navi[lfdNr].sub = getElm("S" + lfdNr);
			navi[lfdNr].sub.setDisplay("none");

			// Navipfeil merken
			navi[lfdNr].arrow = getElm("A" + lfdNr);
		}

		// Navigationslinks merken und mit Handlern versehen
		navi[lfdNr].link = getElm("N" + lfdNr);
		navi[lfdNr].link.getObj().onmouseover	= new Function("naviOver('"+lfdNr+"')");
		navi[lfdNr].link.getObj().onmouseout	= new Function("naviOut('"+lfdNr+"')");
		//navi[lfdNr].link.getObj().onclick		= new Function("naviClick('"+lfdNr+"')");
	}

	//if (currentNavi != null)
	//	naviClick(currentNavi);

	//alert(startURL);
	ContentFrame.location.href = startURL;
	getElm("Favoriten").setVisibility("visible");
}

/**
 * onmouseover-Handler für Navigationslinks
 *
 * @param {Number} lfdNr Inhalts-ID
 */
function naviOver(lfdNr)
{
	var node = navi[lfdNr];
	if (node.arrow)
		node.arrow.setImg((node.active) ? NAVI_ARROW_OPENED_OVER : NAVI_ARROW_CLOSED_OVER);
}

/**
 * onmouseout-Handler für Navigationslinks
 *
 * @param {Number} lfdNr Inhalts-ID
 */
function naviOut(lfdNr)
{
	var node = navi[lfdNr];
	if (node.arrow)
		node.arrow.setImg((node.active) ? NAVI_ARROW_OPENED : NAVI_ARROW_CLOSED);
}

/**
 * onclick-Handler für Navigationslinks
 *
 * @param {Number} lfdNr Inhalts-ID
 */
function naviClick(lfdNr)
{
	currentNavi		= lfdNr;
	var node 		= navi[currentNavi];
	var path		= naviMgr.getTree().getPath(node.getContent());
	var assocPath	= naviMgr.getTree().getAssociativePath(node.getContent());
	var lfdNr0		= path[0].getLfdNr();

	// Titel der 1. Menüebene setzen (dazu nehmen wir den Pfad
	// als numerisches Array, um auf das erste Element (= Ebene 1)
	// zugreifen zu können
	getElm("Bezeichnung").setHTML(
		path[0].getBezeichnung() +
		((path.length > 1) ? " - "+node.getContent().getBezeichnung() : "")
	);

	// Rubrikbild setzen (gebildet aus der Sortiernummer der ersten Ebene
	// des aktuellen Navigationspunktes)
	getElm("Bild1").setImgSrc(
		"Content/image/Bilder_zu_Rubriken/Rubrik" +
		navi[lfdNr0].getContent().getName().slice(0, 2) +
		".jpg"
	);

	// Menübaum anpassen
	for (var lfdNr in navi) {
		node = navi[lfdNr];

		// Status setzen
		//node.opened = (!node.opened && currentNavi == lfdNr); // auf/zu alternierend
		node.active = (currentNavi == lfdNr);

		// Gibt es ein Untermenü? (Hier wird der Pfad als assoziatives
		// Array benötigt, um das Vorhandensein von IDs (= Schlüssel)
		// testen zu können
		if (node.sub) {
			// Führt das Node zu diesem Content (und ist es das aktive?) => öffnen
			//if (assocPath[node.getContent().getLfdNr()] && !(!node.opened && lfdNr == currentNavi)) {
			if (assocPath[node.getContent().getLfdNr()]) {
				node.sub.setDisplay("block");
				node.arrow.setImg(NAVI_ARROW_OPENED);
			}
			// ansonsten alle inaktiven Nodes schließen
			//else if (!node.opened) {
			else {
				node.sub.setDisplay("none");
				node.arrow.setImg(NAVI_ARROW_CLOSED);
			}
		}

		// Farbe der jeweils 1. Ebene setzen
		node.link.setClass((lfdNr == lfdNr0) ? "opened" : "");
	}
}

/**
 * Gibt zurück, ob der übergebene Navipunkt als Favorit gesetzt ist
 *
 * @param {String} val URL oder lfdNr eines Navipunktes
 * @return {Boolean}
 */
function isFavorit(val)
{
	//alert(meinSTV.get("favoriten"));
	var favoriten = meinSTV.get("fav").split(",");

	for (var i = 0, ii = favoriten.length; i < ii; i++) {
		// Navipunkte werden per lfdNr gespeichert
		if (!isNaN(val) && val == favoriten[i])
			return true;

		// ansonsten die URL + der Titel
		else if (isNaN(val)) {

		}
	}

	return false;
}

/**
 * Setzt den Favoritenbutton
 *
 * @param {String} key URL oder lfdNr eines Navipunktes
 */
function setFavoritenButton(key)
{
	if (meinSTV.is("fav", key)) {
		setImg("Favoriten", DROP_FAVORITE_IMG);
		getElm("Favoriten").setTitle(DROP_FAVORITE_TEXT);
	}
	else {
		setImg("Favoriten", ADD_FAVORITE_IMG);
		getElm("Favoriten").setTitle(ADD_FAVORITE_TEXT);
	}
}

/**
 * onmouseover-Handler für Einstellungssymbole
 *
 * @param {String} val Wert
 * @param {String} key Schlüssel des zugehörigen Cookiewertes
 */
function symbolOver(val, key)
{
	if (val != meinSTV.get(key)) {
		changeImg(getElm(einstellungen[key].prefix + meinSTV.get(key)).getObj(), false);
		changeImg(getElm(einstellungen[key].prefix + val).getObj(), true);
	}
}

/**
 * onmouseout-Handler für Einstellungssymbole
 *
 * @param {String} val Wert
 * @param {String} key Schlüssel des zugehörigen Cookiewertes
 */
function symbolOut(val, key)
{
	if (val != meinSTV.get(key)) {
		changeImg(getElm(einstellungen[key].prefix + meinSTV.get(key)).getObj(), true);
		changeImg(getElm(einstellungen[key].prefix + val).getObj(), false);
	}
}

/**
 * onclick-Handler für Einstellungssymbole
 *
 * @param {String} val Wert
 * @param {String} key Schlüssel des zugehörigen Cookiewertes
 */
function symbolClick(val, key)
{
	// Wert im Cookie speichern
	meinSTV.set(key, val);

	// zugehörige Symbole aktualisieren
	symbolUpdate(einstellungen[key]);

	// Inhaltsseite aktualisieren
	/*if (	REGEXP_LIGEN.test(ContentFrame.location.href)
		||	REGEXP_VEREINE.test(ContentFrame.location.href)
		||	REGEXP_TURNIERE.test(ContentFrame.location.href)
	)*/

	if (ContentFrame.document.forms[0])
		ContentFrame.document.forms[0].submit();
	else
		ContentFrame.location.reload();
}

/**
 * Aktualisiert die Symbole einer Einstellung
 * gemäß des aktuell gesetzten Cookie-Wertes
 *
 * @param {Object} einstellung Einstellung
 */
function symbolUpdate(einstellung)
{
	var i, elm, val;
	var cookie_val = meinSTV.get(einstellung.key);

	for (i = 0, ii = document.getElementsByTagName("input").length; i < ii; i++) {
		elm = document.getElementsByTagName("input")[i];
		if (einstellung.regexp.test(elm.id)) {
			val = elm.id.slice(elm.id.lastIndexOf("_") + 1);
			changeImg(getElm(einstellung.prefix + val).getObj(), (val == cookie_val));
		}
	}
}

/**
 * Blendet alle Symbole für eine Einstellung ein oder aus
 *
 * @param {Object} einstellung Einstellung
 * @param {Boolean} show anzeigen oder verstecken
 */
function symboleShow(einstellung, show)
{
	var elm = einstellung.getContainerElm();

	if (show && !elm.isDisplay()) {
		symbolUpdate(einstellung);
		elm.setDisplay("inline");
	}
	else if (!show && elm.isDisplay())
		elm.setDisplay("none");
}

/**
 * Blendet alle Symbole für die Ligaauswahl ein oder aus
 *
 * @param {Boolean} show anzeigen oder verstecken
 */
function showLigaAuswahl(show)
{
	var elm = getElm("ligaAuswahl");

	if (show && !elm.isDisplay())
		elm.setDisplay("inline");
	else if (!show && elm.isDisplay())
		elm.setDisplay("none");
}

/**
 * Blendet alle Symbole für die Ligadarstellung ein oder aus
 *
 * @param {Boolean} show anzeigen oder verstecken
 */
function showLigaDarstellung(show)
{
	var elm = getElm("ligaDarstellung");

	if (show && !elm.isDisplay())
		elm.setDisplay("inline");
	else if (!show && elm.isDisplay())
		elm.setDisplay("none");
}

/**
 * Blendet alle Symbole für die Vereindarstellung ein oder aus
 *
 * @param {Boolean} show anzeigen oder verstecken
 */
function showVereinDarstellung(show)
{
	var elm = getElm("vereinDarstellung");
	//alert((elm.isEmptyDisplay() || !elm.isDisplay()));

	if (show && (elm.isEmptyDisplay() || !elm.isDisplay())) {
		//alert(elm.isDisplay());
		elm.setDisplay("inline");
		//alert(elm.isDisplay());

		if (typeof ContentFrame.SAISONS == "object") {
			var saisons = getElm("VEREIN_Saisons").getObj();

			// Auswahl leeren ...
			saisons.options.length = 0;

			// und neu füllen
			for (var lfdNr in ContentFrame.SAISONS) {
				saisons.options[saisons.options.length] = new Option(
					ContentFrame.SAISONS[lfdNr], lfdNr, false,
					(ContentFrame.SAISON && lfdNr == ContentFrame.SAISON)
				);
			}
		}
	}
	else if (!show && elm.isDisplay())
		elm.setDisplay("none");
}

/**
 * Blendet alle Symbole für die Vereinssuche ein oder aus
 *
 * @param {Boolean} show anzeigen oder verstecken
 */
function showVereinSuche(show)
{
	var elm = getElm("vereinSuche");

	if (show && (elm.isEmptyDisplay() || !elm.isDisplay())) {
		document.getElementById("VEREINE_Suchbegriff").value = "";
		elm.setDisplay("inline");
	}
	else if (!show && elm.isDisplay())
		elm.setDisplay("none");
}

/**
 * Blendet alle Symbole für dden Wertungsfilter ein oder aus
 *
 * @param {Boolean} show anzeigen oder verstecken
 */
function showWertungFilter(show)
{
	var elm = getElm("wertungFilter");

	if (show && (elm.isEmptyDisplay() || !elm.isDisplay())) {
		elm.setDisplay("inline");
		// Zurücksetzen
		changeImg(document.getElementById("WERTUNG_DTB"), false);
		changeImg(document.getElementById("WERTUNG_LK"), false);
		changeImg(document.getElementById("WERTUNG_LM"), false);
		changeImg(document.getElementById("WERTUNG_BM"), false);
	}
	else if (!show && elm.isDisplay())
		elm.setDisplay("none");
}

/**
 * onmouseover/out-Handler für Titelleistenbuttons
 *
 * @param {String} id ID des zu setzenden Buttons
 * @param {Boolean} over
 */
function buttonOverOut(id, over)
{
	var typ = id.slice(0, id.lastIndexOf("_")).toLowerCase();
	var val = id.slice(id.lastIndexOf("_") + 1);
	var i, container, buttons, merker, _elm, _val;

	switch (typ) {
		case "verein":
			container	= "vereinDarstellung";
			merker		= vereinDarstellung;
			break;
		case "liga":
			container	= "ligaDarstellung";
			merker		= ligaDarstellung;
			break;
		default:
			return;
	}

	buttons = getElm(container).getObj().getElementsByTagName("input");
	for (i = 0, ii = buttons.length; i < ii; i++) {
		_elm  = getElm(buttons[i].id);
		_val = _elm.getId().slice(_elm.getId().lastIndexOf("_") + 1);

		if (_val == merker)
			_elm.setClass((over) ? "button" : "button aktiv");
		else if (_val == val)
			_elm.setClass((over) ? "button aktiv" : "button");
	}
}

/**
 * oncklick-Handler für Titelleistenbuttons
 *
 * @param {String} id ID des zu setzenden Buttons
 */
function buttonClick(id)
{
	var typ  = id.slice(0, id.lastIndexOf("_")).toLowerCase();
	var val  = id.slice(id.lastIndexOf("_") + 1);
	var form = ContentFrame.document.forms[0];
	var i, regexp;

	switch (typ) {
		case "verein":
			regexp = /\/(verein|meinSTVmeinVerein)\.php/;
			break;
		case "liga":
			regexp = /\/liga\.php/;
			break;
		default:
			return;
	}

	if (form && regexp.test(ContentFrame.location.href)) {
		switch (typ) {
			case "verein":
				vereinDarstellung = val;
				break;
			case "liga":
				ligaDarstellung = val;
				break;
		}

		form.darstellung.value = val;
		form.submit();
	}
}

/**
 * Aktiviert einen Titelleistenbutton
 *
 * @param {String} id ID des zu setzenden Buttons
 */
function buttonActivate(id)
{
	var typ = id.slice(0, id.lastIndexOf("_")).toLowerCase();
	var val = id.slice(id.lastIndexOf("_") + 1);
	var i, container, buttons, merker, _elm, _val;

	switch (typ) {
		case "verein":
			vereinDarstellung	= val;
			merker				= vereinDarstellung;
			container			= "vereinDarstellung";
			break;
		case "liga":
			ligaDarstellung	= val;
			merker			= ligaDarstellung;
			container		= "ligaDarstellung";
			break;
		default:
			return;
	}

	buttons = getElm(container).getObj().getElementsByTagName("input");
	for (i = 0, ii = buttons.length; i < ii; i++) {
		_elm  = getElm(buttons[i].id);
		_val = _elm.getId().slice(_elm.getId().lastIndexOf("_") + 1);
		_elm.setClass((_val == merker) ? "button aktiv" : "button");
	}
}

/**
 * Öffnet das Popupfenster
 *
 * @param {String} url zu ladende URL
 */
function openPopup(url)
{
	// URL laden
	if (url)
		PopupFrame.location.href = url;

	// mittig platzieren
	getElm("Popup").setPosition(
		Math.round((getFrameWidth() - 700) / 2),
		Math.round((getFrameHeight() - 500) / 2)
	);

	// Einblenden
	getElm("Popup").setVisibility("visible");
	getElm("Main").setClass("popupOpaque");
}

/**
 * Schließt das Popupfenster
 */
function closePopup()
{
	getElm("Popup").setVisibility("hidden");
	getElm("Main").setClass("");
}

/**
 * Passt das Layout an die Fenstergröße an
 */
function resize()
{
	var dx = getFrameWidth();
	var dy = getFrameHeight();

	getElm("TitelBg").setWidth(dx - 372);
	getElm("Titel").setWidth(dx - 372);
	getElm("NaviBg").setHeight(dy - 162);
	getElm("Navi").setHeight(dy - 162);
	getElm("Content").setDimension(dx - 222, dy - 162);
	getElm("ContentFrame").setDimension(dx - 234, dy - 209);
}

addLoadEvent(
	function()
	{
		resize();
		init();

		/*
		 * Wenn der Name des Fensters eine URL mit dem Prefix
		 * "Load=" enthält, diese URL im Inhaltsframe laden
		 */
		if (self.name.slice(0, 5) == "Load=") {
			ContentFrame.location.href = self.name.slice(5);
			self.name = "";
		}

		/**
	 	 * Unterdrückt das Scrollen des TOP-Dokumentes, was beim Anspringen
     	 * von Ankern im eingebetteten IFRAME im IE gelegentlich auftritt.
    	 * (Der Eventhandler "onscroll" wird sowieso nur vom IE unterstützt)
	 	 */
		document.getElementsByTagName("body")[0].onscroll = function()
		{
			window.scrollTo(0, 0);
		};

		/**
		 * Reagiert auf das Anklicken des meineFavoriten-Links
		 */
		getElm("Favoriten").getObj().onclick = function()
		{
			var key, val;

			if (ContentFrame.content) {
				key = ContentFrame.content.getLfdNr();
				val = false;
			}
			else {
				key = ContentFrame.location.href;
				val = ContentFrame.document.getElementsByTagName("h1")[0].firstChild.data;
			}

			// Eintrag nicht vorhanden => anfügen
			if (!meinSTV.is("fav", key))
				meinSTV.add("fav", key, val);
			// sonst entfernen
			else
				meinSTV.drop("fav", key);

			// Favoritenbutton aktualisieren
			setFavoritenButton(key);
		};

		/*
		 * Eingabeelemente durchlaufen und bei bestimmten Buttons Eventhandler setzen
		 */
		for (i = 0, ii = document.getElementsByTagName("input").length; i < ii; i++) {
			var elm  = document.getElementsByTagName("input")[i];
			var key, val;

			// Altersklassen und Bezirke
			for (key in einstellungen) {
				if (einstellungen[key].regexp.test(elm.id)) {
					val 			= elm.id.slice(elm.id.lastIndexOf("_") + 1);
					elm.onclick		= new Function("symbolClick('"+val+"', '"+key+"')");
					elm.onmouseover	= new Function("symbolOver('"+val+"', '"+key+"')");
					elm.onmouseout	= new Function("symbolOut('"+val+"', '"+key+"')");
				}
			}

			// Liga- und Vereindarstellungsbuttons
			if (/^(LIGA|VEREIN)_/.test(elm.id)) {
				elm.onmouseover	= new Function("buttonOverOut('"+elm.id+"', "+true+")");
				elm.onmouseout	= new Function("buttonOverOut('"+elm.id+"', "+false+")");
				elm.onclick		= new Function("buttonClick('"+elm.id+"')");
			}

			if (/^WERTUNG_/.test(elm.id)) {
				elm.onmouseover = function()
				{
					var form = ContentFrame.document.forms[0];
					if (form && form.elements[this.id.toLowerCase()])
						if (form.elements[this.id.toLowerCase()].value == 0)
							changeImg(this, true);
				};
				elm.onmouseout = function()
				{
					var form = ContentFrame.document.forms[0];
					if (form && form.elements[this.id.toLowerCase()])
						if (form.elements[this.id.toLowerCase()].value == 0)
							changeImg(this, false);
				};
				elm.onclick = function()
				{
					var form = ContentFrame.document.forms[0];
					if (form && form.elements[this.id.toLowerCase()]) {
						var elm		= form.elements[this.id.toLowerCase()];
						elm.value	= (elm.value == 0) ? 1 : 0;
						form.submit();
					}
				};
			}
		}

		getElm("VEREINE_Suchbutton").getObj().onclick = function()
		{
			var form = ContentFrame.document.forms[0];
			if (form && /\/vereine\.php/.test(ContentFrame.location.href)) {
				form.suche.value = encodeURI(document.getElementById("VEREINE_Suchbegriff").value);
				form.submit();
			}
		};

		getElm("VEREIN_Saisons").getObj().onchange = function()
		{
			var form = ContentFrame.document.forms[0];
			if (form && /\/(verein|meinSTVmeinVerein)\.php/.test(ContentFrame.location.href)) {
				form.lfdNrSaison.value = this.options[this.selectedIndex].value;
				form.submit();
			}
		};

		/**
		 * onclick-Handler für Drucken-Button
		 */
		getElm("Drucken").getObj().onclick = function()
		{
			open(ContentFrame.location.href + "&print=true", "_blank");
		};

		// onmouseover- und -out-Handler für diverse Buttons
		var elms = [ "VEREINE_Suchbutton" ];
		var temp = getElm("AllgSymbole").getObj().getElementsByTagName("input");
		for (i = 0, ii = temp.length; i < ii; i++)
			elms.push(temp[i].id);
		temp = getElm("AllgSymbole").getObj().getElementsByTagName("img");
		for (i = 0, ii = temp.length; i < ii; i++)
			elms.push(temp[i].id);

		for (i = 0, ii = elms.length; i < ii; i++) {
			var elm = getElm(elms[i]);
			elm.getObj().onmouseover = function()
			{
				changeImg(getElm(this.id).getObj(), true);
			};
			elm.getObj().onmouseout = function()
			{
				changeImg(getElm(this.id).getObj(), false);
			};
		}
	}
);

addResizeEvent(resize);
