// JavaScript-Funktionen fuer das Navigationsmenu
// Copyright (C) 2005 Alexander Mueller
// Autor: Alexander Mueller
// Web:   http://www.EvoComp.de/
// Datei: navigation.js
// The copyright notice must stay intact for use!
// You can obtain this and other scripts at http://www.EvoComp.de/scripts/skripte.html
//
// This program is distributed in the hope that it will be useful,
// but without any warranty, expressed or implied.

// aktueller Status der linken Maustaste
var mouse_down = false;
// gibt an, ob die Maustaste auf dem Close-Button gedrueckt wurde
var close_menu = false;
// gibt an, ob das Menufenster derzeit minimiert dargestellt wird
var menu_status_minimized = false;
// gibt an, ob das Menufenster derzeit geschlossen ist
var menu_status_closed = false;
// aktuelle Position des Menufensters
var menu_pos_x, menu_pos_y;
// Offset der Maus relativ zur oberen linken Position des Menufensters zu dem
// Zeitpunkt, zu dem die Maustaste gedrueckt wurde.
var lx = 0, ly = 0;

// Funktion fuehrt einige Vorarbeiten durch, die zur Nutzung des Menufensters
// noetig sind.
function init_menu ()
{
	// Maus-Event 'move' muss ueberwacht werden damit unter bestimmten
	// Voraussetzungen (linke Maustaste wurde auf Titelleiste gedrueckt
	// gehalten) eine Verschiebung des Menufensters durchgefuehrt wird.
	document.onmousemove = mouse_move;
	// Statusinformationen aus den Get-Parametern (in der URL sichtbar)
	// auslesen und entsprechende Statusvariablen initialisieren
	menu_status_minimized = getMenuMinimizedStatus ();
	menu_status_closed = getMenuClosedStatus ();
	// Breite des Menufensters setzen (Vorgabe dieses Wertes erfolgt in der
	// HTML-Datei)
	document.getElementById ('menucontainer').style.width = menu_width;
	// Breite der Titelleiste setzen
	document.getElementById ('leiste').style.width = menu_width - (!document.all ? 10 : 0);
	// Menufenster minimieren, wenn dies durch Parameter festgelegt wurde
	if (menu_status_minimized)
	{
		document.getElementById ('menu').style.visibility = 'hidden';
		document.getElementById ('menu').style.display = 'none';
	}
	// Menufenster verstecken, wenn dies durch Parameter festgelegt wurde
	if (menu_status_closed)
	{
		document.getElementById ('menucontainer').style.visibility = 'hidden';
		document.getElementById ('menucontainer').style.display = 'none';
	}
	// Position des Menufensters aus den Get-Parametern auslesen
	menu_pos_x = document.getElementById ('menucontainer').style.left = getMenuPositionX ();
	menu_pos_y = document.getElementById ('menucontainer').style.top = getMenuPositionY ();
	// Menustatus in den Links des Dokuments speichern um die Uebergabe der
	// Statuswerte an Folgeseiten bei Anklicken eines Links zu sichern
	addMenuStatusToLinks ();
}

// Passt einen eventuell vorhandenen Link mit der ID 'menureopen' so an, dass
// der entsprechende Parameter zur Anzeige des Menufensters gesetzt wird.
// Damit ist es moeglich das Menufenster, nachdem es geschlossen wurde, wieder
// sichtbar zu machen.
function reopenMenu ()
{
	if (document.getElementById ("menureopen"))
		document.getElementById ("menureopen").href = (document.getElementById ("menureopen").href).replace (/nomenu=1/, 'nomenu=0');
}

// Ermittelt aus den Get-Parametern, ob das Menufenster angezeigt werden soll.
// Werden keine diesbezueglichen Angaben gefunden, so wird das Fenster angezeigt.
function getMenuClosedStatus ()
{
	var mclosed;

	if (document.location.search != "" && (document.location.search).match (/nomenu=[01]/i))
		mclosed = (("" + (document.location.search).match (/nomenu=[01]/i)).replace (/nomenu=/i, '') == 0 ? false : true);
	else
		mclosed = false;
	return mclosed;
}

// Ermittelt aus den Get-Parametern, ob das Menu minimiert angezeigt werden soll.
// Werden keine diesbezueglichen Angaben gefunden, so wird das Menu angezeigt.
function getMenuMinimizedStatus ()
{
	var mminimized;

	if (document.location.search != "" && (document.location.search).match (/mmin=[01]/i))
		mminimized = (("" + (document.location.search).match (/mmin=[01]/i)).replace (/mmin=/i, '') == 0 ? false : true);
	else
		mminimized = false;
	return mminimized;
}

// Liest die horizontale Position des Menufensters aus den Get-Parametern aus.
// Liefert entweder die ausgelesene Position oder die Standardposition, die
// vom Anwender in der HTML-Datei vorgegeben wurde.
function getMenuPositionX ()
{
	var mpx;

	if (document.location.search != "" && (document.location.search).match (/mposx=[\-]?[0-9]+/i))
		mpx = ("" + (document.location.search).match (/mposx=[\-]?[0-9]+/i)).replace (/mposx=/i, '');
	else
		mpx = initial_menu_pos_x;
	return mpx;
}

