/*
	asset new Media GmbH
	Dynamische Navigation
	layerover.js
	Programmiert:
		Sascha Gruesshaber
		Oliver Kruse
	Letztes Update:
		05.08.2009
*/

//Funktionen die allgemein benoetigt werden

function getOffsetLeft(el) //bezieht Browsertechnisch richtig die OffsetLeft Variable des mitgegebene Elements
{
    if (el != null)
    {
        if (el.offsetParent != null && el.offsetParent.id != Nav_Parent_Element)
        {
            return el.offsetLeft + getOffsetLeft(el.offsetParent);
        }
        else
        {
            return el.offsetLeft;
        }
    }
    else
    {
        return (0);
    }

}

function getOffsetTop(el) //bezieht Browsertechnisch richtig die OffsetTop Variable des mitgegebene Elements
{
    if (el != null)
    {
        if (el.offsetParent && el.offsetParent.id != Nav_Parent_Element)
        {
            return el.offsetTop + getOffsetTop(el.offsetParent);
        }
        else
        {
            return el.offsetTop;
        }
    }
    else
    {
        return (0);
    }
}
//----------------------------------------
//Funktionen für die Erzeugung der Navigation
function generiere_link_inhalt(ebene, pageid, bezeichnung, childnote) //generiert den Inhalt der NavX_Einzeln Elemente
{
    return (generiere_link_inhalt(ebene, pageid, bezeichnung, childnote, false));
}

function generiere_link_inhalt(ebene, pageid, bezeichnung, childnote, isHome) //generiert den Inhalt der NavX_Einzeln Elemente
{
    
    if (childnote != null)
    {
        childnote = '\'' + childnote + '\'';
    }
    var classname = 'e' + ebene;
    if (isHome)
    {
        classname = HomeEintragCssKlasse;
    }
    var ausgabe = "";

    if (pageid == Nav_No_Link_ID)
    {
        ausgabe = '<div class="' + classname + '" onmouseover="javascript:nav_set_Aktuelles_Element(' + childnote + ',' + ebene + ');nav_hide();nav_show();timeoutAus();" onmouseout="javascript:nav_hide_timeoutFunction();">\n<div class="rw_nav' + ebene + '_einzeln" id="rw_nav_' + pageid + '" onmouseover="javascript:navSetHover(this.id,' + ebene + ', true);" onmouseout="javascript:navSetHover(this.id,' + ebene + ', false);">';
    }
    else
    {
        ausgabe = '<div onclick="javascript:navPunktweiterleiten(\'' + Nav_Link + pageid + '\');" class="' + classname + '" onmouseover="javascript:nav_set_Aktuelles_Element(' + childnote + ',' + ebene + ');nav_hide();nav_show();timeoutAus();" onmouseout="javascript:nav_hide_timeoutFunction();">\n<div class="rw_nav' + ebene + '_einzeln" id="rw_nav_' + pageid + '" onmouseover="javascript:navSetHover(this.id,' + ebene + ', true);" onmouseout="javascript:navSetHover(this.id,' + ebene + ', false);">';
    }
    
    if (NavArrow[ebene - 1])
    {
        ausgabe += '<table><tr><td style="vertical-align: top;"><img src="' + Nav_Images_Folder_Path + NavArrowSource[ebene - 1] + '" class="rw_nav' + ebene + '_pfeil" /></td><td>' + bezeichnung + '</td></tr></table></div></div>';
        
    }
    else
    {
        ausgabe += bezeichnung + '</div></div>';
    }

    return (ausgabe);
}

