var SelectedTabId = -1;
var RootLevel = 0;
var HorizonXmlNavPosition = { Left : 0, Top : 0 };
var LastHoverAnchor = null;
var RootAnchor = null;

function GetAbsolutePosition(Element)  
{  
    var Position = { Left : 0, Top : 0 };
  
    while(Element && Element != document.body)
    {  
        Position.Left += Element.offsetLeft;  
        Position.Top += Element.offsetTop;  
        Element = Element.offsetParent;  
    }  
    return Position;  
}

function MoveElementToPosition(Element, Position)
{
    Element.style.position = "absolute";
    Element.style.left = Position.Left;
    Element.style.top = Position.Top;
}

function GetSelectedTabId()
{
    var TabId = -1;
    var RegEx = new RegExp("tabid[\/=]+(\\d+)|\/tab(\\d+)\/","ig");
    
    if(RegEx.exec(window.location.href) != null)
    {
        if(RegExp.$1.length > 0)
        {
            TabId = parseInt(RegExp.$1);
        }
        else
        {
	        TabId = parseInt(RegExp.$2);
	    }
    }
    
    return TabId;
}

function GetSupAnchorFromAnchor(Anchor)
{
    if(Anchor.getAttribute("level") == RootLevel) return null;
    var SupAnchor = Anchor.parentNode.parentNode.previousSibling;
    
    if(SupAnchor)
    {
        if(SupAnchor.nodeType == 1 && SupAnchor.tagName == "A")
        {
            return SupAnchor;
        }
        else
        {
            SupAnchor = Anchor.parentNode.parentNode.previousSibling.previousSibling;
            if(SupAnchor && SupAnchor.nodeType == 1 && SupAnchor.tagName == "A")
            {
                return SupAnchor;
            }            
        }
    }
    
    return null;
}

function GetSupULFromAnchor(Anchor)
{
    return Anchor.parentNode.parentNode;
}

function GetSubULFromAnchor(Anchor)
{
    var SubUL = Anchor.nextSibling;
    if(SubUL)
    {
        if(SubUL.nodeType == 1 && SubUL.tagName == "UL")
        {
            return SubUL;
        }
        else
        {
            SubUL = Anchor.nextSibling.nextSibling;
            if(SubUL && SubUL.nodeType == 1 && SubUL.tagName == "UL")
            {
                return SubUL;
            }        
        }
    }
   
    return null;
}

function ShowElement(Element)
{
    Element.style.display = "block";
}

function HideElement(Element)
{
    Element.style.display = "none";
}

function InitHorizonXmlNav()
{
    
    SelectedTabId = GetSelectedTabId();
    
	var NavDiv = document.getElementById("HorizonXmlNav");
	var Anchors = NavDiv.getElementsByTagName('A');
	
	for(var i = 0; i < Anchors.length; i++)
	{
		var Anchor = Anchors[i];
		var Level = Anchor.getAttribute("level");
		var TabId = Anchor.getAttribute("tabid");
		
		if(i == 0)
		{
		    RootLevel = Level;
		    RootAnchor = Anchor;
		    ShowElement(GetSupULFromAnchor(Anchor));
		    HorizonXmlNavPosition = GetAbsolutePosition(Anchor);
		    window.onload = function()
		    {
		        HorizonXmlNavPosition = GetAbsolutePosition(RootAnchor);
		    };
		}
		
        if(TabId == SelectedTabId)
        {
            Anchor.className += " Selected";
        }
        
        if(GetSubULFromAnchor(Anchor))
        {
            Anchor.className += " WithSub";
        }
	}
}

function HideSubUL(Anchor)
{
    Anchor.className = Anchor.className.replace(" Active", "");
    var SubUL = GetSubULFromAnchor(Anchor);
    if(SubUL)
    {
        HideElement(SubUL);
    }
}

function UpRecurAnchor(Anchor, level, Func)
{
    Func(Anchor);
    Anchor = GetSupAnchorFromAnchor(Anchor);
    if(Anchor && Anchor.getAttribute("level") >= level) UpRecurAnchor(Anchor, level, Func);
}

function ActiveHorizonXmlNav(Anchor)
{
    if(LastHoverAnchor && LastHoverAnchor.getAttribute("level") >= Anchor.getAttribute("level"))
    {
        UpRecurAnchor(LastHoverAnchor, Anchor.getAttribute("level"), HideSubUL);
        LastHoverAnchor = null;
    }
    
    var SubUL = GetSubULFromAnchor(Anchor);
    if(SubUL)
    {
        var Position = Anchor.getAttribute("level") == RootLevel ?  HorizonXmlNavPosition : { Left : 0, Top : 0 };
        MoveElementToPosition(SubUL, { Left : Position.Left, Top : Position.Top + Anchor.offsetHeight });
        ShowElement(SubUL);
        
        Anchor.className += " Active";
    }
    
    LastHoverAnchor = Anchor;
}

InitHorizonXmlNav();