// Liest die vertikale Position des Menufensters aus den Get-Parametern aus.
// Liefert entweder die ausgelesene Position oder die Standardposition, die
// vom Anwender in der HTML-Datei vorgegeben wurde.
function getMenuPositionY ()
{
	var mpy;

	if (document.location.search != "" && (document.location.search).match (/mposy=[0-9]+/i))
		mpy = ("" + (document.location.search).match (/mposy=[0-9]+/i)).replace (/mposy=/i, '');
	else
		mpy = initial_menu_pos_y;
	return mpy;
}

// Liefert die Domaenen-URL zu einer uebergebenen URL.
// Bei ungueltiger URL wird ein leeres String zurueckgegeben
function getDomainURL (URL)
{
	if (URL.match (/^((http:\/\/)?(www\.)?((([0-9a-z][0-9a-z-]+\.)+)([a-z]{2,3}))).*/))
		return URL.match (/^((http:\/\/)?(www\.)?((([0-9a-z][0-9a-z-]+\.)+)([a-z]{2,3}))).*/)[1];
	else
		return "";
}

// Status des Menufensters (Position und ob es eingeklappt oder ganz versteckt
// ist) in den Links des HTML-Dokuments speichern.
// Auf diese Weise kann der Status des Menufensters auf einer Folgeseite
// ausgelesen und das Menufenster entsprechend dargestellt werden.
function addMenuStatusToLinks ()
{
	// Alle Links im aktuellen HTML-Dokument bearbeiten
	for (i = 0; i < document.links.length; i++)
	{
		// Links, die dem Verschicken von E-Mails dienen und URLs, die
		// mit dem Domainnamen enden (Probleme bei IE, der die Parameter
		// in den Links anzeigt) sollen nicht parametrisiert werden.
		if (!(document.links[i].href).match (/^mailto:/)
		    && !(document.links[i].href).match (/^(http:\/\/)?(www\.)?((([0-9a-z][0-9a-z-]+\.)+)([a-z]{2,3}))[\/]+$/)
	    	    // nur URLs, die auf die eigene Domain zeigen sollen
		    // Parameter erhalten (keine externen Links)
		    && (document.links[i].href).indexOf (getDomainURL (self.location.href)) != -1
		    // Parameter sollen zusaetzlich noch die in 'pardomains'
		    // enthaltenen Domains erhalten.
		    //&& !(document.links[i].href).match (/ausnahmedomains/)
		    )
		{
			// aktuelle horizontale Position des Menufensters an den
			// Link anhaengen bzw. bisher gespeicherte Werte durch
			// die aktuellen ersetzen
			if ((document.links[i].href).match (/mposx=[-0-9]+/i))
				document.links[i].href = (document.links[i].href).replace (/mposx=[-0-9]+/i, ("mposx=" + menu_pos_x));
			else
				if ((document.links[i].href).indexOf ('?') != -1)
					document.links[i].href = document.links[i].href + "&mposx=" + menu_pos_x;
				else
					document.links[i].href = document.links[i].href + "?mposx=" + menu_pos_x;
			// aktuelle vertikale Position des Menufensters an den
			// Link anhaengen bzw. bisher gespeicherte Werte durch
			// die aktuellen ersetzen
			if ((document.links[i].href).match (/mposy=[0-9]+/i))
				document.links[i].href = (document.links[i].href).replace (/mposy=[0-9]+/i, ("mposy=" + menu_pos_y));
			else
				if ((document.links[i].href).indexOf ('?') != -1)
					document.links[i].href = document.links[i].href + "&mposy=" + menu_pos_y;
				else
					document.links[i].href = document.links[i].href + "?mposy=" + menu_pos_y;
			// Anzeigestatus (Menufenster minimiert) des Menus
			// an den Link anhaengen bzw. bisher gespeicherte Werte
			// durch die aktuellen ersetzen
			if ((document.links[i].href).match (/mmin=[01]/i))
				document.links[i].href = (document.links[i].href).replace (/mmin=[01]/i, ("mmin=" + (menu_status_minimized ? 1 : 0)));
			else
				if ((document.links[i].href).indexOf ('?') != -1)
					document.links[i].href = document.links[i].href + "&mmin=" + (menu_status_minimized ? 1 : 0);
				else
					document.links[i].href = document.links[i].href + "?mmin=" + (menu_status_minimized ? 1 : 0);
			// Anzeigestatus (Menufenster anzeigen) des Menufensters
			// an den Link anhaengen bzw. bisher gespeicherte Werte
			// durch die aktuellen ersetzen
			if ((document.links[i].href).match (/nomenu=[01]/i))
				document.links[i].href = (document.links[i].href).replace (/nomenu=[01]/i, ("nomenu=" + (menu_status_closed ? 1 : 0)));
			else
				if ((document.links[i].href).indexOf ('?') != -1)
					document.links[i].href = document.links[i].href + "&nomenu=" + (menu_status_closed ? 1 : 0);
				else
					document.links[i].href = document.links[i].href + "?nomenu=" + (menu_status_closed ? 1 : 0);
		}
	}
}