function getEbenenCount()//Zählt die Ebenen anhand der Matrix
{
    var matrixstring = Nav_Matrix_Preafix + Nav_Matrix_Seperator;
    if (HomeEintragIstInMatrix)
    {
        matrixstring += "0";
    }
    else
    {
        matrixstring += "1";
    }
     //--->Matrix_0
    var aI = 0;
    var bGefunden = false;
    for (aI = 0; !bGefunden && aI < Nav_Max_Ebenen; aI++)
    {
        try
        {
            if (eval(matrixstring))
            {
                bGefunden = true;
            }
        }
        catch (e) { };
        matrixstring += Nav_Matrix_Seperator + "0";
    }
    if (aI == Nav_Max_Ebenen && bGefunden == false)
    {
        return (-1);
    }
    return (aI);
   
}


function getMatrixVariable(aktuelle_ebene) //Baut Matrix Variable
{
    return (getJavascriptVariable(Nav_Matrix_Preafix, aktuelle_ebene));
}

function getMatrixIDVariable(aktuelle_ebene)//Baut Matrix_ID Variable
{
    return (getJavascriptVariable(Nav_Matrix_ID_Praefix, aktuelle_ebene));
}

function getJavascriptVariable(praefix, aktuelle_ebene) //Baut aus präfix und aktueller_ebene die Bezeichnung der Matrix-Variablen
{
    var ausgabe = praefix;
    for (aI = 0; aI < aktuelle_ebene; aI++)
    {
        ausgabe += Nav_Matrix_Seperator + Nav_Ebenen_Arr[aI];
    }
    for (aI = aktuelle_ebene; aI < Nav_Ebenen_Counter; aI++)
    {
        ausgabe += Nav_Matrix_Seperator + '0';
    }
    return (ausgabe);
}

function getValueOfMatrix(matrix) //Liest den Inhalt, welcher in dem String 'matrix' als Variable im Document vorkommt, aus.
{
    try
    {
        var ausgabe = eval(matrix);
        return (ausgabe);
    }
    catch (e)
    {
        return (null);
    }
}

function getEbenenID(aktuelle_ebene) //Baut anhand der aktuelle_ebene die ID des Navigations-Blocks
{
    var ausgabe = 'Nav';
    for (aI = 0; aI < aktuelle_ebene - 1; aI++)
    {
        ausgabe += Nav_Matrix_Seperator + Nav_Ebenen_Arr[aI];
    }
    return (ausgabe);
}


function ErzeugeHomeEintrag() //Erzeugt einen Home-Eintrag (nur wenn in NavOptions aktiv)
{
    var ausgabe = '';
    if (HomeEintragAnzeigen) //soll angezeigt werden
    {
        var MatrixID;
        var MatrixValue;
        if (HomeEintragIstInMatrix) //Homeintrag steht in Matrix
        {
            Nav_Ebenen_Arr[0] = 0; //Damit die Werte aus M_0_0_0... gehohlt werden 
            MatrixID = getValueOfMatrix(getMatrixIDVariable(1)); //PageID beziehen
            MatrixValue = getValueOfMatrix(getMatrixVariable(1)); //Bezeichnung beziehen
            Nav_Ebenen_Arr[0] = 1;
        }
        else
        {
            MatrixID = HomeEintragPageID; //PageID beziehen
            MatrixValue = HomeEintragBezeichnung; //Bezeichnung beziehen
        }
        Nav_Aktive_Elemente_Temp[0] = MatrixID;
        ausgabe += generiere_link_inhalt(1, MatrixID, MatrixValue, null, true); //NavXEinzeln Eintrag generieren
        if (MatrixID == PageID)
        {
            Nav_Aktive_Elemente = new Array();
            for (var aI = 0; aI < 1; aI++)
            {
                Nav_Aktive_Elemente[aI] = Nav_Aktive_Elemente_Temp[aI];
            }
        }
    }
    else
    {
        if (HomeEintragIstInMatrix) //Homeintrag steht in Matrix
        {
            Nav_Ebenen_Arr[0] = 1;
        }
        else
        {
            Nav_Ebenen_Arr[0] = 1;
        }
    }
    return (ausgabe);
}


