//
//  Copyright 2007 Uplus, Philipp Schienbein, 11.04.2007, Dynamisches Menü
//  Verwendung nur mit gültiger Lizenz
//  www.uplus.de
//
//  Nur zwei Funkionen werden im HTML-Code gebraucht: Enter und init_mousemove
//  init_mousemove muss im Body Tag mit dem Event-Handler "OnLoad" aufgerufen werden!
//  Enter muss angegeben werden, wenn ein aufklappbares Menuelement das OnMouseOver-Event erhält
//  Enter erwartet drei Parameter, id, tabid und parent
//  die id erwartet die id des <div>-Tags, das die Elemente mit display:none hält.
//  die tabid erwartet die id des <div>-Tags, das das komplette Menü darstellt.
//  die parentid ist optional und ist nur notwendig, wenn die zweite Ebene ausgeklappt werden soll.
//  sonst muss die id des übergeordneten Menüs angegeben werden
//

var docE1 = (typeof document.compatMode != "undefined" && document.compatMode != "BackCompat") ? "documentElement" : "body";
var g_xPos = 0;
var g_yPos = 0;
var g_aElementsToCheck = new Array();

// Zusätzlicher Berechnungsrahmen. Um alle Menüelemente "platziert".
var g_Spielraum = {left:0,right:0,top:0,bottom:0};

function max(x,y)
{
    return (x > y) ? x : y;
}
function min(x,y)
{
    return (x < y) ? x : y;
}

function GetAbsElementPosition(obj)
{
    var pos = {left:0, top:0};

    if(typeof obj.offsetLeft != 'undefined')
    {
       while (obj)
       {
           pos.left += obj.offsetLeft;
           pos.top += obj.offsetTop;
           obj = obj.offsetParent;
       }
    }
    else
    {
       pos.left = obj.left ;
       pos.top = obj.top ;
    }
    return pos;
}

function GetAbsElementPositionById(id)
{
	return GetAbsElementPosition(document.getElementById(id));
}

function GetAbsElementRect(obj)
{
    var rect = {left:0, top:0, right:0, bottom:0};
    var pos = GetAbsElementPosition(obj);
    rect.left = pos.left;
    rect.top = pos.top;
    rect.right = obj.offsetWidth + rect.left;
    rect.bottom = obj.offsetHeight + rect.top;

    return rect;
}

function GetAbsElementRectById(id)
{
	return GetAbsElementRect(document.getElementById(id));
}

function GetElementChildren(element, seekname)
{
	// Rückgabe Array:
	var rg = new Array();
	
	// Diese Funktion wird durch das Werfen einer Exception beendet!
	try
	{
		var child = element.childNodes[0];
		var count = 0;
		while(true)
		{
			if(child.nodeName == seekname)
			{
				// In die Liste eintragen:
				rg.push(child);
			}
			
			// Zähler erhöhen und nächstes Element holen:
			count++;
			child = element.childNodes[count];
		}
	}
	catch(e)
	{
		// Ergebnis zurückgeben:
		return rg;
	}
}

// Diese Funktion zeigt das angegebene Element an und speichert dieses ab.
function Enter(id, tabid)
{	
    document.getElementById(id).style.display = "inline";
    for(var x = 0; x < g_aElementsToCheck.length; x++)
    {
        if(g_aElementsToCheck[x][0] == id)
            return;
    }
	
	if(true)
	{
		// Breite des Head-Elements holen:
		var headrect = GetAbsElementRectById(id);
		var greatest_width = headrect.right - headrect.left;
		var content_top = 0;
		
		var element = document.getElementById(id);
 		var arr = GetElementChildren(element, "SPAN");
		var anker;
		
		// Alle Anker des Span Elements holen (FEHLERANFÄLIG!!!!):
		try
		{
			var tmp = arr[0].nodeName;
			anker = GetElementChildren(arr[0], "A");
		}
		catch(e)
		{
			// Kein SPAN-Element definiert! (versuchen, die A-Elemente direkt von dem DIV-Element zu bekommen:
			//alert("NoSpan");
			anker = GetElementChildren(element, "A");
		}
		
		// Die Anker müssten jetzt vorliegen (alle durchgehen und die größte Breite ermitteln (Dennoch durch try abgesichert):
		try
		{
			var elem = anker[0];
			var count = 0;
			while(elem != undefined)
			{
				var rect = GetAbsElementRect(element);
				var width = rect.right - rect.left;
				
				// erstes Element für top:
				if(count == 0)
				{
					content_top = rect.top;
				}
				
				// Ist die Breite größer als die bisherige größte Breite?
				if(width > greatest_width)
				{
					greatest_width = width;
				}
				
				// Zähler inkrementieren und nächstes Element laden:
				count++;
				elem = anker[count];
			}
		}
		catch(e)
		{
			// Keine Anker verfügbar! => Standardverfahren benutzen, und die Funktion beenden:
			alert("Standardverfahren");
			g_aElementsToCheck.push(new Array(id, tabid, parent));
			return;
		}
		
		// Berechnung war erfolgreich! => Eintragen
		g_aElementsToCheck.push(new Array(id, tabid, parent, greatest_width, content_top));
		// Funktion verlassen! (verhindert doppelten Eintrag)
		return;
	}
}

function Leave(id)
{
    document.getElementById(id).style.display = "none";
}

function AlertElementAbsRect(rect)
{
	var elem = document.getElementById("js_tmp_output_menu");
	if(elem != undefined)
	{
		elem.innerHTML = rect.left + "," + rect.right + ";" + rect.top + "," + rect.bottom;
	}
}

function InsideRect(rect, mod)
{
	if((g_xPos < rect.left - mod.left) || (g_xPos > rect.right + mod.right) || (g_yPos < rect.top - mod.top) || (g_yPos > rect.bottom + mod.bottom))
	{ return false; } // Der Mauszeiger befindet sich nicht innerhalb des Rechtecks!
	
	return true; // Mauszeiger innerhalb des Rechteckts!
}

function OnMouseMove(e)
{
    g_xPos = e ? e.pageX : window.event.x;
    g_yPos = e ? e.pageY : window.event.y;

    // document.feld.x.value = g_xPos;
    // document.feld.y.value = g_yPos;

    if(document.all && !document.captureEvents)
    {
        g_xPos += document[docE1].scrollLeft;
        g_yPos += document[docE1].scrollTop;
    }

    for(var i = 0; i < g_aElementsToCheck.length; i++)
    {
        var elem = g_aElementsToCheck[i];
		if(elem[3] == undefined)
		{
			var rect = GetAbsElementRectById(elem[1]);
			
			if(!InsideRect(rect, g_Spielraum))
			{
				Leave(elem[0]);
				g_aElementsToCheck.splice(i,1);
			}
		}
		else
		{	
			var rectA = GetAbsElementRectById(elem[1]);
			var rectB = GetAbsElementRectById(elem[1]);
			
			rectA.bottom = elem[4];
			rectB.top = elem[4];
			rectB.right = rectB.left + elem[3];
			
			if(!InsideRect(rectA, g_Spielraum) && !InsideRect(rectB, g_Spielraum))
			{
				Leave(elem[0]);
				g_aElementsToCheck.splice(i,1);
			}
		}
    }

    if(document.layers) routeEvent(e);
}

function InitMousemove()
{
    if(document.layers) document.captureEvents(Event.MOUSEMOVE);
    document.onmousemove = OnMouseMove;
}

// ALIAS:
function init_mousemove()
{
	InitMousemove();
}

// Mousemove registrieren:
window.onload = InitMousemove();