// Funktion reagiert auf Maustasten-Events innerhalb der Titelleiste des
// Menufensters.
function menu_event (event)
{
	// Bereich pruefen in dem das Event statt gefunden hat. Im Bereich des
	// Schliessen-Symbols soll das Fenster geschlossen werden.
	if (parseInt (document.getElementById ('menucontainer').style.width) - 33 < (document.all ? event.offsetX : event.layerX)
	    && parseInt (document.getElementById ('menucontainer').style.width) - 5 > (document.all ? event.offsetX : event.layerX)
	    && (document.all ? event.offsetY : event.layerY) > 7
	    && (document.all ? event.offsetY : event.layerY) < 23)
	{
		// wurde die Maustaste auf dem Schliessen-Bereich gedrueckt und
		// auch wieder los gelassen, so muss das Menufenster geschlossen
		// werden.
		if (close_menu && event.type == "mouseup")
		{
			close_menu = false;
			document.getElementById ('menucontainer').style.visibility = 'hidden';
			document.getElementById ('menucontainer').style.display = 'none';
			menu_status_closed = true;
			addMenuStatusToLinks ();
		}
		// sonst merken, dass im Schliessen-Bereich Maustaste gedrueckt
		// wurde
		else
			close_menu = true;
	}
	// Im restlichen Bereich der Titelleiste des Menufensters wird das
	// Menufenster verschoben.
	else
	{
		// Wurde die Maustaste gedrueckt, so wird diese Info gespeichert
		// und der Mauscursor entsprechend veraendert. Ausserdem wird
		// die relative Position der Maus zum oberen, linken Rand der
		// Titelleiste gespeichert, da diese fuer die Positionierung des
		// Menufensters benoetigt wird.
		if (event.type == "mousedown")
		{
			mouse_down = true;
			lx = (document.all ? event.offsetX : event.layerX);
			ly = (document.all ? event.offsetY : event.layerY);
			document.getElementById ('leiste').style.cursor = 'move';
		}
		// Wurde die Maustaste auf der Titelleiste losgelassen, nachdem
		// sie zuvor darauf gedrueckt wurde, so wird der Mauscursor wieder
		// zurueckgesetzt und die neue Position des Menufensters gespeichert.
		if (mouse_down && event.type == "mouseup")
		{
			mouse_down = false;
			document.getElementById ('leiste').style.cursor = 'default';
			menu_pos_x = parseInt (document.getElementById ('menucontainer').style.left);
			menu_pos_y = parseInt (document.getElementById ('menucontainer').style.top);
			addMenuStatusToLinks ();
		}
		close_menu = false;
		document.getElementById ('leiste').style.cursor = 'default';
	}
}

// Klappt das Menufenster ein oder aus (je nach dem, ob es vorher eingeklappt
// war oder nicht). Wird bei Doppelklick auf Titelleiste des Menufensters
// aufgerufen.
function toggle_menu_status ()
{
	// wenn Menu ausgeklappt ist soll es eingeklappt werden (eigentliches
	// Menu wird versteckt)
	if (menu_status_minimized = !menu_status_minimized)
	{
		document.getElementById ('menu').style.visibility = 'hidden';
		document.getElementById ('menu').style.display = 'none';
	}
	// ansonsten wird das Menu wieder angezeigt
	else
	{
		document.getElementById ('menu').style.visibility = 'visible';
		document.getElementById ('menu').style.display = 'block';
	}
	// Anzeigestatus des Menufensters in den Links zur Uebergabe an
	// Folgeseiten aktualisieren
	addMenuStatusToLinks ();
}

// Positioniert das Menu an den uebergebenen Koordinaten
function put_menu (x, y)
{
	// Menufenster darf nur so weit links positioniert werden, dass es noch
	// moeglich ist, es wieder zum verschieben auf der Titelleiste anzuklicken.
	if (x - lx < -lx)
		document.getElementById ('menucontainer').style.left = -lx;
	else
		document.getElementById ('menucontainer').style.left = x - lx;
	// Menufenster darf nicht ueber den oberen Darstellungsbereich hinaus
	// bewegt werden, da sonst keine Moeglichkeit besteht es wieder zu verschieben.
	if (y - ly < 0)
		document.getElementById ('menucontainer').style.top = 0;
	else
		document.getElementById ('menucontainer').style.top = y - ly;
}

// Event-Handler wird aufgerufen, wenn die Maus bewegt wurde
function mouse_move (event)
{
	// Event-Objekt holen, wenn es nicht uebergeben wurde (ist bei MSIE noetig)
	if (!event)
		event = window.event;
	// Fenster nur verschieben, wenn Maustaste auf Titelleiste gedrueckt gehalten wird
	if (mouse_down && !close_menu)
		// aktuelle Mauskoordinaten abhaengig von Browser an Funktion zur Positionierung des Menus uebergeben
		put_menu ((document.all ? event.clientX : event.pageX), (document.all ? event.clientY : event.pageY));
}