function generiere_navigationsebenen(aktuelle_ebene, elternelement_id) //generiert für jede Ebene mehrere rw_NavX_Block Elemente
{
    Nav_Ebenen_Arr[aktuelle_ebene - 1] = 1;
    var dmyInhalt = getValueOfMatrix(getMatrixVariable(aktuelle_ebene));
    if (dmyInhalt == null)
    {
        throw ("Matrix nicht auswertbar!\n Eventuell Variablen in NavOptions anpassen!");
        return;
    }
    if (dmyInhalt == '')
    {
        return;
    }
    else
    {
        var ebenenAusgabe = '<div id="' + getEbenenID(aktuelle_ebene) + '" class="rw_nav' + aktuelle_ebene + '_block"';
		if (elternelement_id != null)
		{
			ebenenAusgabe += ' onmouseover="javascript:navSetHover(\'' + elternelement_id + '\',' + (aktuelle_ebene - 1) + ',true);" onmouseout="javascript:navSetHover(\'' + elternelement_id + '\',' + (aktuelle_ebene - 1) + ',false);"';
		}
		ebenenAusgabe += '>';
        if (aktuelle_ebene == 1)
        {
            ebenenAusgabe += ErzeugeHomeEintrag();
        }
        while (getValueOfMatrix(getMatrixVariable(aktuelle_ebene)) != '')
        {
            var childnoteID = null;
            if (aktuelle_ebene < Nav_Ebenen_Counter)
            {
                //Nächste ebene auf 1 setzen und fuer z.B. Ebene 3 wird M_1_0_0_1 überprüft ob diese nicht den Wert '' hat!
                Nav_Ebenen_Arr[(aktuelle_ebene - 1) + 1] = 1; //ein hoeheres elment um ein und danach 
                var childValue = getValueOfMatrix(getMatrixVariable(aktuelle_ebene + 1));  //hohlt aus dem nächsten Unterelement die Value
                if (childValue != '');
                {
                    childnoteID = getEbenenID(aktuelle_ebene + 1);
                }
                //Nav_Ebenen_Arr[(aktuelle_ebene-1)+1]--; //wieder runterzaehlen
            }
            var MatrixID = getValueOfMatrix(getMatrixIDVariable(aktuelle_ebene)); //PageID beziehen
            if (MatrixID == 0)
            {
                Nav_No_Link_ID++;
                MatrixID = Nav_No_Link_ID;
            }
            
            
            var MatrixValue = getValueOfMatrix(getMatrixVariable(aktuelle_ebene)); //Bezeichnung beziehen
			Nav_Aktive_Elemente_Temp[aktuelle_ebene - 1] = MatrixID;
            ebenenAusgabe += generiere_link_inhalt(aktuelle_ebene, MatrixID, MatrixValue, childnoteID); //NavXEinzeln Eintrag generieren
            if (aktuelle_ebene < Nav_Ebenen_Counter)
            {
                var elternID = 'rw_nav_' + MatrixID;
				//Nav_Ebenen_Arr[aktuelle_ebene] = 1;
                generiere_navigationsebenen(aktuelle_ebene + 1, elternID);
            }
            if (MatrixID == PageID)
            {
                Nav_Aktive_Elemente = new Array();
                for (var aI = 0; aI < aktuelle_ebene; aI++)
                {
                    Nav_Aktive_Elemente[aI] = Nav_Aktive_Elemente_Temp[aI];
                }
            }

            Nav_Ebenen_Arr[aktuelle_ebene - 1]++;
        }
        ebenenAusgabe += '</div>';
        document.getElementById(Nav_Parent_Element).innerHTML += ebenenAusgabe;
        return;
    }
}

function generiere_navigation() //Geniert die Navigation
{
    generiere_navigationsebenen(1);
}
//--------------------------------------------
//Positionierung der einzelnen NavigationsElemente
function schreibeNeuePosition() //Schreibt die neuen Positionen der Ebene 1
{
    var ebene1 = $("#" + (getEbenenID(1)))[0];
    Nav_Ebene1_Left = getOffsetLeft(ebene1);
    Nav_Ebene1_Top = getOffsetTop(ebene1);
}

function getNavigationsPositionUnterschiedlich() //Alte Navigationspostion unterschiedlich der neuen Navigationspostion
{
    var ebene1 = $("#" + (getEbenenID(1)))[0];
    if (Nav_Ebene1_Left != getOffsetLeft(ebene1) || Nav_Ebene1_Top != getOffsetTop(ebene1))
    {
        return (true);
    }
    else
    {
        return (false);
    }
}

function positioniere_navigationsebenen() //Positioniert alle Navigationselemente anhand der Position der ersten Ebene
{
    var position_x = 0;
    var position_y = 0;
    var eltern_element_position_x = 0;
    var eltern_element_position_y = 0;

    for (var ebenen_counter = 2; ebenen_counter <= Nav_Ebenen_Counter; ebenen_counter++)
    {
        var elemente_block = $(".rw_nav" + ebenen_counter + "_block");
        for (var elemente_counter = 0; elemente_counter < elemente_block.length; elemente_counter++)
        {
            var element_block_id_aktuell = elemente_block[elemente_counter].id;
            var eltern_element_id = element_block_id_aktuell.substr(0, element_block_id_aktuell.lastIndexOf(Nav_Matrix_Seperator));
            var eltern_element_index = parseInt(element_block_id_aktuell.substr(element_block_id_aktuell.lastIndexOf(Nav_Matrix_Seperator) + 1)); 			//Wechles NavXEinzeln von NavBlock des Parents!
            var eltern_element_block = $("#" + eltern_element_id);
            var eltern_element_einzeln = $("#" + eltern_element_id + " .e" + (ebenen_counter - 1) + " .rw_nav" + (ebenen_counter - 1) + "_einzeln");
            var eltern_element_einzeln_aktuell = eltern_element_einzeln[eltern_element_index - 1];
            if (ebenen_counter - 1 != 1)
            {
                eltern_element_block.css({ "display": "block" });
            }
            eltern_element_position_x = getOffsetLeft(eltern_element_einzeln_aktuell);
            eltern_element_position_y = getOffsetTop(eltern_element_einzeln_aktuell);
            //Horizontale Ausrichtung Eltern Element
            if (Nav_Ausrichtung[ebenen_counter - 2] == Nav_Ausrichtung_Horizontal)
            {
                position_x = eltern_element_position_x + Nav_Ausrichtung_Horizontal_Versatz_X;
                position_y = eltern_element_position_y + eltern_element_einzeln_aktuell.offsetHeight + Nav_Ausrichtung_Horizontal_Versatz_Y;
            }
            //Vertikale Ausrichtung Eltern Element
            else
            {
				position_x = eltern_element_position_x + eltern_element_einzeln_aktuell.offsetWidth + Nav_Ausrichtung_Vertikal_Versatz_X;
                position_y = eltern_element_position_y + Nav_Ausrichtung_Vertikal_Versatz_Y;
            }
            var realepositionrechteseckoben = parseInt($("#" + element_block_id_aktuell).css("width").split("px")[0]) + position_x;
            var breitenavigation = parseInt($("#" + Nav_Parent_Element).css("width").split("px")[0])
            if (realepositionrechteseckoben > breitenavigation && Nav_Ueberhang == false)
            {
                position_x = breitenavigation - parseInt($("#" + element_block_id_aktuell).css("width").split("px")[0]);
            }
            
            $("#" + element_block_id_aktuell).css({ "position": "absolute", "left": position_x + "px", "top": position_y + "px", "z-index": (Nav_ZIndex_Counter_Start + ebenen_counter - 2) });
            if (ebenen_counter - 1 != 1)
            {
                eltern_element_block.css({ "display": "none" });
            }
        }
    }
    schreibeNeuePosition();
}

function setze_aktive_navigationsebenen()
{
	if (Nav_Aktive_Ebene_Zusatz != "")
	{
		if (Nav_Aktive_Elemente)
		{
			for (var aI = 0; aI < Nav_Aktive_Elemente.length; aI++)
			{
				var klassenName = document.getElementById('rw_nav_' + Nav_Aktive_Elemente[aI]).className;
				$(document.getElementById('rw_nav_' + Nav_Aktive_Elemente[aI])).addClass(klassenName + Nav_Aktive_Ebene_Zusatz);
			}
		}
	}		
}

//---------------------------------------
//Funktionen für Ein und Ausblendeffekte
function nav_set_Aktuelles_Element(zuOeffendesElement, aktuelle_ebene) //setzt das zu oeffnende Element der aktuellen ebene
{
    var ebene = aktuelle_ebene - 1;
    Nav_Aktuelles_Element[ebene] = zuOeffendesElement;
    Nav_Aktuelle_Ebene = aktuelle_ebene;
    for (aI = aktuelle_ebene; aI < Nav_EbenenZaehler; aI++)
    {
        Nav_Aktuelles_Element[aI] = null;
    }
}

function nav_show() //setzt TimeOut welches aktuelle Element geöffnet werden soll
{
    var ebene = Nav_Aktuelle_Ebene - 1;
    if (Nav_Auftrag_Zaehler[ebene] == null || Nav_Auftrag_Zaehler[ebene] == undefined) //wenn noch nicht definiert, dann wird auf 0 gesetzt!
    {
        Nav_Auftrag_Zaehler[ebene] = -1;
        Nav_Sichtbares_Element[Nav_EbenenZaehler] = new Array();
        Nav_Wieder_Geschlossene_Elemente_Index[Nav_EbenenZaehler] = 0;
        Nav_EbenenZaehler++;
    }
    Nav_Auftrag_Zaehler[ebene]++;
    window.setTimeout('nav_show_timeoutFunction(' + Nav_Auftrag_Zaehler[ebene] + ', ' + ebene + ')', 300);
}

function nav_show_timeoutFunction(stapelnummer, ebene) //blendet Element ein
{
    if (Nav_Auftrag_Zaehler[ebene] == stapelnummer)
    {
        Nav_Sichtbares_Element[ebene][stapelnummer] = Nav_Aktuelles_Element[ebene];
        if ($("#" + Nav_Aktuelles_Element[ebene])[0] != null && $("#" + Nav_Aktuelles_Element[ebene])[0] != undefined && $("#" + Nav_Aktuelles_Element[ebene])[0].style.display != "block")
        {
            $("#" + Nav_Aktuelles_Element[ebene]).css({ "display": "block", "opacity": "0.0" });
            $("#" + Nav_Aktuelles_Element[ebene]).animate({ "opacity": NavEffectOpacity }, NavEffectSpeed);
        }
        return;
    }
}

function nav_hide() //blendet alle offenen und nicht mehr erwünschten Elemente aus
{
    for (var aktuell_auszublende_ebene = Nav_EbenenZaehler - 1; aktuell_auszublende_ebene >= Nav_Aktuelle_Ebene - 1; aktuell_auszublende_ebene--)
    {
        if (Nav_Sichtbares_Element[aktuell_auszublende_ebene])//Wenn Ebene existiert
        {
            if (Nav_Sichtbares_Element[aktuell_auszublende_ebene].length > Nav_Wieder_Geschlossene_Elemente_Index[aktuell_auszublende_ebene])//Wenn mehr Elemente offen sind als geschlossen wurden
            {
				for (var aI = Nav_Wieder_Geschlossene_Elemente_Index[aktuell_auszublende_ebene]; aI < Nav_Sichtbares_Element[aktuell_auszublende_ebene].length; aI++)//Geht alle noch nicht geschlossenen Elemente einer Ebene durch
                {
                    if (Nav_Aktuelles_Element[aktuell_auszublende_ebene] != Nav_Sichtbares_Element[aktuell_auszublende_ebene][aI])//Wenn auszublendende Ebene ungleich der anzuzeigenden Ebene
                    {
                        if ($("#" + Nav_Sichtbares_Element[aktuell_auszublende_ebene][aI])[0])//Wenn Ebene sichtbar ist wird ausgeblendet
                        {
                            $("#" + Nav_Sichtbares_Element[aktuell_auszublende_ebene][aI]).animate({ "opacity": "hide" }, NavEffectSpeed);
                        }
                        Nav_Wieder_Geschlossene_Elemente_Index[aktuell_auszublende_ebene]++;
                    }
                }
            }
        }
    }
}

function nav_hide_timeoutFunction() //Setzt timeout für Elemente ausblenden
{
    nav_set_Aktuelles_Element(null, 1);
    Nav_Timeout[Nav_Aktuelle_Ebene - 1] = setTimeout('nav_hide()', 1500);
}


function timeoutAus() //loescht alle timeouts
{
    for (var aI = Nav_EbenenZaehler; aI > 0; aI--)
    {
        clearTimeout(Nav_Timeout[aI - 1]);
    }
}

function navPunktweiterleiten(link) //leitet Browser an den Link weiter
{
    window.location.href = link;
}

function navSetHover(elementid, ebene, aktiv)
{
    if (Nav_Hover_Ebene_Zusatz != "")
	{
		if(Nav_Hover_ParentElemente)
		{
			if(aktiv)
			{
				Nav_Hover_Element[ebene-1] = $('#' + elementid)[0];
				for(var aI = 0; aI < ebene; aI++)
				{
					$('.rw_nav' + (aI+1) + '_einzeln' + Nav_Hover_Ebene_Zusatz).removeClass('rw_nav' + (aI+1) + '_einzeln' + Nav_Hover_Ebene_Zusatz);
					$('#' + Nav_Hover_Element[aI].id).addClass('rw_nav' + (aI+1) + '_einzeln' + Nav_Hover_Ebene_Zusatz);
					$($('#' + Nav_Hover_Element[aI].id)[0].parentNode.parentNode).addClass('rw_nav' + (aI+1) + '_block' + Nav_Hover_Ebene_Zusatz);
				}
			}
			else
			{
				for(var aI = 0; aI < ebene; aI++)
				{
					$('.rw_nav' + (aI+1) + '_einzeln' + Nav_Hover_Ebene_Zusatz).removeClass('rw_nav' + (aI+1) + '_einzeln' + Nav_Hover_Ebene_Zusatz);
					$($('#' + Nav_Hover_Element[aI].id)[0].parentNode.parentNode).removeClass('rw_nav' + (aI+1) + '_block' + Nav_Hover_Ebene_Zusatz);
				}
			}
		}
		else
		{
			if (aktiv)
			{
				$("#" + elementid).addClass("rw_nav" + ebene + "_einzeln" + Nav_Hover_Ebene_Zusatz);    
			}
			else
			{
				$("#" + elementid).removeClass("rw_nav" + ebene + "_einzeln" + Nav_Hover_Ebene_Zusatz);
			}
		}
	}
}

//----------------------------------------------
//Document-Events
$(document).ready(function()//Damit die Elemente beim Laden einmal positioniert werden!
{
    Nav_Ebenen_Counter = getEbenenCount();
	if (Nav_Ebenen_Counter > -1)
    {
        Nav_Ebenen_Arr = new Array(Nav_Ebenen_Counter);
        generiere_navigation();
        positioniere_navigationsebenen();
        setze_aktive_navigationsebenen();
    }
})

$(window).resize(function()//Damit bei einem Resize die Elemente neu ausgerichtet werden!
{
    if (Nav_Ebenen_Counter > -1)
    {
        if (getNavigationsPositionUnterschiedlich())
        {
            positioniere_navigationsebenen();
        }
    }
});
